1. 程式人生 > 其它 >建立機器學習模型

建立機器學習模型

一、課題背景:

如今交通發展迅速,交通方式越來越多樣化,從以前的步行到如今滿地的汽車飛馳,人們對於速度的追求越來越高,因為有效的交通方式的選擇可以幫助我們大大的縮短在路上的時間,提高我們做事的效率,再者隨著經濟和科技越來越發展,人們對於交通方式選擇的角度更趨向於安全快捷,所以航空客運公司越來越重視客戶的流失率,本課題通過機器學習構建客戶流失預警模型來預測客戶的流失率,通過研究分析,結合客戶的特徵,方便公司開展對客戶有針對性的、高效率的挽留措施。

二、設計方案:

本次課題的資料來源是從去哪兒網利用爬蟲抓取得到的,檔名為avivation,資料又經過sklearn庫的一個工具把資料以6:4的比列切分為訓練集和測試集,總樣本含量為

62988大小,其中每個樣本有55個屬性值,最後的runoff_flag表示客戶是否流失。

由於本次課程研究問題屬於機器學習的中有監督學習的分類,所以採用的機器學習框架是邏輯迴歸和決策樹,之後採用交叉驗證的方式,通過評估指標來驗證倆個演算法的優良,並以圖示的方式來展現,使得效果一目瞭然,同時為了優化演算法,我們採用了超引數調優的方式來選取最優良的引數。

涉及到技術難點其一就是資料量太大,如果我們全部帶入的話會導致訓練出來的模型沒有泛化的效果,同時也增加我們的額外負擔。所以在此我們採用的解決方式以抽樣方式的隨機選取5000個樣本,最為一個最初的資料;其二,在最初的資料處理過程中,需要進行特徵工程,這個過程繁瑣而且需要細心,比如要進行重複值和缺失值的處理,資料數值處理涉及到模型的準確性,解決方式是在選取的樣本,以肉眼的方式對資料進行了刪選,發現重複值和缺失值的數量並不多,剔除這些資料對模型的影響很小,所以我們選擇以刪除的方式來處理資料,其次本次資料在爬取的過程中已對資料進行了數字化的處理,不需要在進行編碼。

其三,我們需要對分類演算法有一個恰當的選擇,演算法還要理解,解決方式,我們採用指標評估的方式來對常用的倆種分類演算法進行評估,以資料的形式更科學的說明哪種演算法更適合本次建模,最終我們發現邏輯迴歸更加簡單和精確。

三、實現步驟:

1.讀入aviation資料集,剔除重複值、缺失值。

2.切片抽取5000樣本,使用交叉驗證方法(10折)比較邏輯迴歸、決策樹演算法效能差異。

3.使用網格搜尋對上題中效能較好的演算法進行超引數調優。

4.使用34中確定的最優演算法和最優引數建立模型。

5.按照64劃分資料集。

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()