XGBoost调参技巧(二)Titanic实战Top9%

学习Kaggle的第一个比赛就是Titanic,断断续续的半年时间,从小白到杀入9%。XGBoost果真是Kaggle杀器,帮我在Titanic中进入9%、zillow进入22%。

简介

Titanic是Kaggle竞赛里的入门比赛之一,要求参赛者根据乘客的属性来预测是否幸存,是典型的二分类(Binary Classifier)问题。解决二分类问题的算法有很多:决策树、随机森林、GBM,而XGBoost是GBM的优化实现。因此本文以Titanic幸存者预测竞赛为例,介绍XGBoost的调参技巧。

一、读取数据,清洗数据

1.读取数据

#coding:utf-8
import numpy as np
import pandas as pd
from xgboost import XGBClassifier
from sklearn.cross_validation import KFold
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import accuracy_score

#read data
train = pd.read_csv("../data/train.csv")
test = pd.read_csv("../data/test.csv")

导入需要用到的包,注意我导入的是xgboost下的XGBClassifier包,可以结合sciket-learn下的grid_search来对参数进行暴力猜解。

2.清洗数据

def clean_data(titanic):#填充空数据 和 把string数据转成integer表示
    titanic["Age"] = titanic["Age"].fillna(titanic["Age"].median())
    # child
    titanic["child"] = titanic["Age"].apply(lambda x: 1 if x < 15 else 0)

    # sex
    titanic["sex"] = titanic["Sex"].apply(lambda x: 1 if x == "male" else 0)

    titanic["Embarked"] = titanic["Embarked"].fillna("S")
    # embark
    def getEmbark(Embarked):
        if Embarked == "S":
            return 1
        elif Embarked == "C":
            return 2
        else:
            return 3
    titanic["embark"] = titanic["Embarked"].apply(getEmbark)

    # familysize
    titanic["fimalysize"] = titanic["SibSp"] + titanic["Parch"] + 1

    # cabin
    def getCabin(cabin):
        if cabin == "N":
            return 0
        else:
            return 1
    titanic["cabin"] = titanic["Cabin"].apply(getCabin)

    # name
    def getName(name):
        if "Mr" in str(name):
            return 1
        elif "Mrs" in str(name):
            return 2
        else:
            return 0
    titanic["name"] = titanic["Name"].apply(getName)

    titanic["Fare"] = titanic["Fare"].fillna(titanic["Fare"].median())

    return titanic
# 对数据进行清洗
train_data = clean_data(train)
test_data = clean_data(test)

二、特征工程

Kaggle竞赛的三个核心步骤:特征工程、调参、模型融合。俗话说:数据和特征决定机器学习的上限,而算法只是用来逼近这个上限,所以特征工程是机器学习能否成功的关键。我们在每个比赛中需要花大量时间来反复完成这个工作。

features = ["Pclass", "sex", "child", "fimalysize", "Fare", "embark", "cabin"]

三、模型选择

1.构造模型

# 简单初始化xgb的分类器就可以
clf =XGBClassifier(learning_rate=0.1, max_depth=2, 
silent=True, objective='binary:logistic')

2.交叉验证kfold

利用skean提供的grid_search来进行交叉验证选择参数。

# 设置boosting迭代计算次数
param_test = {
    'n_estimators': range(30, 50, 2),
    'max_depth': range(2, 7, 1)
}
grid_search = GridSearchCV(estimator = clf, param_grid = param_test, 
scoring='accuracy', cv=5)
grid_search.fit(train[features], train["Survived"])
grid_search.grid_scores_, grid_search.best_params_, grid_search.best_score_

out:

后面是跑出来的结果。这里我也是非常意外,之前试过各种方法,都没有超过0.8,看来XGBoost的效果确实非常不错。

四、提交结果

进步还是非常大的,进入了9%。做到0.8的话对这个比较的数据集基本上算是比较好的了,再往上提高也没有太大的意义,Titanic暂时告一段落。


欢迎关注个人微信公众号:kaggle数据分析

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值