线性回归、逻辑回归

1. 线性模型(Linear Model)

对于给定样本 x ⃗ \mathbf{\vec{x}} x ,假定其有n维特征,则, x ⃗ = ( x 1 , x 2 , x 3 , … , x n ) T \mathbf{\vec{x}}=(x_1, x_2, x_3, \dotsc, x_n)^{\mathsf{T}} x =(x1,x2,x3,,xn)T。线性模型可以表示为:
f ^ ( x ⃗ ) = w ⃗ T x ⃗ + b \hat{f}(\mathbf{\vec{x}})=\mathbf{\vec{w}^{\mathsf{T}}\vec{x}}+b f^(x )=w Tx +b
其中 w ⃗ = ( w 1 , w 2 , w 3 , … , w n ) T \vec{w}=(w_1, w_2, w_3, \dotsc, w_n)^{\mathsf{T}} w =(w1,w2,w3,,wn)T是权重参数,表征了 x ⃗ \vec{x} x 中每个维度特征的重要性; b b b是偏置项; f ^ ( x ⃗ ) \hat{f}(\mathbf{\vec{x}}) f^(x )是预测值。

线性回归就是根据给定数据集 { ( x 1 ⃗ , y 1 ) , ( x 2 ⃗ , y 2 ) , … , ( x n ⃗ , y n ) } \lbrace\mathsf{(\vec{x_1},y_1),(\vec{x_2},y_2),\dotsc,(\vec{x_n}},y_n)\rbrace {(x1 ,y1),(x2 ,y2),,(xn ,yn)},来确定权重系数 w ⃗ \mathbf{\vec{w}} w 和偏置项 b b b。其中, ( y 1 , y 2 , … , y n ) (y_1,y_2,\dotsc,y_n) (y1,y2,,yn)是每个样本对应的真实值。通过最小化真实值和预测值之间的误差来确定最优的权重系数和偏置项。可以构造损失函数,通过最小化损失函数来求取权重系数和偏置项,如常用的均方误差(mean squared error)损失函数: M S E = 1 n ∑ i = 1 n ( y i ^ − y i ) 2 MSE=\frac{1}{n}\displaystyle\sum_{i=1}^{n}(\hat{y_i}-y_i)^2 MSE=n1i=1n(yi^yi)2
可以用梯度下降法来求解上述最优化问题(注意:此处不是随机梯度下降法,因为均方误差损失函数是凸函数)。在求解最优化问题的时候要注意特征归一化,这在许多机器学习模型中都需要注意的问题。

特征归一化的优点

  1. 归一化后加快了梯度下降求最优解的速度。例如对于不在同一尺度的两个特征,在进行优化时梯度等高线是椭圆形的,导致在梯度下降时,优化的方向沿着垂直等高线的方向走之字路线,也就是说变量的权重在优化的过程会出现震荡,而归一化之后梯度等高线是圆形,梯度的方向指向圆心,迭代就会很快。
ellipse circle
2. 归一化有可能提高精度。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,如果这时值域范围小的特征更重要,就会导致精度损失。归一化可以让每个维度的特征对结果做出的贡献相同。

特征归一化的方法
3. 线性归一化;
4. 标准差归一化;
5. 非线性归一化。

在求解线性回归模型时,特征组合问题也是需要注意的问题,比如房子的长度和宽度作为两个特征参与模型的构造,不如把其乘积面积作为一个特征来进行求解,这样在特征选择上就起到了降维的作用。

2. 广义线性模型(Generalized Linear Model)

对于可导函数 h h h,令 h ( y ) = w ⃗ T x ⃗ + b h(y)=\mathbf{\vec{w}^{\mathsf{T}}\vec{x}}+b h(y)=w Tx +b,就得到了广义线性模型。

例如,对数线性回归:
l n ( y ) = w ⃗ T x ⃗ + b ln(y)=\mathbf{\vec{w}^{\mathsf{T}}\vec{x}}+b ln(y)=w Tx +b

scikit-learn实现线性回归:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet

data = np.loadtxt('LinearRegressionData.txt', delimiter=',')
X = data[:,0]
X = X.reshape(-1,1)
y = data[:,1]

#scikit-learn中线性回归有多种正则化方法,下面的LinearRegression可换成Lasso, Ridge, ElasticNet
regr = LinearRegression()
regr.fit(X,y)

#显示结果
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(0,25)
ax.set_ylim(-5,30)
ax.set_title('Linear Regression',fontsize=14,fontweight='bold')
ax.set_xlabel('X',fontsize=14,fontweight='bold')
ax.set_ylabel('y',fontsize=14,fontweight='bold')
ax.annotate('fitted regression line', xy=(16, 16*regr.coef_+regr.intercept_), 
            xytext=(13,1.5), arrowprops=dict(facecolor='black',shrink=0.03,width=1,headwidth=8,headlength=10),
            horizontalalignment='left',verticalalignment='top',fontsize=12)
