XGBoost調參技巧(二)Titanic實戰Top9%

學習Kaggle的第一個比賽就是Titanic,斷斷續續的半年時間,從小白到殺入9%。XGBoost果真是Kaggle殺器,幫我在Titanic中進入9%、zillow進入22%。

簡介

Titanic是Kaggle競賽里的入門比賽之一,要求參賽者根據乘客的屬性來預測是否倖存,是典型的二分類(Binary Classifier)問題。解決二分類問題的演算法有很多:決策樹、隨機森林、GBM,而XGBoost是GBM的優化實現。因此本文以Titanic倖存者預測競賽為例,介紹XGBoost的調參技巧。

一、讀取數據,清洗數據

1.讀取數據

#coding:utf-8nimport numpy as npnimport pandas as pdnfrom xgboost import XGBClassifiernfrom sklearn.cross_validation import KFoldnfrom sklearn.grid_search import GridSearchCVnfrom sklearn.metrics import accuracy_scorenn#read datantrain = pd.read_csv("../data/train.csv")ntest = pd.read_csv("../data/test.csv")n

導入需要用到的包,注意我導入的是xgboost下的XGBClassifier包,可以結合sciket-learn下的grid_search來對參數進行暴力猜解。

2.清洗數據

def clean_data(titanic):#填充空數據 和 把string數據轉成integer表示n titanic["Age"] = titanic["Age"].fillna(titanic["Age"].median())n # childn titanic["child"] = titanic["Age"].apply(lambda x: 1 if x < 15 else 0)nn # sexn titanic["sex"] = titanic["Sex"].apply(lambda x: 1 if x == "male" else 0)nn titanic["Embarked"] = titanic["Embarked"].fillna("S")n # embarkn def getEmbark(Embarked):n if Embarked == "S":n return 1n elif Embarked == "C":n return 2n else:n return 3n titanic["embark"] = titanic["Embarked"].apply(getEmbark)nn # familysizen titanic["fimalysize"] = titanic["SibSp"] + titanic["Parch"] + 1nn # cabinn def getCabin(cabin):n if cabin == "N":n return 0n else:n return 1n titanic["cabin"] = titanic["Cabin"].apply(getCabin)nn # namen def getName(name):n if "Mr" in str(name):n return 1n elif "Mrs" in str(name):n return 2n else:n return 0n titanic["name"] = titanic["Name"].apply(getName)nn titanic["Fare"] = titanic["Fare"].fillna(titanic["Fare"].median())nn return titanicn# 對數據進行清洗ntrain_data = clean_data(train)ntest_data = clean_data(test)n

二、特徵工程

Kaggle競賽的三個核心步驟:特徵工程、調參、模型融合。俗話說:數據和特徵決定機器學習的上限,而演算法只是用來逼近這個上限,所以特徵工程是機器學習能否成功的關鍵。我們在每個比賽中需要花大量時間來反覆完成這個工作。

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

三、模型選擇

1.構造模型

# 簡單初始化xgb的分類器就可以nclf =XGBClassifier(learning_rate=0.1, max_depth=2, nsilent=True, objective=binary:logistic)n

2.交叉驗證kfold

利用skean提供的grid_search來進行交叉驗證選擇參數。

# 設置boosting迭代計算次數nparam_test = {n n_estimators: range(30, 50, 2),n max_depth: range(2, 7, 1)n}ngrid_search = GridSearchCV(estimator = clf, param_grid = param_test, nscoring=accuracy, cv=5)ngrid_search.fit(train[features], train["Survived"])ngrid_search.grid_scores_, grid_search.best_params_, grid_search.best_score_n

out:

後面是跑出來的結果。這裡我也是非常意外,之前試過各種方法,都沒有超過0.8,看來XGBoost的效果確實非常不錯。

四、提交結果

進步還是非常大的,進入了9%。做到0.8的話對這個比較的數據集基本上算是比較好的了,再往上提高也沒有太大的意義,Titanic暫時告一段落。

歡迎關注個人微信公眾號:kaggle數據分析

推薦閱讀:

我為什麼決定學習數據分析
華為P10與小米6誰更受用戶青睞
一名准增長黑客的數據分析修鍊計劃
使用威脅情報追蹤攻擊者——Part 1 威脅情報的另類分類

TAG:Kaggle | 数据分析 |