机器学习实战:逻辑回归算法深度解析与案例应用

作者:lyx331366759 | 发布时间:2025年9月3日

前言

逻辑回归(Logistic Regression)是机器学习中最经典的分类算法之一,广泛应用于医疗诊断、客户流失预测、金融风控等领域。本文将通过多个实战案例,带你深入理解逻辑回归的核心原理、评估方法以及高级应用技巧。

目录

一、逻辑回归算法原理

1.1 什么是逻辑回归?

逻辑回归是一种用于解决二分类问题的统计学习方法。尽管名字中带有"回归",但它实际上是一种分类算法。其核心思想是:通过sigmoid函数将线性回归的结果映射到(0,1)区间,表示样本属于正类的概率。

1.2 数学原理

Sigmoid函数:

σ(z) = 1 / (1 + e^(-z))

预测函数:

P(y=1|x) = σ(w·x + b)

其中w是权重向量,b是偏置项。

1.3 损失函数

逻辑回归使用对数损失函数(Log Loss):

L = -[y·log(p) + (1-y)·log(1-p)]

二、案例1:癌症概率预测

2.1 数据准备

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 1.读取数据
data = pd.read_csv("../data/breast-cancer-wisconsin.csv")

# 2.数据预处理
data = data.replace('?', np.nan)  # 处理缺失值
data.dropna(axis=0, inplace=True)  # 删除缺失行

# 3.特征工程
X = data.iloc[:, 1:-1]  # 特征
y = data['Class']       # 标签

# 4.数据分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=22
)

# 5.特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

2.2 模型训练与预测

# 创建逻辑回归模型
model = LogisticRegression()
model.fit(X_train_scaled, y_train)

# 模型预测
y_pred = model.predict(X_test_scaled)

# 模型评估
accuracy = model.score(X_test_scaled, y_test)
print(f"模型准确率: {accuracy:.4f}")

三、案例2:混淆矩阵与评估指标详解

3.1 混淆矩阵基础

混淆矩阵是评估分类模型性能的核心工具:

from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score

# 定义真实标签和预测标签
y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
y_pred_A = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']

# 生成混淆矩阵
cm = confusion_matrix(y_true, y_pred_A, labels=['恶性', '良性'])
print("混淆矩阵:")
print(cm)

# 使用DataFrame美化输出
import pandas as pd
df_cm = pd.DataFrame(cm, 
                    index=['恶性(正例)', '良性(反例)'], 
                    columns=['恶性(正例)', '良性(反例)'])
print(df_cm)

3.2 核心评估指标

精确率(Precision)
precision = precision_score(y_true, y_pred_A, pos_label='恶性')
print(f"精确率: {precision:.4f}")
召回率(Recall)
recall = recall_score(y_true, y_pred_A, pos_label='恶性')
print(f"召回率: {recall:.4f}")
F1值
f1 = f1_score(y_true, y_pred_A, pos_label='恶性')
print(f"F1值: {f1:.4f}")

3.3 精确率 vs 召回率的权衡

  • 精确率:在预测为正类的样本中,真正为正类的比例
  • 召回率:在真实为正类的样本中,被正确预测的比例
  • F1值:精确率和召回率的调和平均值

四、案例3:电信客户流失预测

4.1 数据探索

# 读取数据
data = pd.read_csv('../data/churn.csv')

# 数据基本信息
print(f"数据集形状: {data.shape}")
print(f"数据类型:\n{data.dtypes}")

# 标签分布
print("客户流失分布:")
print(data['Churn'].value_counts(normalize=True))

4.2 完整建模流程

from sklearn.metrics import classification_report, roc_auc_score

# 1. 数据预处理
data.dropna(axis=0, inplace=True)  # 处理缺失值

# 2. 特征和标签分离
X = data.iloc[:, 1:-1]  # 特征(去除ID列)
y = data['Churn']       # 标签

# 3. 数据分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=18
)

# 4. 特征编码(独热编码)
X_train_encoded = pd.get_dummies(X_train)
X_test_encoded = pd.get_dummies(X_test)

# 5. 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train_encoded)
X_test_scaled = scaler.transform(X_test_encoded)

# 6. 模型训练
model = LogisticRegression()
model.fit(X_train_scaled, y_train)

# 7. 模型预测
y_pred = model.predict(X_test_scaled)
y_proba = model.predict_proba(X_test_scaled)[:, 1]

# 8. 模型评估
print("=== 模型评估结果 ===")
print(f"准确率: {model.score(X_test_scaled, y_test):.4f}")
print(f"AUC值: {roc_auc_score(y_test, y_proba):.4f}")

# 详细分类报告
print("\n分类报告:")
print(classification_report(y_test, y_pred))

