數據分析實戰之決策樹(泰坦尼克號乘客生存預測)

本文利用已給特徵屬性和存活與否標籤的訓練集和只包含特徵信息測試集數據,通過決策樹模型來預測測試集數據乘客的生存情況

數據集來源爲https://github.com/cystanford/Titanic_Data,可下載數據查看其各字段信息

生存預測的流程:

1、數據探索:

import numpy as np
import pandas as pd

train_data = pd.read_csv(r'C:\Users\hzjy\Desktop\train.csv')  #加載數據
test_data = pd.read_csv(r'C:\Users\hzjy\Desktop\test.csv')

1)訓練集數據的整體特徵:

2)測試集數據的整體特徵:

2、數據清洗

1)訓練集:可以看到Age、Cabin、Embarked是有缺失數據的

  • Age中的空值可用平均年齡來填充
train_data['Age'].fillna(train_data['Age'].mean(),inplace = True)
  • Cabin有大量的缺失值,在訓練集和測試集中缺失率都比較高,無法補齊
  • Embarked爲登陸港口,可以根據港口屬性補齊。可以看到港口爲“S”類型的佔比最高,可以考慮把缺失的港口用“S”港口填充

可以看到港口爲“S”類型的佔比最高,可以考慮把缺失的港口用“S”港口填充

​
train_data['Embarked'].fillna('S',inplace = True)

2)測試集:可以看到Age、Fare、Cabin是有缺失數據的

  • Age中的空值可用平均年齡來填充
test_data['Age'].fillna(test_data['Age'].mean(),inplace = True)
  • Fare中的空值可用平均票價來填充
test_data['Fare'].fillna(test_data['Fare'].mean(),inplace = True)
  • Cabin有大量的缺失值,在訓練集和測試集中缺失率都比較高,無法補齊

3、特徵選擇:選擇對分類結果有關鍵作用的特徵

1)通過數據探索,發現PassengerId和Name對分類沒有太大作用;Cabin有大量的缺失值,可以放棄;Ticket字段編碼較亂,沒有太大作用。其餘字段可能和預測乘客的生存情況有關,通過分類器來處理。

將剩餘字段放到特徵向量features裏。

features = ['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
train_features = train_data[features]
train_labels = train_data['Survived']
test_features = test_data[features]

2)特徵值有一些是字符串,不方便後續的運算,需要把它們轉化爲數值類型,

  • Sex 有male和female兩種類型,可以把它變成 Sex=male 和 Sex = female, 數值用0或1來表示
  • Embarked 有S 、C 、Q三種類型,可以把它變成Embarked= S 、 Embarked= C、Embarked= Q,數值用0或1來表示

可以使用sklearn 特徵選擇中的 DictVectorizer類,用它可以處理符號化的對象,將符號轉化爲數字0或1進行表示

from sklearn.feature_extraction import DictVectorizer
dv = DictVectorizer(sparse = False)
train_features = dv.fit_transform(train_features.to_dict(orient= 'record'))

fit_transform可以將特徵向量轉化爲特徵矩陣,通過dv.feature_names_ 屬性值查看轉化後的屬性

4、決策樹模型使用ID3算法 構造決策樹

在創建決策樹時,設置 criterion = 'entropy' ,然後使用 fit 進行訓練,將特徵值矩陣和分類結果作爲參數傳入,得到決策樹分類器

將預測後的結果導出到文件中:

test_data['Survived'] = pred_labels
test_data.to_csv(r'C:\Users\hzjy\Desktop\test1.csv')  #預測後的測試集導出

5、模型評估和預測

在預測中,首選需要得到測試集的特徵值矩陣,然後使用訓練好的決策樹進行預測

test_features = dv.transform(test_features.to_dict(orient= 'record'))
pred_labels = clf.predict(test_features)

在模型評估中,決策樹提供了score函數可以直接得到準確率。但由於我們的測試集中並沒有真實的生存狀況的結果,只能使用訓練集中的數據進行模型評估

用訓練集做訓練,再用訓練集自身做準確率評估,這樣得出的準確率並不能代表決策樹分類器的準確性。用K折交叉驗證統計決策樹分類器的準確率。

K折交叉驗證的原理:

1)將數據集平均分割成K個等份

2)使用1份的數據作爲測試數據,其餘作爲訓練數據

3)計算測試準確率

4)使用不同的測試集,重複2、3步驟。 

5)訓練k次,最後將k次的測試準確率求平均值,作爲對未知數據預測準確率的估計。

在sklearn的model_selection 模型選擇中提供了cross_val_score函數

對於不知道測試集實際結果的,要使用K折交叉驗證才能知道模型的準確情況

6、決策樹可視化

使用graphviz可視化工具把決策樹呈現出來

關於graphviz的下載:我用的是anaconda,通過在anaconda prompt界面輸入 conda install python-graphviz 來安裝graphviz

from sklearn import tree
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.view()

會得到一個決策樹可視化的pdf文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章