一、课题背景:
如今交通发展迅速,交通方式越来越多样化,从以前的步行到如今满地的汽车飞驰,人们对于速度的追求越来越高,因为有效的交通方式的选择可以帮助我们大大的缩短在路上的时间,提高我们做事的效率,再者随着经济和科技越来越发展,人们对于交通方式选择的角度更趋向于安全快捷,所以航空客运公司越来越重视客户的流失率,本课题通过机器学习构建客户流失预警模型来预测客户的流失率,通过研究分析,结合客户的特征,方便公司开展对客户有针对性的、高效率的挽留措施。
二、设计方案:
本次课题的数据来源是从去哪儿网利用爬虫抓取得到的,文件名为avivation,数据又经过sklearn库的一个工具把数据以6:4的比列切分为训练集和测试集,总样本含量为62988大小,其中每个样本有55个属性值,最后的runoff_flag表示客户是否流失。
由于本次课程研究问题属于机器学习的中有监督学习的分类,所以采用的机器学习框架是逻辑回归和决策树,之后采用交叉验证的方式,通过评估指标来验证俩个算法的优良,并以图标的方式来展现,使得效果一目了然,同时为了优化算法,我们采用了超参数调优的方式来选取最优良的参数。
涉及到技术难点其一就是数据量太大,如果我们全部带入的话会导致训练出来的模型没有泛化的效果,同时也增加我们的额外负担。所以在此我们采用的解决方式以抽样方式的随机选取5000个样本,最为一个最初的数据;其二,在最初的数据处理过程中,需要进行特征工程,这个过程繁琐而且需要细心,比如要进行重复值和缺失值的处理,数据数值处理涉及到模型的准确性,解决方式是在选取的样本,以肉眼的方式对数据进行了删选,发现重复值和缺失值的数量并不多,剔除这些数据对模型的影响很小,所以我们选择以删除的方式来处理数据,其次本次数据在爬取的过程中已对数据进行了数字化的处理,不需要在进行编码。
其三,我们需要对分类算法有一个恰当的选择,算法还要理解,解决方式,我们采用指标评估的方式来对常用的俩种分类算法进行评估,以数据的形式更科学的说明哪种算法更适合本次建模,最终我们发现逻辑回归更加简单和精确。
三、实现步骤:
1.读入aviation数据集,剔除重复值、缺失值。
2.切片抽取5000样本,使用交叉验证方法(10折)比较逻辑回归、决策树算法性能差异。
3.使用网格搜索对上题中性能较好的算法进行超参数调优。
4.使用3、4中确定的最优算法和最优参数建立模型。
5.按照6:4划分数据集。
6.使用训练集数据进行模型训练,对测试集数据进行预测,计算F1分数,画出ROC曲线。
四、总结:
本次课题完成后,我们研究的目的是建立一个合适的机器学习模型来预测客户的流失率,以此来建议航空公司采取合适的措施去挽留客户,最终的结论是采用逻辑回归模型,同时也用这个模型来预测了测试集中的数据,发现效果很好,各项指标也达到了一个很优良的状态。
本次课设课题完成后,我们对机器学习的算法有了进一步的了解和加深,同时对于数据处理的过程我们掌握了一定方法,对于不同的情况采用不同的方式,对于数据我们要报以科学的精神去对待,同时也学到许多的机器学习框架,也懂了整个机器学习处理数据的流程。同时也明白了我们所学到机器学习的知识对于我们生活的一个重要应用,也见识到了它的力量。
虽然本次课题研究主题较为简单,同时特征工程做的工作比较少,所以可能数据的一个优化程度并不是很高,在这次学习当中,我也了解原始数据集一个重要性,它关乎着我们模型的准确性,所以改进的措施是,对数据作进一步的优化,不仅仅处理它的缺失值和重复值,我们也应该使用一种机器学习来对它的某一个特征做预测,来判断是否有错误值,同时以代码的形式来确定。
数据持久化;
import os import numpy as np import pandas as pd from sklearn.model_selection import train_test_split,cross_val_score,GridSearchCV from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn import metrics import matplotlib.pyplot as plt # 1.读入aviation数据集,设置MEMBER_NO为索引列。 df = pd.read_excel(‘aviation.xls‘,index_col=‘MEMBER_NO‘) print(df.info()) # 2.剔除重复值、缺失值。 df.drop_duplicates(inplace=True) # 去重 df.dropna(inplace=True) # 删除缺失值 print(df.info()) # 3.随机抽取500样本,切片特征X和标签Y。 data = df.sample(500) # 抽样 # 从样本数据集data中切片x和y datax = data.iloc[:,0:-1] datay = data.iloc[:,-1] # 4.使用交叉验证方法(10折)比较逻辑回归、决策树算法性能差异,评估指标用F1分数 clf1 = DecisionTreeClassifier() # 决策树 clf2 = LogisticRegression() # 逻辑回归 # 使用F1分值进行10折交叉验证 model1 = cross_val_score(clf1,datax,datay,scoring=‘f1‘,cv=10) model2 = cross_val_score(clf2,datax,datay,scoring=‘f1‘,cv=10) print(‘决策树的F1分值为:‘) print(model1) print(‘均值:{},标准差:{}‘.format(model1.mean(),model1.std())) print(‘逻辑回归的F1分值为:‘) print(model2) print(‘均值:{},标准差:{}‘.format(model2.mean(),model2.std())) # 5.使用网格搜索对上题中F1分数较高的算法进行超参数调优。 # 设置参数 param = {‘C‘:[0.1,1,10], #np.aragr(0.1,1,0.3)等价于[0.1,0.4,0.7] ‘max_iter‘:[80,100,160]} # 初始化出一个对象 searchmodel = GridSearchCV(estimator=clf2, param_grid=param, scoring=‘f1‘, cv=10) # 用网格搜索器进行训练 searchmodel.fit(datax,datay) # 打印网格搜索后的最优分数 print(searchmodel.best_score_) # 打印网格搜索后的最优参数组合 print(searchmodel.best_params_) # 网格搜索后的打印结果 # 0.970963702095 {‘C‘: 10, ‘max_iter‘: 100} # 6.使用4、5中确定的最优算法和最优参数建立模型。 model = LogisticRegression(C=1,max_iter=160) # 7.按照6:4划分数据集。 # 首先从原数据集df中切片x和y x = df.iloc[:,0:-1] y = df.iloc[:,-1] trainx,testx,trainy,testy = train_test_split(x,y,test_size=0.4,random_state=12345) # 8.使用训练集数据进行模型训练,对测试集数据进行预测,打印混淆矩阵。 model.fit(trainx,trainy) # 对训练集进行训练 # 模型预测 prey = model.predict(testx) # 预测的类标签----0或者1 preproba = model.predict_proba(testx) print(preproba) # 样本为0的概率和为1的概率 # 打印混淆矩阵 print(metrics.confusion_matrix(testy,prey)) # 9.打印精确率、召回率、F1分数和AUC值。 print(‘---------精确率---------------‘) print(metrics.precision_score(testy,prey)) print(‘---------召回率---------------‘) print(metrics.recall_score(testy,prey)) print(‘---------F1分值---------------‘) print(metrics.f1_score(testy,prey)) print(‘---------AUC值---------------‘) print(metrics.roc_auc_score(testy,preproba[:,1])) # 10.画出ROC曲线。 fpr,tpr,th = metrics.roc_curve(testy,preproba[:,1]) plt.xlabel(‘FPR‘) plt.ylabel(‘TPR‘) plt.title(‘ROC‘) plt.plot(fpr,tpr) plt.show()