【发布时间】:2016-01-16 15:08:08
【问题描述】:
我有一个包含 100000 行和 129 列的数据集。我使用pandas 将其加载到数据帧中并将集合分成两个子集:父集的训练(70%)和测试(30%)。这是我用来拆分的代码
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% 准确率的原因,但一项改进可能是使用 pandas 命名字段而不是使用
df.columns。它比基于整数的索引更清晰,更不容易出错。 -
@ldirer :是的,我同意了。问题是数据集没有任何命名列(KDD 杯 2008 数据集)。因此,我就把它放在那里
-
好的。我仍然会使用整数索引而不是列属性。默认情况下,当您加载数据框时,您会获得字段的整数名称。具体来说,这部分对我来说很奇怪:
t_df.columns = xrange(1, len(t_df.columns) + 1)。当您在下一行使用drop时,您要删除的字段基于索引而不是您的 df.columns 属性。不确定那是您想要的。 -
@ldirer:你是对的。我误解了drop功能。它使用的是列索引,而不是列名。我想当我重新定义列时,它将使用列名,而不是索引。我重新定义该列的原因是我想将需求更容易地转换为代码
-
如果您希望字段从 1 到 n + 1 而不是从 0 到 n,则可以在加载数据框时传递列名。
标签: python pandas scikit-learn