大佬教程收集整理的这篇文章主要介绍了如何使 ONNX sklearn 转换器支持布尔字符串类型?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Boolean 和 String 类型似乎不受支持,尽管它们列在 common data types source code file 中。
我想我在某处读到 ONNX 不能直接支持分类类型作为输入。这使得它们更难使用,因为 lightGBM 具有良好的分类输入类型支持。
下面有一个完整的 MWE,但代码的关键部分是这个,我尝试将布尔类型指定为输入。
@H_253_9@model_onnx = convert_sklearn(pipe_unsuccessful,'pipeline_xgboost',[('input',BooleanTensorType([None,1]))],#target_opset=12 # omg this is so bad )
完整的 MWE
# Boiler plate
import pandas as pd
from xgboost import XGBClassifIEr
import xgboost as xgb
# generate some data
bool_target = pd.DataFrame(
{
"target": np.random.choice(a=[false,True],size=1000),"random": np.random.uniform(size=1000),# add something random
# "cate" : np.random.randint(0,3,}
)
bool_target["cate"] = np.where(np.random.uniform(size=1000) < 0.1,~bool_target.target,bool_target.target)
bool_target["cate_str"] = np.where((np.random.uniform(size=1000) < 0.9) & bool_target.target,"cate1","cate2")
bool_target["cate_str"] = bool_target["cate_str"].astype("category")
# for each value. make sure there is a 90% match rate
bool_target["explanatory"] = np.where(np.random.uniform(size=1000) < 0.1,bool_target.target)
bool_target["explanatory_missing_1pct"] = np.where(np.random.uniform(size=1000) < 0.1,np.nan,bool_target.target*1)
# make two versions of X one containing String columns and one doesn't
X_no_str = bool_target.loc[:,["random","cate","explanatory","explanatory_missing_1pct"]]
X,y = bool_target.loc[:,"cate_str","explanatory_missing_1pct"]],bool_target.iloc[:,[0]]
仅使用浮点输入成功构建 onnx
# Based on http://onnx.ai/sklearn-onnx/auto_examples/plot_pipeline_xgboost.HTML
from onnxmltools.convert.xgboost.operator_converters.XGBoost import convert_xgboost
from skl2onnx.common.shape_calculator import calculate_linear_classifIEr_output_shapes
from skl2onnx import convert_sklearn,update_registered_converter
from skl2onnx.common.data_types import floatTensorType,BooleanTensorType
# you need to let the convert kNow what XGBClassifIEr is
update_registered_converter(
XGBClassifIEr,'XGBoostXGBClassifIEr',calculate_linear_classifIEr_output_shapes,convert_xgboost,options={'nocl': [True,false],'zipmap': [True,false]})
# how the model can be fitted without a pipeline
#m = XGBClassifIEr(n_jobs=1,use_label_encoder=false,objective="binary:logistic",eval_metric="auc").fit(X_no_str,y)
from sklearn.pipeline import Pipeline
pipe = Pipeline(
[
(
"xgboost",XGBClassifIEr(n_jobs=1,eval_metric="auc")
)
])
# this works fine!
try:
convert_sklearn(pipe,floatTensorType([None,4]))],#target_opset=12 # omg this is so bad
)
except Exception as e:
print(E)
model_onnx = convert_sklearn(pipe,#target_opset=12 # omg this is so bad
)
以上工作正常,但是当你尝试做布尔值时,它失败了
X_no_cate = X_no_str.copy()
X_no_cate.cate = X_no_str.cate*1
X_no_cate.explanatory = X_no_str.explanatory*1
X_no_cate
y = y*1
X_no_cate.columns = ["f"+str(i) for i in range(len(X_no_cate.columns))]
X_no_cate
pipe_unsuccessful = Pipeline(
[
(
"xgboost",eval_metric="auc")
)
])
X_fname = X_no_str.copy()
X_fname.columns = ["f"+str(i) for i in range(len(X_no_cate.columns))]
# keep only one column
X_fname = X_fname[["f1"]]
X_fname.columns = ["f0"]
pipe_unsuccessful.fit(X_fname,y)
try:
convert_sklearn(pipe_unsuccessful,#target_opset=12 # omg this is so bad
)
except Exception as e:
print(E)
model_onnx = convert_sklearn(pipe_unsuccessful,#target_opset=12 # omg this is so bad
)
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的如何使 ONNX sklearn 转换器支持布尔字符串类型?全部内容,希望文章能够帮你解决如何使 ONNX sklearn 转换器支持布尔字符串类型?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。