和我一起入门机器学习-逻辑回归

608 阅读6分钟

逻辑回归

上一篇博客从数学原理和代码角度解释了线性回归,但是该模型只适合特征与预测值呈线性关系的回归场景,接下来我们将介绍逻辑回归,逻辑回归是一种用于二分类问题的机器学习算法。

数学原理

逻辑斯蒂回归(Logistic Regression)虽然名字中有回归,但模型最初是为了解决二分类问题。线性回归模型帮助我们用最简单的线性方程实现了对数据的拟合,但只实现了回归而无法分类。因此LR就是在线性回归的基础上,构建的一种分类模型。

对线性模型进行二分类任务,简单的是通过阶跃函数,即将线性模型的输出值套上一个函数进行分割,大于z的判定为0,小于z的判定为1

激活函数.png

但是该分段函数数学性质不好,既不连续也不可微。因此有人提出了对数几率函数,简称Sigmoid函数。

y=11+ezy=\frac{1}{1+e^{-z}}

该函数具有很好的数学性质,既可以用于预测类别,并且任意阶可微,因此可用于求解最优解,将线性函数带进去,可得LR模型为:

y=11+ewTx+by=\frac{1}{1+e^{-w^Tx+b}}

损失函数

  • 什么是极大似然估计:通俗理解来说,就是利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值。极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:"模型已定,参数未知"
    • 极大似然估计中采样需要满足一个重要的假设,就是所有的采样都是独立同分布的。

y为概率p,根据似然函数的对数可得

L=[ylogypre+(1y)log(1ypre)]L=-[ylogy_{pre}+(1-y)log(1-y_{pre})]

极大似然估计推导损失函数,写出似然函数:

P(y(i)=1x(i);θ)=hθ(x(i))P(y^{(i)}=1|x^{(i)};\theta)=h_{\theta}(x^{(i)})
P(y(i)=0x(i);θ)=1hθ(x(i))P(y^{(i)}=0|x^{(i)};\theta)=1-h_{\theta}(x^{(i)})
L=Πi=1mP(y(i)ypre(i))L=\Pi_{i=1}^mP(y^{(i)}|y^{(i)}_{pre})
=Πi=1mypre(i)y(i)(1ypre(i))1y(i)=\Pi_{i=1}^my_{pre}^{(i)y^{(i)}}(1-y_{pre}^{(i)})^{1-y^{(i)}}

取对数

logL=i=1my(i)logypre(i)+(1y(i))log(1ypre(i))logL=\sum_{i=1}^my^{(i)}logy_{pre}^{(i)}+(1-y^{(i)})log(1-y_{pre}^{(i)})

根据梯度下降法求解,需要链式求导法则求解

J(θ)θj=θ(i=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))])\frac{\partial{J(\theta)}}{\partial{\theta_j}}=\frac{\partial}{\partial{\theta}}(\sum_{i=1}^m[y^{(i)}log(h_{\theta}(x^{(i)}))+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))])
=i=1m[y(i)1hθ(x(i))(1y(i))11hθ(x(i))]θhθ(x(i))=\sum_{i=1}^m[y^{(i)}\frac{1}{h_{\theta}(x^{(i)})}-(1-y^{(i)})\frac{1}{1-h_{\theta}(x^{(i)})}]\frac{\partial}{\partial{\theta}}h_{\theta}(x^{(i)})
=i=1m[y(i)1hθ(x(i))(1y(i))11hθ(x(i))]hθ(x(i))(1hθ(x(i)))θθx(i)=\sum_{i=1}^m[y^{(i)}\frac{1}{h_{\theta}(x^{(i)})}-(1-y^{(i)})\frac{1}{1-h_{\theta}(x^{(i)})}]h_{\theta}(x^{(i)})(1-h_{\theta}(x^{(i)}))\frac{\partial}{\partial{\theta}}\theta{x^{(i)}}
=i=1m[y(i)(1hθ(x(i)))(1y(i))hθ(x(i))]θθx(i)=\sum_{i=1}^m[y^{(i)}(1-h_{\theta}(x^{(i)}))-(1-y^{(i)})h_{\theta}(x^{(i)})]\frac{\partial}{\partial{\theta}}\theta{x^{(i)}}
=i=1m[y(i)hθ(x(i))]xj(i)=\sum_{i=1}^m[y^{(i)}-h_{\theta}(x^{(i)})]x_j^{(i)}

逻辑斯蒂回归的优缺点

  • 优点
    • 将推荐问题转化为CTR点击率预估问题,能综合利用用户、物品、上下文等多种不同的特征
    • 模型简单,可解释性强
    • 训练开销小
      • 简单的线性计算
      • 训练时便于并行化,在预测时只需要对特征进行线性加权,所以性能比较好
    • 资源占用小,尤其是内存:在实际工程中只需要存储权重比较大的特征及特征对应的权重
  • 缺点
    • 表达能力不足,无法进行特征交叉,特征筛选等一系列高级操作
    • 准确率并不是很高:模型太过简单,很难去拟合数据的真实分布

