我在由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)
是错误的(因此假设分数是按此方式排序的)?
答案 0 :(得分:0)
引用docs,grid_scores_
是scikit-learn 0.14.1中的命名元组列表,
包含param_grid中所有参数组合的分数。每个条目对应一个参数设置。每个命名元组都具有以下属性: 参数,参数设置的字典 mean_validation_score,交叉验证折叠的平均得分 cv_validation_scores,每个折叠的分数列表。
所以不,你不应该依赖这个列表中的任何订单,而应该检查项目以找出它们包含的参数。您似乎假设参数按照您的代码排序,但参数网格为dict
,但不保证其键中的任何顺序。