我正在使用 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.32189884516029466uar devel: 0.3328299259976279随机森林:uar train: 0.483040291148839uar devel: 0.40706644557392435这种不匹配的原因是什么?
2 回答
慕田峪4524236
TA贡献1875条经验 获得超5个赞
这里有多个问题:
您的输入参数
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)
添加回答
举报
0/150
提交
取消