如何用pandas从一个数据框中创建测试和训练样本?
我有一个比较大的数据集,格式是一个数据框(dataframe),我想知道怎么把这个数据框随机分成两个部分,一个占80%用来训练,另一个占20%用来测试。
谢谢!
30 个回答
34
不需要转换成numpy。直接用pandas的数据框(df)来进行分割,这样会返回一个pandas的数据框。
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2)
如果你想把x和y分开
X_train, X_test, y_train, y_test = train_test_split(df[list_of_x_cols], df[y_col],test_size=0.2)
如果你想分割整个数据框
X, y = df[list_of_x_cols], df[y_col]
42
我会使用scikit-learn自带的训练测试分割功能,然后从索引中生成数据。
from sklearn.model_selection import train_test_split
y = df.pop('output')
X = df
X_train,X_test,y_train,y_test = train_test_split(X.index,y,test_size=0.2)
X.iloc[X_train] # return dataframe train
433
Pandas的随机抽样也可以用
train=df.sample(frac=0.8,random_state=200)
test=df.drop(train.index)
如果你使用相同的random_state
值,那么每次得到的训练集和测试集的数据都是完全一样的。这就让你在随机分开训练数据和测试数据的同时,也能保证结果的一致性。
967
Scikit Learn中的train_test_split
功能非常好用。它可以将numpy数组和数据框(dataframe)进行分割。
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2)
483
我会直接用numpy的 randn
函数:
In [11]: df = pd.DataFrame(np.random.randn(100, 2))
In [12]: msk = np.random.rand(len(df)) < 0.8
In [13]: train = df[msk]
In [14]: test = df[~msk]
为了确认这个方法有效,我们可以看看结果:
In [15]: len(test)
Out[15]: 21
In [16]: len(train)
Out[16]: 79