Scikit learn - 测试装置的高精度

时间:2015-10-18 05:22:30

标签: python pandas scikit-learn

我有一个包含100000行和129列的数据集。我使用pandas将其加载到数据框中并将该集合拆分为2个子集:父集的训练(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

看起来我在训练过程中遇到过度拟合问题或其他问题。这也发生在所有测试集中。你能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

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

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