ax.grid()
plt.scatter(X,y,color='lime',marker='*',linewidth=2)
fit_x = np.linspace(0,25)
fit_y = regr.coef_ * fit_x + regr.intercept_
plt.plot(fit_x, fit_y,color='r',linewidth=2)
plt.show()

circle

scikit-learn实现逻辑回归:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

data = np.loadtxt('LogisticRegressionData.txt',delimiter=',')
X = data[:,0:2]
X = X.reshape(-1,2)
y = data[:,2]

#分别获取两类样本的索引
negative = data[:,2] == 0
positive = data[:,2] == 1

#scikit-learn中逻辑回归除了线性模型中的LogisticRegression外还可以用判别分析中的LinearDiscriminantAnalysis来实现,
#即下面的LogisticRegression可换位LinearDiscriminantAnalysis
regr = LogisticRegression()
regr.fit(X,y)

#显示结果
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(25,105)
ax.set_ylim(25,105)
ax.set_xlabel("X",fontsize=14,fontweight='bold')
ax.set_ylabel("y",fontsize=14,fontweight='bold')
ax.set_title('Logistic Regression',fontsize=14,fontweight='bold')
ax.grid()
plt.scatter(data[negative][:,0], data[negative][:,1],marker='x',c='r')
plt.scatter(data[positive][:,0], data[positive][:,1],marker='+',c='b')
x_min,x_max = X[:,0].min(),X[:,0].max()
y_min,y_max = X[:,1].min(),X[:,1].max()
h = 0.01
xx,yy = np.meshgrid(np.arange(x_min,x_max,h), np.arange(y_min,y_max,h))
Z = regr.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx,yy,Z,[0.5],colors='g')
plt.savefig('Logistic Regression',dpi=100)
plt.show()

ellipse

附件
如需使用本文所用的数据LinearRegressionData.txtLogisticRegressionData.txt,请移步https://github.com/GarryLau/MachineLearning/tree/master/LinearModel进行下载。

3. 线性回归VS逻辑回归

线性回归与逻辑回归分别是什么?二者的相同点与不同点是什么?
线性回归和逻辑回归是统计学和机器学习中常用的两种回归分析方法,尽管名称中都带有“回归”二字,但它们在应用场景、模型目标以及实现方法上存在显著的相似点和差异。

3.1 线性回归(Linear Regression)

定义:
线性回归是一种用于预测连续型因变量(也称为响应变量)与一个或多个自变量(预测变量)之间关系的统计方法。其基本假设是因变量与自变量之间存在线性关系。

模型形式:
对于单变量线性回归,模型可以表示为:
y = β 0 + β 1 x + ϵ y = \beta_0 + \beta_1 x + \epsilon y=β0+β1x+ϵ
其中:

  • y y y是因变量。
  • x x x是自变量。
  • β 0 \beta_0 β0是截距。
  • β 1 \beta_1 β1是斜率系数,表示自变量对因变量的影响。
  • ϵ \epsilon ϵ是误差项,通常假设服从正态分布。

应用场景:
例如,用于预测房价(连续型变量)与房屋面积、位置等因素之间的关系。

3.2 逻辑回归(Logistic Regression)

定义:
逻辑回归是一种用于分类任务的统计方法,主要用于预测二分类或多分类的因变量。尽管名称中含有“回归”,但其实质上是一种分类算法。

模型形式:
对于二分类逻辑回归,模型通过对线性组合进行逻辑函数(如Sigmoid函数)变换,将结果映射到0到1之间,表示事件发生的概率:
P ( Y = 1 ∣ X ) = 1 1 + e − ( β 0 + β 1 x ) P(Y=1|X) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x)}} P(Y=1∣X)=1+e(β0+β1x)1
其中:

  • P ( Y = 1 ∣ X ) P(Y=1|X) P(Y=1∣X)表示事件发生的概率。
  • 其他符号意义同线性回归。

应用场景:
例如,用于预测某个客户是否会购买产品(是/否),或者预测邮件是否为垃圾邮件。

3.3 相同点

  • 监督学习方法:两者都是监督学习中的回归方法,需要有标注的训练数据。
  • 线性关系假设:在逻辑回归中,虽然输出是概率,但其内部模型依然假设因变量的对数几率与自变量存在线性关系。
  • 参数估计:两者通常都使用最大似然估计(尽管线性回归常用最小二乘法)。
  • 解释性:模型参数均可解释为自变量对因变量的影响程度。

3.4 不同点

  • 因变量类型

    • 线性回归:因变量是连续型的,可以取任意实数值。
    • 逻辑回归:因变量是分类变量,通常是二分类(0或1),也可以扩展到多分类。
  • 输出结果

    • 线性回归:直接预测因变量的具体数值。
    • 逻辑回归:预测事件发生的概率,通过设定阈值进行分类。
  • 损失函数

    • 线性回归:常用均方误差(MSE)作为损失函数。
    • 逻辑回归:使用交叉熵损失函数(或对数损失)。
  • 模型假设

    • 线性回归:假设误差项服从正态分布,且具有恒定方差(同方差性)。
    • 逻辑回归:不对误差项的分布做正态性假设,更关注因变量的类别概率分布。
  • 数值范围

    • 线性回归:输出值无范围限制。
    • 逻辑回归:输出值限制在0到1之间,便于解释为概率。
  • 应用任务

    • 线性回归:主要用于回归任务,预测数值型结果。
    • 逻辑回归:主要用于分类任务,预测类别标签。

