机器学习笔记1——逻辑回归

1 Logistic Regression

Logistic Regression 逻辑回归,简称LR,适合于分类问题

1.1 LR模型

对于线性回归模型,需要拟合一个 Y = X θ + b Y=X\theta+b Y=Xθ+b的函数,回归问题适合于连续的问题,而对于分类问题,需要得到一系列离散的标签,以二分类为例,需要预测的类别为0,1.可以使用sigmoid函数将连续问题转化为离散问题:

g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+ez1

sigmoid函数的图像为:
sigmoid
其中, z → + ∞ z \to +\infty z+时, g ( z ) → 1 g(z) \to 1 g(z)1 z → − ∞ z \to -\infty z 时, g ( z ) → 0 g(z) \to 0 g(z)0. Sigmoid函数的导数为:
g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) g'(z)=g(z)(1-g(z)) g(z)=g(z)(1g(z))
z = θ x + b z=\theta x+b z=θx+b,则有:
h θ ( x ) = 1 1 + e − θ x + b h_\theta(x) = \frac{1}{1+e^{-\theta x+b}} hθ(x)=1+eθx+b1
对于二分类问题,该函数的输出可以理解为分类为1的概率,如果把X记为 [ x ( 1 ) , x ( 2 ) , . . . , x ( m ) ] [x^{(1)},x^{(2)},...,x^{(m)}] [x(1),x(2),...,x(m)], θ \theta θ记为 [ θ 1 , θ 2 , . . . , θ m ] [\theta_1,\theta_2,...,\theta_m] [θ1,θ2,...,θm]为要估计的模型参数,则LR的矩阵形式为:
h θ ( X ) = 1 1 + e − θ X T + b h_\theta(X) = \frac{1}{1+e^{-\theta X^T+b}} hθ(X)=1+eθXT+b1

1.2 损失函数

由于 h θ ( x ) h_\theta (x) hθ(x)表示的是被分类为1的概率,而被分类为0的概率则为 1 − h θ ( x ) 1-h_\theta(x) 1hθ(x),对于离散随机变量,我们可以写出分布列:

y10
h θ ( x ) h_\theta (x) hθ(x) 1 − h θ ( x ) 1-h_\theta(x) 1hθ(x)

