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

机器算法验证 机器学习 Python 大车 准确性
2022-02-12 12:42:58

我的决策树获得了 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个回答

您的测试样本是训练样本的子集:

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]

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

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

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

进口的时候差点就有了

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)

获得随机的训练和测试集

正如@Stephan Kolassa 和@Sanjay Chandlekar 所指出的,这是因为您的测试样本是训练样本的子集。

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

我不精通 Python,但任何统计软件都应该允许随机抽样;SO上也提供了一些提示