由前面结果可知,(参考数据分析1,2)CustomerID表示每个客户的随机字符,对后续建模不影响,我这里选择删除CustomerID列;gender 和 PhoneService 与流失率的相关性低,可直接忽略。
#数据预处理 df1=df.iloc[:,2:20] df1.drop("PhoneService",axis=1,inplace=True) df_id=df["customerID"] df1.head()数据展示: 对客户的职位、月费用和总费用进行去均值和方差缩放,对数据进行标准化:使得数据方差为1,均值为0,则预测结果不会被某些维度过大的特征值主导
标准化后:
使用箱线图查看数据是否存在异常值: 第一种:
df1[['tenure','MonthlyCharges','TotalCharges']]=scaler.transform(df1[['tenure','MonthlyCharges','TotalCharges']]) df1[['tenure','MonthlyCharges','TotalCharges']].plot(kind='box',subplots=True,layout=(3,1),sharex=False,fontsize=8) pyplot.show()第二种:
#使用箱线图查看数据异常值 import seaborn as sns df1[['tenure','MonthlyCharges','TotalCharges']]=scaler.transform(df1[['tenure','MonthlyCharges','TotalCharges']]) plt.figure(figsize=(8,4)) sns.boxplot(data=df1[['tenure','MonthlyCharges','TotalCharges']],palette="Set1")由以上结果可以看出,在三个变量中不存在明显的异常值。
查看对象类型字段中存在的值:
#查看对象类型字段中存在的值 def uni(columnlabel): print(columnlabel,"--",df1[columnlabel].unique()) x=df1.select_dtypes(['object']) for i in range(0,len(x.columns)): uni(x.columns[i])综合之前的结果来看,在六个变量中存在No internet service,即无互联网服务对客户流失率影响很小,这些客户不使用任何互联网产品,因此可以将No internet service 和 No 是一样的效果,可以使用 No 替代 No internet service。
Scikit-learn标签编码,将分类数据转换为整数编码:
#使用Scikit-learn标签编码,将分类数据转换为整数编码 from sklearn.preprocessing import LabelEncoder def labelencode(columnlabel): df1[columnlabel]=LabelEncoder().fit_transform(df1[columnlabel]) for i in range(0,len(x.columns)): labelencode(x.columns[i]) for i in range(0,len(x.columns)): uni(x.columns[i])训练数据和测试数据被分成五组 建立训练数据与测试数据:
#建立训练数据和测试数据 for tr_index,te_index in s.split(X,y): print("train:",tr_index,"test:",te_index) X_train,X_test=X.iloc[tr_index],X.iloc[te_index] y_train,y_test=y[tr_index],y[te_index]这里我选择了5种分类算法。随机森林,决策树,线性支持向量机,K最近邻,朴素贝叶斯算法
#选择机器算法 #选择机器学习方法 from sklearn.ensemble import RandomForestClassifier from sklearn import tree from sklearn.naive_bayes import GaussianNB from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import LinearSVC models=[['rfc',RandomForestClassifier()], ['tree',tree.DecisionTreeClassifier()], ['kmeans',KMeans()], ['gnb',GaussianNB()], ['knn',KNeighborsClassifier()], ['lsvc',LinearSVC()]]对于模型随机森林,预测正确率为78.89%左右 混淆矩阵如下: 对于模型决策树,预测正确率为73.13%左右 混淆矩阵如下: 对于模型朴素贝叶斯,预测正确率为:76.72%左右 混淆矩阵如下: 对于模型k-最近邻,预测正确率为75.69%左右 混淆矩阵如下: 对于模型支持向量机,预测正确率为27.08%左右 混淆矩阵如下:
召回率(recall)的含义是:原本为对的当中,预测为对的比例(值越大越好,1为理想状态) 精确率、精度(precision)的含义是:预测为对的当中,原本为对的比例(值越大越好,1为理想状态) F1分数(F1-Score)指标综合了Precision与Recall的产出的结果F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。
#评估算法 names=pd.DataFrame(names) result=pd.concat(results,axis=1) result.columns=names[0].tolist() result.index=["recall","precision","f1score"] result可以看出,模型随机森林的训练效果最好,支持向量机的训练效果最差。
我实施了随机森林模型:预测结果。
通过数据分析-1,数据分析-2,以及本文的分析, 我们可以大致得出容易流失的用户特征: 1、老年用户与未婚且经济未独立的青少年用户更容易流失。 2、电话服务对用户的流失没有直接的影响。 3、提供的各项网络服务项目能够降低用户的流失率。 4、签订合同越久,用户的留存率越高。 5、采用electronic check支付的用户更易流失。 针对上述诊断结果,可有针对性的对此提出建议: 推荐老年用户与青少年用户采用数字网络,且签订2年期合同(可以各种辅助优惠等营销手段来提高2年期合同的签订率),若能开通相关网络服务可增加用户粘性,因此可增加这块业务的推广,同时考虑改善电子账单支付的用户体验。