我有一个包含100000行和129列的数据集。我使用pandas
将其加载到数据框中,并将该组分为2个子集:训练(70%)父集和测试(30%)。这是我用于拆分的代码Scikit学习 - 测试集上的高精度
def makeSample(df):
test_size = len(df.index) * 30/100
rows = random.sample(df.index, test_size)
testing = df.ix[rows]
training = df.drop(rows)
print "Number of testing set %s\n" % len(testing.index)
print "Number of training set %s\n" % len(training.index)
return training, testing
def split9Folds(df):
for x in xrange(1, 10):
training, testing = makeSample(df)
training.to_csv(r'split/training_%s.csv' % x, header=None, index=None, sep=',', mode='w')
testing.to_csv(r'split/testing_%s.csv' % x, header=None, index=None, sep=',', mode='w')
拆分过程将取9倍。总的来说,我有9对训练/测试文件。然后我用决策树从Scikit-learn
训练
df_file = "split/training_9.csv"
df = pd.read_csv(df_file, sep=',', header=None)
df.columns = xrange(1, len(df.columns) + 1)
## remove the id column
df.drop(df.columns[[4]], axis=1, inplace=True)
## remove the class column
features_column = list(df.columns[1:])
target_column = list(df.columns[0:1])
tr_features_list = df[features_column]
tr_target_list = df[target_column]
clf = tree.DecisionTreeClassifier(min_samples_split=20, random_state=99)
clf = clf.fit(tr_features_list, tr_target_list)
然后使用测试文件,以测试精度。当测试的准确性成绩是1(100%的准确率)
t_file = "split/testing_9.csv"
t_df = pd.read_csv(t_file, sep=',', header=None)
t_df.columns = xrange(1, len(t_df.columns) + 1)
t_df.drop(t_df.columns[[4]], axis=1, inplace=True)
t_features_list = t_df[features_column]
t_target_list = t_df[target_column]
score = clf.score(t_features_list, t_target_list)
print score
看起来像我有在训练过程中过学习问题或其它问题有什么让我感到惊讶的。这也适用于所有测试集。你能为我提供一些建议吗?
不确定你获得100%准确性的原因,但一个增强可能是使用熊猫命名的字段,而不是使用'df.columns'。它使事情更清晰,并且比基于整数的索引更容易出错。 – ldirer
@ldirer:是的,我同意了。问题是该数据集不包含任何命名列(KDD cup 2008数据集)。因此,我只是让它在那里 –
好的。我仍然使用整数索引而不是列属性。默认情况下,当你加载你的数据框时,你会得到字段的整数名称。 具体来说,这部分看起来很奇怪: 't_df.columns = xrange(1,len(t_df.columns)+ 1)'。 在下一行使用“drop”时,您要删除的字段基于索引,而不是基于您的df.columns属性。不知道这是你的意图。 – ldirer