为啥 GridSearchCV 返回的分数与直接运行模型返回的分数如此不同?

Posted

技术标签:

【中文标题】为啥 GridSearchCV 返回的分数与直接运行模型返回的分数如此不同?【英文标题】:Why GridSearchCV return score so different from the score returned by running model directly?为什么 GridSearchCV 返回的分数与直接运行模型返回的分数如此不同? 【发布时间】:2017-01-18 18:01:38 【问题描述】:

我使用 GridSearchCV 为套索模型找到了最佳 alpha。

alphas = np.logspace(-5, 2, 30)
grid = GridSearchCV(estimator=Lasso(),
param_grid=dict(alpha=alphas), cv=10, scoring='r2')
grid.fit(self.X, self.Y) # entire datasets were fed here

print grid.best_params_, grid.best_score_ # score -0.0470788758558
for params, mean_score, scores in grid.grid_scores_:
    print mean_score, params

我得到的最佳参数是 0.0014873521072935117,负 r2 得分为 -0.0470788758558。


然后我直接在模型上尝试了这个 alpha。我循环运行了以下代码。

X_train, X_test, y_train, y_test = train_test_split(self.X, self.Y, train_size=0.7)
lasso = Lasso(alpha=0.001487)
lasso.fit(X_train, y_train)
print lasso.score(X_test, y_test)

请注意,我没有设置随机状态,所以它应该可以作为交叉验证。但是无论我运行多少次代码,我在这里得到的分数都在 0.11 左右(0.11-0.12)。


问题

为什么这两种方法的分数 -0.0470788758558 和 0.11 如此不同?

【问题讨论】:

【参考方案1】:

我找到了原因。

cv 应该这样设置:

cv = ShuffleSplit(n=len(X), n_iter=10, test_size=.3)

当 cv 等于整数时,表示每次迭代有多少折,而不是迭代次数。

【讨论】:

以上是关于为啥 GridSearchCV 返回的分数与直接运行模型返回的分数如此不同?的主要内容,如果未能解决你的问题,请参考以下文章

我从 GridSearchCV 获得的 R^2 分数与我从 cross_val_score 获得的分数非常不同,为啥? (sklearn,python)

为啥当我将 GridSearchCV 与 roc_auc 评分一起使用时,grid_search.score(X,y) 和 roc_auc_score(y, y_predict) 的分数不同?

在 GridSearchCV 和 RandomizedSearchCV 中获取单个模型和自定义分数 [重复]

如何在 scikit-learn 的分类问题中为 F1 分数做 GridSearchCV?

GridSearchCV:选定类的性能指标[不平衡数据集]

为啥 sklearn.grid_search.GridSearchCV 在每次执行时都会返回随机结果?