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
中,最常用的分类线性模型是:
-
LogisticRegression (逻辑回归)
-
原理: 虽然名字带“回归”,但它是经典的分类算法。它使用 Sigmoid 函数将线性模型的输出转换为概率值(0 到 1 之间)。
-
损失函数: 通常使用对数损失(Log Loss) 或 交叉熵损失(Cross-Entropy Loss) 来优化模型参数。
-
特点:
-
输出有概率意义,可以知道分类的置信度。
-
可解释性强,权重系数的大小和正负代表了特征的影响方向和程度。
-
可以通过
penalty
参数施加 L1 或 L2 正则化以防止过拟合。
-
-
-
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)
参数详解
-
正则化参数
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
-
求解器参数
solver (默认='lbfgs')
-
优化算法
-
可选值: 'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'
-
不同求解器支持不同的正则化类型:
-
'liblinear': 支持L1和L2
-
'saga': 支持所有正则化类型
-
其他: 主要支持L2或无正则化
-
max_iter (默认=100)
-
求解器收敛的最大迭代次数
-
对于大型数据集可能需要增加此值
tol (默认=1e-4)
-
优化的容忍度/停止阈值
-
当损失函数变化小于此值时停止迭代
-
多分类参数
multi_class (默认='auto')
-
多分类策略
-
可选值: 'auto', 'ovr', 'multinomial'
-
'ovr' (one-vs-rest): 为每个类别训练一个二分类器
-
'multinomial': 直接多分类,使用softmax函数
-
'auto': 自动选择
-
类别权重参数
class_weight (默认=None)
-
处理类别不平衡
-
可选值: None, 'balanced', 或字典 {class_label: weight}
-
'balanced': 自动调整权重与类别频率成反比
-
其他重要参数
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 10versicolor 0.93 1.00 0.96 13virginica 1.00 0.86 0.92 7
accuracy 0.97 30macro avg 0.98 0.95 0.96 30
weighted avg 0.97 0.97 0.97 30