为什么我会得到100%准确性的决策树?


38

我的决策树准确性达到100%。我究竟做错了什么?

这是我的代码:

import pandas as pd
import json
import numpy as np
import sklearn
import matplotlib.pyplot as plt


data = np.loadtxt("/Users/Nadjla/Downloads/allInteractionsnum.csv", delimiter=',')


x = data[0:14]
y = data[-1]


from sklearn.cross_validation import train_test_split

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]


from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(x_train.astype(int), y_train.astype(int))


from sklearn.metrics import accuracy_score

y_predicted = tree.predict(x_test.astype(int))
accuracy_score(y_test.astype(int), y_predicted)

4
您为什么认为自己做错了什么?也许您的数据可以使您达到完美的经典……
Knarpie

64
顺便说一句,+ 1表示您是否以100%的准确性怀疑是否有问题。太多的人会认为他们的模型很棒...
S. Kolassa-恢复莫妮卡

1
在R中,有一个程序包(脱字符号)可以将数据集自动分成两组,一组用于训练数据,另一组用于测试数据。我称该过程为数据分区。我相信Python中也有类似的程序包可以实现数据分区。
Anastasiya-Romanova

有用的背景阅读:ML中的常见陷阱
smci,

3
@ Anastasiya-Romanova秀几乎每个严肃的ML库都包含此功能,包括OP使用的功能(OP甚至导入了相关功能,只是出于某种原因而没有使用它)。
康拉德·鲁道夫

Answers:


79

您的测试样品是一个子集,你的训练样本:

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]

这意味着您需要在一部分训练数据上评估模型,即您正在进行样本内评估。众所周知,样本内准确度是衡量样本外准确度的较差指标,而最大化样本内准确度可能会导致拟合过度。因此,应该始终在完全独立于训练数据的真实坚持样本上评估模型。

确保您的训练和测试数据不相交,例如,

x_train = x[659:2635]
x_test = x[0:658]
y_train = y[659:2635]
y_test = y[0:658]

2
sklearn.model_selection.train_test_split好像Juan Ignacio Gil所建议的那样使用,因为这也可以洗净集合并避免担心数据集在排序方面是否是非随机的。它也更清晰,因为它显示了意图,并自动处理数据集大小的更改。
杰克·艾德利

1
@JackAidley:我同意(几天前支持Juan的回答)。更好的办法是通过设置随机数种子使拆分确定性地用于调试。
S. Kolassa-恢复莫妮卡

@StephanKolassa嗨,我一直在调整Iris数据集,并在使用GridSearchCV了训练数据之后,使用来获得100%的测试准确性KNeighborsClassifier。我曾用于test_train_split拆分数据集。我在这里可能做错了什么?
Sndn

19

由于使用一部分训练数据进行测试,因此您获得了100%的准确性。在训练时,决策树获得了有关该数据的知识,现在,如果您提供相同的数据进行预测,它将获得完全相同的价值。这就是为什么决策树每次都能产生正确结果的原因。

对于任何机器学习问题,应将训练和测试数据集分开。只有当我们检查模型如何预测未知值时,才能确定模型的准确性。


17

正如其他用户告诉您的那样,您正在使用训练集的子集作为测试集,并且决策树非常容易过拟合。

导入时几乎要拥有它

from sklearn.cross_validation import train_test_split

但是然后您不使用该功能。您应该已经完成​​:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)

获得随机训练和测试集


2

正如@Stephan Kolassa和@Sanjay Chandlekar指出的,这是由于您的测试样本是训练样本的一部分。

但是,对于那些样本的选择,随机抽样将更适合确保两个样本都具有代表性。根据您的数据结构,您可能还会考虑分层随机抽样。

我不太懂Python,但任何统计软件都应允许随机抽样;在SO上也有一些提示。


0

只是想了解为什么需要显式拆分训练和测试样本的直觉

nnn1n=2

这被称为过度拟合,因为这种分割过程极不可能预测与您的问题相关但尚未观察到的数据点。

当然,构建这些预测平台的全部目的是创建可应用于从未见过的数据的工具。将我们拥有的数据分为训练样本和测试样本的尝试是为了模拟这种自致盲现象,并防止我们的模型以上述方式过度拟合。


0

您不需要100%的精度就可以过度拟合。有了足够的存储桶,您将获得无法再现的结果(看起来超出样本的情况很糟糕)。

请参阅《柳叶刀》上的节选文章,其中介绍了将样品切碎到太细的桶中的方法。 蒙克豪森(Munchausen)的统计网格(Statistical Grid)也是XKCD卡通的重要基础

达到100%的准确性仅是找到一个效果良好的分类器的一小步。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.