【发布时间】:2022-01-21 13:53:22
【问题描述】:
我正在尝试在 Scikit-learn 中针对存储在专用字典中的多个训练数据集上具有不同超参数的特定算法执行网格搜索。首先,我调用不同的超参数和要使用的模型:
scoring = ['accuracy', 'balanced_accuracy', 'f1', 'precision', 'recall']
grid_search = {}
for key in X_train_d.keys():
cv = StratifiedKFold(n_splits=5, random_state=1)
model = XGBClassifier(objective="binary:logistic", random_state=42)
space = dict()
space['n_estimators']=[50] # 200
space['learning_rate']= [0.5] #0.01, 0.3, 0.5
grid_search= GridSearchCV(model, space, scoring=scoring, cv=cv, n_jobs=3, verbose=2, refit='balanced_accuracy')
然后,我创建一个空字典,该字典应填充与 X_train_d.keys() 一样多的 GridSearchCV 对象,通过:
grid_result = {}
for key in X_train_d.keys():
grid_result[key] = grid_search.fit(X_train_d[key], Y_train_d[key])
最后,我通过以下方式创建与现有键报告评分等信息一样多的数据集:
df_grid_results = {}
for key in X_train_d.keys():
df_grid_results[key]=pd.DataFrame(grid_search.cv_results_)
df_grid_results[key] = (
df_grid_results[key]
.set_index(df_grid_results[key]["params"].apply(
lambda x: "_".join(str(val) for val in x.values()))
)
.rename_axis('kernel')
)
一切都“完美”地工作——在某种意义上没有显示错误——除了当我检查不同的 GridSearchCV 对象或 df_grid_results 数据集时,我看到结果都是相同的,就好像模型适合相同数据集一遍又一遍,而 X_train_d 和 Y_train_d 字典包含不同的数据集。
当然,当我单独拟合模型时,例如:
model1_cv = grid_search.fit(X_train_d[1], Y_train_d[1])
model2_cv = grid_search.fit(X_train_d[2], Y_train_d[2])
结果与预期不同。
我觉得我在这里错过了一些非常愚蠢和明显的东西。有人可以帮忙吗?谢谢!
【问题讨论】:
-
欢迎来到堆栈溢出,请提供一段工作代码,以便我们尝试和帮助。这里 X_train_d 没有定义。在这里,您似乎每次都使用覆盖 grid_search 变量,因此它只保留最后一个。这可以解释你的结果。在进行下一个循环之前,您必须在同一循环中定义和使用 grid_search。
标签: python scikit-learn classification grid-search gridsearchcv