Python - 机器学习

6

目前我正在尝试了解机器学习算法的工作方式,但有一件事情我没有真正理解,那就是预测标签的计算准确性和视觉混淆矩阵之间的明显区别。我会尽可能清晰地进行解释。

以下是数据集的代码片段(这里您可以看到9个样本(实际数据集中约4k),6个特征和9个标签(代表不是数字,而是某些含义,并且不能像7> 4> 1一样进行比较)):

f1      f2      f3      f4      f5    f6   label
89.18   0.412   9.1     24.17   2.4   1    1
90.1    0.519   14.3    16.555  3.2   1    2
83.42   0.537   13.3    14.93   3.4   1    3
64.82   0.68    9.1     8.97    4.5   2    4
34.53   0.703   4.9     8.22    3.5   2    5
87.19   1.045   4.7     5.32    5.4   2    6
43.23   0.699   14.9    12.375  4.0   2    7
43.29   0.702   7.3     6.705   4.0   2    8
20.498  1.505   1.321   6.4785  3.8   2    9

出于好奇心,我尝试了许多算法(线性、高斯、支持向量机(SVC、SVR)、贝叶斯等)。就我所理解的手册而言,在我的情况下最好使用分类器(离散),而不是回归(连续)。使用通用算法:

model.fit(X_train, y_train) 
model.score(X_test, y_test)

我得到:

Lin_Reg: 0.855793988736
Log_Reg: 0.463251670379
DTC:     0.400890868597
KNC:     0.41425389755
LDA:     0.550111358575
Gaus_NB: 0.391982182628
Bay_Rid: 0.855698151574
SVC:     0.483296213808
SVR:     0.647914795849

连续算法取得了更好的结果。当我使用混淆矩阵验证贝叶斯岭回归的结果时,需要将浮点数转换为整数,结果如下所示:

Pred  l1   l2   l3   l4   l5   l6   l7   l8   l9
True
l1    23,  66,  0,   0,   0,   0,   0,   0,   0
l2    31,  57   1,   0,   0,   0,   0,   0,   0
l3    13,  85,  19   0,   0,   0,   0,   0,   0
l4    0,   0,   0,   0    1,   6,   0,   0,   0
l5    0,   0,   0,   4,   8    7,   0,   0,   0
l6    0,   0,   0,   1,   27,  36   7,   0,   0
l7    0,   0,   0,   0,   2,   15,  0    0,   0
l8    0,   0,   0,   1,   1,   30,  8,   0    0
l9    0,   0,   0,   1,   0,   9,   1,   0,   0

是什么让我明白85%的准确率是错误的。这是如何解释的?这是因为浮点数/整数转换吗?

如果有任何直接的答案/链接等,将不胜感激。


2
你是如何计算准确率的?类似于 sklearn.metrics.accuracy_score(y_test, model.predict(X_test)) 这样吗? - sietschie
2
如果您通过手动比较 model.predict() 的结果和标签,计算相等的条目数量,您应该能够了解计算准确率或混淆矩阵是否错误(或两者都有误)。 - sietschie
3个回答

5
您在这里混淆了机器学习的两个非常不同的概念:回归和分类。回归通常处理连续值,例如温度或股票市场价值。另一方面,分类可以告诉您录音中是哪种鸟类 - 这正是您将使用混淆矩阵的地方。它会告诉您算法正确预测标签的次数以及它犯了哪些错误。您正在使用的SciPy有专门的部分来处理这两个问题。
对于分类和回归问题,您可以使用不同的评分指标,因此永远不要假设它们是可比较的。正如@javad指出的那样,“确定系数”与准确性非常不同。我还建议阅读精确度和召回率
在您的情况下,您显然有一个分类问题,因此应该进行处理。此外,请注意f6看起来具有离散值集。
如果您想快速尝试不同的方法,我可以推荐例如H2O,它除了具有良好的API外,还拥有出色的用户界面,并允许大规模并行处理。XGBoost也很棒。

4
请浏览此处的文档 (链接),如果在回归方法中调用score(),它们将返回“预测的决定系数R ^ 2”,而不是准确度。

1

请查看this
使用"model.score(X_test, y_test)"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接