用一个式子表示就是
p ( y ∣ x , θ ) = h θ ( x ) y ( 1 − h θ ( x ) ) 1 − y p(y|x,\theta) = h_\theta(x)^y(1-h_\theta(x))^{1-y} p(yx,θ)=hθ(x)y(1hθ(x))1y
这就是 y y y的分布函数,函数中的\theta表示要估计的参数,熟悉概率论的都知道,要估计分布函数中的参数可以有矩估计和极大似然法两种,这里选极大似然法,也叫最大似然法,这里把他的概念写出来:
极大似然法
也就是说,假设所有的训练样本 y 1 , y 2 , . . , y m y_1,y_2,..,y_m y1,y2,..,ym所对应的随机变量 Y 1 , Y 2 , Y m Y_1,Y_2,Y_m Y1,Y2,Ym是独立同分布的,其分布函数为 p ( y ∣ x , θ ) p(y|x,\theta) p(yx,θ),独立同分布的随机变量的联合分布函数就是每个分布函数的乘积,把这个联合分布函数称为似然函数,表示为:
L ( θ ) = ∏ i = 1 m h θ ( x ( i ) ) y ^ ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ^ ( i ) L(\theta) = \prod_{i=1}^{m}h_\theta(x^{(i)})^{\hat{y}^{(i)}}(1-h_\theta(x^{(i)}))^{1-\hat{y}^{(i)}} L(θ)=i=1mhθ(x(i))y^(i)(1hθ(x(i)))1y^(i)
因为似然函数取对数后达到最大值时候的 θ \theta θ与本身达到最大值后的 θ \theta θ是相同的,即:
arg max ⁡ L ( θ ) = arg max ⁡ log ⁡ [ L ( θ ) ] \argmax L(\theta) = \argmax \log [L(\theta)] argmaxL(θ)=argmaxlog[L(θ)]
所以我们一般用对数似然函数,似然函数取反就是损失函数,而最大化似然函数就是最小化损失函数:
J ( θ ) = − ln ⁡ L ( θ ) = − ∑ i = 1 m y ^ ( i ) ln ⁡ h θ ( x ( i ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) J(\theta) = - \ln L(\theta)=-\sum_{i=1}^{m} \hat{y}^{(i)}\ln h_\theta(x^{(i)})+(1-y^{(i)}) \ln (1-h_\theta(x^{(i)})) J(θ)=lnL(θ)=i=1my^(i)lnhθ(x(i))+(1y(i))ln(1hθ(x(i)))

那损失函数什么时候取最小值呢?当然就是其导数取0的时候啦。注意这里的 θ \theta θ表示m个待估计的参数 θ 1 , θ 2 , . . . , θ m \theta_1,\theta_2,...,\theta_m θ1,θ2,...,θm,取极值时要求每个偏导都为0. 损失函数的矩阵表达方法为:
J ( θ ) = − Y T log ⁡ h θ ( X ) − ( E − Y ) T log ⁡ ( E − h θ ( X ) ) J(\theta) = -Y^T\log h_\theta(X)-(E-Y)^T \log (E-h_\theta(X)) J(θ)=YTloghθ(X)(EY)Tlog(Ehθ(X))
其中 E E E为单位矩阵

1.3 优化方法

对于二分类的LR,可以使用梯度下降法,坐标轴下降法,牛顿法等。梯度下降法容易理解,就是参数按照梯度减小的方向更新(形式上的推导),
θ = θ − α ∂ J ( θ ) ∂ θ \theta = \theta - \alpha \frac{\partial J(\theta)}{\partial \theta} θ=θαθJ(θ)
在LR中,我们在最开始给出了SIgmoid的导数,因此用梯度下降法更新参数可以表示为:
θ = θ − α X T ( h θ ( X ) − Y ) \theta = \theta -\alpha X^T(h_\theta(X)-Y) θ=θαXT(hθ(X)Y)
而牛顿法最初是用来求解函数零点的,而极值代表一阶导数的零点,因此可以用牛顿法。记 J ′ ( θ ) J'(\theta) J(θ)为一阶偏导数, J ′ ′ ( θ ) J''(\theta) J(θ)为二阶偏导数,则有:
θ = θ − α J ′ ( θ ) J ′ ′ ( θ ) \theta = \theta - \alpha \frac{J'(\theta)}{J''(\theta)} θ=θαJ(θ)J(θ)
坐标轴下降法则是固定一个坐标,沿着另外一个坐标寻找最优点,适合于导数不连续的情况。

1.4 Regulization(正则化)

为什么要正则化,这是因为机器学习模型中,学习到的参数 θ \theta θ是直接与特征向量 X X X相乘的,如LR中有:
h θ ( x ) = 1 1 + e − θ x + b h_\theta(x) = \frac{1}{1+e^{-\theta x+b}} hθ(x)=1+eθx+b1
X X X不变的情况下,如果 θ \theta θ特别大,那乘积就会特别大,假如在测试的时候,某个测试样本跟训练样本的分布不太一样,那么经过参数 θ \theta θ放大后可能得到一个非常离谱的值。参数的取值过大会让模型异常敏感,也容易过拟合,那么如何避免这种情况呢?一种可行的方法就是,我们不希望学习到的参数 θ = θ 1 , θ 2 , . . . , θ m \theta={\theta_1,\theta_2,...,\theta_m} θ=θ1,θ2,...,θm取值太大,那就让他们尽量接近于0,即:
min ⁡ ∑ i = 1 m ∣ ∣ θ i ∣ ∣ \min \sum_{i=1}^{m} ||\theta_i|| mini=1mθi
矩阵表达就是 min ⁡ ∣ ∣ θ ∣ ∣ 1 \min ||\theta||_1 minθ1,我们称为L1正则项,同样的,也有L2正则项
1 2 ∣ ∣ θ ∣ ∣ 2 2 = 1 2 ∑ i = 1 m ∣ ∣ θ i ∣ ∣ 2 \frac{1}{2}||\theta||_2^2=\frac{1}{2}\sum_{i=1}^{m} ||\theta_i||^2 21θ22=21i=1mθi2
因为正则项也是关于 θ \theta θ的函数,也是我们要优化的目标之一(目标是让它最小),这样就可以合并到损失函数中:
J ( θ ) = − Y T log ⁡ h θ ( X ) − ( E − Y ) T log ⁡ ( E − h θ ( X ) ) + λ 1 ∣ ∣ θ ∣ ∣ 1 J(\theta) = -Y^T\log h_\theta(X)-(E-Y)^T \log (E-h_\theta(X))+\lambda_1 ||\theta||_1 J(θ)=YTloghθ(X)(EY)Tlog(Ehθ(X))+λ1θ1

λ 1 \lambda_1 λ1是正则项的权重。加入正则项后,学习到的参数就不会太大,模型也就没那么敏感。当然,如果正则项的权重过大,那所有的参数 θ \theta θ会很小,模型会异常不敏感,基本所有的输入都会得到一个差不多的输出,所有这个权重也要仔细考虑。
此外,由于 b b b是直接加到优化函数后的,相当于对函数做平移,我们并不需要正则化这个参数。

1.5多元逻辑回归

多元逻辑回归是二元情况的推广,每个类的概率用Softmax函数计算。假设要分K类,每个要学习的参数为 ( θ 1 , b 1 ) , ( θ 2 , b 2 ) . . . , ( θ k , b k ) (\theta_1,b_1),(\theta_2,b_2)...,(\theta_k,b_k) (θ1,b1),(θ2,b2)...,(θk,bk)
z 1 = θ 1 x + b 1 z 2 = θ 2 x + b 2 . . . z k = θ k x + b k z_1 = \theta_1x+b_1 \\ z_2 = \theta_2x+b_2 \\ ...\\ z_k = \theta_kx+b_k z1=θ1x+b1z2=θ2x+b2...zk=θkx+bk
则x属于每个类的概率可以计算为:
y 1 = e z 1 ∑ i = 1 k e z k y 2 = e z 2 ∑ i = 1 k e z k . . . y k = e z k ∑ i = 1 k e z k y_1 = \frac{e^{z_1}}{\sum_{i=1}^{k}e^{z_k}} \\ y_2 = \frac{e^{z_2}}{\sum_{i=1}^{k}e^{z_k}} \\ ... \\ y_k = \frac{e^{z_k}}{\sum_{i=1}^{k}e^{z_k}} \\ y1=i=1kezkez1y2=i=1kezkez2...yk=i=1kezkezk
如下图:
在这里插入图片描述
softmax其实就相当于把输入放大后再做归一化。
在多个类计算损失函数时,用到的是多个类的entropy,这时要用到One-hot矩阵,也就是:
y ^ 1 = ( 1 0 . . . 0 ) y ^ 2 = ( 0 1 . . . 0 ) y ^ k = ( 0 0 . . . 1 ) \hat{y}_1=\begin{pmatrix} 1 \\ 0 \\ ... \\ 0 \end{pmatrix} \hat{y}_2=\begin{pmatrix} 0 \\ 1 \\ ... \\ 0 \end{pmatrix} \hat{y}_k=\begin{pmatrix} 0 \\ 0 \\ ... \\ 1 \end{pmatrix} y^1=10...0y^2=01...0y^k=00...1
具体计算的时候,使用:
min ⁡ − ∑ i = 1 k y ^ i ln ⁡ y i \min -\sum_{i=1}^{k} \hat{y}_i \ln y_i mini=1ky^ilnyi

1.6 总结

自己的实验数据集中有23万条数据,从结果看,LR的准确率算很高的,最关键的是训练速度很快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
居民出行选择行为可以被视为一个分类问题,其中特征包括年龄、性别、收入、出行目的、出行时间、出行距离等。在这里,我们可以使用逻辑回归模型进行预测。 我们可以先收集一些相关数据,然后将其分为训练集和测试集。接着,我们可以使用 Python 中的 Scikit-learn 库来构建逻辑回归模型。具体步骤如下: 1. 首先,我们需要导入所需的库: ```python import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score ``` 2. 然后,我们需要加载数据并进行预处理: ```python data = pd.read_csv('travel_behavior.csv') data = data.dropna() # 删除缺失值 data = pd.get_dummies(data, columns=['purpose', 'time']) # 将分类变量转换为哑变量 X = data.drop(['choice'], axis=1) y = data['choice'] ``` 这里,我们使用了 Pandas 库加载数据,并删除了任何包含缺失值的行。然后,我们使用 `get_dummies()` 函数将分类变量转换为哑变量。最后,我们将特征(`X`)和标签(`y`)分开。 3. 接着,我们将数据分为训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) ``` 这里,我们使用了 `train_test_split()` 函数来将数据分为训练集和测试集。我们选择了 20% 的数据作为测试集,而其余的数据则用于训练模型。 4. 然后,我们可以使用逻辑回归模型进行训练: ```python model = LogisticRegression() model.fit(X_train, y_train) ``` 这里,我们使用了 Scikit-learn 库中的 `LogisticRegression()` 类来构建逻辑回归模型,并使用 `fit()` 方法将模型拟合到训练数据上。 5. 最后,我们可以使用测试集来评估模型的准确性: ```python y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` 这里,我们使用 `predict()` 方法来预测测试集中的标签,并使用 `accuracy_score()` 函数来计算模型的准确性。 通过以上步骤,我们就可以构建一个简单的逻辑回归模型,用于预测居民出行选择行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值