# Python-电信用户流失预测模型 **Repository Path**: RedHat_cug/telecom ## Basic Information - **Project Name**: Python-电信用户流失预测模型 - **Description**: 1、做好用户流失预测可以降低营销成本。老生常谈,新客户开发成本是老客户维护成本的5倍。 2、获得更好的用户体验。并不是所有的增值服务都可以有效留住客户。 3、获得更高的销售回报。价格敏感型客户和非价格敏感性客户。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-01-11 - **Last Updated**: 2022-01-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 《电信用户流失预测模型》 ## 1.研究背景 1、做好**用户流失预测**可以降低营销成本。老生常谈,**新客户开发成本**是**老客户维护成本**的5倍。 2、获得更好的用户体验。并不是所有的增值服务都可以有效留住客户。 3、获得更高的销售回报。价格敏感型客户和非价格敏感性客户。 ## 2.提出问题 1、流失客户有哪些显著性特征? 2、当客户在哪些特征下什么条件下比较容易发生流失? ## 3.数据集描述 该数据集有21个变量,7043个数据点。变量可分为以下三个部分:用户属性、用户行为、研究对象。 ***用户属性*** `customerID` :用户ID `gender`:性别(Female & Male) `SeniorCitizen` :老年人(1表示是,0表示不是) `Partner` :是否有配偶(Yes or No) `Dependents` :是否经济独立(Yes or No) `tenure` :客户的职位(0-72,共73个职位) ***用户行为*** `PhoneService` :是否开通电话服务业务(Yes or No) `MultipleLines` :是否开通了多线业务(Yes 、No or No phoneservice 三种) `InternetService` :是否开通互联网服务(No, DSL数字网络,fiber optic光纤网络 三种) `OnlineSecurity` :是否开通网络安全服务(Yes,No,No internetserive 三种) `OnlineBackup` :是否开通在线备份业务(Yes,No,No internetserive 三种) `DeviceProtection` :是否开通了设备保护业务(Yes,No,No internetserive 三种) `TechSupport` :是否开通了技术支持服务(Yes,No,No internetserive 三种) `StreamingTV` :是否开通网络电视(Yes,No,No internetserive 三种) `StreamingMovies` :是否开通网络电影(Yes,No,No internetserive 三种) `Contract` :签订合同方式 (按月,一年,两年) `PaperlessBilling` :是否开通电子账单(Yes or No) `PaymentMethod` :付款方式(bank transfer,credit card,electronic check,mailed check) `MonthlyCharges` :月费用 `TotalCharges` :总费用 **研究对象** Churn:该用户是否流失(Yes or No) ## 4.分析思路 `分析视角`是`分析方法`的灵魂。 分析方法有上百种,但`分析视角`只有四种: - 对比视角 - 分类视角 - 相关视角 - 描述视角 一旦将`业务需求`拆解成指标,接下来只需要针对每个指标进行`分析视角`四选一即可。 数据集描述,已经将变量分为三个维度了:用户属性、用户行为、研究对象(是否流失客户),三个维度组合一下就得出了以下解题思路了: - 哪些属性的用户比较容易流失? - 哪些行为的用户比较容易流失? 以上两个分析思路运用的是【对比视角】,该视角下具体的分析方法有: - 数值型数据:均值比较 - 分类型数据:频数分布比较(交叉分析) 以上的分析方法是统计分析,只能一个维度一个维度地去比较。但实际情况中,并不是每个维度的权重都一样的,那如何去研究各个维度的权重? `权重问题`属于`分类视角`,故我们可以采用`分类模型`,要用哪个`分类模型`呢?不知道。可以全部采用,看模型精度得分,然后选得分最高的模型进行进一步预测。 - Random Forest 随机森林 - SVC 支持向量机 - LogisticRegression 逻辑回归 - KNN 近邻算法 - Naive Bayes 朴素贝叶斯 - Decision Tree 决策树 - AdaBoost - GradientBoosting - XGB - CatBoost ## 5.分析结论及运营建议 ### 5.1 分析结论 ![8](pic/8.png) 综合`统计分析`和`XGB算法输出特征重要性`得出流失客户有以下特征(依特征重要性从大到小排列): 1. tenure :1-5号职位的用户比较容易流失 2. PaymentMethod :使用`电子支票`支付的人 3. MonthlyCharges 、TotalCharges : 总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失 4. PaperlessBilling : 开通电子账单 5. Partner : 单身 6. OnlineBackup : 没开通`在线备份业务` 7. InternetService :开通了`Fiber optic 光纤网络` 8. TechSupport :没开通“技术支持服务” 9. DeviceProtection :没开通`设备保护业务` 10. OnlineSecurity :没开通`网络安全服务` 11. Contract :`按月`签订合同方式 12. Dependents :无经济独立 13. SeniorCitizen :青年人 14. TotalCharges :总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失 当条件覆盖得越多,人群越精确,但与此同时,覆盖的人群也会越少。业务方可直接在数据库中,通过SQL检索符合要求的客户,然后做针对性的运营工作。 ### 5.2 运营建议 如何留住客户,可以从两方面去思考: - 增加用户的沉没成本(损失厌恶) - - 会员等级 - 积分制 - 充值赠送 - 满减券 - 其他增值服务 - 培养用户的条件反射(习惯) - - 会员日 - 定期用户召回 - 签到 - 每日定时抽奖 - 小游戏 ### 电子账单解锁新权益 - `现象`:“开通电子账单”的人反而容易流失。 - `基本假设`:价格敏感型客户。电子账单,让客户理性消费。 - `建议`:让“电子账单”变成一项“福利。跟连锁便利店,联名发"商品满减券",每月的账单时间,就将"商品满减券“和账单一起推送过去。文案:您上月消费了XX元,解锁了xx会员权益。 - `底层规律`:增加沉没成本。 ### “单身用户”尊享亲情网 - `现象`:“单身用户”容易流失。 - `基本假设`:社交欲望低。 - `建议`:一个单身用户拥有建立3个人以内的“亲情网”的权益。 - `底层规律`:增加沉没成本。 ### 推广“在线备份、设备保护、技术支持、网络保护”等增值服务。 ## 6.数据清洗 ### 6.1 导入模块 #### 6.1.1 数据处理 ``` import pandas as pd import numpy as np ``` #### 6.1.2 可视化 ``` import matplotlib.pyplot as plt import seaborn as sns sns.set(style='darkgrid',font_scale=1.3) plt.rcParams['font.family']='SimHei' plt.rcParams['axes.unicode_minus']=False ``` ### 6.1.3 特征工程 ``` import sklearn from sklearn import preprocessing #数据预处理模块 from sklearn.preprocessing import LabelEncoder #编码转换 from sklearn.preprocessing import StandardScaler #归一化 from sklearn.model_selection import StratifiedShuffleSplit #分层抽样 from sklearn.model_selection import train_test_split #数据分区 from sklearn.decomposition import PCA #主成分分析 (降维) ``` #### 6.1.4 分类算法 ``` from sklearn.ensemble import RandomForestClassifier #随机森林 from sklearn.svm import SVC,LinearSVC #支持向量机 from sklearn.linear_model import LogisticRegression #逻辑回归 from sklearn.neighbors import KNeighborsClassifier #KNN算法 from sklearn.cluster import KMeans #K-Means 聚类算法 from sklearn.naive_bayes import GaussianNB #朴素贝叶斯 from sklearn.tree import DecisionTreeClassifier #决策树 ``` #### 6.1.5 分类算法--集成学习 ``` import xgboost as xgb from xgboost import XGBClassifier from catboost import CatBoostClassifier from sklearn.ensemble import AdaBoostClassifier from sklearn.ensemble import GradientBoostingClassifier ``` #### 6.1.6 模型评估 ``` from sklearn.metrics import classification_report,precision_score,recall_score,f1_score #分类报告 from sklearn.metrics import confusion_matrix #混淆矩阵 from sklearn.metrics import silhouette_score #轮廓系数(评价k-mean聚类效果) from sklearn.model_selection import GridSearchCV #交叉验证 from sklearn.metrics import make_scorer from sklearn.ensemble import VotingClassifier #投票 ``` #### 6.1.7 忽略警告 ``` import warnings warnings.filterwarnings('ignore') ``` ### 6.2 读取数据 ``` df=pd.read_csv(r'C:\Users\Think\Desktop\刻意练习数据\电信数据集\Customer-Churn.csv',header=0) #预览数据 df.head() #查看数据大小 df.shape #查看数据数据及分布 df.describe() ``` ### 6.3 数据清洗 #### 6.3.1 缺失值处理 ``` #查看缺失值 df.isnull().sum() ``` 注:缺失值的数据类型是 float 类型。一旦有变量的数据类型转换成`float 类型`,需再次查看缺失值。 ![image-20210629175523224](pic/11.png) #### 6.3.2 重复值处理 ``` #查看重复值 df.duplicated().sum() ``` 【输出】 ![image-20210629175549387](pic/12.png) #### 6.3.3 数值类型转换 ``` #查看数据类型 df.info() ``` 【输出】 ![image-20210629175609718](pic/13.png) `TotalCharages`总费用应该跟`MonthlvCharges`是同一个数据类型(float64)。故需将TotalCharages由object转换成float64,且需要再次查看缺失值。 ``` #总费用 TotalCharges 该列的数据类型应是float64,不是object # df['TotalCharges'].astype('float64') # 此处用“astype”转化数据类型报错 “could not convert string to float” df.TotalCharges = df.TotalCharges.apply(pd.to_numeric, errors="coerce") ``` 再次查看缺失值: ![image-20210627144436788](pic/14.png) TotalCharges列有11个缺失值,处理缺失值的原则是尽量填充,最后才是删除。缺失值填充的原则: - 分类型数据:众数填充 - 数值型数据:正态分布,均值/中位数填充;偏态分布,中位数填充。 TotalCharges列是数值型数据,先画直方图查看数据分布形态。 ``` #分别作直方图:全部客户类型、流失客户类型、留存客户类型 plt.figure(figsize=(14,5)) plt.subplot(1,3,1) plt.title('全部客户的总付费直方图') sns.distplot(df['TotalCharges'].dropna()) plt.subplot(1,3,2) plt.title('流失客户的总付费直方图') sns.distplot(df[df['Churn']=='Yes']['TotalCharges'].dropna()) plt.subplot(1,3,3) plt.title('留存客户的总付费直方图') sns.distplot(df[df['Churn']=='No']['TotalCharges'].dropna()) ``` 结果如下: ![1](pic/1.png) 从三个直方图看,该列数据是偏态分布,故选择`中位数`填充。 ```python df.fillna({'TotalCharges':df['TotalCharges'].median()},inplace=True) #再次确认是否还有空值 df.isnull().sum() ``` ### 6.4 查看样本分布 研究对象'Churn'列重新编码“Yes”=1,“No”=0。重新编码有下面两种方法。 方法一:replace ``` df['Churn'].replace(to_replace = 'Yes', value = 1,inplace = True) df['Churn'].replace(to_replace = 'No', value = 0,inplace = True) ``` 方法二:map函数 ``` df['Churn']=df['Churn'].map({'Yes':1,'No':0}) ``` 预览数据: ``` df['Churn'].head() ``` 绘制饼图,查看流失客户占比。 ```python churn_value=df["Churn"].value_counts() labels=df["Churn"].value_counts().index plt.figure(figsize=(7,7)) plt.pie(churn_value,labels=labels,colors=["b","w"], explode=(0.1,0),autopct='%1.1f%%', shadow=True) plt.title("流失客户占比高达26.5%") plt.show() ``` 结果如下: ![2](pic/2.png) 【分析】:流失客户样本占比26.5%,留存客户样本占比73.5%,明显的“样本不均衡”。 解决样本不均衡有以下方法可以选择: - 分层抽样 - 过抽样 - 欠抽样 ## 7.特征选择 提取特征 ``` feature=df.iloc[:,1:20] ``` ### 7.1 整数编码 查看变量间的两两相关性 ``` #重新编码 corr_df = feature.apply(lambda x: pd.factorize(x)[0]) corr_df.head() #相关性矩阵 corr=corr_df.corr() corr ``` 结果如下: ![image-20210629073933108](pic/15.png) 相关性矩阵可视化 ``` #绘制热力图观察变量之间的相关性强弱 plt.figure(figsize=(25,12)) ax = sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, linewidths=0.2, cmap="RdYlGn",annot=True) plt.title("变量间相关性") ``` 结果如下: ![3](pic/3.png) 【分析】:从热力图来看,互联网服务、网络安全、在线备份、设备维护服务、技术支持服务、开通网络电视服务、开通网络电影之间相关性很强,且是正相关。电话服务和多线业务之间也存在很强的正相关关系。 ### 7.2 独热编码 查看研究对象"Churn"与其他变量下的标签相关性。独热编码,可以将分类变量下的标签转化成列 ``` df_onehot = pd.get_dummies(df.iloc[:,1:21]) df_onehot.head() ``` 结果如下: ![image-20210629080644860](pic/16.png) 绘图查看用户流失('Churn')与各个维度之间的关系 ```python plt.figure(figsize=(15,6)) df_onehot.corr()[df_onehot.corr().index!="Churn"].Churn.sort_values( ascending=False).plot(kind='bar') plt.title('Churn与变量之间的相关性') ``` 结果如下: ![4](pic/4.png) 【分析】:从图看gender(性别)、PhoneService(电话服务)相关性几乎为0,故两个维度可以忽略。 ['SeniorCitizen','Partner','Dependents', 'Contract',MultipleLines,'InternetService', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection','TechSupport', 'StreamingTV', 'StreamingMovies','PaperlessBilling','PaymentMethod']等都有较高的相关性,将以上维度合并成一个列表kf_var,然后进行频数比较。 ```python kf_var=list(df.columns[2:5]) for var in list(df.columns[7:18]): kf_var.append(var) print('kf_var=',kf_var) ``` 结果如下: ```python kf_var= ['SeniorCitizen', 'Partner', 'Dependents', 'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling', 'PaymentMethod'] ``` ## 8.统计分析 ### 8.1 频数分布比较 #### 8.1.1 卡方检验 组间有显著性差异,频数分布比较才有意义,否则可能会做无用功。"卡方检验",就是提高频数比较结论可信度的统计方法。 ```python #分组间确实是有显著性差异,频数比较的结论才有可信度,故需进行“卡方检验” from scipy.stats import chi2_contingency #统计分析 卡方检验 #自定义卡方检验函数 def KF(x): df1=pd.crosstab(df['Churn'],df[x]) li1=list(df1.iloc[0,:]) li2=list(df1.iloc[1,:]) kf_data=np.array([li1,li2]) kf=chi2_contingency(kf_data) if kf[1]<0.05: print('Churn by {} 的卡方临界值是{:.2f},小于0.05,表明{}组间有显著性差异,可进行【交叉分析】'.format(x,kf[1],x),'\n') else: print('Churn by {} 的卡方临界值是{:.2f},大于0.05,表明{}组间无显著性差异,不可进行交叉分析'.format(x,kf[1],x),'\n') #对 kf_var进行卡方检验 print('kf_var的卡方检验结果如下:','\n') print(list(map(KF, kf_var))) ``` kf_var的卡方检验结果如下: Churn by SeniorCitizen 的卡方临界值是0.00,小于0.05,表明SeniorCitizen组间有显著性差异,可进行【交叉分析】 Churn by Partner 的卡方临界值是0.00,小于0.05,表明Partner组间有显著性差异,可进行【交叉分析】 Churn by Dependents 的卡方临界值是0.00,小于0.05,表明Dependents组间有显著性差异,可进行【交叉分析】 Churn by MultipleLines 的卡方临界值是0.00,小于0.05,表明MultipleLines组间有显著性差异,可进行【交叉分析】 Churn by InternetService 的卡方临界值是0.00,小于0.05,表明InternetService组间有显著性差异,可进行【交叉分析】 Churn by OnlineSecurity 的卡方临界值是0.00,小于0.05,表明OnlineSecurity组间有显著性差异,可进行【交叉分析】 Churn by OnlineBackup 的卡方临界值是0.00,小于0.05,表明OnlineBackup组间有显著性差异,可进行【交叉分析】 Churn by DeviceProtection 的卡方临界值是0.00,小于0.05,表明DeviceProtection组间有显著性差异,可进行【交叉分析】 Churn by TechSupport 的卡方临界值是0.00,小于0.05,表明TechSupport组间有显著性差异,可进行【交叉分析】 Churn by StreamingTV 的卡方临界值是0.00,小于0.05,表明StreamingTV组间有显著性差异,可进行【交叉分析】 Churn by StreamingMovies 的卡方临界值是0.00,小于0.05,表明StreamingMovies组间有显著性差异,可进行【交叉分析】 Churn by Contract 的卡方临界值是0.00,小于0.05,表明Contract组间有显著性差异,可进行【交叉分析】 Churn by PaperlessBilling 的卡方临界值是0.00,小于0.05,表明PaperlessBilling组间有显著性差异,可进行【交叉分析】 Churn by PaymentMethod 的卡方临界值是0.00,小于0.05,表明PaymentMethod组间有显著性差异,可进行【交叉分析】 从卡方检验的结果,kf_var包含的特征,组间都有显著性差异,可进行【频数比较】。 #### 8.1.2 柱形图 频数比较--柱形图 ```python plt.figure(figsize=(20,25)) a=0 for k in kf_var: a=a+1 plt.subplot(4,4,a) plt.title('Churn BY '+ k) sns.countplot(x=k,hue='Churn',data=df) ``` 结果如下: ![5](pic/5.png) 因为PaymentMethod的标签比较长,影响看图,所以单独画。 ```python plt.figure(figsize=(18,13)) plt.xticks(fontsize=20) plt.yticks(fontsize=20) plt.xlabel(xlabel="PaymentMethod",fontsize=25) plt.ylabel(ylabel="Count",fontsize=25) sns.countplot(x='PaymentMethod',hue='Churn',data=df) ``` ![6](pic/6.png) 可以直接从柱形图去判断对哪个维度对流失客户的影响大吗?不能,因为“样本不均衡”(流失客户样本占比26.5%,留存客户样本占比73.5%),基数不一样,故不能直接通过“频数”的柱形图去分析。解决办法:交叉分析,且作同行百分比('Churn'作为“行”) #### 8.1.3 交叉分析 ```python print('ka_var列表中的维度与Churn交叉分析结果如下:','\n') for i in kf_var: print('................Churn BY {}...............'.format(i)) print(pd.crosstab(df['Churn'],df[i],normalize=0),'\n') #交叉分析,同行百分比 ``` ka_var列表中的维度与Churn交叉分析结果如下: 【SeniorCitizen 分析】:年轻用户 在流失、留存,两个标签的人数占比都高。 ``` ................Churn BY SeniorCitizen............... SeniorCitizen 0 1 Churn 0 0.871279 0.128721 1 0.745318 0.254682 ``` 【Parter 分析】:单身用户更容易流失。 ``` ................Churn BY Partner............... Partner No Yes Churn 0 0.471782 0.528218 1 0.642055 0.357945 ``` 【Denpendents 分析】:经济不独立的用户更容易流失。 ``` ................Churn BY Dependents............... Dependents No Yes Churn 0 0.655199 0.344801 1 0.825575 0.174425 ``` 【MultipleLines 分析】:是否开通MultipleLines,对留存和流失都没有明显的促进作用。 ``` ................Churn BY MultipleLines............... MultipleLines No No phone service Yes Churn 0 0.491109 0.098956 0.409934 1 0.454254 0.090958 0.454789 ``` 【InternetService 分析】:办理了 “Fiber optic 光纤网络”的客户容易流失。 ``` ................Churn BY InternetService............... InternetService DSL Fiber optic No Churn 0 0.379204 0.347700 0.273096 1 0.245586 0.693954 0.060460 ``` 【OnlineSecurity 分析】:没开通“网络安全服务”的客户容易流失。 ``` ................Churn BY OnlineSecurity............... OnlineSecurity No No internet service Yes Churn 0 0.393699 0.273096 0.333204 1 0.781701 0.060460 0.157838 ``` 【OnlineBackup 分析】:没开通“在线备份服务”的客户容易流失。 ``` ................Churn BY OnlineBackup............... OnlineBackup No No internet service Yes Churn 0 0.358523 0.273096 0.368380 1 0.659711 0.060460 0.279829 ``` 【DeviceProtection 分析】:没开通“设备保护业务”的用户比较容易流失 ``` ................Churn BY DeviceProtection............... DeviceProtection No No internet service Yes Churn 0 0.364128 0.273096 0.362775 1 0.647940 0.060460 0.291600 ``` 【TechSupport 分析】:没开通“技术支持服务”的用户容易流失。 ``` ................Churn BY TechSupport............... TechSupport No No internet service Yes Churn 0 0.391767 0.273096 0.335137 1 0.773676 0.060460 0.165864 ``` 【StreamingTV 分析】:是否开通“网络电视”服务,对用户留存、流失,没有明显的促进作用。 ``` ................Churn BY StreamingTV............... StreamingTV No No internet service Yes Churn 0 0.361036 0.273096 0.365868 1 0.504013 0.060460 0.435527 ``` 【StreamingMovies 分析】:是否开通“网络电影”服务,对用户留存、流失,没有明显的促进作用。 ``` ................Churn BY StreamingMovies............... StreamingMovies No No internet service Yes Churn 0 0.356977 0.273096 0.369927 1 0.501873 0.060460 0.437667 ``` 【Contract 分析】逐月签订合同的用户最容易流失。 ``` ................Churn BY Contract............... Contract Month-to-month One year Two year Churn 0 0.429068 0.252609 0.318322 1 0.885500 0.088818 0.025682 ``` 【PaymentMethod分析】使用“电子支票”支付的人更容易流失。 ``` ................Churn BY PaymentMethod............... PaymentMethod Bank transfer (automatic) Credit card (automatic) \ Churn 0 0.248550 0.249324 1 0.138042 0.124131 PaymentMethod Electronic check Mailed check Churn 0 0.250097 0.252029 1 0.573034 0.164794 ``` ### 8.2 均值比较 组间有显著性差异,均值比较才有意义。显著性检验,先通过了齐性检验,再通过方差分析,最后才能做均值比较。 #### 8.2.0 齐性检验,方差分析 ```python from scipy import stats #自定义齐性检验 & 方差分析 函数 def ANOVA(x): li_index=list(df['Churn'].value_counts().keys()) args=[] for i in li_index: args.append(df[df['Churn']==i][x]) w,p=stats.levene(*args) #齐性检验 if p<0.05: print('警告:Churn BY {}的P值为{:.2f},小于0.05,表明齐性检验不通过,不可作方差分析'.format(x,p),'\n') else: f,p_value=stats.f_oneway(*args) #方差分析 print('Churn BY {} 的f值是{},p_value值是{}'.format(x,f,p_value),'\n') if p_value<0.05: print('Churn BY {}的均值有显著性差异,可进行均值比较'.format(x),'\n') else: print('Churn BY {}的均值无显著性差异,不可进行均值比较'.format(x),'\n') ``` 对MonthlyCharges、TotalCharges维度分别进行齐性检验和方差分析 ```python print('MonthlyCharges、TotalCharges的齐性检验和方差分析结果如下:','\n') ANOVA('MonthlyCharges') ANOVA('TotalCharges') ``` ``` MonthlyCharges、TotalCharges的齐性检验和方差分析结果如下: 警告:Churn BY MonthlyCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析 警告:Churn BY TotalCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析 ``` ### 8.3 总结 用户出现以下特征比较容易流失: - SeniorCitizen:青年人 - Partner :单身 - Dependents :无经济独立 - InternetService:开通了 “Fiber optic 光纤网络” - OnlineSecurity:没开通“网络安全服务” - OnlineBackup:没开通“在线备份业务” - DeviceProtection:没开通通了“设备保护业务 - TechSupport:没开通“技术支持服务” - Contract:“按月”签订合同方式 - PaperlessBilling:开通电子账单 - PaymentMethod:使用“电子支票”支付的人 我们可以在SQL(数据库)上找有以上特征的客户,进行精准营销,即可以降低用户流失。虽然特征选得越多,越精确,但覆盖的人群也会越少。故,我们还需要计算“特征”的【重要性】,将最为重要的几个特征作为筛选条件。 计算特征的【重要性】,是“分类视角”,接下来我们会挑选常见的分类模型,进行批量训练,然后挑出得分最高的模型,进一步计算“特征重要性”。 ## 9.特征工程 ### 9.1 提取特征 有前面的流失率与各个维度的相关系数柱状图可知:流失率与gender(性别)、PhoneService(电话服务)相关性几乎为0,可以筛选掉,而customerID是随机数,不影响建模,故可以筛选掉。最终得到特征 churn_var ```python churn_var=df.iloc[:,2:20] churn_var.drop("PhoneService",axis=1, inplace=True) churn_var.head() ``` 结果如下: ![image-20210629145223978](pic/17.png) ### 9.2 处理“量纲差异大” “MonthlyCharges"、"TotalCharges"两个特征跟其他特征相比,量纲差异大。 ![image-20210629145434119](pic/18.png) 处理量纲差异大,有两种方法: 1. 标准化 2. 离散化 以上两种方法,哪个能让模型精度提高,就选哪个。根据模型的最后得分,我选了“离散化”来处理量纲差异大。 #### 9.2.1 标准化 ```python scaler = StandardScaler(copy=False) scaler.fit_transform(churn_var[['MonthlyCharges','TotalCharges']]) #fit_transform拟合数据 churn_var[['MonthlyCharges','TotalCharges']]=scaler.transform(churn_var[['MonthlyCharges','TotalCharges']]) #transform标准化 print(churn_var[['MonthlyCharges','TotalCharges']].head() )#查看拟合结果 ``` 【输出】 ``` array([[-1.16032292, -0.99424194], [-0.25962894, -0.17324413], [-0.36266036, -0.95967407], ..., [-1.1686319 , -0.85446945], [ 0.32033821, -0.87206242], [ 1.35896134, 2.01428802]]) MonthlyCharges TotalCharges 0 -1.160323 -0.994242 1 -0.259629 -0.173244 2 -0.362660 -0.959674 3 -0.746535 -0.194766 4 0.197365 -0.940470 ``` #### 9.2.2 特征离散化 特征离散化后,模型易于快速迭代,且模型更稳定。 1、处理'MonthlyCharges': ``` #查看'MonthlyCharges'列的4分位 churn_var['MonthlyCharges'].describe() ``` ``` count 7.043000e+03 mean -6.406285e-17 std 1.000071e+00 min -1.545860e+00 25% -9.725399e-01 50% 1.857327e-01 75% 8.338335e-01 max 1.794352e+00 Name: MonthlyCharges, dtype: float64 ``` **离散操作** 18.25=