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无效的主要内容,如果未能解决你的问题,请参考以下文章