我正在对由StandardScaler, SelectKBest & Lasso
组成的管道进行gridSearch。我从下面的代码中得到的best_params_与最小化grid_scores_:
numComponents=np.arange(20,220,20)
alphas=np.logspace(-6,0,15)
pipe = Pipeline(steps=[('normalize', StandardScaler()), ('selectK', SelectKBest(f_regression)), ('lasso', Lasso())])
gsObj = gridCV(pipe, dict(selectK__k=numComponents.tolist(), lasso__alpha=alphas.tolist()), scoring='mean_squared_error', cv=10, n_jobs=3, pre_dispatch=3)
gsObj.fit(X_train, y_train)
cvMse=np.array([-score[1] for score in gsObj.grid_scores_]).reshape(len(numComponents), len(alphas))
optNumComponents=gsObj.best_params_['selectK__k']
optAlpha=gsObj.best_params_['lasso__alpha']
最低的cvMse
出现在numComponents
指数=5,alpha
指数=7,而gsObj.best_params_ optNumComponents
指数=2,optAlpha
指数=9。
我是否错误地将grid_scores_
重塑为:len(numComponents) x len(alphas)
(因此假设分数是以这种方式排序的)?
引用文档,grid_scores_
是scikit-learn 0.14.1中的命名元组列表,
包含param_grid中所有参数组合的分数。每个条目对应一个参数设置。每个命名元组都有以下属性:参数,参数设置的字典Mean_validation_score,交叉验证折叠的平均得分Cv_validation_scores,每个折叠的分数列表。
所以,不,您不应该依赖于列表中的任何顺序,相反,您应该检查项以找出它们包含的参数。您似乎假设参数是有序的,因为它们在您的代码中,但参数网格是一个dict
,它不保证其键中的任何顺序。