案例之 逻辑回归_电信用户流失预测

代码示例:

python 复制代码
"""
案例:通过逻辑回归算法,针对于电信用户数据建模,进行流失预测分析;
"""

# 导包
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,classification_report # 准确率,精确率,召回率,F1值,分类评估报告

# 1.定义函数,演示:数据的预处理
def demo01_data_preprocessing():
    # 1.读取csv文件,获取df对象
    churn_df = pd.read_csv('./data/churn.csv')
    # 2.查看(处理前的)数据集
    # churn_df.info()
    # print(churn_df.head(5))
    # 3.因为Churn 和 gender列是字符串,所以需要进行one-hot编码(热编码处理)
    churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
    # 4.查看(处理后的)数据集
    # churn_df.info()
    # print(churn_df.head(5))
    # 5.删除one-hot处理后新增的,冗余的列
    # 默认axis=0删除行,删除列axis=1。参1:要删除的列,参2:axis=1表示删除列,参3:inplace=True表示直接修改源数据,不返回新的数据集
    churn_df.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
    # churn_df.info()
    # print(churn_df.head(5))
    # 6.修改列名,将Churn_Yes ------> flag,充当标签列
    churn_df.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
    churn_df.info()
    print(churn_df.head(5)) # False------>不流失,True------>流失
    # 7.查看数据值的分布
    print(churn_df['flag'].value_counts())   # False:5174,True:1869

# 2.定义函数,演示:数据的可视化
def demo02_data_visualization():
    # 1.读取csv文件,获取df对象
    churn_df = pd.read_csv('./data/churn.csv')
    # 2.对object类型的列(数据)做 one-hot编码处理
    churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
    # 3.删除one-hot处理后新增的,冗余的列
    churn_df.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
    # 4.修改列名,将Churn_Yes ------> flag,充当标签列
    churn_df.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
    # 5.查看数据值的分布
    print(churn_df['flag'].value_counts())  # False:5174,True:1869
    # 6.查看列名,方便我们一会儿抽取特征
    # 列名为:['Partner_att', 'Dependents_att', 'landline', 'internet_att','internet_other', 'StreamingTV', 'StreamingMovies', 'Contract_Month',
    #        'Contract_1YR', 'PaymentBank', 'PaymentCreditcard', 'PaymentElectronic','MonthlyCharges', 'TotalCharges', 'flag', 'gender_Female']
    print(churn_df.columns)
    # 7.数据的可视化,绘制 计数柱状图
    # 参1:数据集,参2:x轴的列名(月度会员),参3:hue表示分组,根据分组进行绘制,这里是:是否流失(False:不流失,True:流失)
    sns.countplot(data=churn_df, x='Contract_Month', hue='flag')
    plt.show()

# 3.定义函数,演示:逻辑回归算法的模型训练,预测,评估
def demo03_logistic_regression_model():
    # 1.加载数据集
    churn_df = pd.read_csv('./data/churn.csv')

    # 2.数据的预处理
    # 2.1 对object类型的列(数据)做 one-hot编码处理
    churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
    # 2.2 删除one-hot处理后新增的,冗余的列
    churn_df.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
    # 2.3 修改列名,将Churn_Yes ------> flag,充当标签列
    churn_df.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
    # 2.4 提取特征列 和 标签列
    # x的特征列:月度会员,是否有互联网服务,是否是电子支付
    x=churn_df[['Contract_Month', 'internet_other', 'PaymentElectronic']]
    y=churn_df['flag']      # False------>不流失,True------>流失
    # 2.5 划分训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=23)

    # 3.特征工程(如:特征提取,特征预处理:归一化、标准化,特征降维,特征选择,特征组合),暂不处理

    # 4.模型训练
    # 4.1 创建(逻辑回归)模型对象
    estimator = LogisticRegression()
    # 4.2 模型训练
    estimator.fit(x_train, y_train)

    # 5.模型预测
    y_predict = estimator.predict(x_test)
    print(f'预测结果:{y_predict}') #预测结果:[False False  True ... False  True False]

    # 6.模型评估
    print(f'准确率:{estimator.score(x_test, y_test)}')   # (预测前)准确率:0.7679205110007097
    print(f'准确率:{accuracy_score(y_test, y_predict)}') # (预测后)准确率:0.7679205110007097
    print(f'精确率:{precision_score(y_test, y_predict)}') # 精确率:0.5807692307692308
    print(f'召回率:{recall_score(y_test, y_predict)}')    # 召回率:0.4092140921409214
    print(f'F1值:{f1_score(y_test, y_predict)}')         # F1值:0.48012718600953896
    # macro avg 宏平均: 不考虑样本权重,直接求平均;适用于 数据均衡 的情况
    # weighted avg 样本权重平均:即 考虑样本权重,求平均;适用于数据不均衡 的情况
    print(f'分类评估报告:\n{classification_report(y_test, y_predict)}')

