具有 PredefinedSplit 评分的 Sklearn GridSearch

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

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


梵蒂冈之花
浏览 338回答 2
2回答

慕田峪4524236

这里有多个问题:您的输入参数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')你正在做rf_grid.fit(X, y)网格搜索。这意味着在找到最佳参数组合后,GridSearchCV 将拟合整个数据(整个 X,忽略 ,PredefinedSplit因为它仅在交叉验证期间用于搜索最佳参数)。所以从本质上讲,估计者GridSearchCV会看到整个数据,所以分数会与你得到的结果不同clf.fit(X_train, y_train)

慕村9548890

这是因为在你GridSearchCV正在使用的计分功能recall-macro基本上返回recall score其macro平均值。请参阅此链接。但是,当您返回默认分数时,RandomForestClassifier它会返回mean accuracy. 所以,这就是分数不同的原因。有关相同信息,请参阅此链接。(因为一个是召回率,另一个是准确率)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python