Python - 机器学习

Posted

技术标签:

【中文标题】Python - 机器学习【英文标题】:Python - machine learning 【发布时间】:2017-03-03 20:33:58 【问题描述】:

目前我正在尝试了解机器学习算法的工作方式,但我并没有真正理解的一件事是预测标签的计算准确度与视觉混淆矩阵之间的明显差异。我会尽量解释清楚。

这里是数据集的sn-p(这里你可以看到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)、贝叶斯等)。据我了解手册,就我而言,最好使用分类器(离散),而不是回归(连续)。使用通用:

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 转换吗?

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

【问题讨论】:

您是如何计算准确度的? sklearn.metrics.accuracy_score(y_test, model.predict(X_test)) 之类的东西? 如果你手动比较model.predict()的结果和你的标签,通过计算有多少条目是相等的,你应该知道计算的准确性或混淆矩阵是否错误。 (或者如果两者都关闭) 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

在您的情况下,您显然存在分类问题,因此应该对其进行处理。另外,请注意 f6 看起来有一组离散的值。

如果您想快速尝试不同的方法,我可以推荐例如H2O,除了漂亮的 API 之外,还具有出色的用户界面并允许大规模并行处理。 XGBoost 也很棒。

【讨论】:

【参考方案3】:

查看文档here。

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

【讨论】:

以上是关于Python - 机器学习的主要内容,如果未能解决你的问题,请参考以下文章

《Python机器学习时间指南》Python机器学习的生态系统

机器学习资料《分布式机器学习算法理论与实践》+《白话机器学习算法》+《Python机器学习基础教程》

从Python开始机器学习

机器学习00:如何通过Python入门机器学习

[Python]-机器学习Python入门《Python机器学习手册》-01-向量矩阵和数组

机器学习实践:《Python机器学习实践指南》中文PDF+英文PDF+代码