4.3 混淆矩阵可视化

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# 生成混淆矩阵
cm = confusion_matrix(y_test, y_pred, labels=['Yes', 'No'])

# 可视化
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
            xticklabels=['流失(Yes)', '未流失(No)'],
            yticklabels=['流失(Yes)', '未流失(No)'])
plt.title('电信客户流失预测 - 混淆矩阵')
plt.ylabel('真实标签')
plt.xlabel('预测标签')
plt.show()

五、高级特征工程实战

5.1 特征工程策略

def advanced_feature_engineering(data):
    """高级特征工程"""
    df = data.copy()
    
    # 1. 处理数值型特征
    df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors='coerce')
    df['TotalCharges'].fillna(df['TotalCharges'].median(), inplace=True)
    
    # 2. 创建费用相关特征
    df['Charges_Ratio'] = df['MonthlyCharges'] / (df['TotalCharges'] + 1)
    df['High_Monthly_Charges'] = (df['MonthlyCharges'] > df['MonthlyCharges'].quantile(0.75)).astype(int)
    
    # 3. 创建服务聚合特征
    service_cols = ['landline', 'internet_att', 'internet_other', 'StreamingTV', 'StreamingMovies']
    df['Total_Services'] = df[service_cols].sum(axis=1)
    df['Has_Internet'] = (df['internet_att'] + df['internet_other'] > 0).astype(int)
    df['Has_Streaming'] = (df['StreamingTV'] + df['StreamingMovies'] > 0).astype(int)
    
    # 4. 创建人口统计特征
    df['Family_Size'] = df['Partner_att'] + df['Dependents_att']
    df['Senior_Family'] = ((df['Dependents_att'] == 1) & (df['Partner_att'] == 1)).astype(int)
    
    # 5. 创建交互特征
    df['Internet_Streaming'] = df['Has_Internet'] * df['Has_Streaming']
    df['Monthly_Services_Interaction'] = df['MonthlyCharges'] * df['Total_Services']
    
    return df

5.2 集成学习方法

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV

# 随机森林模型
rf_model = RandomForestClassifier(
    n_estimators=200,
    max_depth=10,
    random_state=42
)

# 梯度提升模型
gb_model = GradientBoostingClassifier(
    n_estimators=200,
    learning_rate=0.1,
    max_depth=6,
    random_state=42
)

# 超参数调优
param_grid = {
    'n_estimators': [100, 200, 300],
    'max_depth': [10, 15, 20],
    'min_samples_split': [2, 5, 10]
}

grid_search = GridSearchCV(rf_model, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳分数: {grid_search.best_score_:.4f}")

5.3 模型融合

from sklearn.ensemble import VotingClassifier

# 创建模型集合
ensemble_model = VotingClassifier(
    estimators=[
        ('rf', RandomForestClassifier(n_estimators=200, random_state=42)),
        ('gb', GradientBoostingClassifier(n_estimators=200, random_state=42)),
        ('lr', LogisticRegression(random_state=42))
    ],
    voting='soft'  # 使用概率投票
)

# 训练融合模型
ensemble_model.fit(X_train, y_train)
ensemble_pred = ensemble_model.predict(X_test)

print(f"模型融合准确率: {ensemble_model.score(X_test, y_test):.4f}")

六、总结与展望

6.1 核心要点总结

  1. 逻辑回归基础:理解sigmoid函数和概率预测原理
  2. 评估方法:掌握混淆矩阵、精确率、召回率、F1值等指标
  3. 数据预处理:特征编码、标准化、处理缺失值
  4. 特征工程:创建有意义的特征提升模型性能
  5. 模型优化:集成学习、超参数调优

6.2 实际应用建议

  1. 医疗诊断:癌症预测、疾病风险评估
  2. 金融风控:信用评分、欺诈检测
  3. 客户分析:流失预测、推荐系统
  4. 市场营销:客户响应预测、精准营销

6.3 进阶学习方向

  1. 深度学习:神经网络在分类问题中的应用
  2. 特征选择:LASSO回归、互信息等方法
  3. 模型解释:SHAP、LIME等可解释性工具
  4. 生产部署:模型服务化、A/B测试

代码仓库:本文所有代码均可在GitHub上获取完整版本。

建议收藏:这是一篇从理论到实践的完整指南,适合机器学习初学者和从业者参考。

欢迎交流:如果您在实践中遇到问题或有更好的优化建议,欢迎在评论区分享!

点赞关注:不迷路,持续学习机器学习新知识!🚀


标签:机器学习、逻辑回归、分类算法、特征工程、Python、scikit-learn

声明:本文为原创文章,转载请注明出处。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