尝试自定义计算grid.best_score_(使用GridSearchCV获得)

时间:2016-12-15 23:04:09

标签: scikit-learn

我正在尝试重新计算grid.best_score_我在自己的数据上获得的结果没有成功... 所以我尝试使用传统的数据集,但没有更多的成功。这是代码:

from sklearn import datasets
from sklearn import linear_model
from sklearn.cross_validation import ShuffleSplit
from sklearn import grid_search
from sklearn.metrics import r2_score

import numpy as np

lr = linear_model.LinearRegression()
boston = datasets.load_boston()
target = boston.target
param_grid = {'fit_intercept':[False]}
cv = ShuffleSplit(target.size, n_iter=5, test_size=0.30, random_state=0)
grid = grid_search.GridSearchCV(lr, param_grid, cv=cv)
grid.fit(boston.data, target)
# got cv score computed by gridSearchCV :
print grid.best_score_

0.677708680059

# now try a custom computation of cv score
cv_scores = []
for (train, test) in cv:
    y_true = target[test]
    y_pred = grid.best_estimator_.predict(boston.data[test,:])
    cv_scores.append(r2_score(y_true, y_pred))

print np.mean(cv_scores)

0.703865991851

我看不出为什么会有所不同,GridSearchCV应该使用LinearRegression的得分手,这是r2得分。也许我编码cv得分的方式不是用于计算best_score_的方式...我在通过GridSearchCV代码之前在这里问。

1 个答案:

答案 0 :(得分:2)

除非refit=False构造函数中的GridSearchCV,否则获胜的估算工具会在fit的末尾对整个数据集进行重新设定。 best_score_是使用交叉验证拆分的估算员平均得分,而best_estimator_是适用于所有数据的获胜配置的估算。

lr2 = linear_model.LinearRegression(fit_intercept=False)
scores2 = [lr2.fit(boston.data[train,:], target[train]).score(boston.data[test,:], target[test])
           for train, test in cv]
print np.mean(scores2)

将打印0.67770868005943297