?

基于決策樹算法對泰坦尼克號數據的預測

2020-10-09 10:24袁馨段華瓊
電腦知識與技術 2020年22期
關鍵詞:大數據預測

袁馨 段華瓊

摘要:隨著互聯網的興起,二十一世紀已經是一個信息時代,也可以稱為大數據時代,數據早已滲透到當今的每一個行業,成為重要的生產因素。大數據技術應用的領域越來越多,幫助企業不斷地發展新業務,創造新的運營模式,例如電子商務,物流配送等。該文詳細闡述了一個基于決策樹算法的數據分析挖掘過程,以泰坦尼克號數據為例,通過對數據的分析與挖掘來實現預測功能。

關鍵詞:決策樹算法;大數據;預測

中圖分類號:TP311 文獻標識碼:A

文章編號:1009-3044(2020)22-0185-02

開放科學(資源服務)標識碼(OSID):

大數據的出現,涌現出許多新的分析與挖掘算法,統稱為大數據技術。越來越多的企業運用大數據技術對數據進行深層次的分析,從而決定企業的運營模式。例如超市的捆綁銷售,流失客戶的風險預測等。本文主要通過各類屬性的提取、處理,探究影響泰坦尼克號乘客存活率的因素,最后對測試集的數據做存活率預測。

1 決策樹算法簡介

1.1算法思想

決策樹算法屬于機器學習的一種,是一種基本的分類與回歸方法,本文主要討論分類的決策樹。該算法能從給定的無序訓練樣本中,提煉出像樹一樣的分類模型。樹中的每個非葉子節點記錄了使用哪個特征來進行類別判斷,每個葉子節點則代表了最后判斷的類別。從根節點開始,數據在信息增益最大的特征上產生分裂,在迭代過程中,分裂過程在每個子節點重復進行,直到所有的葉子為純性,即每一個節點的數據屬于同一類。這也是做預測的方法,通過對特征的提取,建立模型,然后對測試的數據做分類。決策樹可以分成三個算法:ID3算法、C4.5算法和CART算法。這三個算法都比較常見,在選擇屬性的時候采用不同的方式來判斷。

1.2算法特點

相對于其他機器學習算法來說,決策樹算法相對簡單,計算復雜度不高,且易于理解和實現。人們在學習和使用的過程中,不需要了解太多的背景知識。它能直接體現數據的特點,生成的樹通過解釋后都能很好地理解它的含義。對于決策樹的數據準備,也相對簡單,它能夠同時處理數據型和常規性的屬性值,對數據中間值的缺失不太敏感,可以處理不相關特征數據的特點。

13決策樹算法的預測步驟

①收集數據:收集數據可以采用很多方法,無論是自己收集,還是使用網上現成的數據集,這都是需要準備的基礎步驟之—一。

②分析數據:一個數據集會有很多屬性,對于預測的內容來說,并不是所有列的值都跟預測內容有關,所以對于每一列數據需要逐個去分析它與預測內容的關系,在后續的屬性提取時,僅僅提取與預測內容有關聯性的列。

③處理數據:提取數據之后,需要對數據進行一個預處理,看數據是否有缺失值或異常值,是否需要刪除某些數據。然后還需要對每一列屬性值的類型進行分析判斷,如果存在數據類型不合適的情況,就需要對屬性值類型進行轉換。對提取的數據進行清洗后,后續才能直接在算法中使用。這一過程雖然是對數據的處理,但也是非常重要的一步。

④訓練算法:這個過程包括決策樹模型的構建,然后使用訓練數據對該決策樹模型進行訓練,得出一個準確率。

⑤測試算法:光有訓練數據的準確率不能說明該模型是否好,還需要測試集的準確率來判斷,當錯誤率達到可以接受的范圍,那么這個模型就可以投入使用了。

⑥預測:用模型對測試數據做一個預測,輸出最后的預測結果。

2 泰坦尼克號數據集簡介

1912年4月15日,泰坦尼克號在首次航行的過程中,撞上了冰山然后輪船沉沒,2224名乘客和工作人員中有1502人死亡。死亡原因之一是沒有足夠的救生艇給乘客和工作人員。對于幸存下來的人,有一部分是因為運氣,但還有一些人的存活概率本身就比其他人更大,比如婦女、兒童和上層人士。通過對這些數據進行分析與挖掘,找出影響存活率的因素。

泰坦尼克號數據集分為兩部分:測試數據和訓練數據。訓練數據樣本總數目是891,測試數據樣本總數目是418。兩部分數據的屬性列一樣,一共11個屬性,具體包括:Passengerld(乘客Id);Survived(存活率:0代表N死亡,1代表存活);Pclass:(社會地位:1最高,3最低);Name(乘客姓名);Sex(性別);Age(年齡);SibSp(堂/兄妹個數);Parch(父母孩子個數);Ticket(船票信息);Fare(票價);Cabin(船艙);Embarked(登船港口:C=Cherbourg, Q=Queenstown, S=Southampton)

