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
相关推荐
Daily Mirror13 分钟前
Day 32 类的定义和方法
python
秋刀鱼 ..20 分钟前
第五届机电一体化、自动化与智能控制国际学术会议(MAIC 2025)
运维·人工智能·python·机器人·自动化·制造·新人首发
沃丰科技26 分钟前
以全栈AI能力重塑智能客服服务效能
人工智能·机器学习·自然语言处理
2501_9216494927 分钟前
亚太股票数据API:日股、韩股、新加坡股票、印尼股票市场实时行情,实时数据API-python
开发语言·后端·python·websocket·金融
Hello.Reader29 分钟前
用 Python 跑通第一个 Flink ML 项目KMeans 聚类从本地到集群实战
python·flink·kmeans
Wiktok32 分钟前
【WIT】解决导入pywinauto相关库会导致程序UI界面(tkinter/pyside6)浏览文件等操作卡住问题
python·ui·pywinauto
小白狮ww36 分钟前
挥手点亮圣诞:AI 3D 魔法树教程
人工智能·深度学习·机器学习·3d·音视频·图片处理·动作识别
噔噔噔噔@1 小时前
详细介绍Python+Pytest+BDD+Playwright,用FSM打造高效测试框架
开发语言·python·pytest
sg_knight1 小时前
什么是设计模式?为什么 Python 也需要设计模式
开发语言·python·设计模式
程序猿追1 小时前
昇腾NPU实战:Z-Image-Turbo-Fun-Controlnet-Union模型部署与测试全记录
大数据·服务器·人工智能·机器学习