【问题标题】:Scikit learn - High accuracy on the testing setScikit learn - 测试集上的高精度
【发布时间】: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


【解决方案1】:

也许您混淆了 DecisionTree(单个决策树)和一些集成元估计器(许多分类器,例如 DecisionTree)的概念。 我看不出你的结果有什么问题。没有任何限制,决策树可以始终完美地分离您的数据集。因为它可以逼近任何决策边界。这就是你的情况。您对 DecisonTree 的唯一限制 - min_samples_split=20。但是与您的数据集大小(100k 个样本)相比,20 几乎没有。

如果您想构建更多受限(通用)树 - 您可以使用 max_depth、min_samples_split(增加它)、min_samples_leaf、etc

【讨论】:

    猜你喜欢
    • 2014-03-26
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2016-02-18
    • 2015-01-04
    • 1970-01-01
    • 2015-03-03
    相关资源
    最近更新 更多