sklearn中估计器管道的参数clf无效

Posted

技术标签:

【中文标题】sklearn中估计器管道的参数clf无效【英文标题】:Invalid parameter clf for estimator Pipeline in sklearn 【发布时间】:2018-06-24 13:50:52 【问题描述】:

谁能检查以下代码的问题? 在构建模型的任何步骤中我错了吗? 我已经在参数中添加了两个“clf__”。

clf=RandomForestClassifier()
pca = PCA()
pca_clf = make_pipeline(pca, clf) 


kfold = KFold(n_splits=10, random_state=22)



parameters = 'clf__n_estimators': [4, 6, 9], 'clf__max_features': ['log2', 
'sqrt','auto'],'clf__criterion': ['entropy', 'gini'], 'clf__max_depth': [2, 
 3, 5, 10], 'clf__min_samples_split': [2, 3, 5],
'clf__min_samples_leaf': [1,5,8] 

grid_RF=GridSearchCV(pca_clf,param_grid=parameters,
        scoring='accuracy',cv=kfold)
grid_RF = grid_RF.fit(X_train, y_train)
clf = grid_RF.best_estimator_
clf.fit(X_train, y_train)
grid_RF.best_score_

cv_result = cross_val_score(clf,X_train,y_train, cv = kfold,scoring = 
"accuracy")

cv_result.mean()

【问题讨论】:

【参考方案1】:

您假设以错误的方式使用make_pipeline。来自the documentation:-

这是 Pipeline 构造函数的简写;它不需要, 并且不允许,命名估计器。相反,他们的名字将 自动设置为它们类型的小写。

这意味着当您提供 PCA 对象时,其名称将设置为“pca”(小写),而当您向其提供 RandomForestClassifier 对象时,它将被命名为“randomforestclassifier”,而不是“clf”你在想。

所以现在您创建的参数网格无效,因为它包含clf__ 并且它不存在于管道中。

解决方案 1:

替换这一行:

pca_clf = make_pipeline(pca, clf) 

pca_clf = Pipeline([('pca', pca), ('clf', clf)])

解决方案 2:

如果您不想更改pca_clf = make_pipeline(pca, clf) 行,则将parameters 中所有出现的clf 替换为'randomforestclassifier',如下所示:

parameters = 'randomforestclassifier__n_estimators': [4, 6, 9], 
              'randomforestclassifier__max_features': ['log2', 'sqrt','auto'],
              'randomforestclassifier__criterion': ['entropy', 'gini'], 
              'randomforestclassifier__max_depth': [2, 3, 5, 10], 
              'randomforestclassifier__min_samples_split': [2, 3, 5],
              'randomforestclassifier__min_samples_leaf': [1,5,8] 

旁注:无需在您的代码中执行此操作:

clf = grid_RF.best_estimator_
clf.fit(X_train, y_train)

best_estimator_ 已经配备了具有最佳参数的整个数据,因此调用 clf.fit() 是多余的。

【讨论】:

以上是关于sklearn中估计器管道的参数clf无效的主要内容,如果未能解决你的问题,请参考以下文章

在 Sklearn 管道和交叉验证中使用缩放器

GridSearchCV 和 ValueError:估计器管道的参数 alpha 无效

在 sklearn 管道中转换估计器的结果

我如何使用不在 sklearn 中的估计器进行模型管道

sklearn 管道的参数无效

是否可以将多个管道组合到 Neuraxle 或 sklearn 中的单个估计器中以创建多输出分类器并一次性适应