代码实战

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_breast_cancer

照常先导入所需要的包,我们这次使用的数据集是经典的乳腺癌数据集,该数据集包括了乳腺癌患者的不同特征。我们先大致看一下有哪一些特征

# 加载乳腺癌数据集
data = load_breast_cancer()

print(data.feature_names)

# ['mean radius' 'mean texture' 'mean perimeter' 'mean area'
# 'mean smoothness' 'mean compactness' 'mean concavity'
# 'mean concave points' 'mean symmetry' 'mean fractal dimension'
# 'radius error' 'texture error' 'perimeter error' 'area error'
# 'smoothness error' 'compactness error' 'concavity error'
# 'concave points error' 'symmetry error' 'fractal dimension error'
# 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
# 'worst smoothness' 'worst compactness' 'worst concavity'
# 'worst concave points' 'worst symmetry' 'worst fractal dimension']

print(data.target_names)

# ['malignant' 'benign']

数据集的特征包括以下几列(这个特征数还算少的,我们就先全部列出来,看一下是否符合,之后介绍的算法可能不会介绍全部的特征)

  • mean radius:平均半径
  • mean texture:平均纹理
  • mean perimeter:平均周长
  • mean area:平均面积
  • mean smoothness:平均平滑度
  • mean compactness:平均紧密度
  • mean concavity:平均凹度
  • mean concave points:平均凹点
  • mean symmetry:平均对称性
  • mean fractal dimension:平均分形维数
  • radius error:半径误差
  • texture error:纹理误差
  • perimeter error:周长误差
  • area error:面积误差
  • smoothness error:光滑度误差
  • compactness error:紧密度误差
  • concavity error:凹度误差
  • concave points error:凹点误差
  • symmetry error:对称性误差
  • fractal dimension error:分形维数误差
  • worst radius:最坏半径
  • worst texture:最坏纹理
  • worst perimeter:最坏周长
  • worst area:最坏面积
  • worst smoothness:最坏光滑度
  • worst compactness:最坏紧密度
  • worst concavity:最坏凹度
  • worst concave points:最坏凹点
  • worst symmetry:最坏对称性
  • worst fractal dimension:最坏分形误差

目标类别分别为

  • malignant:恶性
  • benign:良性

可以看到特征均是从半径、纹理、周长、面积、光滑度、紧密度、凹度、凹点、对称性和分形误差这几个角度展开的。目标为恶性和良性。也就是说这个问题是一个二分类问题,使用逻辑回归算法再合适不过了。

# 特征选择
features = ['mean radius', 'mean texture', 'mean perimeter', 'mean area', 'mean smoothness']
target = 'target'

# 划分特征和目标变量
X = pd.DataFrame(data.data, columns=data.feature_names)[features]
y = data.target

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

接下来调用逻辑回归模型,进行训练

from sklearn.linear_model import LogisticRegression

# 创建逻辑回归模型
model = LogisticRegression()

# 模型训练
model.fit(X_train, y_train)

# 估计特征的权重
weights = model.coef_
intercept = model.intercept_

然后在测试集上看一下训练效果

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 预测测试数据集
y_pred = model.predict(X_test)

# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 score:", f1)

最后预测新样本

import numpy as np

# 新样本特征
new_sample = np.array([15.12, 15.16, 97.67, 712.2, 0.0898]).reshape(1, -1)

# 特征缩放
new_sample_scaled = scaler.transform(new_sample)

# 预测新样本的分类
prediction = model.predict(new_sample_scaled)

print("Prediction:", prediction)

补充

上面的代码实战用到了几个评价指标,这里对这几个评价指标做一个简单的介绍,之后会专门对评价指标进行总结

评价指标

首先我们先看这样一个矩阵

PositiveNegative
PositiveTPFP
NegativeFNTN

上面这个矩阵也叫做混淆矩阵,行的positive、negative字段表示样本实际值,列的positive、negative字段表示预测的结果,那么我们就可以给出表格中值的几个概念

  • TP:True Positive。预测为正确的正样本
  • FP:False Positive。预测为错误的正样本
  • TN:True Negative。预测为正确的负样本
  • FN:True Negative。预测为正确的负样本

那么我们就可以解释代码中用到的几个指标

  • 准确率Accuracy:分类器正确分类的样本数与总的样本数之比,即预测正确的概率

    Accuracy=TP+FNTP+FP+TN+FNAccuracy=\frac{TP+FN}{TP+FP+TN+FN}
  • 精准率Precision:预测为正的样本中,实际为正样本的比例

    Pecision=TPTP+FPPecision=\frac{TP}{TP+FP}
  • 召回率Recall:实际为正的样本被预测为正样本的比例

    Recall=TPTP+FNRecall=\frac{TP}{TP+FN}
  • F1 Score:由于精准率和召回率是互相矛盾的,为了综合考虑这两个指标,再尽可能提高这两个指标的同时,也希望两者之间的差异尽可能小。

    F1=2PRp+RF1=2\frac{P*R}{p+R}