数学基础

sigmoid激活函数

  • 数学公式:$$f(x) = \frac{1}{1 + e^{-x}}$$
  • 核心作用:将线性回归输出的$(-\infty, +\infty)$映射到(0, 1),将输出映射到概率值

极大似然估计

  • 核心思想:跟据观测值和结果来估计模型算法的未知参数,极大似然估计是在统计观测值情况下,参数最有可能的结果
  • 注意:极大似然函数不可以直接作为损失函数,需要加入负号转化为求最小值,在逻辑回归中,通过对数似然函数加负号构建损失函数

逻辑回归算法思想

逻辑回归基本思想

  • 核心用途:主要用于分类任务,用于解决二分类任务,多分类任务要套用多个逻辑回归模型
  • 基本结构:在线性回归之后接激活函数,将连续输出变为概率值(0~100%)
  • 计算流程
    1. 通过线性模型$f(x) = w^T x + b$计算特征加权值
    2. 使用sigmoid函数将线性输出映射为概率值
  • 逻辑回归假设函数:$h(w) = sigmoid(w^Tx + b)$
  • 优化方法:梯度下降算法

逻辑回归中的损失函数

  • 函数定义:交叉熵损失函数$$Loss(w) = -\sum_{i=1}^m(y_ilog(p_i) + (1-y_i)log(1-p_i))$$,其中$y_i$表示真实值,取值0或1,$p_i$表示预测值,取值[0, 1]
  • 函数特性
    • 当真实值为1时,原式变为$Loss=-log(p_i)$,则$p_i$越靠近1时,损失越小
    • 当真实值为0时,原式变为$Loss=-log(1-p_i)$,则$p_i$越靠近0时,损失越小
  • 函数本质:有极大似然函数,去对数,填符号,转化而来
    • 设有n个样本,则极大似然函数为$J = \prod_{i=1}^np^{y_i}(1-p)^{1-y_i}$
    • 取极大似然函数对数为$logJ = \sum_{i=1}^{n}(y_ilog(p_i) + (1-y_i)log(1 - p_i))$
    • 加负号变为交叉熵损失函数

逻辑回归的API

  • 来自sklearn的API:sklearn.linear_model.LogisticRegression(solver=liblinear, penalty='l2', C=1.0)
    • 参数solver:是优化方法,可选liblinear对小数据集场景训练速度快,sagsaga对大数据集更快,其中sagasag支持L2正则化或没有正则化,liblinearsaga支持L1正则化
    • 参数penalty:正则化种类,可选l1l2
    • 参数C:正则化力度,相当于正则化项前的系数$\alpha$
    • 注意:默认将类别数量少的作为正例(标签为1)
  • 实例:
    1
    2
    model = LogisticRegression()  
    model.fit(x_train, y_train)

分类任务评估指标

混淆矩阵(Confusion Matrix)

  • 应用场景:针对不同场景需求(如希望正样本全部被检测或负样本全部被检测)设计不同的评估指标
  • 评估指标
    • **真正例(TP)**:真实值为正例的样本中,被划分为正例的数量
    • **伪反例(FN)**:真实值为正例的样本中,被划分为反例的数量
    • **伪正例(FP)**:真实值为反例的样本中,被划分为正例的数量
    • **真反例(TN)**:真实值为反例的样本中,被划分为反例的数量
  • 矩阵结构
预测正例(Prediction Positive) 预测假例(Prediction Negative)
真实正例(Reference Positive) 真正例TP(true positive) 伪反例FN(false negative)
真实假例(Reference Negative) 伪正例FP(false postive) 真反例TN(true negative)
  • 混淆矩阵API:来自sklearn的API:sklearn.metrics.confusion_matrix
    • 参数labels:指明正负样本 第一个参数为正样本,第二个参数为负样本
    • 参数y_true:真实标签列表
    • 参数y_pred:预测结果列表
  • 实例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from sklearn.metrics import confusion_matrix  
    import pandas as pd

    # 构建数据: 真实值, 预测值
    y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
    y_pred = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']

    # 混淆矩阵
    matrix = confusion_matrix(y_true, y_pred, labels=['恶性', '良性']) # 其中labels参数指明正负样本 第一个参数为正样本,第二个参数为负样本
    DF = pd.DataFrame(matrix, columns=["恶性", "良性"], index=["恶性", "良性"])
    print(DF)

精确率(Accuracy)

  • 定义:预测正确的数量占比
  • 数学公式:$$Accuracy = \frac{TP+TN}{TP+FN+FP+TN}$$

