Lesson 4.1 逻辑回归模型构建与多分类学习方法

Posted 虚心求知的熊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lesson 4.1 逻辑回归模型构建与多分类学习方法相关的知识,希望对你有一定的参考价值。

文章目录

  • 首先,我们来讨论关于逻辑回归的基本原理。
  • 逻辑回归的基本原理,从整体上来划分可以分为两个部分,其一是关于模型方程的构建,也就是方程的基本形态,当然也包括模型的基本性质及其结果解读;其二则是模型参数求解,即在构建完模型之后如何利用数学工具求解最佳参数。基本划分情况如下:
  • 模型构建部分:可以从广义线性回归(Generalized liner model)+ 对数几率函数(logit function)角度理解,也可以从随机变量的逻辑斯蒂分布(logistic distribution)角度出发进行理解。
  • 参数求解部分:可以借助极大似然估计(Maximum Likelihood Estimate)方法求解,可以借助 KL 离散度基本理论构建二分类交叉熵损失函数求解。
# 科学计算模块
import numpy as np
import pandas as pd

# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt

# 自定义模块
from ML_basic_function import *

一、广义线性模型(Generalized liner model)的基本定义

  • 在前文中我们了解到关于线性回归的局限性,这种局限性的根本由模型本身的简单线性结构(自变量加权求和预测因变量)导致的。
  • 如果说线性回归是在一个相对严格的条件下建立的简单模型,那么在后续实践应用过程中,人们根据实际情况的不同,在线性回归的基础上又衍生出了种类繁多的线性类模型。
  • 其中,有一类线性模型,是在线性回归基础上,在等号的左边或右边加上了一个函数,从而能够让模型更好的捕捉一般规律,此时该模型就被称为广义线性模型,该函数就被称为联系函数
  • 广义线性模型的提出初衷上还是为了解决非线性相关的预测问题,例如,现在有数据分布如下:
# 数据集特征
np.random.seed(24)
x = np.linspace(0, 4, 20).reshape(-1, 1)
x = np.concatenate((x, np.ones_like(x)), axis=1)
x
#array([[0.        , 1.        ],
#       [0.21052632, 1.        ],
#       [0.42105263, 1.        ],
#       [0.63157895, 1.        ],
#       [0.84210526, 1.        ],
#       [1.05263158, 1.        ],
#       [1.26315789, 1.        ],
#       [1.47368421, 1.        ],
#       [1.68421053, 1.        ],
#       [1.89473684, 1.        ],
#       [2.10526316, 1.        ],
#       [2.31578947, 1.        ],
#       [2.52631579, 1.        ],
#       [2.73684211, 1.        ],
#       [2.94736842, 1.        ],
#       [3.15789474, 1.        ],
#       [3.36842105, 1.        ],
#       [3.57894737, 1.        ],
#       [3.78947368, 1.        ],
#       [4.        , 1.        ]])

# 数据集标签
y = np.exp(x[:, 0] + 1).reshape(-1, 1)
y
#array([[  2.71828183],
#       [  3.35525011],
#       [  4.1414776 ],
#       [  5.11193983],
#       [  6.30980809],
#       [  7.78836987],
#       [  9.61339939],
#       [ 11.86608357],
#       [ 14.64663368],
#       [ 18.07874325],
#       [ 22.31509059],
#       [ 27.54413077],
#       [ 33.99847904],
#       [ 41.96525883],
#       [ 51.79887449],
#       [ 63.93677707],
#       [ 78.91892444],
#       [ 97.41180148],
#       [120.23806881],
#       [148.4131591 ]])
  • 此时 x 和 y 的真实关系为 y = e ( x + 1 ) y=e^(x+1) y=e(x+1)
  • 但如果以线性方程来进行预测,即: y = w T ⋅ x + b y= w^T \\cdot x + b y=wTx+b
  • 当然,我们可以令 w ^ = [ w 1 , w 2 , . . . w d , b ] T \\hat w = [w_1,w_2,...w_d, b]^T w^=[w1,w2,...wd,b]T x ^ = [ x 1 , x 2 , . . . x d , 1 ] T \\hat x = [x_1,x_2,...x_d, 1]^T x^=[x1,x2,...xd,1]T,从而将上述方程改写为: y = w ^ T ⋅ x ^ y= \\hat w^T \\cdot \\hat x y=w^Tx^
  • 则模型输出结果为:
