我怎么知道如何解释模型 sklearn.svm.LinearSVC() 的输出系数 (`coefs_`)?

数据挖掘 Python 可视化 scikit-学习 支持向量机 范围
2022-03-13 23:54:16

我正在关注Andreas C. Müller 和 Sarah Guido的 Python 机器学习简介:数据科学家指南LinearSVC(),在第 2 章中给出了应用演示。此屏幕截图显示了对三个 blob 进行分类的结果:

在此处输入图像描述

这三个 blob 显然被正确分类,如彩色输出所示。

我的问题是我们应该如何知道如何解释模型拟合输出以绘制三条线?输出参数由下式给出

print(LinearSVC().fit(X,y).coef_)
[[-0.17492286  0.23139933]
 [ 0.47621448 -0.06937432]
 [-0.18914355 -0.20399596]]

print(LinearSVC().fit(X,y).intercept_)
[-1.07745571  0.13140557 -0.08604799]

作者向我们介绍了如何画线:

from sklearn.svm import LinearSVC  
linear_svm = LinearSVC().fit(X,y)  
...
line = np.linspace(-15, 15)  
for coef, intercept in zip(linear_svm.coef_, linear_svm.intercept_):  
    plt.plot(line, -(line * coef[0] + intercept) / coef[1])  #HOW DO WE KNOW
plt.ylim(-10, 15)  
plt.xlim(-10, 8)  
plt.show()  

带有注释的代码行是将我们的系数转换为该行的斜率/截距对的代码行:

y = -(coef_0 / coef_1) x - intercept/coef_1

其中前面的项x是斜率,-intercept/coef_1是截距。有关 LinearSVC 的文档中coef_andintercept_仅称为“属性”,但不指向任何coef_0作为斜率且coef_1是某些整体缩放的负数的指标。

在不依赖书籍和 StackOverflow 中的示例的情况下,如何在 Scikit-learn 中查找该模型和其他类似模型的输出系数的解释?

2个回答

这是一种(诚然很难)的方法。

如果你真的想了解底层细节,你总是可以通过源代码来工作。例如,我们可以看到该LinearSVC fit方法调用_fit_liblinear了. 调用train_wrap了 liblinear,它使所有东西都准备好调用 C++ 函数train

所以train在 linear.cpp中是繁重的工作开始的地方。请注意,训练函数中模型结构的成员在 Python 中w被映射回。coef_

一旦你准确地理解了底层train函数的作用,就应该清楚地知道coef_我们以这种方式画线的确切含义和原因。

虽然这可能有点费力,但一旦你习惯了以这种方式做事,你就会真正了解一切是如何从上到下运作的。

y = -(coef_0 / coef_1) x - intercept/coef_1coef_0 x + coef_1 y + intercept = 0,它是将 blob 与其余部分分开的边界线。(coef_0, coef_1)是法线向量,方向指示斑点的位置。