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