Kaggle八门神器(一):竞赛神器之XGBoost介绍
Xgboost为一个十分有效的机器学习模型,在各种竞赛中均可以看到它的身影,同时Xgboost在工业届也有着广泛的应用,本文以Titanic
数据集为研究对象,简单地探究Xgboost模型建模过程,同时对数据清理以及特征工程的内容作简单的介绍,以此作为Xgboost模型的学习笔记,错误和不足之处还请各位看官指出。
数据集
本文数据集源自于竞赛Titanic: Machine Learning from Disaster,竞赛中我们要求根据数据集提供的乘客编号、姓名性别等信息,运用机器学习模型预测船上乘客的存活与否
泰坦尼克号沉没事故(英语:Sinking of the RMS Titanic)是1912年4月14日深夜至15日凌晨在北大西洋发生的著名船难,事发时是泰坦尼克号从英国南安普敦港至美国纽约港首航的第5天,该船当时是世界最大的邮轮。1912年4月14日星期天23时40分[a]与一座冰山擦撞前,已经收到6次海冰警告,但当瞭望员看到冰山时,该船的行驶速度正接近最高速。由于无法快速转向,该船右舷侧面遭受了一次撞击,部分船体出现缝隙,使16个水密隔舱中的5个进水。泰坦尼克号的设计仅能够承受4个水密隔舱进水,因此沉没。 --Wikipedia
import pandas as pd
pd.options.mode.chained_assignment = None
titanic = pd.read_csv('Titanic/train.csv')
titanic.head(5)
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
数据清理
数据分析中维持一个干净的数据集对建模十分关键,可靠的数据集主要由以下几个方面来评估:
- 数据的可靠性,这个方面由原始数据集保证
- 数据的版本控制, 输入数据对机器学习建模影响很大,如果模型训练输入数据不断发生变化的话很可能无法生成正确的模型,即上游的输入数据供给进程突然发生变化会波及到模型建立的过程
- 特征的必要性,建模特征数量和模型精度并不呈现严格的正相关
- 特征的相关性,建模过程中我们尽可能减少相关特征的数量
在本例子,Name
和Ticket
和存活条件相关性较低,我们可以考虑将这些特征剔除
X = titanic[['Pclass', 'Age', 'Sex']]
y = titanic['Survived']
# 对于年龄空缺的乘客我们使用平均年龄进行填充
X['Age'] = X['Age'].fillna(X['Age'].mean())
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
X_train.head(5)
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Pclass | Age | Sex | |
---|---|---|---|
110 | 1 | 47.000000 | male |
360 | 3 | 40.000000 | male |
364 | 3 | 29.699118 | male |
320 | 3 | 22.000000 | male |
296 | 3 | 23.500000 | male |
特征工程
传统编码工作的关注点在于代码编码的过程,而机器学习和数据分析工作者则是着力于数据特征的表示过程,开发者通过特征工程(新特征可以来源于数据济原始特征的逻辑运算)建立一个良好的数据特征原型。特征工程的主要工作有
- 映射字符串字符为整型
- 采用One-Hot编码方式映射枚举值
在本例中,我们将Titanic
数据集的Sex
一列的男性和女性映射为整型值0和1
X_train['Sex'] = X_train['Sex'].map({'male':0,'female':1})
X_test['Sex'] = X_test['Sex'].map({'male':0,'female':1})
# 检视映射处理结果
X_train.head(5)
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Pclass | Age | Sex | |
---|---|---|---|
110 | 1 | 47.000000 | 0 |
360 | 3 | 40.000000 | 0 |
364 | 3 | 29.699118 | 0 |
320 | 3 | 22.000000 | 0 |
296 | 3 | 23.500000 | 0 |
from sklearn.ensemble import RandomForestClassifier
titanic_rf = RandomForestClassifier()
titanic_rf.fit(X_train, y_train)
print('The accuracy of Random Forest Classifier on testing set:', titanic_rf.score(X_test, y_test))
The accuracy of Random Forest Classifier on testing set: 0.8026905829596412
from xgboost import XGBClassifier
titanic_xgb = XGBClassifier()
titanic_xgb.fit(X_train, y_train)
print('The accuracy of eXtreme Gradient Boosting Classifier on testing set:', titanic_xgb.score(X_test, y_test))
The accuracy of eXtreme Gradient Boosting Classifier on testing set: 0.8385650224215246
分类结果报告
目标分类中常用的指标有精确率、召回率以及F1均值,公式如下:
- 精确率 \(Precision = \frac{T_P}{(T_P + F_P)}\)
- 召回率 \(Recall = \frac{T_P}{(T_P + F_N)}\)
- F1值 \(F1 = 2 \times \frac{Precision \times Recall}{(Precision + Recall)}\)
from sklearn.metrics import classification_report, precision_recall_curve
from sklearn.metrics import f1_score
rf_result = titanic_rf.predict(X_test)
xgb_result = titanic_xgb.predict(X_test)
print('随机森林模型: \n ' + classification_report(rf_result, y_test, digits=4))
print('XGBoost模型: \n ' + classification_report(xgb_result, y_test, digits=4))
随机森林模型:
precision recall f1-score support
0 0.8731 0.8125 0.8417 144
1 0.6966 0.7848 0.7381 79
micro avg 0.8027 0.8027 0.8027 223
macro avg 0.7849 0.7987 0.7899 223
weighted avg 0.8106 0.8027 0.8050 223
XGBoost模型:
precision recall f1-score support
0 0.9179 0.8311 0.8723 148
1 0.7191 0.8533 0.7805 75
micro avg 0.8386 0.8386 0.8386 223
macro avg 0.8185 0.8422 0.8264 223
weighted avg 0.8510 0.8386 0.8414 223
可以看到随机森林模型和XGBoost的F1均值分别为0.8050和0.8414,XGBoost在Titanic
数据集中略胜一筹
Kaggle八门神器(一):竞赛神器之XGBoost介绍的更多相关文章
- python三大神器之virtualenv pip, virtualenv, fabric通称为pythoner的三大神器。
python三大神器之virtualenv pip, virtualenv, fabric通称为pythoner的三大神器. virtualenv virtualenv------用来建立一个虚拟 ...
- SSH客户端神器之 MobaXterm
SSH客户端神器之 MobaXterm 由于需要连接远程 Linux 服务器,早期使用过 Putty,SecureCRT,后面主要使用 Xshell. 自从接触了 MobaXterm之后,个人感觉比 ...
- ORACLE恢复神器之ODU/AUL/DUL
分享ORACLE数据库恢复神器之ODU.DUL和AUL工具. ODU:ORACLE DATABASE UNLOADER DUL:DATA UNLOADER AUL:也称MyDUL 关于三种工具说明: ...
- Cocos2d-x单机游戏防八门神器修改数据
来源:http://cocos2d.9tech.cn/news/2014/0212/39812.html 网上的cocos2d-x教程多为知识点的讲解,但我们学习cocos2d-x的目的是为了什么?为 ...
- Unity,android和IOS 防止八门神器注入
八门神器主要是不断筛选,来获取关键属性(比如金币)在内存中的地址,再根据该地址来修改指向的数据就可以成功. 因此,我们需要在金币读取和设置的时候,使用一个偏移量,来达到干扰的目的就可以了 未经仔细测试 ...
- [转帖]APP逆向神器之Frida【Android初级篇】
APP逆向神器之Frida[Android初级篇] https://juejin.im/post/5d25a543e51d455d6d5358ab 说到逆向APP,很多人首先想到的都是反编译,但是单看 ...
- H5神器之canvas应用——网页修改保存图片
因为最近项目上的要求,需要在页面中可以对一张图片进行涂改和添加文字,然后再保存到(服务器)本地,因为也是第一次接触这方面的,然后爬网页啊爬网页,之后发现了一款adobe开发的一款插件,适合 Anroi ...
- SpringBoot四大神器之Actuator
介绍 Spring Boot有四大神器,分别是auto-configuration.starters.cli.actuator,本文主要讲actuator.actuator是spring boot提供 ...
- Win下必备神器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
随机推荐
- asteris录音设置
[macro-recording] exten =>s,1,Set(CALLFILENAME=${STRFTIME(${EPOCH},UTC-8,%Y-%m-%d-%H-%M-%S)}-${CA ...
- 向nexus远程仓库里面添加JAR
向nexus远程仓库里面添加JAR 远程仓库:http://10.1.252.21:8081/nexus/index.html admin/admin123 方法一:手动 在左侧选择:Reposito ...
- matlab形态学图像处理之strel函数
转自:http://blog.sina.com.cn/s/blog_b1cd5d330101pmwi.html strel--structuring element 运用各种形状和大小构造元素,基本语 ...
- bzoj5093
NTT+组合数学 $把每个点分别按度数考虑,由于有标号,可以得出$ $ans=n*2^{(n-1)*(n-2)}*\sum_{i=1}^{n-1}{C(n-1,i)*i^{k}}$ $本质上是求\su ...
- 【旧文章搬运】VC插件中如何获取当前工程的工作目录
原文发表于百度空间,2014-09-24========================================================================== 好难找的资 ...
- ng2父子模块通信@ViewChild和@Inject
一.@ViewChild 父组件中使用@ViewChild拿到子组件的变量和方法(父组件可调用子组件的方法和变量) parent.component.ts: import { Component, O ...
- IOS技能要求
iOS专业技能: 拥有独立开发iOS APP应用的能力,并且独立开发过多款应用:熟练掌握iOS主流界面布局设计,基本控件和自定义控件的使用,事件处理及事件分发机制:熟练掌握工厂.代理.观察者.单例等多 ...
- css水平居中方式
1. text-align:center 这种方式只适合于内联元素或者文字处于块元素当中是,给块元素设置这个,那么块元素当中的文字或者内联元素则居中.兼容各种浏览器 <div class=&qu ...
- WPF ChangePropertyAction中TargetName和TargetObject的区别
在wpf页面布局中经常用到ChangePropertyAction来更改属性,在这个里面有TargetName和TargetObject两个属性,都表示需要修改的控件名称,那么这两个有什么区别呢,通过 ...
- boost编译配置及简单使用
boost编译配置及简单使用 1.下载 http://www.boost.org/ 2.编译: A.解压 boost_1_55_0.zip 到boost路径 B.运行 bootstrap.bat. 会 ...