gpt4 book ai didi

python - 如何使用 GridSearchCV 的结果绘制验证曲线?

转载 作者:行者123 更新时间:2023-12-03 21:13:16 25 4
gpt4 key购买 nike

我正在使用 GridSearchCV 训练模型以找到最佳参数

代码:

grid_params = {
'n_estimators': [100, 200, 300, 400],
'criterion': ['gini', 'entropy'],
'max_features': ['auto', 'sqrt', 'log2']
}

gs = GridSearchCV(
RandomForestClassifier(),
grid_params,
cv=2,
verbose=1,
n_jobs=-1
)

clf = gs.fit(X_train, y_train)

这是一个缓慢的过程,在此之后,我打印混淆矩阵,但我想绘制验证曲线以检查是否存在过度拟合,我使用以下代码:
train_scores, valid_scores = validation_curve(clf.best_estimator_, X, y)

问题是我需要设置 param_name , param_range ,但我不想再次训练,因为这是一个太慢的过程。

另一种选择是使用 gs , 而不是 clf.best_estimator_ ,但我需要 gs训练,以获取其他信息。

如何绘制验证曲线,并保持 gs教练,两次没有火车?

最佳答案

您可以使用 cv_results_ GridSearchCV 的属性并获得每个超参数组合的结果。 Validation Curve旨在描述单个参数值对训练和交叉验证分数的影响。

由于您正在使用 GridSearchCV 微调多个参数,我们可以创建多个图来可视化每个参数的影响。问题在于,当我们想要研究特定参数时,我们必须平均计算其他参数。我们可以通过做 groupby 来实现这一点。分别在每个参数上,然后汇总结果。

我们可以取平均值,但对于标准差,我们必须使用 pooled variance因为每个 CV 的标准偏差几乎是恒定的。



from sklearn.datasets import make_classification
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.ensemble import RandomForestClassifier

X, y = make_classification(n_samples=1000,
n_features=100, n_informative=2,
class_sep=0.5,random_state=42)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

grid_params = {
'n_estimators': [10, 20, 50],
'max_features': ['auto', 'sqrt', 'log2'],
'criterion': ['gini', 'entropy'],
'max_depth': [2, 5, 10]
}

gs = GridSearchCV(
RandomForestClassifier(random_state=42),
grid_params,
cv=5,
verbose=1,
n_jobs=-1,
return_train_score=True # set this for train score
)

gs.fit(X_train, y_train)

import pandas as pd
df = pd.DataFrame(gs.cv_results_)
results = ['mean_test_score',
'mean_train_score',
'std_test_score',
'std_train_score']

def pooled_var(stds):
# https://en.wikipedia.org/wiki/Pooled_variance#Pooled_standard_deviation
n = 5 # size of each group
return np.sqrt(sum((n-1)*(stds**2))/ len(stds)*(n-1))

fig, axes = plt.subplots(1, len(grid_params),
figsize = (5*len(grid_params), 7),
sharey='row')
axes[0].set_ylabel("Score", fontsize=25)


for idx, (param_name, param_range) in enumerate(grid_params.items()):
grouped_df = df.groupby(f'param_{param_name}')[results]\
.agg({'mean_train_score': 'mean',
'mean_test_score': 'mean',
'std_train_score': pooled_var,
'std_test_score': pooled_var})

previous_group = df.groupby(f'param_{param_name}')[results]
axes[idx].set_xlabel(param_name, fontsize=30)
axes[idx].set_ylim(0.0, 1.1)
lw = 2
axes[idx].plot(param_range, grouped_df['mean_train_score'], label="Training score",
color="darkorange", lw=lw)
axes[idx].fill_between(param_range,grouped_df['mean_train_score'] - grouped_df['std_train_score'],
grouped_df['mean_train_score'] + grouped_df['std_train_score'], alpha=0.2,
color="darkorange", lw=lw)
axes[idx].plot(param_range, grouped_df['mean_test_score'], label="Cross-validation score",
color="navy", lw=lw)
axes[idx].fill_between(param_range, grouped_df['mean_test_score'] - grouped_df['std_test_score'],
grouped_df['mean_test_score'] + grouped_df['std_test_score'], alpha=0.2,
color="navy", lw=lw)

handles, labels = axes[0].get_legend_handles_labels()
fig.suptitle('Validation curves', fontsize=40)
fig.legend(handles, labels, loc=8, ncol=2, fontsize=20)

fig.subplots_adjust(bottom=0.25, top=0.85)
plt.show()

enter image description here

注意:对于像 criterion 这样的字符串值的参数,线图不是正确的。 ,您可以将其修改为带有误差条的条形图。

关于python - 如何使用 GridSearchCV 的结果绘制验证曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62363657/

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