Python案例详解如何用Scikit-learn做逻辑回归(附完整代码)
目录导读
- 逻辑回归核心概念与适用场景
- 环境配置与数据准备
- 数据预处理与特征工程
- 模型训练与参数调优
- 模型评估与结果解读
- 常见问题与FAQ
- 总结与延伸学习
逻辑回归核心概念与适用场景
逻辑回归虽然名字带“回归”,但它本质上是一种分类算法,主要用于二分类问题(如:邮件是否为垃圾邮件、用户是否点击广告),它通过Sigmoid函数将线性回归的输出映射到0-1之间,形成概率值。

核心公式: [ P(y=1) = \frac{1}{1 + e^{-(w^T x + b)}} ]
典型应用场景:
- 银行风控(判断用户是否会违约)
- 医疗诊断(判断肿瘤是否恶性)
- 电商转化率预测
问:逻辑回归与线性回归的区别是什么?
答:线性回归输出连续值(如房价预测),逻辑回归输出概率值(0-1之间)并用于分类,逻辑回归通过最大似然估计优化参数,而非最小二乘法。
环境配置与数据准备
Python环境要求
确保已安装以下库:
pip install scikit-learn pandas numpy matplotlib
案例数据集说明
我们使用Scikit-learn内置的乳腺癌数据集(Breast Cancer Wisconsin),包含30个特征(如细胞核半径、纹理等),目标变量为良性(0)或恶性(1)。
from sklearn.datasets import load_breast_cancer import pandas as pd data = load_breast_cancer() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = data.target print(df.head())
问:为什么选择乳腺癌数据集作为案例?
答:该数据集特征维度适中(30维),样本量569,适合初学者快速验证逻辑回归效果,且无缺失值,减少预处理负担。
数据预处理与特征工程
标准化处理
逻辑回归对特征尺度敏感,需使用标准化(StandardScaler)使特征均值为0、方差为1:
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
特征选择建议
- 使用
SelectKBest或相关性矩阵筛选重要特征 - 避免多重共线性(如特征间相关系数>0.9)
问:如果不做标准化会怎样?
答:梯度下降收敛变慢,且系数大小差异过大,导致模型难以解释。
模型训练与参数调优
基础模型训练
from sklearn.linear_model import LogisticRegression model = LogisticRegression(max_iter=1000) model.fit(X_train_scaled, y_train)
超参数调优(网格搜索)
from sklearn.model_selection import GridSearchCV
param_grid = {
'C': [0.01, 0.1, 1, 10, 100], # 正则化强度倒数
'penalty': ['l1', 'l2'], # 正则化类型
'solver': ['liblinear', 'saga'] # 优化器
}
grid = GridSearchCV(LogisticRegression(max_iter=1000), param_grid, cv=5)
grid.fit(X_train_scaled, y_train)
print("最佳参数:", grid.best_params_)
调优结论:多数情况下C=1, penalty='l2', solver='lbfgs'表现良好。
问:
C值越大越好吗?
答:C是正则化强度的倒数,C越小正则化越强,易欠拟合;C越大约束越弱,易过拟合,需通过交叉验证选择。
模型评估与结果解读
核心指标计算
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
y_pred = grid.predict(X_test_scaled)
print("准确率:", accuracy_score(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
结果可视化(ROC曲线)
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
y_prob = grid.predict_proba(X_test_scaled)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, label=f'ROC (AUC={roc_auc:.2f})')
plt.plot([0,1], [0,1], 'k--')
plt.xlabel('假正率')
plt.ylabel('真正率')
plt.legend()
plt.show()
典型输出:准确率>97%,AUC>0.99(说明模型区分能力强)。
问:为什么AUC比准确率更重要?
答:当类别不平衡时,准确率可能失真(如99%良性、1%恶性时,全部预测为良性也有99%准确率),AUC关注排序能力,更鲁棒。
常见问题与FAQ
Q1:逻辑回归出现“不收敛”警告怎么办?
A:增加max_iter值(如10000),或选用solver='sag'、'saga'等适合大数据的优化器。
Q2:特征数量多时如何避免过拟合?
A:使用penalty='l1'(Lasso)自动做特征选择,或通过SelectFromModel筛选。
Q3:模型预测为恶性的概率就是癌症风险吗?
A:概率代表模型置信度,不代表真实风险,需结合临床背景,通常以0.5为决策阈值。
Q4:逻辑回归能处理多分类吗?
A:可以,使用LogisticRegression(multi_class='multinomial'),Scikit-learn自动实现Softmax回归。
总结与延伸学习
案例要点回顾
- 逻辑回归适用于二分类,通过标准化和正则化提升性能
- 网格搜索可系统调优
C和penalty参数 - 评估应综合准确率、混淆矩阵、AUC等多指标
进阶学习路径
- 处理不平衡数据集:尝试SMOTE过采样或class_weight='balanced'
- 特征交互:使用
sklearn.preprocessing.PolynomialFeatures添加非线性项 - 模型解释:用
shap库解释每个特征的贡献度 - 实战部署:将训练好的模型通过Flask或FastAPI封装为API
问:学习逻辑回归后下一步该学什么?
答:建议转向逻辑回归的变体(如弹性网络)、模型融合(集成学习)或深度学习基础(如用PyTorch实现逻辑回归)。
延伸阅读:如果你想进一步理解逻辑回归的数学推导,可搜索《Logistic Regression: A Self-Explanatory Primer》;若想挑战工业级案例,可探索Kaggle上的“Titanic”或“Credit Card Fraud Detection”竞赛。