Python - 机器学习

时间:2016-10-21 13:40:07

标签: python algorithm pandas machine-learning scikit-learn

目前我正在尝试理解机器学习算法的工作方式,而我真正得到的一件事是预测标签的计算精度与视觉混淆矩阵之间的明显差异。我会尽可能清楚地解释。

这是数据集的片段(这里你可以看到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

为了好奇,我尝试了许多算法(线性,高斯,SVM(SVC,SVR),贝叶斯等)。据我所知,在我的情况下,最好使用分类器(离散),而不是回归(连续)。使用common:

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%的准确性是错误的。 怎么解释这个?这是因为float / int转换吗?

感谢任何直接回答/链接等。

3 个答案:

答案 0 :(得分:5)

你在这里混合了两个截然不同的机器学习概念:回归和分类。回归通常处理连续值,例如温度或股票市场价值。另一方面,分类可以告诉您录制中的哪种鸟类 - 这就是您使用混淆矩阵的确切位置。它会告诉你算法正确预测标签的次数以及错误的位置。您正在使用的SciPy为两者都有单独的部分。

对于分类和回归问题,您可以使用不同的指标对其进行评分,因此永远不要假设它们具有可比性。正如@javad所指出的那样,“决心系数”与准确性非常不同。我还建议您阅读precision and recall

在您的情况下,您显然存在分类问题,因此应予以对待。另外,请注意f6看起来像是一组离散的值。

如果您想快速尝试不同的方法,我可以推荐,例如H2O,旁边是漂亮的API,具有出色的用户界面,可以进行大规模的并行处理。 XGBoost也很出色。

答案 1 :(得分:4)

查看文档here

如果您使用回归方法调用score(),他们将返回预测的'确定系数R ^ 2',而不是准确度。

答案 2 :(得分:1)

看看this 使用“model.score(X_test,y_test)”。