【问题标题】:Sklearn GridSearch with PredefinedSplit scoring does not match a standalone classifier具有 PredefinedSplit 评分的 Sklearn GridSearch 与独立分类器不匹配
【发布时间】:2019-08-17 17:12:30
【问题描述】:

我正在使用 sklearn GridSearch 使用预定义的验证集来查找随机森林分类的​​最佳参数。 GridSearch 返回的最佳估计器的分数与训练具有相同参数的单独分类器获得的分数不匹配。

数据拆分定义

X = pd.concat([X_train, X_devel])
y = pd.concat([y_train, y_devel])
test_fold = -X.index.str.contains('train').astype(int)
ps = PredefinedSplit(test_fold)

GridSearch 定义

n_estimators = [10]
max_depth = [4]
grid = {'n_estimators': n_estimators, 'max_depth': max_depth}

rf = RandomForestClassifier(random_state=0)
rf_grid = GridSearchCV(estimator = rf, param_grid = grid, cv = ps, scoring='recall_macro')
rf_grid.fit(X, y)

分类器定义

clf = RandomForestClassifier(n_estimators=10, max_depth=4, random_state=0)
clf.fit(X_train, y_train)

召回率是使用 sklearn.metrics.recall_score 显式计算的

y_pred_train = clf.predict(X_train)
y_pred_devel = clf.predict(X_devel)

uar_train = recall_score(y_train, y_pred_train, average='macro')
uar_devel = recall_score(y_devel, y_pred_devel, average='macro')

网格搜索

uar train:  0.32189884516029466
uar devel:  0.3328299259976279

随机森林:

uar train:  0.483040291148839
uar devel:  0.40706644557392435

这种不匹配的原因是什么?

【问题讨论】:

    标签: python validation scikit-learn grid-search scoring


    【解决方案1】:

    这里有多个问题:

    1. recall_score 的输入参数是相反的。实际正确的顺序是:

      recall_score(y_true, y_test)
      

      但你正在做:

      recall_score(y_pred_train, y_train, average='macro')
      

      更正为:

      recall_score(y_train, y_pred_train, average='macro')
      
    2. 您正在使用rf_grid.fit(X, y) 进行网格搜索。这意味着在找到最佳参数组合后,GridSearchCV 将适合整个数据(整个 X,忽略 PredefinedSplit,因为它仅在交叉验证期间用于搜索最佳参数)。所以本质上,来自GridSearchCV 的估计器会看到整个数据,所以分数会与你在clf.fit(X_train, y_train) 时得到的不同

    【讨论】:

    • 感谢您的见解。改变参数的顺序后仍有一些不清楚的地方,在整个数据集上重新训练后的召回率预计会提高(因为分类器现在已经看到了所有的数据),但是训练和开发子集的召回率仍然较低。任何线索为什么会这样?
    • @OxanaVerkholyak 很抱歉,如果没有看到数据样本,我不能再说什么。可能有很多事情:1)您的训练测试拆分是否平衡? 2)您的数据是否不平衡? 3) 有多少个班? “recall_macro”不考虑标签不平衡。也许这可能是原因。其他指标、准确性、混淆矩阵等呢?请发布完整的代码以及可能产生此结果的一些示例数据。
    【解决方案2】:

    这是因为在您的GridSearchCV 中,您使用的评分函数为recall-macro,它基本上返回recall score,即macro 的平均值。见this link

    但是,当您从 RandomForestClassifier 返回默认分数时,它会返回 mean accuracy。所以,这就是分数不同的原因。有关相同信息,请参阅this link。 (因为一个是召回率,另一个是准确率)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2021-01-13
      • 2017-06-26
      • 2017-10-12
      • 2019-04-25
      • 2018-10-20
      • 2016-12-25
      相关资源
      最近更新 更多