我想为在包含 200 个样本、10 个特征和 1 个目标变量的数据上运行的三个回归模型生成学习曲线。
目标变量包含两个集群/峰值,使其在集群之间和集群内部不平衡,因此我应用了分层拆分以使用 train_test_split 将数据分为训练集和测试集,方式如下:
# Stratified Split dataset into Training and Testing
bins = np.linspace(0, 1.01, 10)
y_binned = np.digitize(Y_scaled, bins)
X_train, X_test, Y_train, Y_test = train_test_split(X_scaled, Y_scaled, stratify=y_binned, test_size=0.3, random_state=0)
然后,我使用分层 K 折交叉验证进行超参数优化,对每个模型进行训练和测试。
我现在想使用倾斜曲线来检查验证我的模型没有过度拟合,并且训练和测试分数已经收敛。为此,我转向 sklearn.model_selection.learning_curve。
在 sklearn 的学习曲线的文档中,它说如下:
学习曲线。
确定不同训练集大小的交叉验证训练和测试分数。
交叉验证生成器在训练和测试数据中将整个数据集拆分 k 次。不同大小的训练集子集将用于训练估计器,每个训练子集大小的分数和测试集将被计算。之后,将在每个训练子集大小的所有 k 次运行中平均得分。
我使用Plotting Learning CUrves中定义的函数(带有一个额外的'scorer'变量)和以下代码实现了学习曲线:
cv = StratifiedKFold(n_splits=5, shuffle=False, random_state=0)
title = "Learning Curves (Linear Regression)"
estimator = model_1
plot_learning_curve(estimator, title, r2_score, X_train_0, Y_train_0, train_sizes=np.linspace(0.1, 1.0, 10), \
ylim=(0.1, 1.01), cv=cv, n_jobs=-1)
title = "Learning Curves (Ridge Regression)"
estimator = model_2
plot_learning_curve(estimator, title, r2_score, X_train_0, Y_train_0, train_sizes=np.linspace(0.1, 1.0, 10), \
ylim=(0.1, 1.01), cv=cv, n_jobs=-1)
title = "Learning Curves (Random Forest - Extra Trees)"
estimator = model_3
plot_learning_curve(estimator, title, r2_score, X_train_0, Y_train_0, train_sizes=np.linspace(0.1, 1.0, 10), \
ylim=(0.1, 1.01), cv=cv, n_jobs=-1)
plt.show()
根据代码:
train_sizes=np.linspace(0.1, 1.0, 10
并且
cv = StratifiedKFold(n_splits=5, shuffle=False, random_state=0)
我预计训练数据集(X_train_0)将被拆分为 10 个子集,每个子集将根据整体进行分层(就像在训练和测试期间一样),并且每个然后将这十个子集拆分为分层训练/测试集,训练集进行 5 倍分层 k 折交叉验证。
我将训练数据 X_train_0 和目标 Y_train_0 传递给学习曲线函数,期望获得每个子集的平均训练和测试分数,但是我收到以下错误:
ValueError:支持的目标类型是:('binary','multiclass')。取而代之的是“连续”。
在这一点上,我无法弄清楚如何将学习曲线目标的连续变量传递给估计器,同时生成训练数据集的分层子集。