机器学习——基于逻辑回归的电信用户流失预测
·
一.案例介绍

数据

二.代码部分详解
导包
#1.导包
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg') # 解决后端错误
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 准确率, 精确率, 召回率, F1值, 分类评估报告
from sklearn.metrics import accuracy_score, precision_score, recall_score ,f1_score ,classification_report
1.数据处理部分
#1.定义函数,演示数据的预处理
def dm01_data_preprocess():
#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处理后,冗余的列
#参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 dm02_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())
#6.查看列名,方便之后抽取特征
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 dm03_logistic_regression():
#1.加载数据集
churn_df = pd.read_csv('./data/churn.csv')
#2.数据的预处理
#2.1热编码处理
churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
#2.2删除冗余的列
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->不流失 Ture->流失
#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_pre = estimator.predict(x_test)
print(f'打印预测结果{y_pre}')
#6.模型评估
print(f'准确率:{estimator.score(x_test,y_test)}') #预测前0.7679205110007097
print(f'准确率:{accuracy_score(y_test, y_pre)}') #预测后0.7679205110007097
print(f'精确率:{precision_score(y_test, y_pre)}') #0.5807692307692308
print(f'召回率:{recall_score(y_test, y_pre)}') #0.4092140921409214
print(f'F1值:{f1_score(y_test, y_pre)}') #0.48012718600953896
#macro avg:宏平均,即:不考虑样本权重,直接求平均。 适用于:数据不均衡的情况
#weighted avg:样本权重平均,即:考虑样本权重,求平均。 适用于不均衡的情况
print(f'分类评估报告:\n{classification_report(y_test,y_pre )}')

4.完整代码
"""
新学:
数据处理部分:
1.将部分数据改成独热编码
2.删除多余数据
3.更改标签名称
"""
#1.导包
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg') # 解决后端错误
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 准确率, 精确率, 召回率, F1值, 分类评估报告
from sklearn.metrics import accuracy_score, precision_score, recall_score ,f1_score ,classification_report
#1.定义函数,演示数据的预处理
def dm01_data_preprocess():
#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处理后,冗余的列
#参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 dm02_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())
#6.查看列名,方便之后抽取特征
print(churn_df.columns) #
# 7.数据的可视化,绘制 计数柱状图
#参1:数据集 参2:x轴的列名(阅读会员) 参3:hue表示分组,根据分组进行绘制,这里是:是否流失(False-》不流失,True-》流失)
sns.countplot(data=churn_df, x='Contract_Month', hue='flag')
plt.show()
"""
Index(['Partner_att', 'Dependents_att', 'landline', 'internet_att',
'internet_other', 'StreamingTV', 'StreamingMovies', 'Contract_Month',
'Contract_1YR', 'PaymentBank', 'PaymentCreditcard', 'PaymentElectronic',
'MonthlyCharges', 'TotalCharges', 'flag', 'gender_Female'],
dtype='object')
"""
#3.逻辑回归算法的模型训练、预测、评估
def dm03_logistic_regression():
#1.加载数据集
churn_df = pd.read_csv('./data/churn.csv')
#2.数据的预处理
#2.1热编码处理
churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
#2.2删除冗余的列
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->不流失 Ture->流失
#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_pre = estimator.predict(x_test)
print(f'打印预测结果{y_pre}')
#6.模型评估
print(f'准确率:{estimator.score(x_test,y_test)}') #预测前0.7679205110007097
print(f'准确率:{accuracy_score(y_test, y_pre)}') #预测后0.7679205110007097
print(f'精确率:{precision_score(y_test, y_pre)}') #0.5807692307692308
print(f'召回率:{recall_score(y_test, y_pre)}') #0.4092140921409214
print(f'F1值:{f1_score(y_test, y_pre)}') #0.48012718600953896
#macro avg:宏平均,即:不考虑样本权重,直接求平均。 适用于:数据不均衡的情况
#weighted avg:样本权重平均,即:考虑样本权重,求平均。 适用于不均衡的情况
print(f'分类评估报告:\n{classification_report(y_test,y_pre )}')
#4.测试
if __name__=='__main__':
#dm01_data_preprocess()
#dm02_data_Visualization()
dm03_logistic_regression()
三.总结
数据处理部分: 1.将部分数据改成独热编码 2.删除多余数据 3.更改标签名称
强化学习了逻辑回归的调用,以及增加了对于模型训练的其他评估指标,如精确率、召回率、F1值
更多推荐

所有评论(0)