案例之 逻辑回归_电信用户流失预测
代码示例:
""" 案例:通过逻辑回归算法,针对于电信用户数据建模,进行流失预测分析; """# 导包importpandasaspdimportseabornassnsimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_score,classification_report# 准确率,精确率,召回率,F1值,分类评估报告# 1.定义函数,演示:数据的预处理defdemo01_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.定义函数,演示:数据的可视化defdemo02_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.定义函数,演示:逻辑回归算法的模型训练,预测,评估defdemo03_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.7679205110007097print(f'准确率:{accuracy_score(y_test,y_predict)}')# (预测后)准确率:0.7679205110007097print(f'精确率:{precision_score(y_test,y_predict)}')# 精确率:0.5807692307692308print(f'召回率:{recall_score(y_test,y_predict)}')# 召回率:0.4092140921409214print(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 样本权重平均:即 考虑样本权重,求平均;适用于数据不均衡的情况。当数据非常多,值如果不均衡,增大某个权重、降低对方权重,两者即使量纲不同,差异也会变小;)
