学习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数据分析