gpt4 book ai didi

python - 具有 PredefinedSplit 评分的 Sklearn GridSearch 与独立分类器不匹配

转载 作者:行者123 更新时间:2023-11-30 21:57:03 25 4
gpt4 key购买 nike

我正在使用 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)

网格搜索定义

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

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

最佳答案

这里有多个问题:

  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) 时获得的分数不同

关于python - 具有 PredefinedSplit 评分的 Sklearn GridSearch 与独立分类器不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55372067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com