我试图找出如何建立一个工作流程sklearn.neighbors.KNeighborsRegressor
包括:放在一起sklearn管道+嵌套交叉验证
- 正常化功能
- 特征选择(20的最佳子集数字特征,没有特定的总)
- 交叉验证超参数K的范围为1〜20
- 交叉验证模型
- 使用RMSE作为误差度量
scikit-learn中有很多不同的选项,我有点不知所措,试图决定我需要哪些类。
而且sklearn.neighbors.KNeighborsRegressor
,我想我需要:
sklearn.pipeline.Pipeline
sklearn.preprocessing.Normalizer
sklearn.model_selection.GridSearchCV
sklearn.model_selection.cross_val_score
sklearn.feature_selection.selectKBest
OR
sklearn.feature_selection.SelectFromModel
会有人请告诉我可能是什么定义这个管道/工作流程是怎样的?我想应该是这样的:
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import Normalizer
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import cross_val_score, GridSearchCV
# build regression pipeline
pipeline = Pipeline([('normalize', Normalizer()),
('kbest', SelectKBest(f_classif)),
('regressor', KNeighborsRegressor())])
# try knn__n_neighbors from 1 to 20, and feature count from 1 to len(features)
parameters = {'kbest__k': list(range(1, X.shape[1]+1)),
'regressor__n_neighbors': list(range(1,21))}
# outer cross-validation on model, inner cross-validation on hyperparameters
scores = cross_val_score(GridSearchCV(pipeline, parameters, scoring="neg_mean_squared_error", cv=10),
X, y, cv=10, scoring="neg_mean_squared_error", verbose=2)
rmses = np.abs(scores)**(1/2)
avg_rmse = np.mean(rmses)
print(avg_rmse)
它似乎没有错误的,但有几个我所关注的是:
- 我有没有正确地执行嵌套的交叉验证,使我的RMSE没有偏见?
- 如果我想根据最佳RMSE选择最终模型,我是否应该使用
scoring="neg_mean_squared_error"
同时使用cross_val_score
和GridSearchCV
? - 是
SelectKBest, f_classif
是用于选择KNeighborsRegressor
型号功能的最佳选择吗? - 我怎么能看到:
- 它的功能子集被选为最佳
- 其中选择K作为最佳
任何帮助,不胜感激!
你的代码似乎很好。另外,这种方法对我来说是正确的。你有任何错误或意外的结果? – sera
嘿,谢谢你的评论。我更新了我的帖子,提供了更多关于我的担忧的信息。 – Austin