逻辑回归模型参数在sklearn中的体现

sklearn中使用Logistic Regression

LR模型是机器学习入门必备模型之一,scikit-learn(简称 sklearn)作为机器学习领域最重要的库之一当然对这种基本模型已经支持的非常完整,不过对于初学者来说,模型的数学推导和成熟的代码库之间还是有着距离需要我们自己探索,本人在初次使用sklearn时,发现LR模型就两行代码搞定,虽然运行没有问题,但是LR数学模型里面的参数到底都是什么值,在sklearn中哪些变量存放等类似的问题值得去摸索。

逻辑回归(Logistic Regression)与线性回归(Linear Regression)

本文虽然只关注逻辑回归模型参数,但是逻辑回归的模型参数实际上是和线性回归的模型参数一样,而且对于初学者来说,逻辑回归和线性回归也是很容易搞混的两个模型,其实容易搞混也是有原因的,个人认为起码有两个原因:

  • 两个模型无论中文名称还是英文名称都有回归字样
  • 两个模型的数学定义中都有线性拟合的部分
    对于第一点,其实只要分清楚两个模型的应用场景就不会弄混了,逻辑回归虽然听起来像回归,但实际上是一个分类模型,分类模型即通过特性来判断这个东西属于A类还是B类(当然类别数量也可以大于2),例如垃圾邮件分类中,逻辑回归模型中的输入是一份邮件内容, 输出只有两个值,1表示邮件是垃圾邮件,0表示不是垃圾邮件;线性回归才是如假包换的回归模型,它的输出是连续数值,比如时间和温度的数据,做线性回归之后,可以预测任意时间的温度值。

说了这么多还是没有进入到本文的主要内容…,下面看看两个模型的数学定义

  • 线性回归模型
    线性回归

  • 逻辑回归模型
    这里写图片描述

仔细看两个模型的数学表达式,实际上逻辑回归是在线性回归的基础上,加了一个sigmod函数,即线性回归给出一个预测值就完事了,但是逻辑回归需要把这个预测值作为sigmod函数的输入,通过sigmod函数计算出一个非常接近0或者1的数,这个0或者1就是逻辑回归的最终输出。
tips: 当然两个模型的损失函数还是有所不同,这里不做探讨。

  • sigmod函数是这样的
    y = 1 1 + e − x y = \dfrac{1}{1 + e^{-x} } y=1+ex1

综上可以得出无论逻辑回归还是线性回归,模型参数都是一样的,只有一个 ω \omega ω向量,例如在接下来的实列中,需要根据年龄和收入判断是否会购买某个商品的例子中,需要模型来学习的参数就只有 ω \omega ω x i x_i xi代表特性,即年龄和收入,通常模型会有一个截距参数 b b b来给模型一个0输入的初始值。
ω T x i = ω 0 ∗ x 0 + ω 1 ∗ x 1 + b \omega^Tx_i = \omega_0 * x_0 + \omega_1 * x_1 + b ωTxi=ω0x0+ω1x1+b
OK,当我们使用sklearn时候,如下两行代码即可学习出上述公式里面的参数 ω \omega ω b b b

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(x_train, y_train)

那么我们的参数值在哪里呢?仔细阅读函数文档或者debug模式下,可以看到:
逻辑回归模型参数在sklearn中的体现_第1张图片

当然这个是需要用梯度下降法对模型的损失函数进行计算得到的,这里直接给结论:**上图中的coef_变量对应模型参数 ω \omega ω,intercept 对应参数 b b b **
接着用这两个变量画出模型的分类边界线和原始数据:

import matplotlib.pyplot as plt

fig_train = plt.figure()
xlim = [-3, 3]
ylim = [-2.5, 3.5]
ax = fig_train.add_subplot(111)
plt.xlabel('Age')
plt.ylabel('Salary')
plt.title('Logistic Regresstion (Training set)')

theta = classifier.coef_
b = classifier.intercept_
# line equation: age * theta_0 + salary * theta1 + b = 0
age_plot = [i/10 for i in range(-40, 40)]
salary_plot = -1 * (theta[0, 0] * np.array(age_plot) + b)/theta[0, 1]
ax.plot(age_plot, salary_plot, c='r')

x_positive = x_train[np.where(y_train == 1)]
x_negative = x_train[np.where(y_train == 0)]
ax.scatter(x_negative[:, 0], x_negative[:, 1], c='r', label='0')
ax.scatter(x_positive[:, 0], x_positive[:, 1], c='g', label='1')
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.legend()
plt.show()

其中x_train是预处理后的 (数据清洗和标准化) 400个人的年龄和收入,y_train是这400个人是否会购买某商品的标记,上述代码作图如下:
逻辑回归模型参数在sklearn中的体现_第2张图片

总结一下,逻辑回归是在线性回归的基础上,加了一个sigmod函数,两个模型都需要学习线性模型中的参数,sklearn库中LogisticRegression分类器的coef_变量对应模型参数 ω \omega ω,intercept 对应参数 b b b

你可能感兴趣的:(机器学习模型)