我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文再次审视鸢尾花数据集的逻辑回归模型,审视的角度是:模型训练后得到的系数coef_和截距intercept_。得到这两个数据后,可以说明什么问题呢?

苏南大叔:以鸢尾花逻辑回归为例,如何理解预测结果的系数和截距? - 系数和截距
以鸢尾花逻辑回归为例,如何理解预测结果的系数和截距?(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章。测试环境:win10python@3.12.0sklearn@1.2.2

本文结论 coef_ / intercept_

先说一下本文的结论,然后再看论证的过程。如果大家觉得苏南大叔哪里说的不对,欢迎留言给我。

训练的数据集,直观的体现了n_featuresn_class

  • 训练集有n_features个特性。对应鸢尾花的四列数据:萼长,萼宽,瓣长,瓣宽。
  • 训练集有n_class种分类方法。二分类法:是或者不是【某个】分类(针对某个分类,是或者不是)。多分类[n>2]法:是【哪个】分类法,(是分类一,还是分类二,还是分类三)。

LogisticRegression逻辑回归,可以正常处理二分类,也可以正常处理多分类,自由切换。当然,也可以主动指明参数,使用二分类还是多分类模型。

理解系数coef_和截距intercept_

  • coef_属性,“斜率”参数(w,也叫作权重或系数)。.coef_是个(n_class, n_features)的矩阵。
  • intercept_ 属性,偏移或截距(b).intercept_是个(1, n_class)的矩阵。

准备训练集

阐述这两个参数的不同,主要取决于鸢尾花数据集的不同分割,就会产生出不同的系数和截距。所以,本文代码的关键点就在于X_train, X_test, y_train, y_test这四个值的获取了。不同的数据划分,会得到不同的系数coef_和截距intercept_。(主要是矩阵形状不同)。

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=8)

鸢尾花普通预测

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()                   
model.fit(X_train, y_train)
print(model.coef_)
print(model.intercept_)
# ...

苏南大叔:以鸢尾花逻辑回归为例,如何理解预测结果的系数和截距? - 代码对比
以鸢尾花逻辑回归为例,如何理解预测结果的系数和截距?(图2-2)

参考下面这篇文章:

不同的切分方案[临界点]

load_iris()的鸢尾花数据集,150条数据。分类0、1、2各占50条。前50条是分类0,中间50条是分类1,最后50条是分类2。所以,如果要通过train_test_split()进行区分的话,是这样区分的:

train_size = 重点在这里
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=train_size, shuffle=False)

情况一:训练集(train_size)取前[1,50],全部是分类0,训练失败。

ValueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: 0

情况二:训练集(train_size)取[51,100],分类就是二分法了。是分类0么?是或者不是。
输出类似是:

[[ 0.68356372 -0.10543896  1.14568169  0.40767542]]
[-9.82160855]

情况三:训练集(train_size)取[101,149),至少留一个测试集数据吧?否则,会得到错误提示:

ValueError: train_size=150 should be either positive and smaller than the number of samples 150 or a float in the (0, 1) range

这种情况就是多分类了。是分类0么?是分类1么?是分类2么?
输出类似是:

[[-0.38126136  0.62368848 -1.81658703 -0.7706714 ]
 [ 0.23689646 -0.91695469  0.58560897 -0.09521547]
 [ 0.14436491  0.29326621  1.23097805  0.86588687]]

[ 7.514447    1.81896707 -9.33341407]

表格总结

训练集数量特性数量训练集分类方法coefintercept
[1,50]4[0]二分法errorerror
[51,100]4[0,1]二分法1行4列一行1列
[101,149]4[0,1,2]多分类3行4列一行3列

结论

通过对比观察系数coef_和截距intercept_的数据变化,可以佐证苏南大叔的相关猜测。其实,系数coef_和截距intercept_,还可以客观预测测试集合的可能性数据。不同的模型,有着不同的算法。但是都和这两个值有关系。待文章后续更新。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    sklearn