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

1次阅读
没有评论

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

image.webp

背景介绍

逻辑回归是机器学习中最基础、最常用的分类算法之一。虽然名字里有 ” 回归 ”,但它实际上是一个分类模型,特别适合处理二分类问题。比如预测用户是否会购买商品、判断邮件是否为垃圾邮件等场景都能看到它的身影。

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

鸢尾花数据集 (Iris) 是机器学习领域的经典数据集,包含 150 个样本,每个样本有 4 个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和 1 个分类标签(三种鸢尾花品种)。为了简化问题,我们这里只选择其中两个品种进行二分类实验。

核心原理

  1. 什么是逻辑回归
  2. 逻辑回归通过 sigmoid 函数将线性回归的输出映射到 (0,1) 区间,可以理解为样本属于某一类的概率
  3. 当概率 >0.5 时预测为正类,否则为负类

  4. sigmoid 函数

  5. 这个 S 形曲线函数把任何实数都压缩到 0 和 1 之间
  6. 公式可以简单理解为:概率 = 1 / (1 + e^(-z)),其中 z 是线性组合

  7. 损失函数

  8. 使用交叉熵损失来衡量预测概率与真实标签的差异
  9. 目标是最小化这个损失,让模型预测更准确

  10. 训练过程

  11. 通过梯度下降等优化算法调整模型参数
  12. 不断迭代直到模型收敛

完整实现

环境准备

首先确保安装了必要的库:

!pip install numpy pandas matplotlib scikit-learn

数据加载与预处理

from sklearn.datasets import load_iris
import pandas as pd

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 我们只取前两类(Setosa 和 Versicolor)做二分类
X = X[y != 2]
y = y[y != 2]

# 转换为 DataFrame 方便查看
df = pd.DataFrame(X, columns=iris.feature_names)
df['label'] = y
print(df.head())

特征选择与可视化

import matplotlib.pyplot as plt

# 选择两个特征进行可视化(花瓣长度和宽度)plt.scatter(X[:, 2], X[:, 3], c=y, cmap='viridis')
plt.xlabel('Petal length')
plt.ylabel('Petal width')
plt.title('Iris Data Distribution')
plt.show()

数据拆分

from sklearn.model_selection import train_test_split

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

模型训练

from sklearn.linear_model import LogisticRegression

# 创建逻辑回归模型
model = LogisticRegression()

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

模型评估

from sklearn.metrics import accuracy_score, confusion_matrix

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 查看混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(cm)

避坑指南

  1. 数据不平衡问题
  2. 如果两类样本数量差异很大,模型可能会偏向多数类
  3. 解决方法:使用 class_weight 参数调整类别权重,或采用过采样 / 欠采样

  4. 特征尺度不统一

  5. 逻辑回归对特征尺度敏感,建议进行标准化
  6. 解决方法:使用 StandardScaler 进行特征缩放

  7. 过拟合问题

  8. 如果模型在训练集表现很好但测试集差,可能是过拟合
  9. 解决方法:尝试增加正则化项(调整 C 参数),或减少特征数量

  10. 未处理异常值

  11. 极端值可能对模型产生不良影响
  12. 解决方法:检查数据分布,考虑移除或修正异常值

  13. 未检查多重共线性

  14. 高度相关的特征可能降低模型稳定性
  15. 解决方法:计算特征相关性,考虑移除冗余特征

扩展思考

  1. 多分类问题
  2. 尝试用逻辑回归处理三类鸢尾花分类
  3. 了解 one-vs-rest 和 softmax 两种多分类策略

  4. 正则化应用

  5. 实验 L1 和 L2 正则化的效果差异
  6. 观察不同 C 值对模型系数的影响

  7. 特征工程

  8. 尝试不同的特征组合
  9. 考虑添加多项式特征提升模型表现

动手实践

现在,请你尝试修改上面的代码,完成以下任务:

  1. 选择不同的特征组合(比如只用花萼特征或只用花瓣特征)训练模型,比较准确率变化
  2. 调整 train_test_split 的 random_state 参数,观察结果波动情况
  3. 尝试修改 LogisticRegression 的 C 参数(比如设为 0.1 或 10),看看模型表现如何变化

通过这些实验,你会更直观地理解特征选择、数据划分和正则化对模型的影响。

总结

本文从零开始实现了鸢尾花数据的逻辑回归二分类任务。我们首先了解了逻辑回归的基本原理,然后通过 Python 代码完成了数据加载、预处理、模型训练和评估的全流程。最后还讨论了常见问题和扩展方向。逻辑回归虽然简单,但掌握好这个基础模型对学习更复杂的算法很有帮助。建议读者动手实践文中的代码,并尝试完成最后的实践任务,这将大大加深你的理解。

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