我在我的测试集上得到了 100% 的准确率,有什么问题吗?

数据挖掘 scikit-学习 随机森林 决策树 准确性 机器学习模型
2021-10-06 08:11:24

使用决策树算法训练时,我的测试集准确率达到 100%。但随机森林的准确率只有 85%

我的模型有问题还是决策树最适合提供的数据集。

代码:

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20)

#Random Forest

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators = 1000, random_state = 42)
rf.fit(x_train, y_train);
predictions = rf.predict(x_test)
cm = sklearn.metrics.confusion_matrix(y_test,predictions)
print(cm)

#Decision Tree

from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(x_train, y_train)
predictions = clf.predict(x_test)
cm = sklearn.metrics.confusion_matrix(y_test,predictions)

混淆矩阵:

随机森林:

[[19937  1]
 [    8 52]]

决策树:

[[19938  0]
 [    0 60]]
4个回答

发生这种情况可能有几个原因。

  1. 首先,检查您的代码。在任何情况下,100% 的准确率似乎都不太可能。你有多少测试数据点?你用多少个训练数据点训练你的模型?您可能犯了编码错误并比较了两个相同的列表。

  2. 您是否使用不同的测试集进行测试?高精度可能是由于运气 - 尝试使用一些广泛可用的 KFoldCrossValidation 库。

  3. 您可以可视化您的决策树以了解我们正在发生的事情。如果它在测试集上有 100% 的准确率,那么它在训练集上是否有 100% 的准确率?

的默认超参数DecisionTreeClassifier允许它过度拟合您的训练数据。

默认min_samples_leaf值为1. 默认max_depth值为None. 这种组合允许您DecisionTreeClassifier增长,直到每片叶子都有一个数据点。

既然你有100%准确性,我假设您的traintest拆分中有重复项。这与您拆分的方式无关,而是与您清理数据的方式有关。

你能检查你是否有重复的数据点吗?

x = [[1, 2, 3],
     [4, 5, 6],
     [1, 2, 3]]

y = [1,
     2,
     1]

initial_number_of_data_points = len(x)


def get_unique(X_matrix, y_vector):
    Xy = list(set(list(zip([tuple(x) for x in X_matrix], y_vector))))
    X_matrix = [list(l[0]) for l in Xy]
    y_vector = [l[1] for l in Xy]
    return X_matrix, y_vector


x, y = get_unique(x, y)
data_points_removed = initial_number_of_data_points - len(x)
print("Number of duplicates removed:", data_points_removed )

如果您和拆分中有重复项,则预计它具有很高的准确性。traintest

我相信你面临的问题是不平衡类问题。你有 99% 的数据属于一个类。可能是您拥有的测试数据只能属于该类别。因为 99% 的数据属于一个类别,所以您的模型很有可能将您的所有测试数据预测为该类别。要处理不平衡数据,您应该使用 AUROC 而不是准确度。您可以使用过采样和欠采样等技术使其成为平衡的数据集。

请检查您是否使用测试集来构建模型。这是一个常见的场景,例如:

随机森林分类器在测试集上给出了非常高的准确度——过度拟合?

如果真是这样,一切都说得通了。随机森林试图不过度拟合您的模型,而决策树只会将您的数据存储为一棵树。