Titanic: Machine Learning from Disaster - Kagglehtml
2 年前就被推薦照着這個比賽作一下,結果我打開這個頁面便蒙了,徹底不知道該如何下手。算法
兩年後,再次打開這個頁面,看到清清楚楚的Titanic Tutorial - Kaggle,徹底傻瓜式的照着作就能作下來。當年是什麼矇蔽了個人眼睛~spring
use machine learning to create a model that predicts which passengers survived the Titanic shipwreckapi
Titanic: Machine Learning from Disaster - Kagglebash
摘抄的網站的解釋,後面具體談。dom
Titanic比賽中用到的是 RandomForestClassifier
算法,在瞭解這個算法前,我注意到 sklearn
中這個算法類是在 ensemble
模塊中,英文很差,不知道 ensemble
是什麼意思?因此想先了解一下 ensemble
ide
字典的解釋是:a number of things considered as a group
性能
聽起來有組合的意思。學習
搜索了一下,在 ML 中有 ensemble learning
, 翻譯可能是「集成學習」,參考集成學習(ensemble learning)應如何入門? - 知乎提到,有三種常見的集成學習框架:bagging
,boosting
和 stacking
。
從 API Reference — scikit-learn 0.22.1 documentation中也能看出來這幾種框架都有相應的算法。
Random Forest
是 bagging
框架中的一個算法。這裏就單先試着理解這個,其餘框架等之後遇到了再說。可是瞭解這個以前,仍是得先清楚 Ensemble Learning 究竟是什麼?
In statistics and machine learning, ensemble methods use multiple learning algorithms to obtain better predictive performance than could be obtained from any of the constituent learning algorithms alone.
這個解釋應和了字面上的意思,組合了多種算法來得到更好的預測性能,結果優於單用其中的單個算法。
sklearn.ensemble.BaggingClassifier — scikit-learn 0.22.1 documentation
A Bagging classifier is an ensemble meta-estimator that fits base classifiers each on random subsets of the original dataset and then aggregate their individual predictions (either by voting or by averaging) to form a final prediction.
大意就是:
問題是:
我都不曉得~
前面提到 Random Forest
是 bagging
框架的一種算法。如今來看看這個算法如何解答個人一些疑問。
1.11. Ensemble methods — scikit-learn 0.22.1 documentation
The prediction of the ensemble is given as the averaged prediction of the individual classifiers.
先明確了一個,這個算法是懟各分類器求平均的。Forest of what? 天然是 forest of trees, 而這裏的 tree 指的是 decision trees,因此這個算法實際上是 averaging algorithms based on randomized decision trees
random forest builds multiple decision trees and merges them together to get a more accurate and stable prediction.
Random forest
對每一個分類器都建一個決策樹,而後再合併。
分類器是如何劃分的呢?仍是以 Titanic 的代碼爲例來試着理解下:
from sklearn.ensemble import RandomForestClassifier
y = train_data["Survived"]
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
複製代碼
y
:是訓練集中災難中存活的人的集合features
: 是這些人的特徵值,如性別,幾等艙等get_dummies
而不是直接用train_data[features]
呢?嘗試直接用 train_data[features]
, 打印 X 的結果是這樣的:
Pclass Sex SibSp Parch
0 3 male 1 0
1 1 female 1 0
複製代碼
若是再繼續用這個 X 建模的話,會報錯:
ValueError: could not convert string to float: 'male'
複製代碼
顯然,由於 Sex 字段是 string 類型,而模型須要的是 float 類型,因此不能直接用 train_data[features]
那 get_dummies()
的做用也清楚了,就是將這些 string 類型的字段轉化成 float 類型。從下面的打印結果也能夠看出,Sex 字段被分紅了兩個字段,Sex_male, Sex_female, 其值分別是 0 和 1.
Pclass SibSp Parch Sex_female Sex_male
0 3 1 0 0 1
1 1 1 0 1 0
2 3 0 0 1 0
3 1 1 0 1 0
4 3 0 0 0 1
.. ... ... ... ... ...
886 2 0 0 0 1
887 1 0 0 1 0
888 3 1 2 1 0
889 1 0 0 0 1
890 3 0 0 0 1
複製代碼
RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
具體如何調參,參考 parameter tuning guidelines
Random Forest
的應用場景既然是分類器算法,天然不少分類應用的場景都適合了;另外還有迴歸問題的場景。
這篇文章The Random Forest Algorithm: A Complete Guide - Built In給出了一個實際例子的類比:
一樣,你拿到了幾個 offer,猶豫該接哪一個等等;看中了幾套房子,決定選哪一個,貌似均可以套用這個算法一試了。
test_data = pd.read_csv("/kaggle/input/titanic/test.csv")
test_data.head()
複製代碼
men = train_data.loc[train_data.Sex == 'male']["Survived"]
rate_men = sum(men)/len(men)
複製代碼