【问题标题】:Export KNN best estimator from GridSearchCV to PMML将 KNN 最佳估计器从 GridSearchCV 导出到 PMML
【发布时间】:2018-04-19 05:27:47
【问题描述】:

我尝试将 KNN 模型保存到 anaconda 中的 PMML。但它不起作用。

我的脚本:

#### load iris dataset
iris_dt = pd.read_csv('iris.csv' , header = 0)
#### Create development and evaluation samples
X_train_dev, X_test, y_train_dev, y_test =  train_test_split(iris_dt.ix[:, 0:4],
                                                         iris_dt['Species'],
                                                test_size=0.05,
                                                random_state=36851235,
                                                stratify=iris_dt['Species'])
#### Train KNNClassifier
# tune CV
crossv = StratifiedKFold(n_splits=10, random_state=36851234)
# tune GridSearchCV parameters
param_grid = {'n_neighbors': np.arange(1, 30)}

knn = KNeighborsClassifier()
knn_randomcv = RandomizedSearchCV(knn,
                              param_grid ,
                              n_iter = 15,
                              scoring = 'f1_weighted',
                              cv = crossv,
                              random_state=36851232)
knn_randomcv = knn_randomcv.fit(X_train_dev, y_train_dev)  

# choose best estimator
knn_best_random = knn_randomcv.best_estimator_

#### Save best estimator like pmml
pipeline = PMMLPipeline([("knn_best_estimator",knn_randomcv.best_estimator_)])

pipeline.active_fields = X_train_dev.columns.values
pipeline.target_field = y_train_dev.name

sklearn2pmml(pipeline, "KNNFit_py.pmml", debug = 'True') 

我的调试日志:

  • 蟒蛇:2.7.14
  • sklearn:0.19.1
  • sklearn.externals.joblib:0.11
  • 熊猫:0.20.3
  • sklearn_pandas:1.6.0
  • sklearn2pmml: 0.35.0

当我尝试启动 java 转换器时,我得到更详细的错误:

SEVERE: Failed to convert
java.lang.ClassCastException: numpy.core.Scalar cannot be cast to java.lang.Number
    at sklearn.neighbors.KNeighborsClassifier.getNumberOfNeighbors(KNeighborsClassifier.java:70)
    at sklearn.neighbors.KNeighborsUtil.encodeNeighbors(KNeighborsUtil.java:130)
    at sklearn.neighbors.KNeighborsClassifier.encodeModel(KNeighborsClassifier.java:57)
    at sklearn.neighbors.KNeighborsClassifier.encodeModel(KNeighborsClassifier.java:32)
    at sklearn2pmml.pipeline.PMMLPipeline.encodePMML(PMMLPipeline.java:161)
    at org.jpmml.sklearn.Main.run(Main.java:145)
    at org.jpmml.sklearn.Main.main(Main.java:94)

Exception in thread "main" java.lang.ClassCastException: numpy.core.Scalar cannot be cast to java.lang.Number
    at sklearn.neighbors.KNeighborsClassifier.getNumberOfNeighbors(KNeighborsClassifier.java:70)
    at sklearn.neighbors.KNeighborsUtil.encodeNeighbors(KNeighborsUtil.java:130)
    at sklearn.neighbors.KNeighborsClassifier.encodeModel(KNeighborsClassifier.java:57)
    at sklearn.neighbors.KNeighborsClassifier.encodeModel(KNeighborsClassifier.java:32)
    at sklearn2pmml.pipeline.PMMLPipeline.encodePMML(PMMLPipeline.java:161)
    at org.jpmml.sklearn.Main.run(Main.java:145)
    at org.jpmml.sklearn.Main.main(Main.java:94)

请帮忙。

【问题讨论】:

    标签: python scikit-learn knn grid-search pmml


    【解决方案1】:

    根据文档:

    n_neighbors : int, optional (default = 5)
    
        Number of neighbors to use by default for kneighbors queries.
    

    n_neighbors 应该是一个简单的int

    当您执行np.arange(1, 30) 时,它返回一个numpy.int64,而不是python 内置的int。我认为 Sklearn-jpmml 无法处理 numpy.int64 代替 int ,因此出现错误:

    numpy.core.Scalar cannot be cast to java.lang.Number
    

    改为:

    param_grid = {'n_neighbors': range(1, 30)}
    

    错误就会消失。

    编辑:已发布 github issue on the problem here

    【讨论】:

    猜你喜欢
    • 2022-07-19
    • 2020-09-19
    • 2017-10-14
    • 2019-04-01
    • 1970-01-01
    • 2020-04-25
    • 2018-12-27
    • 2021-05-12
    • 2013-05-31
    相关资源
    最近更新 更多