# 4.测试
if __name__ == '__main__':
    # demo01_data_preprocessing()
    # demo02_data_visualization()
    demo03_logistic_regression_model()


1. 定义函数,演示:数据的预处理
def demo01_data_preprocessing():

One-Hot热编码处理即将String类型的Gender字段 拆分成 左侧bool类型的Gender_Male、Gender_Female两个字段。

简述步骤:读取csv文件、热编码处理 、删列、改列名、查看;
2. 定义函数,演示:数据的可视化
def demo02_data_visualization():

前1~ 5步与上一个函数相同。sns.countplot(data=churn_df, x='Contract_Month')x='Contract_Month'表示根据月度会员做分析,x轴是月度会员;想看看流不流失hue='flag',flag='false'表示数据不流失:
3. 定义函数,演示:逻辑回归算法的模型训练,预测,评估
def demo03_logistic_regression_model():
①对于分类评估报告:False不流失、True流失,即流失与不流失中的:precision精确率 、recall召回率、f1-scoreF1值、support数据集的个数 ,accuracy准确率、macro avg 宏平均、weighted avg 权重平均

macro avg 宏平均 :逐个计算每个类的精确率,再求平均 即 不考虑样本权重,直接求平均;适用于数据均衡 的情况。

weighted avg 样本权重平均 :即 考虑样本权重,求平均;适用于数据不均衡的情况。当数据非常多,值如果不均衡,增大某个权重、降低对方权重,两者即使量纲不同,差异也会变小;)

相关推荐
风筝在晴天搁浅2 小时前
快手/字节 CodeTop LeetCode 415.字符串相加
算法·leetcode
我是发哥哈2 小时前
跨AI模型生成视频的五大维度对比:选型避坑指南
大数据·人工智能·学习·机器学习·chatgpt·音视频
DragonnAi2 小时前
猫咪如厕检测与分类识别系统系列【十四】 项目结构重新整理-即将开源完整算法
算法·开源
机器视觉_Explorer2 小时前
【halcon】编程技巧:鼠标擦除
图像处理·人工智能·深度学习·算法·视觉检测
何陋轩3 小时前
Spring AI实战指南:在Java项目中集成大语言模型
人工智能·后端·机器学习
灵智实验室3 小时前
PX4状态估计技术EKF2详解(二):EKF2 误差状态动力学与协方差传播
算法·无人机·px 4
米粒13 小时前
力扣算法刷题 Day 64 Floyd算法 & A* 算法 & 总结篇
算法·leetcode·职场和发展
XX風4 小时前
OpenGL中Face culling 面剔除的具体实现
算法·图形渲染
IT猿手4 小时前
光伏模型参数估计:基于山羊优化算法(GOA )的光伏模型参数辨识问题求解研究,免费提供完整MATLAB代码链接
开发语言·算法·matlab·群智能优化算法·智能优化算法·光伏模型参数估计·光伏模型参数辨识