使用 StratifiedKFold 分割数据集时,为什么不能将连续变量用于学习曲线的估计?

数据挖掘 学习
2022-03-11 02:21:07

我想为在包含 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')。取而代之的是“连续”。

在这一点上,我无法弄清楚如何将学习曲线目标的连续变量传递给估计器,同时生成训练数据集的分层子集。

0个回答
没有发现任何回复~