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

来源:互联网 发布:淘宝号在哪里看 编辑:程序博客网 时间:2024/06/03 09:12
学习Kaggle的第一个比赛就是Titanic,断断续续的半年时间,从小白到杀入9%。XGBoost果真是Kaggle杀器,帮我在Titanic中进入9%、zillow进入22%。

简介

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

一、读取数据,清洗数据

1.读取数据

#coding:utf-8import numpy as npimport pandas as pdfrom xgboost import XGBClassifierfrom sklearn.cross_validation import KFoldfrom sklearn.grid_search import GridSearchCVfrom sklearn.metrics import accuracy_score#read datatrain = 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数据分析

原创粉丝点击