np.linalg.lstsq(x, y, rcond=-1)[0]
#array([[ 30.44214742],
#       [-22.37576724]])
  • y = 30.44 x − 22.38 y=30.44x-22.38 y=30.44x22.38
  • 则模型预测结果为:
yhat = x[:, 0] * 30.44 - 22.38
yhat
#array([-22.38      , -15.97157895,  -9.56315789,  -3.15473684,
#         3.25368421,   9.66210526,  16.07052632,  22.47894737,
#        28.88736842,  35.29578947,  41.70421053,  48.11263158,
#        54.52105263,  60.92947368,  67.33789474,  73.74631579,
#        80.15473684,  86.56315789,  92.97157895,  99.38      ])

# 观察模型预测和真实结果
plt.plot(x[:, 0], y, 'o')
plt.plot(x[:, 0], yhat, 'r-')

  • 能够发现,线性模型预测结果和真实结果差距较大。
  • 但此时如果我们在等号右边加上以 e e e 为底的指数运算,也就是将线性方程输出结果进行以 e e e 为底的指数运算转换之后去预测 y,即将方程改写为 y = e ( w ^ T ⋅ x ^ ) y=e^(\\hat w^T \\cdot \\hat x) y=e(w^Tx^)
  • 等价于 l n y = w ^ T ⋅ x ^ lny = \\hat w^T \\cdot \\hat x lny=w^Tx^
  • 即相当于是线性方程输出结果去预测 y y y 取以 e e e 为底的对数运算之后的结果。此时我们可以带入 l n y lny lny 进行建模。
np.linalg.lstsq(x, np.log(y), rcond=-1)[0]
#array([[1.],
#       [1.]])
  • 可得到方程 l n y = x + 1 lny=x+1 lny=x+1
  • 等价于 y = e ( x + 1 ) y=e^(x+1) y=e(x+1)
  • 即解出原方程。
  • 通过上面的过程,我们不难发现,通过在模型左右两端加上某些函数,能够让线性模型也具备捕捉非线性规律的能力。而在上例中,这种捕捉非线性规律的本质,是在方程加入 ln 对数函数之后,能够使得模型的输入空间(特征所在空间)到输出空间(标签所在空间)进行了非线性的函数映射。
  • 而这种连接线性方程左右两端、并且实际上能够拓展模型性能的函数,就被称为联系函数,而加入了联系函数的模型也被称为广义线性模型。广义线性模型的一般形式可表示如下: g ( y ) = w ^ T ⋅ x ^ g(y)=\\hat w^T \\cdot \\hat x g(y)=w^Tx^
  • 等价于 y = g − 1 ( w ^ T ⋅ x ^ ) y = g^-1(\\hat w^T \\cdot \\hat x) y=g1(w^Tx^)
  • 其中 g ( ⋅ ) g(·) g() 为联系函数(link function), g − 1 ( ⋅ ) g^-1(·) g1() 为联系函数的反函数。而如上例中的情况,也就是当联系函数为自然底数的对数函数时,该模型也被称为对数线性模型(logit linear model)。
  • 这里需要注意,一般来说广义线性模型要求联系函数必须是单调可微函数。
  • 从广义线性模型的角度出发,当联系函数为 g ( x ) = x g(x)=x g(x)=x 时, g ( y ) = y = w ^ T ⋅ x ^ g(y)=y=\\hat w^T \\cdot \\hat x g(y)=y=w^Tx^,此时就退化成了线性模型。而能够通过联系函数拓展模型捕捉规律的范围,这也就是广义的由来。

二、对数几率模型与逻辑回归

  • 逻辑回归也被称为对数几率回归。接下来,我们从广义线性模型角度理解逻辑回归。

1. 对数几率模型(logit model)