《Python机器学习及实践:从零开始通往Kaggle竞赛之路》第4章 实战篇 学习笔记(二)4.2Titanic罹难乘客预测总结

编程入门 行业动态 更新时间:2024-10-15 16:19:35

《Python机器学习及实践:从零开始通往Kaggle竞赛<a href=https://www.elefans.com/category/jswz/34/1770107.html style=之路》第4章 实战篇 学习笔记(二)4.2Titanic罹难乘客预测总结"/>

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》第4章 实战篇 学习笔记(二)4.2Titanic罹难乘客预测总结

目录

4.2Titanic罹难乘客预测

1、背景

2、下载数据

3、搭建模型

4、编程实践

5、提交结果


4.2Titanic罹难乘客预测

1、背景

与“2.1.1.5决策树总结”节所探索的任务一样,Kaggle也在其平台上发布了“泰坦尼克号罹难乘客”的预测任务;并且这个预测问题一直作为其平台的教学任务,供初学者熟悉Kaggle的竞赛流程。时至今日已有几千名选手设计了他们的模型,同时网站的自动评估系统也对他们所提交的结果做了测试,并且发布了排名。

因此,通过这项兼具有纪念和缅怀意义的任务,来完成一次真正的实战演练,并与他人同台竞技。这跟之前的实践略有不同的是,Kaggle上的实战问题都不会提供测试集的正确答案,包括这项教学任务。所以,期待大家不断地尝试提及的机器学习模型,并且竭尽所能地优化它们。只有这样,才能从不懈的实战中积累经验,最终达到熟练掌握机器学习的应用技巧、快速构建机器学习系统的目的。

正如图4-6所示,在Titanic罹难乘客预测任务的竞赛主页的左边栏(Dashboard),不仅可以查阅当前竞赛的信息,包括竞赛的描述(Description)、如何评价提交结果(Evaluation)、竞赛规则(Rules)还有奖金悬赏的细节(Prizes);还能够在Data页面中下载必要的数据,进而在Make a submission页面提交结果。

2、下载数据

虽然可以在Data页面看到7个文件下载。但是,用于竞赛的数据只有train.csv(59.76KB)和test.csv(27.96KB)文件。这里下载这两份数据到本地计算机的Datasets/Titanic文件夹下。

备注:具体下载数据的方法参照。

3、搭建模型

接下来,读者可以有两种选择编写代码,一种是在自己的本地计算机编写代码;另一种是直接在Kaggle平台上编写代码并在线运行。对于后者,只需在左边栏点击New Script,进入类似于图4-2所示的Kaggle在线编程页面,按照所给的代码范例,并注意文件读写的正确路径即可。这里只给出本地IPython Notebook中运行的代码。不仅使用随机森林分类器与XGBoost模型,而且均采用交叉验证的方法搜索最优的超参数组合。

备注:图4-2参照。

4、编程实践

