首页 > 解决方案 > 训练数据上的gridCV.score方法与gridCV.best_score_之间的区别

问题描述

我对 randomsearch.score 方法(得分 1)和 randomsearch.best_score_ 属性(得分 2)之间的区别有疑问。

特别是当 randomsearch.score 应用于 X_train 和 y_train 时。

我认为 randomsearchCV 会自动查找在训练集上得分最高的参数?我会假设 randomsearch.score(Xtrain, ytrain) 将与 randomsearch.best_params_ 分数相同?

from sklearn.model_selection import RandomizedSearchCV

def evaluate_model(model, param_grid, n_iter=100):
    random_search = RandomizedSearchCV(model, 
                                       param_grid, 
                                       cv=5, 
                                       n_jobs=2, 
                                       verbose=1, 
                                       n_iter=n_iter)

    random_search.fit(X_train, y_train)

    print (random_search.score(X_train, y_train)) # Score 1
    print (random_search.best_score_) # Score 2
    print (random_search.score(X_test, y_test)) # Score 3

    return random_search

  rgr = GradientBoostingRegressor(n_estimators=50)
  param_grid = {"max_depth": range(1,10,1)}

  gradient_boosting = evaluate_model(rgr, param_grid)

而是返回

Score 1: 0.9585014239352219
Score 2: 0.7129331788310186
Score 3: 0.7530744077231204

标签: pythonscikit-learn

解决方案


使用random_search.score(X_train, y_train),您正在测试用于训练的相同数据,因此得分如此之高。这是(几乎)完全没有意义的信息**,因为它不会告诉您模型在看不见的数据中的表现如何。

cv=5表示您的数据针对每个超参数设置进行了 5 次分区,每个分区中 20% 的数据用于测试,80% 用于训练。然后对这 5 个测试集的结果进行平均。然后在所有可能的超参数设置中记录最高的此类平均值random_search.best_score_。所以关键的区别是你没有评估用于训练的相同数据的性能,因此分数相对较低。

random_search.score(X_test, y_test)与您在看不见的数据上评估模型相同best_score_,但它是实际泛化性能的更好指标。但是,与您的模型不同score 2的是,您的模型已使用 100% 的训练数据(而不是 80%)进行了训练。这是为什么score 3优于的一种可能解释score 2

**如果这个值很低,你就知道你的模型是欠拟合的,应该尝试增加模型的复杂度,比如向 NN 添加更多的隐藏层,或者增加max_depth决策树。


推荐阅读