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

鸢尾花数据集 (Iris) 是机器学习领域的经典数据集,包含 150 个样本,每个样本有 4 个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和 1 个分类标签(三种鸢尾花品种)。为了简化问题,我们这里只选择其中两个品种进行二分类实验。
核心原理
- 什么是逻辑回归
- 逻辑回归通过 sigmoid 函数将线性回归的输出映射到 (0,1) 区间,可以理解为样本属于某一类的概率
-
当概率 >0.5 时预测为正类,否则为负类
-
sigmoid 函数
- 这个 S 形曲线函数把任何实数都压缩到 0 和 1 之间
-
公式可以简单理解为:概率 = 1 / (1 + e^(-z)),其中 z 是线性组合
-
损失函数
- 使用交叉熵损失来衡量预测概率与真实标签的差异
-
目标是最小化这个损失,让模型预测更准确
-
训练过程
- 通过梯度下降等优化算法调整模型参数
- 不断迭代直到模型收敛
完整实现
环境准备
首先确保安装了必要的库:
!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)
避坑指南
- 数据不平衡问题
- 如果两类样本数量差异很大,模型可能会偏向多数类
-
解决方法:使用 class_weight 参数调整类别权重,或采用过采样 / 欠采样
-
特征尺度不统一
- 逻辑回归对特征尺度敏感,建议进行标准化
-
解决方法:使用 StandardScaler 进行特征缩放
-
过拟合问题
- 如果模型在训练集表现很好但测试集差,可能是过拟合
-
解决方法:尝试增加正则化项(调整 C 参数),或减少特征数量
-
未处理异常值
- 极端值可能对模型产生不良影响
-
解决方法:检查数据分布,考虑移除或修正异常值
-
未检查多重共线性
- 高度相关的特征可能降低模型稳定性
- 解决方法:计算特征相关性,考虑移除冗余特征
扩展思考
- 多分类问题
- 尝试用逻辑回归处理三类鸢尾花分类
-
了解 one-vs-rest 和 softmax 两种多分类策略
-
正则化应用
- 实验 L1 和 L2 正则化的效果差异
-
观察不同 C 值对模型系数的影响
-
特征工程
- 尝试不同的特征组合
- 考虑添加多项式特征提升模型表现
动手实践
现在,请你尝试修改上面的代码,完成以下任务:
- 选择不同的特征组合(比如只用花萼特征或只用花瓣特征)训练模型,比较准确率变化
- 调整 train_test_split 的 random_state 参数,观察结果波动情况
- 尝试修改 LogisticRegression 的 C 参数(比如设为 0.1 或 10),看看模型表现如何变化
通过这些实验,你会更直观地理解特征选择、数据划分和正则化对模型的影响。
总结
本文从零开始实现了鸢尾花数据的逻辑回归二分类任务。我们首先了解了逻辑回归的基本原理,然后通过 Python 代码完成了数据加载、预处理、模型训练和评估的全流程。最后还讨论了常见问题和扩展方向。逻辑回归虽然简单,但掌握好这个基础模型对学习更复杂的算法很有帮助。建议读者动手实践文中的代码,并尝试完成最后的实践任务,这将大大加深你的理解。
