如何在 Python 中将数据分成 3 部分 - 训练(70%)、验证(15%)和测试(15%)并且每个部分的目标率相似?

数据挖掘 机器学习 Python scikit-学习 过拟合
2021-10-07 10:42:39

我正在从事一个公司项目,我需要将数据划分为 3 个部分 - 训练、验证和测试(保留)。

有谁知道我如何将数据分成上面的 3 个部分,每个部分将具有相似的响应变量(目标率)-(相似的分类精度和相似的回归平均值(响应)。

我知道如何使用 SKLEARN 中的 train_test_split 函数将数据分成 3 部分

from sklearn.model_selection import train_test_split

x, x_test, y, y_test = train_test_split(xtrain,labels,test_size=0.2,train_size=0.8)
x_train, x_cv, y_train, y_cv = train_test_split(x,y,test_size = 0.25,train_size =0.75)

但这并没有给出类似的目标率,有人可以帮我吗?

2个回答

对于分类,您可以使用以下stratify参数:

分层:类数组或无(默认=无)

如果不是 None,则以分层方式拆分数据,将其用作类标签。

请参阅sklearn.model_selection.train_test_split例如:

x, x_test, y, y_test = train_test_split(xtrain,labels,test_size=0.2, stratify=labels) 

这将确保训练数据和测试数据之间的类分布相似。 (旁注:我已经扔掉了train_size参数,因为它将根据 自动确定test_size

据我所知,对于回归,scikit learn 中目前没有实现。但是你可以在这里这里找到关于交叉验证的讨论和手动实现。

拆分为未在 sklearn 中实现的验证集。但你可以通过棘手的方式做到这一点:

1)第一步,您将 X 和 y 拆分为训练和测试集。

2)在第二步,您将您的训练集从上一步拆分为验证和较小的训练集。

X_train, X_test, y_train, y_test 
    = train_test_split(X, y, test_size=0.7, random_state=123)

X_train, X_val, y_train, y_val 
    = train_test_split(X_train, y_train, test_size=0.5, random_state=123)