Python 逻辑回归实战:预测用户流失率(附代码)

一、逻辑回归简介

逻辑回归是一种用于解决二分类问题的统计学习方法。其核心思想是通过Sigmoid函数将线性回归结果映射到$(0,1)$区间,表示概率: $$ P(Y=1|X) = \frac{1}{1+e^{-(\beta_0 + \beta_1X_1 + ... + \beta_nX_n)}} $$ 其中$X_i$为特征变量,$\beta_i$为模型系数。当概率$P \geq 0.5$时判定为正类(如用户流失)。


二、数据准备

使用电信用户数据集(示例数据):

import pandas as pd
data = pd.read_csv("customer_churn.csv")
print(data.head())

数据集包含:

  • 特征:服务时长、月消费、合约类型等
  • 标签:Churn(0=未流失,1=流失)

三、数据预处理
  1. 缺失值处理
data.fillna(data.mean(), inplace=True)

  1. 特征编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['Contract'] = le.fit_transform(data['Contract'])

  1. 特征选择与标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(data[['Tenure', 'MonthlyCharges']])
y = data['Churn']


四、模型构建与训练
  1. 数据集划分
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)

  1. 逻辑回归建模
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(penalty='l2', C=1.0, solver='liblinear')
model.fit(X_train, y_train)

  1. 获取系数
print("模型系数:", model.coef_)
print("截距项:", model.intercept_)


五、模型评估
  1. 预测与评估指标
from sklearn.metrics import accuracy_score, confusion_matrix
y_pred = model.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))

  1. ROC曲线
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:,1])
plt.plot(fpr, tpr, label='AUC='+str(auc(fpr,tpr).round(2)))
plt.plot([0,1],[0,1],'k--')
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.legend(); plt.show()


六、完整代码
# 导入库
import pandas as pd
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, roc_curve, auc
import matplotlib.pyplot as plt

# 数据加载与预处理
data = pd.read_csv("customer_churn.csv")
data.fillna(data.mean(), inplace=True)
le = LabelEncoder()
data['Contract'] = le.fit_transform(data['Contract'])
scaler = StandardScaler()
X = scaler.fit_transform(data[['Tenure', 'MonthlyCharges']])
y = data['Churn']

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = LogisticRegression(penalty='l2', C=1.0, solver='liblinear')
model.fit(X_train, y_train)

# 预测评估
y_pred = model.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))

# ROC曲线
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:,1])
plt.plot(fpr, tpr, label='AUC='+str(auc(fpr,tpr).round(2)))
plt.plot([0,1],[0,1],'k--')
plt.xlabel('假阳性率'); plt.ylabel('真阳性率')
plt.legend(); plt.show()

应用建议

  1. 通过模型系数分析特征重要性(如月消费$\uparrow$导致流失概率$\uparrow$)
  2. 优化方向:增加特征工程、调整正则化参数$C$、尝试其他分类器
  3. 业务应用:识别高流失风险用户,制定挽留策略
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