# 代码77:Titanic罹难乘客预测竞赛编码示例
# 导入pandas方便数据读取和预处理。
import pandas as pd# 分别对训练和测试数据从本地进行读取。
train = pd.read_csv('../Datasets/Titanic/train.csv')
test = pd.read_csv('../Datasets/Titanic/test.csv')
# 先分别输出训练与测试数据的基本信息。这是一个好习惯,可以对数据的规模、各个特征的数据类型以及是否有缺失等,有一个总体的了解。
print(train.info())
print(test.info())# 按照我们之前对Titanic事件的经验,人工选取对预测有效的特征。
selected_features = ['Pclass', 'Sex', 'Age', 'Embarked', 'SibSp', 'Parch', 'Fare']X_train = train[selected_features]
X_test = test[selected_features]y_train = train['Survived']# 通过我们之前对数据的总体观察,得到Embarked特征存在缺失值,需要补完。
print(X_train['Embarked'].value_counts())
print(X_test['Embarked'].value_counts())# 对于Embarked这种类别型的特征,我们使用出现频率最高的特征值进行补充,这也是相对可以减少引入误差的一种填充方法。
X_train['Embarked'].fillna('S', inplace=True)
X_test['Embarked'].fillna('S', inplace=True)# 而对于Age这种数值型的特征,我们习惯使用求平均值或者中位数来填充缺失值,也是相对可以减少引入误差的一种填充方法。
X_train['Age'].fillna(X_train['Age'].mean(), inplace=True)
X_test['Age'].fillna(X_test['Age'].mean(), inplace=True)
X_test['Fare'].fillna(X_test['Fare'].mean(), inplace=True)# 重新对处理后的训练和测试数据进行查验,发现一切就绪。
X_train.info()
X_test.info()# 接下来便是采用DictVectorizer对特征向量化。
from sklearn.feature_extraction import DictVectorizerdict_vec = DictVectorizer(sparse=False)
X_train = dict_vec.fit_transform(X_train.to_dict(orient='record'))
dict_vec.feature_names_
print(dict_vec.feature_names_)
X_test = dict_vec.transform(X_test.to_dict(orient='record'))# 从sklearn.ensemble中导入RandomForestClassifier。
from sklearn.ensemble import RandomForestClassifier# 使用默认配置初始化RandomForestClassifier。
rfc = RandomForestClassifier()# 从流行工具包xgboost导入XGBClassifier用于处理分类预测问题。
from xgboost import XGBClassifier# 也使用默认配置初始化XGBClassifier。
xgbc = XGBClassifier()from sklearn.model_selection import cross_val_score# 使用5折交叉验证的方法在训练集上分别对默认配置的RandomForestClassifier以及XGBClassifier进行性能评估,并获得平均分类准确性的得分。
cross_val_score(rfc, X_train, y_train, cv=5).mean()
print('RandomForestClassifier:', cross_val_score(rfc, X_train, y_train, cv=5).mean())
cross_val_score(xgbc, X_train, y_train, cv=5).mean()
print('XGBClassifier:', cross_val_score(xgbc, X_train, y_train, cv=5).mean())# 使用默认配置的RandomForestClassifier进行预测操作。
rfc.fit(X_train, y_train)
rfc_y_predict = rfc.predict(X_test)
rfc_submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': rfc_y_predict})
# 将默认配置的RandomForestClassifier对测试数据的预测结果存储在rfc_submission.csv文件中。
rfc_submission.to_csv('../Datasets/Titanic/rfc_submission.csv', index=False)# 使用默认配置的XGBClassifier进行预测操作。
xgbc.fit(X_train, y_train)
print(xgbc.fit(X_train, y_train))
xgbc_y_predict = xgbc.predict(X_test)
# 将默认配置的XGBClassifier对测试数据的预测结果存储在xgbc_submission.csv文件中。
xgbc_submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': xgbc_y_predict})
xgbc_submission.to_csv('../Datasets/Titanic/xgbc_submission.csv', index=False)# 使用并行网格搜索的方式寻找更好的超参数组合,以期待进一步提高XGBClassifier的预测性能。
from sklearn.model_selection import GridSearchCVparams = {'max_depth': range(2, 7), 'n_estimators': range(100, 1100, 200), 'learning_rate': [0.05, 0.1, 0.25, 0.5, 1.0]}xgbc_best = XGBClassifier()
gs = GridSearchCV(xgbc_best, params, n_jobs=-1, cv=5, verbose=1)
gs.fit(X_train, y_train)
print(gs.fit(X_train, y_train))# 查验优化之后的XGBClassifier的超参数配置以及交叉验证的准确性。
print(gs.best_score_)
print(gs.best_params_)# 使用经过优化超参数配置的XGBClassifier堆测试数据的预测结果存储在文件xgbc_best_submission中。
xgbc_best_y_predict = gs.predict(X_test)
xgbc_best_submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': xgbc_best_y_predict})
xgbc_best_submission.to_csv('../Datasets/Titanic/xgbc_best_submission.csv', index=False)

备注1:原来的导入模型from sklearn.cross_validation import cross_val_score的时候,提示错误:

from sklearn.cross_validation import cross_val_score
ModuleNotFoundError: No module named 'sklearn.cross_validation'

需要替换cross_validation:

from sklearn.model_selection import cross_val_score

备注2:原来的导入模型from sklearn.grid_search import GridSearchCV的时候,提示错误:

from sklearn.grid_search import GridSearchCV
ModuleNotFoundError: No module named 'sklearn.grid_search'

需要替换grid_search:

from sklearn.model_selection import GridSearchCV