查准率(Precision)

  • 定义:预测为正例的样本中实际为正例的比例,又称精确率
  • 数学公式:$$Precision = \frac{TP}{TP + FP}$$
  • 查准率API:来自sklearnsklearn.metrics.precision_score
    • 参数y_true:真实标签列表
    • 参数y_pred:预测结果列表
    • 参数pos_label:正样本标签
  • 实例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from sklearn.metrics import precision_score  
    import pandas as pd

    # 构建数据: 真实值, 预测值
    y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
    y_pred = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']

    # 精确率
    print(precision_score(y_true, y_pred, pos_label='恶性'))

召回率(recall)

  • 定义:表示在真实为正例的样本中,被正确预测为正例的比例,又称查全率
  • 数学公式:$$Recall = \frac{TP}{TP + FN}$$
  • 召回率API:来自sklearnsklearn.metrics.recall_score
    • 参数y_true:真实标签列表
    • 参数y_pred:预测结果列表
    • 参数pos_label:正样本标签
  • 实例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from sklearn.metrics import recall_score  
    import pandas as pd

    # 构建数据: 真实值, 预测值
    y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
    y_pred = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']

    # 精确率
    print(recall_score(y_true, y_pred, pos_label='恶性'))

    [!note] 召回率和精确率的关系
    召回率和精确率是对抗关系,召回率高时,精确率会变低

F1-score

  • 定义:综合精确率和召回率的评估指标,适用于需要平衡两者的情况,精确率和召回率通常难以同时达到最高,F1-score提供平衡视角
  • 数学公式: $$F1 = \frac{2 * Precision * Recall}{Precision + Recall}$$
  • F1-score的API:来自sklearnsklearn.metrics.f1_score
    • 参数y_true:真实标签列表
    • 参数y_pred:预测结果列表
    • 参数pos_label:正样本标签
  • 实例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from sklearn.metrics import f1_score  
    import pandas as pd

    # 构建数据: 真实值, 预测值
    y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
    y_pred = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']

    # 精确率
    print(f1_score(y_true, y_pred, pos_label='恶性'))

ROC曲线

ROC_space

  • 基础概念
    • 真正率(True Postive Rate, TPR):正样本中被预测为正样本的比例,数学公式为$TPR = \frac{TP}{TP + FN}$
    • 假正率(False Positive Rate, FPR):负样本中被预测为正样本的比例,数学公式为$FPR = \frac{FP}{FP + TN}$
    • ROC曲线构成为:x轴为FPR,y轴为TPR
  • 判断标准:TPR越大,FPR越小,则模型性能越好,模型的ROC曲线在RandomGuess曲线(对角线表示随机猜测的性能)上方时,表明模型是可取的,在其下方时表明模型无效
  • 曲线特征
    • 曲线必经过(0,0)和(1,1)两点
    • 曲线越靠近左上角(0,1)点,模型性能越好
    • 对角线表示随机猜测的性能
  • 特殊点含义
    • 点(0, 0):FPR = 0,TPR = 0,表示所有负样本预测正确,所有正样本预测错误
    • 点(1, 0):FPR = 1, TPR = 0, 表示所有负样本预测错误,所有正样本预测错误
    • 点(0, 1):FPR = 0, TPR = 1, 表示所有负样本预测正确,所有正样本预测正确
    • 点(1, 1):FPR = 1, TPR = 1, 表示所有负样本预测错误,所有正样本预测正确

AUC指标

  • AUC(Aera Under the ROC Curve)定义:ROC曲线与x轴所围成面积
  • 判断标准
    • AUC=1表示完美分类器
    • AUC=0.5表示模型没有区分能力
    • AUC>0.5表示模型优于随机猜测

案例

癌症实例分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 0.导入库函数  
import numpy as np
import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 1.数据加载
data = pd.read_csv("<csv_file>")
print(data.info())

# 2.数据处理
# 2.1 缺失值处理
# 将 ? 替换为 nandata.replace(to_replace="?", value=np.nan)
# 删除 nan 值
data = data.dropna()

# 2.2 获取特征和目标
X = data.iloc[:, 1:-1]
y = data['Class']

# 2.3 数据划分
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 3.特征工程(标准化)
preprocess = StandardScaler()
x_train = preprocess.fit_transform(x_train)
x_test = preprocess.transform(x_test)

# 4.模型训练
model = LogisticRegression()
model.fit(x_train, y_train)

# 5.模型预测
y_pred = model.predict(x_test)
print(y_pred)
print(accuracy_score(y_pred, y_test))

参考资料