程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使 ONNX sklearn 转换器支持布尔字符串类型?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使 ONNX sklearn 转换器支持布尔字符串类型??

开发过程中遇到如何使 ONNX sklearn 转换器支持布尔字符串类型?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使 ONNX sklearn 转换器支持布尔字符串类型?的解决方法建议,希望对你解决如何使 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,请注明来意。