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)
复制代码