3.5 总结

尽管线性回归和逻辑回归在名称和某些基础理论上有相似之处,但它们服务于不同的任务目标,适用于不同类型的数据和问题场景。在实际应用中,选择哪种回归方法应根据具体的问题类型和数据特点来决定。

4. 章节3讲到逻辑回归的模型形式是“线性组合进行逻辑函数(如Sigmoid函数)变换,将结果映射到0到1之间”,那逻辑回归必须是自变量的线性组合吗,可以用非线性组合吗?

在逻辑回归(Logistic Regression)中,模型的核心是将自变量(特征)的组合通过逻辑函数(如Sigmoid函数)映射到0到1之间,以表示事件发生的概率。默认情况下,逻辑回归确实使用自变量的线性组合来构建模型,即模型假设因变量的对数几率(log-odds)与自变量存在线性关系:

log ( P ( Y = 1 ∣ X ) 1 − P ( Y = 1 ∣ X ) ) = β 0 + β 1 x 1 + β 2 x 2 + … + β n x n \text{log}\left(\frac{P(Y=1|X)}{1 - P(Y=1|X)}\right) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n log(1P(Y=1∣X)P(Y=1∣X))=β0+β1x1+β2x2++βnxn

然而,这是否意味着逻辑回归只能使用自变量的线性组合?答案是否定的。虽然基础模型假设是线性的,但通过特征转换和扩展,逻辑回归可以有效地处理非线性关系。以下是一些实现方式:

4.1 引入非线性特征

通过对原始特征进行非线性变换(如多项式、对数、指数等),可以在逻辑回归模型中捕捉自变量与因变量之间的非线性关系。例如:

  • 多项式特征
    log ( P ( Y = 1 ∣ X ) 1 − P ( Y = 1 ∣ X ) ) = β 0 + β 1 x + β 2 x 2 + β 3 x 3 \text{log}\left(\frac{P(Y=1|X)}{1 - P(Y=1|X)}\right) = \beta_0 + \beta_1 x + \beta_2 x^2 + \beta_3 x^3 log(1P(Y=1∣X)P(Y=1∣X))=β0+β1x+β2x2+β3x3

  • 交互项
    如果有两个特征 (x_1) 和 (x_2),可以引入它们的交互项:
    log ( P ( Y = 1 ∣ X ) 1 − P ( Y = 1 ∣ X ) ) = β 0 + β 1 x 1 + β 2 x 2 + β 3 x 1 x 2 \text{log}\left(\frac{P(Y=1|X)}{1 - P(Y=1|X)}\right) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_1x_2 log(1P(Y=1∣X)P(Y=1∣X))=β0+β1x1+β2x2+β3x1x2

4.2 使用基函数(Basis Functions)

基函数如样条函数(splines)、径向基函数(RBF)等,可以将输入特征映射到更高维度的空间,从而捕捉复杂的非线性关系。例如,使用样条函数可以在特定区间内对特征进行分段拟合。

4.3 特征工程

通过领域知识或数据驱动的方法,构造新的特征来反映非线性关系。例如,对于某些问题,特征的对数、平方根或其他函数形式可能更能揭示其与目标变量的关系。

4.4 正则化技术

在引入大量非线性特征的情况下,使用正则化方法(如L1、L2正则化)可以防止模型过拟合,并选择最重要的非线性特征。

4.5 广义线性模型的扩展

逻辑回归是广义线性模型(Generalized Linear Models, GLM)的一种。在GLM框架下,可以通过选择不同的链接函数和分布族,进一步扩展模型以处理更多样化的非线性关系。

4.6 结合非线性模型的混合方法

虽然逻辑回归本身是线性的,但它可以与其他非线性模型结合使用。例如,前面使用非线性方法提取特征,然后将这些特征输入到逻辑回归模型中,以提升模型的表达能力。

4.7 实践中的考虑

  • 解释性:引入非线性特征后,模型的解释性可能会降低。需要权衡模型的复杂性与可解释性,特别是在需要对模型决策进行解释的应用场景中。

  • 过拟合风险:增加特征的非线性程度可能导致模型过拟合,尤其是在样本量有限的情况下。因此,正则化和交叉验证等技术在此过程中尤为重要。

  • 计算复杂度:引入大量非线性特征可能增加计算复杂度,尤其是在高维数据集上,需要考虑计算资源的限制。

4.8 总结

虽然标准的逻辑回归模型假设自变量的线性组合用于构建对数几率,但通过适当的特征转换和扩展,可以在逻辑回归框架内处理非线性关系。这种灵活性使得逻辑回归在处理复杂数据时具有更强的适应能力。然而,需谨慎处理以避免过拟合,并保持模型的可解释性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值