鸢尾花数据分类实战:逻辑回归二分类原理与Python实现

1次阅读
没有评论

共计 2496 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景与问题定义

分类问题是机器学习中最常见的任务之一,从垃圾邮件识别到医疗诊断都有广泛应用。逻辑回归作为入门级算法,因其数学可解释性和训练效率成为初学者的首选工具。但在实际使用中常遇到两个典型问题:

鸢尾花数据分类实战:逻辑回归二分类原理与 Python 实现

  • 特征工程敏感度:原始特征量纲差异大时(如鸢尾花数据中花瓣长度与萼片宽度的数值范围差异),模型性能会显著下降
  • 概率解释误区:初学者容易将输出的概率值直接等同于分类置信度,而忽略 sigmoid 函数的非线性特性

算法对比

在二分类任务中,逻辑回归常与 SVM、决策树进行对比:

算法 计算效率 可解释性 特征要求
逻辑回归 ★★★★ ★★★★ 需数值型特征
SVM ★★ ★★ 依赖核函数选择
决策树 ★★★ ★★★★★ 支持混合特征类型

逻辑回归特别适合需要概率输出的场景(如风险评分),且在大规模数据下仍有较好表现。

代码实现

1. 数据准备

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 加载数据并转换为二分类问题(只保留 setosa 和 versicolor)data = load_iris()
X = data.data[:100]  # 前 100 个样本
Y = data.target[:100]  # 对应标签

# 特征标准化(关键步骤)scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 数据集拆分(注意先拆分再标准化)X_train, X_test, y_train, y_test = train_test_split(X_scaled, Y, test_size=0.2, random_state=42)

为什么需要特征缩放? 逻辑回归使用梯度下降优化时,不同特征量纲会导致收敛速度差异。标准化使所有特征服从 N(0,1)分布,保证权重更新步长一致。

2. 模型训练

from sklearn.linear_model import LogisticRegression

# 创建模型(注意设置正则化参数)model = LogisticRegression(penalty='l2', C=1.0, solver='lbfgs')

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

# 查看权重系数
print(f'模型权重:{model.coef_}')
print(f'截距项:{model.intercept_}')

3. 决策边界可视化

import matplotlib.pyplot as plt
import numpy as np

# 取前两个特征进行可视化
X_vis = X_train[:, :2]

# 生成网格点
x_min, x_max = X_vis[:, 0].min() - 1, X_vis[:, 0].max() + 1
y_min, y_max = X_vis[:, 1].min() - 1, X_vis[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

# 预测网格点类别
Z = model.predict(np.c_[xx.ravel(), yy.ravel(), 
                        np.zeros_like(xx.ravel()), 
                        np.zeros_like(xx.ravel())])
Z = Z.reshape(xx.shape)

# 绘制决策边界
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X_vis[:, 0], X_vis[:, 1], c=y_train, s=20, edgecolor='k')
plt.xlabel('标准化后的萼片长度')
plt.ylabel('标准化后的萼片宽度')
plt.title('逻辑回归决策边界')
plt.show()

关键问题解析

1. 类别不平衡处理

当两类样本数量差异较大时(如正负样本比例 1:9),推荐采用以下方法:

  • 在 LogisticRegression 中设置class_weight='balanced'
  • 使用过采样(SMOTE)或欠采样技术
  • 调整分类阈值(默认 0.5,可通过 ROC 曲线找到最佳 cutoff)

2. 数据泄露预防

  • 测试集不能参与特征缩放 fit_transform() 只能在训练集上执行,测试集应使用transform()。否则会引入测试集信息到训练过程,导致评估结果虚高
  • 正确的 Pipeline 构建方式
    from sklearn.pipeline import make_pipeline
    
    pipe = make_pipeline(StandardScaler(),
        LogisticRegression())
    pipe.fit(X_train, y_train)  # 自动避免数据泄露

3. 正则化参数选择

正则化强度参数C(C=1/λ)的选择策略:

  1. 通常先尝试对数均匀采样(如[0.001, 0.01, 0.1, 1, 10, 100])
  2. 通过交叉验证观察模型在验证集上的表现
  3. L1 正则化(penalty=’l1’)会产生稀疏解,适合特征选择

数学原理补充

逻辑回归的核心是 sigmoid 函数:

$$
\sigma(z) = \frac{1}{1+e^{-z}} \quad \text{其中} \quad z = w^Tx + b
$$

损失函数(交叉熵损失):

$$
J(w) = -\frac{1}{N}\sum_{i=1}^N [y_i\log(p_i) + (1-y_i)\log(1-p_i)]
$$

延伸思考

  1. 多分类扩展:如何通过 One-vs-Rest 或 Softmax 回归将二分类逻辑扩展到多分类场景?各类别概率之和为什么必须等于 1?
  2. 函数选择:为什么必须使用 sigmoid 函数而不是其他激活函数?其概率解释与指数族分布有何关联?

实践建议

对于初学者,建议:
1. 先用 model.decision_function() 观察原始线性输出
2. 通过 sklearn.metrics 模块全面评估准确率、召回率、AUC 等指标
3. 使用 Yellowbrick 库快速生成分类评估可视化报告

正文完
 0
评论(没有评论)