2015-05-06 83 views
0

我想在熊猫中手动创建训练和测试数据集,而不是使用sklearn进行交叉验证。我近乎成功。但是,我发现df_trainingdf_test之间的数字不一致。这是为什么?在Pandas中创建训练和测试数据集

这里就是我所做的:

  • 通过加入行随机选择与random.choice
  • 创建了一个名为新数据集df_test行创建了一个名为从原始数据帧df_training新的数据集从df_training中的原始数据集中使用df.drop(df_training.index)作为参数。

当df和df_training的尺寸保持不变时,这是我没有得到df_test的修正尺寸的地方。

from sklearn.datasets import load_boston 
boston = load_boston() 

names = ['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat'] 
df = pd.DataFrame(boston.data, columns=names) 
# add in prices 
df['price'] = boston.target 

df.shape 
(506, 14) 

import random 
# Use 70% of the DataFrame and call is df_training 
df_training = df.ix[np.random.choice(df.index, 354)] 
df_training.shape 

# Remove the 70% of data from the main DataFrame and call it df_test 
df_test = df.drop(df_training.index) 

df_test.shape 
(250, 14) 

我应该不是504 - 354 = 150?

有趣的是,当我运行整个代码几次时,我得到了不同的test_set结果。训练集和原始集不变时,我不应该得到相同的结果吗?这是怎么回事?

In [26]: %run create_training.py 
Original Set: (506, 14) 
training set: (354, 14) 
test set: (247, 14) 

In [27]: %run create_training.py 
Original Set: (506, 14) 
training set: (354, 14) 
test set: (254, 14) 

In [28]: %run create_training.py 
Original Set: (506, 14) 
training set: (354, 14) 
test set: (241, 14) 
+0

您可以使用[sklearn的列车试验分](http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html) – EdChum

+0

谢谢,我会检查出来。我只是想用一些不属于sklearn的东西。 – Rohit

回答

0

我认为这里的两名失踪的成分有:

  • 设置为numpy随机函数的种子,以便使分裂重复性。
  • 致电np.random.choice使用replacement=Falserefer to the docs了解更多信息)。

代码:

# make results reproducible 
np.random.seed(42) 
# sample without replacement 
train_ix = np.random.choice(df.index, 354, replace=False) 
df_training = df.ix[train_ix] 
df_test = df.drop(train_ix) 
+0

甜!感谢你的帮助。 – Rohit

相关问题