决策树系列(二)——基于决策树算法实现泰坦尼克号生还预测
1. 下載數據集
鏈接:https://pan.baidu.com/s/1Z570Ri3d2UMEPP2Nz-Q1lw 提取碼:mfof2.代碼實現
2.1 引包
[1]:import pandas as pdimport numpy as npfrom sklearn.tree import DecisionTreeClassifier # 分類樹import matplotlib.pyplot as plt # 畫圖from sklearn.model_selection import GridSearchCV,cross_val_score # 網格搜索,交叉驗證from sklearn.model_selection import train_test_split # 切分訓練集和測試集2.2 讀取數據
[2]:data = pd.read_csv("E:/project_data/train.csv")2.3 分析數據
??該訓練集共有12列數據,其中包含11個特征feature和一個標簽label(Survived )。其中英文對照表如下:
| PassengerId | 乘客ID |
| Survived | 存活情況 |
| Pclass | 客艙等級 |
| Name | 乘客姓名 |
| Sex | 性別 |
| Age | 年齡 |
| SibSp | 同代直系親屬人數 |
| Parch | 不同代直系親屬人數 |
| Ticket | 船票編號 |
| Fare | 票價 |
| Cabin | 船艙號 |
| Embarked | 登船港口 |
??info()此方法顯示有關DataFrame的信息,包括索引dtype和列dtype,非空值和內存使用情況。從結果中可以看出包含缺失值的特征有Age,Cabin,Embarked,所以我們需要對缺失值進行預處理。
2.4 數據預處理
2.4.1 特征篩選
??在所有的特征中,根據我們的生活經驗知道,其中一些特征對乘客是否能夠存活幾乎沒什么幫助。比如姓名和船票編號,不可能因為你很出名以及你編號比較好,就能優先上救生艇。且由于船艙號缺失量確實比例很高,于是我們將這三個特征刪除。
[5]:data.drop(["Name","Cabin","Ticket"],inplace = True,axis=1) [6]:data.head()2.4.2 處理缺失值
對于含有缺失值的特征,通常有三種處理方法:
- 直接刪除
- 填補缺失值
- 直接使用
??對于Cabin這個特征,由于其缺失比例太高,所以我們使用第一種方法,直接刪除該特征。但是對于Age,缺失值不多且較為重要。所以我們對于Age使用均值填補;Embarked只是缺失兩個,所以我們刪除缺失值所在的兩行即可,對整體數據影響不大。
[7]:data["Age"] = data["Age"].fillna(data["Age"].mean())data.info() [8]:data.dropna(inplace=True)data.info()2.4.3 特征轉換
??由于sklearn中,決策樹模型只能處理數字以及數據的類別,所以對字符串我們需要進行特征轉換.
[9]:labels = data["Embarked"].unique().tolist()labels [10]:data["Embarked"] = data["Embarked"].apply(lambda x:labels.index(x))data.head() [11]:data["Sex"] = (data["Sex"] == "male").astype("int")data.head()2.4.4 切分訓練集和測試集
[12]:x = data.iloc[:,data.columns!="Survived"]y = data.iloc[:,data.columns == "Survived"] [13]:Xtrain,Xtest,Ytrain,Ytest = train_test_split(x,y,test_size = 0.3)
??在切分數據集之后,index是混亂的。雖然在決策樹算法中并沒有影響,但是當我們使用其他模型需要使用到index時,會發生錯誤。所以養成習慣,每次切分完訓練集和數據集,需要回復順序索引。
2.5 模型構建
2.5.1 無參數建模
[15]:clf = DecisionTreeClassifier(random_state=25)clf = clf.fit(Xtrain,Ytrain)score = clf.score(Xtest,Ytest)score0.7565543071161048
2.5.2 交叉驗證
[16]:clf = DecisionTreeClassifier(random_state=30)score = cross_val_score(clf,x,y,cv=10).mean()score0.7514683350357507
2.5.3 使用max_depth調參
[17]:clf = DecisionTreeClassifier(random_state=30,max_depth=5)score = cross_val_score(clf,x,y,cv=10).mean()score0.7941905005107252
2.5.3 繪制max_depth超參數學習曲線
[18]:tr = []te = []for i in range(10):clf = DecisionTreeClassifier(random_state=25,max_depth=i+1,criterion="entropy")clf = clf.fit(Xtrain,Ytrain)score_tr = clf.score(Xtrain,Ytrain)score_te = cross_val_score(clf,x,y,cv=10).mean()tr.append(score_tr)te.append(score_te)print(max(te))plt.plot(range(1,11),tr,color = "red",label="train")plt.plot(range(1,11),te,color = "blue",label = "test")plt.legend()plt.show()0.8166624106230849
2.5.4 網格搜索
??上面我們只是通過學習曲線找到了一個參數的最佳值,那么每一個參數都需要這樣一條一條繪制學習曲線嗎?sklearn為我們提供了網格搜索GridSearchCV,這個方法可以找出多個參數在各自的范圍內組合后模型最好的參數。
[19]:parameters = {"min_samples_leaf":[*range(1,50,5)],"min_impurity_decrease":[*np.linspace(0,0.5,50)]}clf = DecisionTreeClassifier(random_state=25,max_depth=3)GS = GridSearchCV(clf,parameters,cv=10)GS = GS.fit(Xtrain,Ytrain)??best_score_屬性會返回在我們給出的參數選值內,模型效果最好的那組得到的模型準確率。
[20]:GS.best_score_0.8006430868167203
??best_params_屬性會返回在我們給出的參數選值內,模型效果最好的那組使用的參數信息。
[21]:GS.best_params_{‘min_impurity_decrease’: 0.0, ‘min_samples_leaf’: 16}
2.5.5 使用最優參數訓練模型并繪制樹形圖
[22]:clf = DecisionTreeClassifier(random_state=25,max_depth=3,criterion="entropy",min_samples_leaf=16,min_impurity_decrease=0)clf = clf.fit(Xtrain,Ytrain)score = clf.score(Xtest,Ytest)score0.7752808988764045
繪制樹形圖
[22]:import graphvizfrom sklearn import treedot_data = tree.export_graphviz(clf,out_file=None,feature_names=feature_name,filled=True,rounded=True)graph = graphviz.Source(dot_data)graph2.6 總結
??由于此數據集更多是用來熟悉數據處理以及決策樹建模流程,所以準確率并不用太過于糾結。之后會使用決策樹做隱形眼鏡數據預測以及球隊勝率預測,感覺有幫助可以關注一下!!!
系列文章:
機器學習系列——決策樹(一)
參考資料:
菜菜的sklearn
總結
以上是生活随笔為你收集整理的决策树系列(二)——基于决策树算法实现泰坦尼克号生还预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS6.0文件解析漏洞
- 下一篇: IIS6 伪静态 IIS文件类型映射配置