Python 将数据拆分为训练/测试文件,以便为两个文件至少选取一个样本
我有一个csv文件,它被读入一个数据帧。我根据一列的值将其拆分为培训和测试文件 假设该列称为“category”,它有几个类别名称作为列值 如cat1、cat2、cat3等重复多次 我需要分割文件,使每个类别名称在两个文件中至少出现一次 到目前为止,我能够根据比率将文件拆分为两个。我尝试了很多选择,但这是迄今为止最好的一个Python 将数据拆分为训练/测试文件,以便为两个文件至少选取一个样本,python,pandas,scikit-learn,sklearn-pandas,Python,Pandas,Scikit Learn,Sklearn Pandas,我有一个csv文件,它被读入一个数据帧。我根据一列的值将其拆分为培训和测试文件 假设该列称为“category”,它有几个类别名称作为列值 如cat1、cat2、cat3等重复多次 我需要分割文件,使每个类别名称在两个文件中至少出现一次 到目前为止,我能够根据比率将文件拆分为两个。我尝试了很多选择,但这是迄今为止最好的一个 def executeSplitData(self): data = self.readCSV() df = data if sel
def executeSplitData(self):
data = self.readCSV()
df = data
if self.column in data:
train, test = train_test_split(df, stratify = None, test_size=0.5)
self.writeTrainFile(train)
self.writeTestFile(test)
我不完全理解test\u train\u split中的分层选项。
请帮忙。谢谢我试着根据使用它,但无法使
分层
工作
安装程序
如果我尝试:
train, test = train_test_split(df, stratify=df.category, test_size=.5)
train, test = train_test_split(df, stratify=df.category.values, test_size=.5)
train, test = train_test_split(df, stratify=df.category.values.tolist(), test_size=.5)
所有人都返回了一个:
TypeError:传递的参数无效:
文件说:
分层:类似数组或无(默认为无)
我想不出这为什么行不通
我决定围绕以下方面开展工作:
def stratify_train_test(df, stratifyby, *args, **kwargs):
train, test = pd.DataFrame(), pd.DataFrame()
gb = df.groupby(stratifyby)
for k in gb.groups:
traink, testk = train_test_split(gb.get_group(k), *args, **kwargs)
train = pd.concat([train, traink])
test = pd.concat([test, testk])
return train, test
train, test = stratify_train_test(df, 'category', test_size=.5)
# this also works
# train, test = stratify_train_test(df, df.category, test_size=.5)
print get_freq(train.category)
print len(train)
Name: category, dtype: float64
cat4 0.400
cat3 0.284
cat2 0.208
cat1 0.108
Name: category, dtype: float64
500
print get_freq(test.category)
print len(test)
cat4 0.400
cat3 0.284
cat2 0.208
cat1 0.108
Name: category, dtype: float64
500
嗨,皮尔德。。谢谢你的帮助。但是我需要更多的信息。。每个类别都会添加到最后的两个文件中,但不会发生拆分。打印测试1类别列2 0 1 A 1 1 A 2 B 3 C 4 3 C 5 4 D 1 A 2 B 4 3 C 5 4 D>>打印列1类别列2 0 1 A 1 A 2 B 3 3 C 4 3 C 5 4 D 0 1 A 3 C
def stratify_train_test(df, stratifyby, *args, **kwargs):
train, test = pd.DataFrame(), pd.DataFrame()
gb = df.groupby(stratifyby)
for k in gb.groups:
traink, testk = train_test_split(gb.get_group(k), *args, **kwargs)
train = pd.concat([train, traink])
test = pd.concat([test, testk])
return train, test
train, test = stratify_train_test(df, 'category', test_size=.5)
# this also works
# train, test = stratify_train_test(df, df.category, test_size=.5)
print get_freq(train.category)
print len(train)
Name: category, dtype: float64
cat4 0.400
cat3 0.284
cat2 0.208
cat1 0.108
Name: category, dtype: float64
500
print get_freq(test.category)
print len(test)
cat4 0.400
cat3 0.284
cat2 0.208
cat1 0.108
Name: category, dtype: float64
500