一.案例介绍

数据

二.代码部分详解

导包

#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值

更多推荐