基于两组使用Pandas Scikit创建测试/火车拆分 - 学习

时间:2015-11-19 21:59:37

标签: python pandas scikit-learn

我有一个Pandas数据帧:comb ENROLLED_Response条目的数量非常少,因此对整个DataFrame进行随机抽样可能会丢失过多的注册数据。

解决方案是采用ENROLLED_Response == True所有条目的75%样本 然后获取ENROLLED_Response == False

所有条目的70%样本

所以我最终应该在DataFrame上使用is_train / truefalse

所以我通常使用类似的东西:

from sklearn.cross_validation import cross_val_score

#split the dataset for train and test
comb['is_train'] = np.random.uniform(0, 1, len(comb)) <= .75
train, test = comb[comb['is_train']==True],  comb[comb['is_train']==False]

对于大多数情况来说这是好的,但由于注册人数较少,这种方法往往会遗漏太多的“注册”。因为这么少。所以我需要的更像是:

comb['is_train'] = train_test_split(comb['ENROLLED_Response']==True, Train_size = 0.75)
comb['is_train']= train_test_split(comb['ENROLLED_Response']==False, Train_size = 0.75)

当然不起作用。这个概念是:第一个样本注册并标记随机的.75作为列车,然后对非注册(其他所有)进行采样,并将它们标记为.75,作为列车,在同一个新列(is_train)中,这样它就可以了很容易在Scikit_learn中使用,如:

train, test = comb[comb['is_train']==True],comb[comb['is_train']==False]

无法弄清楚如何做到这一点,因为随机生成的np数组与整个DataFrame的长度有关(以及其他问题......)

1 个答案:

答案 0 :(得分:0)

评论后更新:

import pandas as pd
import numpy as np

np.random.seed(42)

truePct = 0.75
falsePct = 0.70

comb = pd.DataFrame({ 
    "feat1": np.random.randint(low=1, high=4, size=20),
    "feat2": np.random.randint(low=1, high=4, size=20),
    "ENROLLED_Response": np.random.randint(low=0, high=4, size=20)==3
})

# Set train to False by default
comb['train'] = False

# Create two permutations for both classes
nTrue = comb[comb.ENROLLED_Response==True].shape[0]
nFalse = comb[comb.ENROLLED_Response==False].shape[0]
truePerm = np.random.permutation(nTrue)[:int(np.floor(truePct*nTrue)-1)]
falsePerm = np.random.permutation(nFalse)[:int(np.floor(falsePct*nFalse)-1)]

# Select the indices
trainTrueIndex = comb[comb.ENROLLED_Response==True].index[truePerm].values.tolist()
trainFalseIndex = comb[comb.ENROLLED_Response==False].index[falsePerm].values.tolist()

comb.loc[trainTrueIndex,'train'] = True
comb.loc[trainFalseIndex,'train'] = True

print comb

结果

   ENROLLED_Response  feat1  feat2  train
0              False      3      1  False
1              False      1      1  False
2              False      3      2  False
3              False      3      2  False
4              False      1      1   True
5              False      1      1   True
6              False      3      1   True
7               True      2      3   True
8              False      3      3  False
9               True      3      3   True
10             False      3      2   True
11             False      3      3   True
12             False      1      2   True
13             False      3      2   True
14             False      2      3  False
15             False      1      2   True
16             False      2      3   True
17              True      2      3  False
18              True      2      1  False
19             False      2      3   True

我并不完全相信我正确地解释了你的问题,但似乎你正在处理ENROLLED_Response变量中的类不平衡。要在训练集和测试集中保留该类不平衡,您可能需要使用不同的Scikit-Learn交叉验证功能:StratifiedShuffleSplit

此函数是StratifiedKFold和ShuffleSplit的合并,它返回分层随机化折叠。通过保留每个类别的样本百分比来进行折叠。