本地输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  891 non-null    int64  1   Survived     891 non-null    int64  2   Pclass       891 non-null    int64  3   Name         891 non-null    object 4   Sex          891 non-null    object 5   Age          714 non-null    float646   SibSp        891 non-null    int64  7   Parch        891 non-null    int64  8   Ticket       891 non-null    object 9   Fare         891 non-null    float6410  Cabin        204 non-null    object 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
None
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  418 non-null    int64  1   Pclass       418 non-null    int64  2   Name         418 non-null    object 3   Sex          418 non-null    object 4   Age          332 non-null    float645   SibSp        418 non-null    int64  6   Parch        418 non-null    int64  7   Ticket       418 non-null    object 8   Fare         417 non-null    float649   Cabin        91 non-null     object 10  Embarked     418 non-null    object 
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB
None
S    644
C    168
Q     77
Name: Embarked, dtype: int64
S    270
C    102
Q     46
Name: Embarked, dtype: int64
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 7 columns):#   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  0   Pclass    891 non-null    int64  1   Sex       891 non-null    object 2   Age       891 non-null    float643   Embarked  891 non-null    object 4   SibSp     891 non-null    int64  5   Parch     891 non-null    int64  6   Fare      891 non-null    float64
dtypes: float64(2), int64(3), object(2)
memory usage: 48.9+ KB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 7 columns):#   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  0   Pclass    418 non-null    int64  1   Sex       418 non-null    object 2   Age       418 non-null    float643   Embarked  418 non-null    object 4   SibSp     418 non-null    int64  5   Parch     418 non-null    int64  6   Fare      418 non-null    float64
dtypes: float64(2), int64(3), object(2)
memory usage: 23.0+ KB
['Age', 'Embarked=C', 'Embarked=Q', 'Embarked=S', 'Fare', 'Parch', 'Pclass', 'Sex=female', 'Sex=male', 'SibSp']
RandomForestClassifier: 0.8114870378507314
XGBClassifier: 0.8159500345238844
XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,colsample_bynode=1, colsample_bytree=1, gamma=0,learning_rate=0.1, max_delta_step=0, max_depth=3,min_child_weight=1, missing=None, n_estimators=100, n_jobs=1,nthread=None, objective='binary:logistic', random_state=0,reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,silent=None, subsample=1, verbosity=1)
Fitting 5 folds for each of 125 candidates, totalling 625 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=-1)]: Done  34 tasks      | elapsed:    3.2s
[Parallel(n_jobs=-1)]: Done 184 tasks      | elapsed:   12.6s
[Parallel(n_jobs=-1)]: Done 434 tasks      | elapsed:   28.5s
[Parallel(n_jobs=-1)]: Done 625 out of 625 | elapsed:   43.7s finished
Fitting 5 folds for each of 125 candidates, totalling 625 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=-1)]: Done  52 tasks      | elapsed:    2.7s
[Parallel(n_jobs=-1)]: Done 224 tasks      | elapsed:   18.9s
[Parallel(n_jobs=-1)]: Done 474 tasks      | elapsed:   40.6s
[Parallel(n_jobs=-1)]: Done 625 out of 625 | elapsed:   51.9s finished
GridSearchCV(cv=5, error_score=nan,estimator=XGBClassifier(base_score=0.5, booster='gbtree',colsample_bylevel=1, colsample_bynode=1,colsample_bytree=1, gamma=0,learning_rate=0.1, max_delta_step=0,max_depth=3, min_child_weight=1,missing=None, n_estimators=100, n_jobs=1,nthread=None, objective='binary:logistic',random_state=0, reg_alpha=0, reg_lambda=1,scale_pos_weight=1, seed=None, silent=None,subsample=1, verbosity=1),iid='deprecated', n_jobs=-1,param_grid={'learning_rate': [0.05, 0.1, 0.25, 0.5, 1.0],'max_depth': range(2, 7),'n_estimators': range(100, 1100, 200)},pre_dispatch='2*n_jobs', refit=True, return_train_score=False,scoring=None, verbose=1)
0.8350323269097985
{'learning_rate': 0.1, 'max_depth': 4, 'n_estimators': 300}

5、提交结果

着重注意的是,在今后的实战中,一定要严格遵守竞赛数据中所提供的样例提交文件的格式。因为所有参赛选手所提交的文件,都会在网站后台由程序自动按照Evaluation中的评估函数进行评价,而且稍有不符合格式的提交文件都不会被评估程序所考量,更不必说取得竞赛的名次。

按照上面代码所设定的输出,得到3个用于提交检测结果的文件:rfc_submission.csv、xgbc_submission.csv以及xgbc_best_submission.csv;并且如图4-7所示,Kaggle竞赛平台的自动测评系统给出了上述3个提交文件的最终性能表现。图4-7所示的Kaggle测评结果也许有些出乎意料,原本以为经过超参数搜索和优化之后的模型可以取得更好的预测性能,但是事实恰恰相反。在今后的实践中也有可能出现这样的情况,究其原因是因为无法保证现实数据都来源于同一种分布,因此尽管模型经过交叉验证和超参数搜索等步骤处理,也不能保证在所有情况下都能取得更高的性能。

更多推荐

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》第4章 实战篇 学习笔记(二)4.2Titanic罹难乘客预测总结

本文发布于:2024-03-11 15:09:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1729238.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:之路   乘客   学习笔记   从零开始   机器

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!