袁馨 段華瓊
摘要:隨著互聯(lián)網(wǎng)的興起,二十一世紀(jì)已經(jīng)是一個(gè)信息時(shí)代,也可以稱為大數(shù)據(jù)時(shí)代,數(shù)據(jù)早已滲透到當(dāng)今的每一個(gè)行業(yè),成為重要的生產(chǎn)因素。大數(shù)據(jù)技術(shù)應(yīng)用的領(lǐng)域越來(lái)越多,幫助企業(yè)不斷地發(fā)展新業(yè)務(wù),創(chuàng)造新的運(yùn)營(yíng)模式,例如電子商務(wù),物流配送等。該文詳細(xì)闡述了一個(gè)基于決策樹算法的數(shù)據(jù)分析挖掘過(guò)程,以泰坦尼克號(hào)數(shù)據(jù)為例,通過(guò)對(duì)數(shù)據(jù)的分析與挖掘來(lái)實(shí)現(xiàn)預(yù)測(cè)功能。
關(guān)鍵詞:決策樹算法;大數(shù)據(jù);預(yù)測(cè)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)22-0185-02
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
大數(shù)據(jù)的出現(xiàn),涌現(xiàn)出許多新的分析與挖掘算法,統(tǒng)稱為大數(shù)據(jù)技術(shù)。越來(lái)越多的企業(yè)運(yùn)用大數(shù)據(jù)技術(shù)對(duì)數(shù)據(jù)進(jìn)行深層次的分析,從而決定企業(yè)的運(yùn)營(yíng)模式。例如超市的捆綁銷售,流失客戶的風(fēng)險(xiǎn)預(yù)測(cè)等。本文主要通過(guò)各類屬性的提取、處理,探究影響泰坦尼克號(hào)乘客存活率的因素,最后對(duì)測(cè)試集的數(shù)據(jù)做存活率預(yù)測(cè)。
1 決策樹算法簡(jiǎn)介
1.1算法思想
決策樹算法屬于機(jī)器學(xué)習(xí)的一種,是一種基本的分類與回歸方法,本文主要討論分類的決策樹。該算法能從給定的無(wú)序訓(xùn)練樣本中,提煉出像樹一樣的分類模型。樹中的每個(gè)非葉子節(jié)點(diǎn)記錄了使用哪個(gè)特征來(lái)進(jìn)行類別判斷,每個(gè)葉子節(jié)點(diǎn)則代表了最后判斷的類別。從根節(jié)點(diǎn)開始,數(shù)據(jù)在信息增益最大的特征上產(chǎn)生分裂,在迭代過(guò)程中,分裂過(guò)程在每個(gè)子節(jié)點(diǎn)重復(fù)進(jìn)行,直到所有的葉子為純性,即每一個(gè)節(jié)點(diǎn)的數(shù)據(jù)屬于同一類。這也是做預(yù)測(cè)的方法,通過(guò)對(duì)特征的提取,建立模型,然后對(duì)測(cè)試的數(shù)據(jù)做分類。決策樹可以分成三個(gè)算法:ID3算法、C4.5算法和CART算法。這三個(gè)算法都比較常見,在選擇屬性的時(shí)候采用不同的方式來(lái)判斷。
1.2算法特點(diǎn)
相對(duì)于其他機(jī)器學(xué)習(xí)算法來(lái)說(shuō),決策樹算法相對(duì)簡(jiǎn)單,計(jì)算復(fù)雜度不高,且易于理解和實(shí)現(xiàn)。人們?cè)趯W(xué)習(xí)和使用的過(guò)程中,不需要了解太多的背景知識(shí)。它能直接體現(xiàn)數(shù)據(jù)的特點(diǎn),生成的樹通過(guò)解釋后都能很好地理解它的含義。對(duì)于決策樹的數(shù)據(jù)準(zhǔn)備,也相對(duì)簡(jiǎn)單,它能夠同時(shí)處理數(shù)據(jù)型和常規(guī)性的屬性值,對(duì)數(shù)據(jù)中間值的缺失不太敏感,可以處理不相關(guān)特征數(shù)據(jù)的特點(diǎn)。
13決策樹算法的預(yù)測(cè)步驟
①收集數(shù)據(jù):收集數(shù)據(jù)可以采用很多方法,無(wú)論是自己收集,還是使用網(wǎng)上現(xiàn)成的數(shù)據(jù)集,這都是需要準(zhǔn)備的基礎(chǔ)步驟之—一。
②分析數(shù)據(jù):一個(gè)數(shù)據(jù)集會(huì)有很多屬性,對(duì)于預(yù)測(cè)的內(nèi)容來(lái)說(shuō),并不是所有列的值都跟預(yù)測(cè)內(nèi)容有關(guān),所以對(duì)于每一列數(shù)據(jù)需要逐個(gè)去分析它與預(yù)測(cè)內(nèi)容的關(guān)系,在后續(xù)的屬性提取時(shí),僅僅提取與預(yù)測(cè)內(nèi)容有關(guān)聯(lián)性的列。
③處理數(shù)據(jù):提取數(shù)據(jù)之后,需要對(duì)數(shù)據(jù)進(jìn)行一個(gè)預(yù)處理,看數(shù)據(jù)是否有缺失值或異常值,是否需要?jiǎng)h除某些數(shù)據(jù)。然后還需要對(duì)每一列屬性值的類型進(jìn)行分析判斷,如果存在數(shù)據(jù)類型不合適的情況,就需要對(duì)屬性值類型進(jìn)行轉(zhuǎn)換。對(duì)提取的數(shù)據(jù)進(jìn)行清洗后,后續(xù)才能直接在算法中使用。這一過(guò)程雖然是對(duì)數(shù)據(jù)的處理,但也是非常重要的一步。
④訓(xùn)練算法:這個(gè)過(guò)程包括決策樹模型的構(gòu)建,然后使用訓(xùn)練數(shù)據(jù)對(duì)該決策樹模型進(jìn)行訓(xùn)練,得出一個(gè)準(zhǔn)確率。
⑤測(cè)試算法:光有訓(xùn)練數(shù)據(jù)的準(zhǔn)確率不能說(shuō)明該模型是否好,還需要測(cè)試集的準(zhǔn)確率來(lái)判斷,當(dāng)錯(cuò)誤率達(dá)到可以接受的范圍,那么這個(gè)模型就可以投入使用了。
⑥預(yù)測(cè):用模型對(duì)測(cè)試數(shù)據(jù)做一個(gè)預(yù)測(cè),輸出最后的預(yù)測(cè)結(jié)果。
2 泰坦尼克號(hào)數(shù)據(jù)集簡(jiǎn)介
1912年4月15日,泰坦尼克號(hào)在首次航行的過(guò)程中,撞上了冰山然后輪船沉沒(méi),2224名乘客和工作人員中有1502人死亡。死亡原因之一是沒(méi)有足夠的救生艇給乘客和工作人員。對(duì)于幸存下來(lái)的人,有一部分是因?yàn)檫\(yùn)氣,但還有一些人的存活概率本身就比其他人更大,比如婦女、兒童和上層人士。通過(guò)對(duì)這些數(shù)據(jù)進(jìn)行分析與挖掘,找出影響存活率的因素。
泰坦尼克號(hào)數(shù)據(jù)集分為兩部分:測(cè)試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)。訓(xùn)練數(shù)據(jù)樣本總數(shù)目是891,測(cè)試數(shù)據(jù)樣本總數(shù)目是418。兩部分?jǐn)?shù)據(jù)的屬性列一樣,一共11個(gè)屬性,具體包括:Passengerld(乘客Id);Survived(存活率:0代表N死亡,1代表存活);Pclass:(社會(huì)地位:1最高,3最低);Name(乘客姓名);Sex(性別);Age(年齡);SibSp(堂/兄妹個(gè)數(shù));Parch(父母孩子個(gè)數(shù));Ticket(船票信息);Fare(票價(jià));Cabin(船艙);Embarked(登船港口:C=Cherbourg, Q=Queenstown, S=Southampton)
3 數(shù)據(jù)分析與挖掘
3.1數(shù)據(jù)分析
a.從訓(xùn)練數(shù)據(jù)中提取Pclass和Survived這兩列數(shù)據(jù),然后用groupby對(duì)Pclass做分組,計(jì)算每組平均值并排序,最后得出的結(jié)論是地位越高的人存活率越高,說(shuō)明Pclass跟存活率有關(guān)聯(lián)性,后續(xù)需要提取這個(gè)屬性,主要代碼如下:
print(train_df[[7 Pclass,Survived,】】.groupby([,Pclass'D.mean0Vsort_values(by='Survived 7))
b.從訓(xùn)練數(shù)據(jù)中提取Sex和Survived這兩列數(shù)據(jù),然后用groupby對(duì)Pclass分組,計(jì)算每組平均值并排序,最后得出的結(jié)論是女性的存活率更高,所以后續(xù)也需要提取Sex屬性,主要代碼如下:
print(train_df[[7 Sex, 'Survived,】].groupby(L'Sex'D. meanOVsort_values(by=Survived 7))
c.從訓(xùn)練數(shù)據(jù)中提取SibSp,parch和survived,根據(jù)SibSp,parch來(lái)分組,求均值,排序,方法與上面的屬性相同,最后得出的結(jié)論是這兩個(gè)屬性的存活率差別不大,說(shuō)明這兩個(gè)屬性對(duì)存活率影響不大,后續(xù)過(guò)程中放棄這兩個(gè)屬性的提取。
d.從訓(xùn)練數(shù)據(jù)中提age和Survived這兩列數(shù)據(jù),使用Facet-Grid對(duì)這兩個(gè)屬性做可視化,參數(shù)為訓(xùn)練數(shù)據(jù)集和Survived列,然后通過(guò)調(diào)用FacetGrid.map0函數(shù)將繪圖函數(shù)應(yīng)用于每個(gè)子集。最后得出的結(jié)論是嬰兒存活率較高,年齡在15-25歲之間的人大部分都死亡了,說(shuō)明年齡對(duì)存活率的影響較大,后續(xù)也需要提取age屬性,主要代碼如下:
1= sns.FacetGrid(train_df,col= 'Survived 7)
print(l.map(plt.hist,7 Age 7 ,bins=20》
e.提取Embarked、Sex和Pclass,觀察它們與存活率的關(guān)系,最后得出的結(jié)論是Embarked=C的男性存活率更高,后續(xù)也需要提取Embarked屬性,主要代碼如下:
grid. map(sns. pointplot,,Pclass,,,Survived',,Sex', palette='deep,Yhue_order=[”female”,”male”】)
f.提取Fare和Survive,最后得出的結(jié)論是票價(jià)高的成員的生存率更高,后續(xù)也需要提取Fare屬性,主要代碼如下:
s. FacetGrid(train_df, row= 'Fare 7, col= 'Survived 7, size=2.0, as-pect=1.6)
把所有的屬性列一一提取出來(lái),觀察它們與存活率是否有關(guān)聯(lián),通過(guò)上文中對(duì)每一屬性的具體分析,選出影響存活率的5個(gè)屬性,分別是:Pclass,Sex,age,F(xiàn)are,Embarked。
3.2 處理數(shù)據(jù)
選擇好需要提取的屬性后,查看對(duì)應(yīng)的數(shù)據(jù)時(shí)發(fā)現(xiàn)有的數(shù)據(jù)有缺失或空值的情況,還發(fā)現(xiàn)有些屬性的數(shù)據(jù)是字符的形式,所以需要先對(duì)這些數(shù)據(jù)作處理后才可以應(yīng)用。
對(duì)于不需要的屬性,直接使drop刪除,參數(shù)axis=1表示刪除該列。因?yàn)樵摂?shù)據(jù)集分成訓(xùn)練集和測(cè)試集,所以分開刪除,不需要的屬性列有Cabin,Ticket,Sibsp,Parch,Name,Passen-gerID。刪除Ticket的代碼如下,其余屬性的刪除及代碼方法與Ticket相同。
train_df= train_df.drop([,Ticket,,7 Cabin 7】,axis=l)
test_df= test_df.drop([,Ticket',7Cabin,],axis=l)
性別屬性的數(shù)據(jù)使用英文male/female表示男女,所以需要轉(zhuǎn)換Sex為數(shù)字類型,將female替換為1,male替換為0。將測(cè)試集和訓(xùn)練集合并在一起,只需要做一次替換即可,主要代碼如下:
Data_total= [train_df,test_dfl
for dataset in Data_total:
dataset[,Sex 7】=dataset[,Sex7].map({,female':1,,male 7:0】).as—type(int)
age屬性的數(shù)據(jù)存在缺失值,選擇它的中位數(shù)df.median0進(jìn)行填充。
Embarke屬性也存在缺失值,采用眾數(shù)進(jìn)行填充,先用mode把眾數(shù)提取出來(lái),存放在EA變量中,然后再進(jìn)行填充。并且由于它的數(shù)據(jù)類型為字符,用map把它轉(zhuǎn)化為對(duì)應(yīng)的數(shù)字,主要代碼如下:
EA=train_df.Embarked.dropnaO.mode0[0]
for dataset in Data_total: dataset[,Embarked,】=datasetrEm_barked'].fillna(EA)= dataset[,Embarked'].map({7S7:0,7C 7:1,7Q:2D.astype(int)
Fare屬性也存在缺失值,直接用fllna進(jìn)行填充,參數(shù)為test_dfT,F(xiàn)are,l.median0。還需要轉(zhuǎn)換Fare為數(shù)值類型。由于Fare的數(shù)據(jù)值有很多種,如果對(duì)每一種進(jìn)行單獨(dú)轉(zhuǎn)化,這樣工作量會(huì)很大,所以采用分段的方式來(lái)處理數(shù)據(jù),主要代碼如下:
for dataset in Data_total:
dataset.loc [dataset[7 Fare】<=8,F(xiàn)are']=0
dataset. loc[(dataset[7 Fare 7] >8)&(dataset[Fare】<=15),'Fare,]=1
dataset.loc[(dataset[,F(xiàn)are 7】>15)&(dataset【,F(xiàn)are']<=31),'Fare']=2
dataset.loc[dataset[Fare】>31,F(xiàn)are']=3
dataset[7 Fare 7】_dataset[,F(xiàn)are,].astype(int)
3.3 訓(xùn)練測(cè)試算法
當(dāng)數(shù)據(jù)屬性分析處理完畢之后,數(shù)據(jù)部分就告一段落,接下來(lái)是決策樹算法處理。首先引入決策樹模型,這里的參數(shù)沒(méi)有具體指明,然后利用cross_vaLscore對(duì)它做一個(gè)交叉驗(yàn)證,cv=10,最后打印出訓(xùn)練準(zhǔn)確率和測(cè)試準(zhǔn)確率均為0.88左右。這個(gè)數(shù)字在可接受范圍之類,所以這個(gè)模型可以直接使用,部分代碼如下:
models=[(7 DecisionTree 7 ,DecisionTreeClassifier 0)]
for clf_name,clf in models:
rfc_s=cross_val_score(clf,X,y,cv=10)