为什么我的 SVM 和决策树 (scikit) 的准确率达到 100%

机器算法验证 机器学习 支持向量机 scikit-学习
2022-04-21 04:07:17

我有一个包含 1175 个示例和 21 个特征的数据集,这些特征在 [-1, +1] 的范围内,以及两个类标签 1 和 0。当我阅读了大部分资源时,最好在[-1, +1] 或 [0, 1] 的范围。所以我认为我不需要任何预处理。但是当我从 scikit-learn 运行 SVM 和决策树分类器时,我使用 10 倍的交叉验证获得了 100% 的准确率。然而,随着我执行更多的迭代,分类精度似乎会降低。

我正在从 Kinect 设备收集这些数据,该设备为我提供了人体某些关节的角度和位置。由于硬件故障,我确信数据上有噪音。因此,获得 100% 几乎是不可能的。

我的数据集在这里可用

2个回答

我能够重现您的结果:

> clf = svm.SVC()
> scores = cross_validation.cross_val_score(clf, X, Y, cv=10)

我没有得到完美的折叠分类,但接近:

> print(scores)
array([ 1.        ,  1.        ,  1.        ,  0.99152542,  1.        ,
        1.        ,  1.        ,  1.        ,  1.        ,  1.        ])

要弄清楚支持向量机发生了什么并不容易,因此我将决策树拟合到您的数据中:

> tre = tree.DecisionTreeClassifier()
> tre.fit(X, Y)

这棵树是训练数据上的完美分类器:

> sum(abs(tre.predict(X) - Y))
0

原来这棵树很简单:

在此处输入图像描述

看起来数据中的第三列(名为 的列Z)是一个完美的分隔符。这可以通过散点图轻松确认:

在此处输入图像描述

哦,我的上帝,我遇到了同样的问题。也许我的答案对你来说不是最好的答案,但它可能对其他人有所帮助。

这是我的代码Scikit-Learn

clf = DecisionTreeClassifier(criterion='entropy', max_depth=10)
clf.fit(X, y)

我得到了 100% 的准确率。

但是,当我得到feature_importances_ofclf时,发现X应该从X中删除标签列,从 中删除标签列后X,准确率为 89%。

所以,我的建议是在你建立模型之后,检查其中的参数,例如feature_importances_等等。祝你好运!