我想在pandas数据帧上进行测试、训练、有效,但我不想生成新的数据帧。相反,我想在Split = ['train','valid','test']
中添加一个名为"Split"的新列。我希望'train'
、'valid'
、'test'
分别随机分布在行的64%
、16%
和20%
中。
我知道scikit learn的train_testrongplit,但我不想要新的框架。所以我可以试试:
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2)
但我只想要一个列"Split",其中包含train、valid和test的值作为标签。这是为了机器学习的目的,所以我想确保分裂是完全随机的。
有人知道这是怎么可能的吗?
这里有一种方法,使用建议的numpy.random.choice
:
import pandas as pd
import numpy as np
# Set up a little example
data = np.ones(shape=(100, 3))
df = pd.DataFrame(data, columns=['x1', 'x2', 'y'])
df['split'] = pd.NA
# Split
split = ['train', 'valid', 'test']
df['split'] = df['split'].apply(lambda x: np.random.choice(split, p=[0.64, 0.16, 0.20]))
# Verify
df['split'].value_counts()
对于一次给定的运行,这产生了
train 64
valid 19
test 17
Name: split, dtype: int64