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

代码示例:

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

相关推荐
小玮看世界5 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光5 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
随意起个昵称5 小时前
【BFS】冰面滑行
算法·宽度优先
张继雁6 小时前
张继雁 个人技术简介|磨削加工过滤方向
大数据·数据库·论文阅读·人工智能·机器学习·创业创新·业界资讯
(Charon)6 小时前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
hansang_IR7 小时前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
这个DBA有点耶7 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康7 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_0027 小时前
C++11(一)
开发语言·c++·算法
529宝宝起名网7 小时前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理