目前我正在尝试理解机器学习算法的工作方式,其中有一点我不是很明白,那就是预测标签的计算准确性和视觉混淆矩阵之间的明显差异。我会尽可能清晰地解释这个问题。
以下是数据集的一个片段(你可以看到9个样本(实际数据集大约有4k),6个特征和9个标签(这些标签代表的不是数字,而是某些含义,且不能像7 > 4 > 1那样进行比较)):
f1 f2 f3 f4 f5 f6 label89.18 0.412 9.1 24.17 2.4 1 190.1 0.519 14.3 16.555 3.2 1 283.42 0.537 13.3 14.93 3.4 1 364.82 0.68 9.1 8.97 4.5 2 434.53 0.703 4.9 8.22 3.5 2 587.19 1.045 4.7 5.32 5.4 2 643.23 0.699 14.9 12.375 4.0 2 743.29 0.702 7.3 6.705 4.0 2 820.498 1.505 1.321 6.4785 3.8 2 9
出于好奇,我尝试了多种算法(线性、Gaussian、SVM(SVC、SVR)、贝叶斯等)。根据我的理解,在我的情况下,最好使用分类器(离散),而不是回归(连续)。使用常见的:
model.fit(X_train, y_train) model.score(X_test, y_test)
我得到了以下结果:
Lin_Reg: 0.855793988736Log_Reg: 0.463251670379DTC: 0.400890868597KNC: 0.41425389755LDA: 0.550111358575Gaus_NB: 0.391982182628Bay_Rid: 0.855698151574SVC: 0.483296213808SVR: 0.647914795849
连续算法的表现更好。当我使用混淆矩阵来验证贝叶斯岭回归的结果时(不得不将浮点数转换为整数),我得到了以下结果:
Pred l1 l2 l3 l4 l5 l6 l7 l8 l9Truel1 23, 66, 0, 0, 0, 0, 0, 0, 0l2 31, 57 1, 0, 0, 0, 0, 0, 0l3 13, 85, 19 0, 0, 0, 0, 0, 0l4 0, 0, 0, 0 1, 6, 0, 0, 0l5 0, 0, 0, 4, 8 7, 0, 0, 0l6 0, 0, 0, 1, 27, 36 7, 0, 0l7 0, 0, 0, 0, 2, 15, 0 0, 0l8 0, 0, 0, 1, 1, 30, 8, 0 0l9 0, 0, 0, 1, 0, 9, 1, 0, 0
这让我明白85%的准确率是错误的。如何解释这一点?这是因为浮点数/整数转换的原因吗?
对任何直接的回答/链接等表示感谢。
回答:
你在这里混淆了机器学习中的两个非常不同的概念:回归和分类。回归通常处理连续值,例如温度或股票市场价值。另一方面,分类可以告诉你录音中的鸟类种类——这正是你会使用混淆矩阵的地方。它会告诉你算法正确预测标签的次数以及它犯错的地方。你使用的SciPy有专门针对这两者的部分。
对于分类和回归问题,你可以使用不同的指标来评分它们,所以永远不要假设它们是可比较的。正如@javad指出的,”决定系数”与准确率非常不同。我还建议阅读精确度和召回率的内容。
在你的案例中,你显然有一个分类问题,因此应该这样处理。此外,请注意f6看起来像是有一组离散的值。
如果你想快速尝试不同的方法,我可以推荐例如H2O,它除了有很好的API外,还有很好的用户界面,并且允许大规模并行处理。XGBoost也非常优秀。