不平衡数据集拆分

时间:2018-07-15 04:25:23

标签: validation machine-learning classification

不平衡的dataset的最佳技术是什么?

我有一个11967年的dataset实例,其中正标记的数量为139,负标记的数量为11828。

如何拆分dataset进行测试(在该技术之前或之后)?

3 个答案:

答案 0 :(得分:2)

处理不平衡数据集的好方法很少:

欠采样:这意味着采用较少的多数类(在您的情况下为负标签,以便使新数据集平衡)。

过采样:这意味着复制少数类(正标签)的数据以平衡数据集。

还有第三种处理不平衡数据集的方法,即 smote 。随时查看此链接:https://www.analyticsvidhya.com/blog/2016/09/this-machine-learning-project-on-imbalanced-data-can-add-value-to-your-resume/

答案 1 :(得分:0)

我建议您在sklearn.model_selection.train_test_split中使用 stratify 方法。如果设置此statify ='y'(y是数据集的标签),则将对数据进行划分,以使训练集和测试集包含相等百分比的正样本和负样本。这在不平衡的数据集中非常有用。除了将数据集随机分为两个部分之外,它还会考虑标签。

这是示例代码:

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

有关更多信息,请参阅文档: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

答案 2 :(得分:0)

使用sklearn分割数据集的标准方法如下:

#splitting the datasets into training and validation sets (60% training)
from sklearn.model_selection import train_test_split
xTrain, xVald, yTrain, yVald = train_test_split(Xs, y, train_size=0.60, random_state = 2)

其中Xs和y是预测变量和响应变量。

如前所述,您的数据集的类分布不均衡。这种分布不允许您构建预测模型,因为该模型会将您的罕见事件(阳性水平)视为随机噪声,并且无法很好地预测新数据集。

在建立任何预测模型之前,您可能必须对稀有事件进行升采样以使其在分布中达到平衡。如果您想坚持原始分布,则可以运行随机森林模型,该模型也适用于不平衡数据。有关更多信息,请参见以下链接: https://elitedatascience.com/imbalanced-classes

如果要对数据进行上采样,则可以尝试以下操作:

from sklearn.utils import resample
# Separate majority and minority classes
df_majority = df[df.pos_neg==0] #I classified negative class as '0'
df_minority = df[df.pos_neg==1]

# Upsample minority class
df_minority_upsampled = resample(df_minority, 
                                 replace=True,       # sample with replacement
                                 n_samples=11828,    # to match majority class
                                 random_state=123)   # reproducible results

# Combine majority class with upsampled minority class
df_upsampled = pd.concat([df_majority, df_minority_upsampled])

# Display new class counts
df_upsampled.value_counts()
# 1    11828
# 0    11828