3 數據分析與挖掘

3.1數據分析

a.從訓練數據中提取Pclass和Survived這兩列數據,然后用groupby對Pclass做分組,計算每組平均值并排序,最后得出的結論是地位越高的人存活率越高,說明Pclass跟存活率有關聯性,后續需要提取這個屬性,主要代碼如下:

print(train_df[[7 Pclass,Survived,】】.groupby([,Pclass'D.mean0Vsort_values(by='Survived 7))

b.從訓練數據中提取Sex和Survived這兩列數據,然后用groupby對Pclass分組,計算每組平均值并排序,最后得出的結論是女性的存活率更高,所以后續也需要提取Sex屬性,主要代碼如下:

print(train_df[[7 Sex, 'Survived,】].groupby(L'Sex'D. meanOVsort_values(by=Survived 7))

c.從訓練數據中提取SibSp,parch和survived,根據SibSp,parch來分組,求均值,排序,方法與上面的屬性相同,最后得出的結論是這兩個屬性的存活率差別不大,說明這兩個屬性對存活率影響不大,后續過程中放棄這兩個屬性的提取。

d.從訓練數據中提age和Survived這兩列數據,使用Facet-Grid對這兩個屬性做可視化,參數為訓練數據集和Survived列,然后通過調用FacetGrid.map0函數將繪圖函數應用于每個子集。最后得出的結論是嬰兒存活率較高,年齡在15-25歲之間的人大部分都死亡了,說明年齡對存活率的影響較大,后續也需要提取age屬性,主要代碼如下:

1= sns.FacetGrid(train_df,col= 'Survived 7)

print(l.map(plt.hist,7 Age 7 ,bins=20》

e.提取Embarked、Sex和Pclass,觀察它們與存活率的關系,最后得出的結論是Embarked=C的男性存活率更高,后續也需要提取Embarked屬性,主要代碼如下:

grid. map(sns. pointplot,,Pclass,,,Survived',,Sex', palette='deep,Yhue_order=[”female”,”male”】)

f.提取Fare和Survive,最后得出的結論是票價高的成員的生存率更高,后續也需要提取Fare屬性,主要代碼如下:

s. FacetGrid(train_df, row= 'Fare 7, col= 'Survived 7, size=2.0, as-pect=1.6)

把所有的屬性列一一提取出來,觀察它們與存活率是否有關聯,通過上文中對每一屬性的具體分析,選出影響存活率的5個屬性,分別是:Pclass,Sex,age,Fare,Embarked。

3.2 處理數據

選擇好需要提取的屬性后,查看對應的數據時發現有的數據有缺失或空值的情況,還發現有些屬性的數據是字符的形式,所以需要先對這些數據作處理后才可以應用。

對于不需要的屬性,直接使drop刪除,參數axis=1表示刪除該列。因為該數據集分成訓練集和測試集,所以分開刪除,不需要的屬性列有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)

性別屬性的數據使用英文male/female表示男女,所以需要轉換Sex為數字類型,將female替換為1,male替換為0。將測試集和訓練集合并在一起,只需要做一次替換即可,主要代碼如下:

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屬性的數據存在缺失值,選擇它的中位數df.median0進行填充。

Embarke屬性也存在缺失值,采用眾數進行填充,先用mode把眾數提取出來,存放在EA變量中,然后再進行填充。并且由于它的數據類型為字符,用map把它轉化為對應的數字,主要代碼如下:

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進行填充,參數為test_dfT,Fare,l.median0。還需要轉換Fare為數值類型。由于Fare的數據值有很多種,如果對每一種進行單獨轉化,這樣工作量會很大,所以采用分段的方式來處理數據,主要代碼如下:

for dataset in Data_total:

dataset.loc [dataset[7 Fare】<=8,Fare']=0

dataset. loc[(dataset[7 Fare 7] >8)&(dataset[Fare】<=15),'Fare,]=1

dataset.loc[(dataset[,Fare 7】>15)&(dataset【,Fare']<=31),'Fare']=2

dataset.loc[dataset[Fare】>31,Fare']=3

dataset[7 Fare 7】_dataset[,Fare,].astype(int)

3.3 訓練測試算法

當數據屬性分析處理完畢之后,數據部分就告一段落,接下來是決策樹算法處理。首先引入決策樹模型,這里的參數沒有具體指明,然后利用cross_vaLscore對它做一個交叉驗證,cv=10,最后打印出訓練準確率和測試準確率均為0.88左右。這個數字在可接受范圍之類,所以這個模型可以直接使用,部分代碼如下:

models=[(7 DecisionTree 7 ,DecisionTreeClassifier 0)]

for clf_name,clf in models:

rfc_s=cross_val_score(clf,X,y,cv=10)

猜你喜歡
大數據預測
無可預測
選修2-2期中考試預測卷(A卷)
選修2-2期中考試預測卷(B卷)
選修2—2期中考試預測卷(A卷)
不可預測
大數據環境下基于移動客戶端的傳統媒體轉型思路
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合