下面这个极其简化的DataFrame表示一个包含医疗诊断的更大的DataFrame:
medicalData = pd.DataFrame({'diagnosis':['positive','positive','negative','negative','positive','negative','negative','negative','negative','negative']})
medicalData
diagnosis
0 positive
1 positive
2 negative
3 negative
4 positive
5 negative
6 negative
7 negative
8 negative
9 negative
问题:对于机器学习,我需要将此 Dataframe 随机拆分为三个子帧,方法如下:
trainingDF, validationDF, testDF = SplitData(medicalData,fractions = [0.6,0.2,0.2])
...其中分割数组指定进入每个子帧的完整数据的部分。
- 子帧中的数据需要是互斥的,并且分割阵列(分数)需要总和为1。
*另外,每个子集中阳性诊断的分数需要大致相同。 - Answers to this question建议使用the pandas sample method或the train_test_split function from sklearn。但这些解决方案似乎都不能很好地推广到n分裂,也没有一个提供分层分裂。
4条答案
按热度按时间gab6jxml1#
np.array_split
如果你想推广到
n
分割,np.array_split
是你的朋友(它可以很好地处理DataFrames)。train_test_split
使用
train_test_split
进行分层分裂的多风解。其中
X
是要素的DataFrame,y
是标签的单列DataFrame。rseugnpd2#
下面是一个Python函数,它将Pandas Dataframe 拆分为训练、验证和测试 Dataframe ,并使用***分层采样***。它通过调用scikit-learn的函数
train_test_split()
两次来执行此拆分。下面是一个完整的工作示例。
考虑一个数据集,该数据集具有要对其执行分层的标签。这个标签在原始数据集中有自己的分布,比如75%
foo
,15%bar
和10%baz
。现在,让我们使用60/20/20的比例将数据集分割为训练、验证和测试子集,其中每个分割都保留相同的标签分布。请参见下图:以下是示例数据集:
现在,让我们调用上面的
split_stratified_into_train_val_test()
函数,以获得遵循60/20/20比率的训练、验证和测试 Dataframe 。三个 Dataframe
df_train
、df_val
和df_test
包含所有原始行,但它们的大小将遵循上述比例。此外,三个分割中的每一个将具有相同的标签分布,即75%
foo
、15%bar
和10%baz
。2g32fytz3#
在@stackoverflowuser2010 answer中,我添加了一个字典,用于为不太频繁的标签(<10)分配手动比率,该字典给出了函数{amount_of_examples:[train_length,瓦尔,test]}。结果如下:
f2uvfpb94#
纯
pandas
方案按照70 / 20 / 10%的比例分成培训/验证/测试: