Scikit-learn Python机器学习 - 分类算法 - 线性模型 逻辑回归

锋哥原创的Scikit-learn Python机器学习视频教程:

https://www.bilibili.com/video/BV11reUzEEPH

课程介绍

本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。

Scikit-learn Python机器学习 - 分类算法 - 线性模型 逻辑回归

线性模型用于分类的核心思想非常直观:试图找到一个线性决策边界(在特征空间中是一条直线、一个平面或一个超平面),将不同类别的数据点分开

对于二分类问题,模型学习的是: y = w[0]*x[0] + w[1]*x[1] + ... + w[p]*x[p] + b > 0

  • x[0]x[p] 表示样本的 p 个特征。

  • w[0]w[p] 是模型学习到的权重系数(Coefficients),体现了每个特征对决策的重要性。

  • b截距(Intercept),也叫偏置。

  • 如果这个线性函数的结果大于 0,样本被预测为类别 A;否则被预测为类别 B。

这个决策边界就是函数 y = 0 所代表的那个超平面。

如何将线性输出转换为概率? 虽然决策是线性的,但我们可以通过一个链接函数 (如 Sigmoid 函数)将线性输出映射到 [0, 1] 区间,解释为样本属于某个类别的概率。这就是逻辑回归的做法。

sklearn.linear_model 中,最常用的分类线性模型是:

  1. LogisticRegression (逻辑回归)

    • 原理: 虽然名字带"回归",但它是经典的分类算法。它使用 Sigmoid 函数将线性模型的输出转换为概率值(0 到 1 之间)。

    • 损失函数 : 通常使用对数损失(Log Loss)交叉熵损失(Cross-Entropy Loss) 来优化模型参数。

    • 特点

      • 输出有概率意义,可以知道分类的置信度。

      • 可解释性强,权重系数的大小和正负代表了特征的影响方向和程度。

      • 可以通过 penalty 参数施加 L1 或 L2 正则化以防止过拟合。

  2. SGDClassifier (随机梯度下降分类器)

    • 原理 : 这是一个通用的线性分类器,它使用随机梯度下降(Stochastic Gradient Descent) 来最小化不同的损失函数。

    • 灵活性 : 通过设置 loss 参数,它可以模拟其他线性模型:

      • loss='log_loss': 等价于逻辑回归。

      • loss='hinge': 等价于线性支持向量机(SVM)。

      • loss='perceptron': 等价于感知机。

    • 特点

      • 非常适合大规模数据集,因为它是增量式学习的,每次只用一个或一小批样本更新模型。

      • 效率高,但需要仔细调参(如学习率)。

LogisticRegression 是 scikit-learn 中用于执行逻辑回归的分类器,适用于二分类和多分类任务。

复制代码
LogisticRegression(penalty='l2', *, dual=False, tol=0.0001, C=1.0, 
                   fit_intercept=True, intercept_scaling=1, class_weight=None, 
                   random_state=None, solver='lbfgs', max_iter=100, 
                   multi_class='auto', verbose=0, warm_start=False, n_jobs=None, 
                   l1_ratio=None)

参数详解

  1. 正则化参数

penalty (默认='l2')

  • 正则化类型,用于防止过拟合

  • 可选值: 'l1', 'l2', 'elasticnet', 'none'

  • 'l1' (Lasso): 产生稀疏模型,可用于特征选择

  • 'l2' (Ridge): 默认值,使所有特征系数变小但不为零

  • 'elasticnet': L1和L2的混合

  • 'none': 无正则化

C (默认=1.0)

  • 正则化强度的倒数

  • 必须是正浮点数

  • 值越小,正则化越强

l1_ratio (默认=None)

  • 仅当 penalty='elasticnet' 时使用

  • 控制L1和L2正则化的混合比例(0到1之间)

  • 0表示纯L2,1表示纯L1

  1. 求解器参数

solver (默认='lbfgs')

  • 优化算法

  • 可选值: 'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'

  • 不同求解器支持不同的正则化类型:

    • 'liblinear': 支持L1和L2

    • 'saga': 支持所有正则化类型

    • 其他: 主要支持L2或无正则化

max_iter (默认=100)

  • 求解器收敛的最大迭代次数

  • 对于大型数据集可能需要增加此值

tol (默认=1e-4)

  • 优化的容忍度/停止阈值

  • 当损失函数变化小于此值时停止迭代

  1. 多分类参数

multi_class (默认='auto')

  • 多分类策略

  • 可选值: 'auto', 'ovr', 'multinomial'

  • 'ovr' (one-vs-rest): 为每个类别训练一个二分类器

  • 'multinomial': 直接多分类,使用softmax函数

  • 'auto': 自动选择

  1. 类别权重参数

class_weight (默认=None)

  • 处理类别不平衡

  • 可选值: None, 'balanced', 或字典 {class_label: weight}

  • 'balanced': 自动调整权重与类别频率成反比

  1. 其他重要参数

random_state (默认=None)

  • 随机数种子,用于 reproducible results

  • 当solver为'sag', 'saga'或'liblinear'时使用

fit_intercept (默认=True)

  • 是否拟合截距项(偏置项)

n_jobs (默认=None)

  • 用于计算的CPU核心数

  • -1表示使用所有可用的核心

verbose (默认=0)

  • 输出详细程度

  • 值越大,输出信息越详细

warm_start (默认=False)

  • 是否使用前一次拟合的结果作为初始化

我们来看一个示例:

复制代码
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
​
# 1,加载数据
iris = load_iris()
X = iris.data  # 特征矩阵 (150个样本,4个特征:萼长、萼宽、瓣长、瓣宽)
y = iris.target  # 特征值 目标向量 (3类鸢尾花:0, 1, 2)
​
# 2,数据预处理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)  # 划分训练集和测试集
scaler = StandardScaler()  # 数据标准化:消除不同特征量纲的影响
X_train_scaled = scaler.fit_transform(X_train)  # fit计算生成模型,transform通过模型转换数据
X_test_scaled = scaler.transform(X_test)  # # 使用训练集的参数转换测试集
​
# 3,创建和训练LogisticRegression模型
model = LogisticRegression()
model.fit(X_train_scaled, y_train)  # 使用训练数据拟合(训练)模型
​
# 4,进行预测并评估模型
y_pred = model.predict(X_test_scaled)  # 在测试集上进行预测
print('模型预测值:', y_pred)
print('正确值   :', y_test)
​
accuracy = accuracy_score(y_test, y_pred)  # 计算准确率
print(f'测试集准确率:{accuracy:.2f}')
print('分类报告:\n', classification_report(y_test, y_pred, target_names=iris.target_names))

运行输出:

复制代码
模型预测值: [2 0 0 1 0 0 1 1 2 1 1 2 1 0 2 1 1 2 1 0 0 0 2 1 1 1 1 0 1 0]
正确值   : [2 0 0 1 0 0 1 1 2 1 1 2 1 0 2 2 1 2 1 0 0 0 2 1 1 1 1 0 1 0]
测试集准确率:0.97
分类报告:
               precision    recall  f1-score   support
​
      setosa       1.00      1.00      1.00        10
  versicolor       0.93      1.00      0.96        13
   virginica       1.00      0.86      0.92         7
​
    accuracy                           0.97        30
   macro avg       0.98      0.95      0.96        30
weighted avg       0.97      0.97      0.97        30
相关推荐
大熊背5 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
极梦网络无忧5 小时前
OpenClaw 基础使用说明(中文版)
python
codeJinger5 小时前
【Python】操作Excel文件
python·excel
XLYcmy6 小时前
一个针对医疗RAG系统的数据窃取攻击工具
python·网络安全·ai·llm·agent·rag·ai安全
Islucas7 小时前
Claude code入门保姆级教程
python·bash·claude
萝卜白菜。7 小时前
TongWeb7.0相同的类指明加载顺序
开发语言·python·pycharm
AI医影跨模态组学7 小时前
J Immunother. Cancer(IF=10.6)南方医科大学南方医院等团队:基于病理组学的集成模型在胃癌免疫治疗反应预测中的开发与解读
人工智能·深度学习·机器学习·论文·医学·医学影像
赵钰老师7 小时前
【ADCIRC】基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术应用
python·信息可视化·数据分析
补三补四7 小时前
参数高效微调技术详解:理论基础与实践应用
人工智能·深度学习·机器学习