目录
一、相关概念
(一)回归与分类的区别
回归:因变量取连续值。例如一台4核CPU,3G内存的手机,跑分估计会是多少?
分类:因变量取离散值。例如这台手机的性能应分为哪一类 (高性能还是低性能) ?
手机性能与硬件配置表
核心数 | 内存 | 跑分 |
---|---|---|
1 | 8 | 5020 |
8 | 6 | 200000 |
8 | 4 | 130000 |
8 | 3 | 105000 |
10 | 2 | 30000 |
用回归的方法做分类,可以考虑以下步骤:
- 求出回归方程的参数
- 计算手机的跑分值
- 设置一个阈值,比较跑分值和阈值的大小
关键:阈值取多少合适?
(二)跃阶函数和激活函数
阶跃函数和激活函数对比图
1、Sigmoid函数的数学表达式: g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1
- 当 z = 0 z=0 z=0 时, g ( z ) = 0.5 g(z) = 0.5 g(z)=0.5
- 随着 z z z的增大,对应的 g ( z ) g(z) g(z)值逐渐逼近于1
- 随着 z z z的减小,对应的 g ( z ) g(z) g(z)值逐渐逼近于0
2、两个基本性质: g ( − z ) = 1 − g ( z ) g(-z)=1-g(z) g(−z)=1−g(z) d g ( z ) d x = g ( z ) [ 1 − g ( z ) ] \frac{\mathrm{d}g(z)}{\mathrm{d}x}=g(z)[1-g(z)] dxdg(z)=g(z)[1−g(z)]
- 相同点:都可以实现对连续值的离散化
- 不同点:跃阶函数存在瞬间跳变,数学上具有不连续性,不好处理;而Sigmoid激活函数是连续函数,具有良好的数学性质: g ( z ) g(z) g(z)不仅处处光滑可导,而且是任意阶可导的凸函数。
二、逻辑回归 (logistic Regression)
(一)逻辑回归的基本概念
1、思想:基于回归模型做分类
-
线性回归模型: f ( X ) = w T X f(X)=\mathbf{w}^TX f(X)=wTX
-
待分类样本: X = ( x 1 , x 2 , . . . , X m ) T X=(x_1,x_2,...,X_m)^T X=(x1,x2,...,Xm)T (此处的 X 表 X表 X表示单个样本)
-
分类的目标:将样本 X X X划分为正例或返利
-
关键要点:激活函数 g ( f ( X ) ) g(f(X)) g(f(X)) 的设计
Sigmoid函数 g ( z ) = 1 1 + e − z \begin{aligned}g(z)=\frac{1}{1+e^{-z}}\end{aligned} g(z)=1+e−z1 如果阈值取0.5,可以用于分类。
2、二值分类的基本流程
(二)逻辑回归的分类思想
把一个样本 X i X_i Xi 逻辑回归的函数值 g ( X i ) g(X_i) g(Xi) 看成是该样本属于正例 y i = 1 y_i=1 yi=1 的概率值:
- 如果该值大于0.5,就可以判定该样本属于正例
- 如果该值小于0.5,则可判定该样本属于反例
p ( y i = 1 ∣ X i ) = g ( X i ) = 1 1 + e − θ T X i = e θ T X i 1 + e θ T X i p(y_i=1|X_i)=g(X_i)=\frac{1}{1+e^{-\theta^TX_i}}=\frac{e^{\theta^TX_i}}{1+e^{\theta^TX_i}} p(yi=1∣Xi)=g(Xi)=1+e−θTXi1=1+eθTXieθTXi p ( y i = 0 ∣ X i ) = 1 − g ( X i ) = 1 − e θ T X i 1 + e θ T X i = 1 1 + e θ T X i p(y_i=0|X_i)=1-g(X_i)=1-\frac{e^{\theta^TX_i}}{1+e^{\theta^TX_i}}=\frac{1}{1+e^{\theta^TX_i}} p(yi=0∣Xi)=1−g(Xi)=1−1+eθTXieθTXi=1+eθTXi1
(三)逻辑回归与对数几率的关系
一个事件的几率 (odds) 是指该事件发生的概率与该事件不发生概率的比值,即:如果事件发生概率为 p p p,那么该事件的几率等于 p 1 − p \frac{p}{1-p} 1−pp。该事件的对数几率 (log odds) 或者 logit (对它取log,即 log it) 函数是: l o g i t ( p ) = log p 1 − p logit(p)=\log\frac{p}{1-p} logit(p)=log1−pp 如果求逻辑回归中正例样本的对数几率,则有: log p ( y i = 1 ∣ X i ) p ( y i = 0 ∣ X i ) = log g ( X i ) 1 − g ( X i ) = log e θ T X i 1 + e θ T X i 1 1 + e θ T X i = θ T X i \begin{aligned}\log\frac{p(y_i=1|X_i)}{p(y_i=0|X_i)}=\log\frac{g(X_i)}{1-g(X_i)}=\log\frac{\frac{e^{\theta^TX_i}}{1+e^{\theta^TX_i}}}{\frac{1}{1+e^{\theta^TX_i}}}\end{aligned}=\theta^TX_i logp(yi=0∣Xi)p(yi=1∣Xi)=log1−g(Xi)g(Xi)=log1+eθTXi11+eθTXieθTXi=θTXi 即:逻辑回归中输出 y i = 1 y_i=1 yi=1 (正例样本) 的对数几率是输入 X i X_i Xi 的线性函数 (逻辑回归也称为对数几率回归)。
注意另外一个事实:因为非线性函数 (此处是 g ( X ) g(X) g(X)) 经过一定的变换可以变成线性函数,所以可以把一个非线性问题转化成一个线性问题来处理!
(四)逻辑回归的损失函数
1、最大似然估计 (MLE)
为了下面分析过程的符号统一,把样本分类成正例的概率预测值记为 y ^ i \hat{y}_i y^i,则有: y ^ i = p ( y i = 1 ∣ X i ) = g ( θ T X i ) \hat{y}_i=p(y_i=1|X_i)=g(\theta^TX_i) y^i=p(yi=1∣Xi)=g(θTXi) 如果已知样本 X i X_i Xi 为正例,即真实的分类标签 y i = 1 y_i=1 yi=1,则希望分类的概率预测值 y ^ i \hat{y}_i y^i 越大越好;反之如果 X i X_i Xi 为反例,即真实的标签 y i = 0 y_i=0 yi=0,则希望 1 − y ^ i 1 −\hat{y}_i 1−y^i 越大越好,此时可以将正反例的概率分布统一写成: p ( y i ∣ θ , X i ) = y ^ i y i ( 1 − y ^ i ) 1 − y i p(y_i|\theta,X_i)=\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i} p(yi∣θ,Xi)=y^iyi(1−y^i)1−yi 其中, y i = 1 y_i=1 yi=1 或 0 0 0。
学习的目标是要求上式中的系数向量 θ \theta θ,可以通过最大似然估计来求解。 m m m 个样本的最大似然估计 (Maximum Likelihood Estimation) 就是是它们的联合概率分布最大化,即使得右式最大化的系数 θ \theta θ 就是学习目标: θ = arg max θ ∏ i = 1 m y ^ i y i ( 1 − y ^ i ) 1 − y i (公式1) \theta=\argmax_\theta\prod_{i=1}^m\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i}\tag{公式1} θ=θargmaxi=1∏my^iyi(1−y^i)1−yi(公式1)
2、逻辑回归的损失函数
求解公式1等价于求解使对数似然函数最大化的参数向量 θ \theta θ: θ = arg max θ ∑ i = 1 m y i ln y ^ i + ( 1 − y i ) ln ( 1 − y ^ i ) \theta=\argmax_\theta\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i) θ=θargmaxi=1∑myilny^i+(1−yi)ln(1−y^i) 其中, y i = 1 y_i=1 yi=1 或 0 0 0。
上式也等价于求解使负对数似然函数最小化的参数向量 θ \theta θ:
θ = arg min θ [ − ∑ i = 1 m y i ln y ^ i + ( 1 − y i ) ln ( 1 − y ^ i ) ] (公式2) \theta=\argmin_\theta\left[-\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i)\right]\tag{公式2} θ=θargmin[−i=1∑myilny^i+(1−yi)ln(1−y^i)](公式2)
如果令 L ( θ ) = − ∑ i = 1 m y i ln y ^ i + ( 1 − y i ) ln ( 1 − y ^ i ) (公式3) L(\theta)=-\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i)\tag{公式3} L(θ)=−i=1∑myilny^i+(1−yi)ln(1−y^i)(公式3),则 L ( θ ) L(\theta) L(θ) 就是逻辑回归的损失函数,而使 L ( θ ) L(\theta) L(θ) 最小化的参数向量 θ \theta θ 即学习目标。
L ( θ ) = − ∑ i = 1 m y i ln y ^ i + ( 1 − y i ) ln ( 1 − y ^ i ) L(\theta)=-\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i) L(θ)=−i=1∑myilny^i+(1−yi)ln(1−y^i)
逻辑回归的损失函数使用了负似然对数函数,而非均方误差函数,原因在于前者是凸函数,存在全局最优解;而后者非凸,可能陷入局部极少值点。
逻辑回归的损失函数 L ( θ ) L(\theta) L(θ) 也称为交叉熵损失函数,交叉熵能够衡量两个数据分布的异同程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。
3、熵增定律及其启示
熵增定律,又称热力学第二定律,指出在一个孤立系统中,如果没有外力做功,熵(代表混乱程度的物理量)总是趋于增加,即系统总是从有序向无序发展。
如果物理学只能留一条定律,我会留熵增定律。------吴国盛 (清华大学的科学史系主任)
如果地球毁灭了,我们怎么能够在一张名片上写下地球文明的全部精髓,让其他文明知道我们曾有过这个文明呢?
吴军老师给出的答案是三个公式:
- 1 + 1 = 2 1+1=2 1+1=2 :代表了数学文明
- E = m c E=mc E=mc :爱因斯坦的质能方程
- S = − ∑ P ln P S=-\sum P\ln P S=−∑PlnP :熵的定义
生命就是对抗负熵的过程。
物质总是向着熵增演化,屋子不收拾会变乱,手机会越来越卡,耳机线会凌乱,热水会慢慢变凉,太阳会不断燃烧衰变......直到宇宙的尽头------热寂。因为事物总是向着熵增的方向发展,所以一切符合熵增的,都非常的容易和舒适,比如懒散。因为所有事物都向着无规律、无序和混乱发展,如果你要变得自律,你就得逆着熵增做功,这个过程会非常痛苦。生命本身就是自律的过程,即熵减的过程。
(五)逻辑回归的参数求解
因为 y ^ i = p ( y i ∣ X i ) = g ( θ T X i ) \hat{y}i=p(y_i|X_i)=g(\theta^TX_i) y^i=p(yi∣Xi)=g(θTXi) 是参数向量 θ \theta θ 的非线性函数,导致求解公式2没有解析解,而 g ( θ T X i ) g(\theta^TX_i) g(θTXi) 对于 θ \theta θ 又是高阶可导的凸函数,所以可以通过梯度下降法、牛顿法等数值优化的方法求出 θ \theta θ 的最优解:
∇ L ( θ ) = − ∑ i = 1 m y i ∂ ln y ^ i ∂ θ + ( 1 − y i ) ∂ ln ( 1 − y ^ i ) ∂ θ = − ∑ i = 1 m y i y ^ i ∂ ln g ( θ T X i ) ∂ θ + ( 1 − y i ) ( 1 − y ^ i ) ∂ ln g ( θ T X i ) ∂ θ = − ∑ i = 1 m y i y ^ i y ^ i ( 1 − y ^ i ) X i + ( 1 − y i ) ( 1 − y ^ i ) y ^ i ( 1 − y ^ i ) X i = ∑ i = 1 m ( y ^ i − y i ) X i \begin{aligned} \nabla L(\theta)&=-\sum{i=1}^my_i\frac{\partial\ln\hat{y}_i}{\partial\theta}+(1-y_i)\frac{\partial\ln(1-\hat{y}i)}{\partial\theta}\\ &=-\sum{i=1}^m\frac{y_i}{\hat{y}_i}\frac{\partial\ln g(\theta^TX_i)}{\partial\theta}+\frac{(1-y_i)}{(1-\hat{y}i)}\frac{\partial\ln g(\theta^TX_i)}{\partial\theta}\\ &=-\sum{i=1}^m\frac{y_i}{\hat{y}_i}\hat{y}_i(1-\hat{y}_i)X_i+\frac{(1-y_i)}{(1-\hat{y}_i)}\hat{y}_i(1-\hat{y}i)X_i\\ &=\sum{i=1}^m(\hat{y}_i-y_i)X_i \end{aligned} ∇L(θ)=−i=1∑myi∂θ∂lny^i+(1−yi)∂θ∂ln(1−y^i)=−i=1∑my^iyi∂θ∂lng(θTXi)+(1−y^i)(1−yi)∂θ∂lng(θTXi)=−i=1∑my^iyiy^i(1−y^i)Xi+(1−y^i)(1−yi)y^i(1−y^i)Xi=i=1∑m(y^i−yi)Xi
梯度下降法迭代求解: θ k + 1 = θ k − γ ∇ L ( θ k ) \theta^{k+1}=\theta^k-\gamma\nabla L(\theta^k) θk+1=θk−γ∇L(θk)
(六)正则化逻辑回归
θ = arg min θ ( [ − ∑ i = 1 m y i ln y ^ i + ( 1 − y i ) ln ( 1 − y ^ i ) ] + λ 2 ∑ j = 1 n θ j 2 ) \theta=\argmin_\theta\left(\left[-\sum_{i=1}^my_i\ln\hat{y}i+(1-y_i)\ln(1-\hat{y}i)\right]+\frac{\lambda}{2}\sum{j=1}^n\theta_j^2\right) θ=θargmin([−i=1∑myilny^i+(1−yi)ln(1−y^i)]+2λj=1∑nθj2) 其中, λ 2 ∑ j = 1 n θ j 2 \begin{aligned}\frac{\lambda}{2}\sum{j=1}^n\theta_j^2\end{aligned} 2λj=1∑nθj2 为 l 2 l_2 l2 正则项。
正则项系数 λ \lambda λ 是一个超参数,表示对于系数向量的惩罚程度。
三、Scikit-learn的LogisticRegression类
sklearn
的linear_model
模块提供LogisticRegression类用于构建Logistic回归模型。LogisticRegression类的基本语法格式如下:
python
class sklearn.linear_model.LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True,
intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr',
verbose=0, warm_start=False, n_jobs=1)
1、Logistic回归模型的参数
上面的参数C是正则化系数 λ \lambda λ 的倒数,C值越小正则化越强 (对应 λ \lambda λ值越大),分类边界越光滑,泛化性能越好 (但训练误差可能变大)。
2、Logistic回归模型的属性和方法
四、逻辑回归简单示例
以下两个示例代码中用到的数据集下载地址:
链接:https://pan.quark.cn/s/fbc5e2bb995d
提取码:fUvF
示例1
python
import pandas as pd
data = pd.read_excel('credit.xlsx')
x = data.iloc[:600,:14].as_matrix()
y = data.iloc[:600,14].as_matrix()
x1= data.iloc[600:,:14].as_matrix()
y1= data.iloc[600:,14].as_matrix()
from sklearn.linear_model import LogisticRegression as LR
lr = LR() #创建逻辑回归模型类
lr.fit(x, y) #训练数据
r=lr.score(x, y); # 模型准确率(针对训练数据)
R=lr.predict(x1)
Z=R-y1
Rs=len(Z[Z==0])/len(Z)
print('预测结果为:',R)
print('预测准确率为:',Rs)
示例2
python
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
data = pd.read_csv('LogisticRegression.csv')
data_tr, data_te, label_tr, label_te = train_test_split(data.iloc[:, 1:], data['admit'], test_size=0.2)
clf = LogisticRegression()
clf.fit(data_tr, label_tr)
pre = clf.predict(data_te)
res = classification_report(label_te, pre)
print(res)