Python案例如何用Scikit-learn做逻辑回归

wen python案例 1

Python案例详解如何用Scikit-learn做逻辑回归(附完整代码)

目录导读

  1. 逻辑回归核心概念与适用场景
  2. 环境配置与数据准备
  3. 数据预处理与特征工程
  4. 模型训练与参数调优
  5. 模型评估与结果解读
  6. 常见问题与FAQ
  7. 总结与延伸学习

逻辑回归核心概念与适用场景

逻辑回归虽然名字带“回归”,但它本质上是一种分类算法,主要用于二分类问题(如:邮件是否为垃圾邮件、用户是否点击广告),它通过Sigmoid函数将线性回归的输出映射到0-1之间,形成概率值。

Python案例如何用Scikit-learn做逻辑回归

核心公式: [ 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回归。


总结与延伸学习

案例要点回顾

  • 逻辑回归适用于二分类,通过标准化和正则化提升性能
  • 网格搜索可系统调优Cpenalty参数
  • 评估应综合准确率、混淆矩阵、AUC等多指标

进阶学习路径

  1. 处理不平衡数据集:尝试SMOTE过采样或class_weight='balanced'
  2. 特征交互:使用sklearn.preprocessing.PolynomialFeatures添加非线性项
  3. 模型解释:用shap库解释每个特征的贡献度
  4. 实战部署:将训练好的模型通过Flask或FastAPI封装为API

问:学习逻辑回归后下一步该学什么?
答:建议转向逻辑回归的变体(如弹性网络)、模型融合(集成学习)或深度学习基础(如用PyTorch实现逻辑回归)。


延伸阅读:如果你想进一步理解逻辑回归的数学推导,可搜索《Logistic Regression: A Self-Explanatory Primer》;若想挑战工业级案例,可探索Kaggle上的“Titanic”或“Credit Card Fraud Detection”竞赛。

抱歉,评论功能暂时关闭!