Python – 自定义抽样获取训练和测试数据

我有一个高度不平衡的数据集。

我的数据集包含1450条记录,输出为二元的0和1。输出0有1200条记录,输出1有250条记录。

我使用以下代码来构建模型的测试和训练数据集。

from sklearn.cross_validation import train_test_split X = Actual_DataFramey = Actual_DataFrame.pop('Attrition')X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.20, random_state=42, stratify=y)

但我希望通过一个函数来指定训练数据的记录数量,以及其中来自类别’0’和类别’1’的百分比各是多少。

因此,需要一个函数,该函数接受2个输入来创建训练数据:-训练数据的总记录数,-属于类别'1'的记录数

这将极大地帮助解决有偏见的抽样数据集问题。


回答:

你可以简单地编写一个与sklearn中的train_test_split非常相似的函数。基本思路是从输入参数train_sizepos_class_size中计算出你需要多少正类样本和负类样本。

def custom_split(X, y, train_size, pos_class_size, random_state=42):    neg_class_size = train_size = pos_class_size    pos_df = X[y == 1]    neg_df = X[y == 0]    pos_train = pos_df.sample(pos_class_size)    pos_test = pos_df[~pos_df.index.isin(pos_train.index)]    neg_train = neg_df.sample(neg_class_size)    neg_test = neg_df[~neg_df.index.isin(neg_train.index)]    X_train = pd.concat([pos_train,neg_train], axis=1)    X_test = pd.concat([pos_test,neg_test], axis=1)    y_train = y[X_train.index]    y_test = y[X_test.index]    return X_train, X_test, y_train, y_test

有更节省内存或运行更快的方法,我没有对这段代码进行任何测试,但它应该能工作。

至少,你应该能理解背后的思路。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注