一. 前言
在XGBoost基本原理博文中我們介紹了XGBoost的基本原理,本篇博文我們將介紹XGBoost的基本使用方法,作爲新手的學習參考。
本文使用kaggle上的泰坦尼克數據集,只是對XGBoost的使用做一個簡單的描述,若想知道Kaggle的整個競賽流程以及在競賽中如何使用XGBoost進行預測的話,關注本博客,以後會陸續推出與競賽內容相關的博客及代碼。kaggle的泰坦尼克的數據集分爲訓練數據和測試數據,測試數據與訓練數據的區別在於測試數據缺少‘survival’列,即爲我們需要預測的列,數據集中的每列描述如下:
- survival------表示乘客是否存活;0=No,1=Yes
- pclass------表示票的等級;1=1st,2=2nd,3=3rd
- sex------表示乘客性別;
- Age------表示乘客年齡
- sibsp------表示在船上的兄弟姐妹加上配偶的數量
- parch------表示在船上的父母加上子女的數量
- ticket------表示票的編號
- fare------表示票價
- cabin------表示船艙編號
- embarked------表示乘客登錄的港口;C = Cherbourg, Q = Queenstown, S = Southampton
接下來就是如何進行簡單的特徵處理,以及如何用XGBoost對測試集進行預測,同時也會使用其他的模型與XGBoost進行比較。
二. 數據的特徵處理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import cross_validation
from sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings('ignore')
train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')
train.info() # 打印訓練數據的信息
<class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): PassengerId 891 non-null int64 Survived 891 non-null int64 Pclass 891 non-null int64 Name 891 non-null object Sex 891 non-null object Age 714 non-null float64 SibSp 891 non-null int64 Parch 891 non-null int64 Ticket 891 non-null object Fare 891 non-null float64 Cabin 204 non-null object Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.6+ KB
從輸出信息中可以看出訓練集一共有891個樣本,12個特徵,所有數據所佔的內存大小爲83.6K;所有的特徵中有兩個特徵缺失情況較爲嚴重,一個是Age,一個是Cabin;一個缺失不嚴重Embarked;數據一共有三種類型,float64(2), int64(5), object(5)。
接下來就是對數據的缺失值進行處理,這裏採用的方法是對連續值用該列的平均值進行填充,非連續值用該列的衆數進行填充,還可以使用機器學習的模型對缺失值進行預測,用預測的值來填充缺失值,該方法在下面會用到:
def handle_na(train, test): # 將Cabin特徵刪除
fare_mean = train['Fare'].mean() # 測試集的fare特徵有缺失值,用訓練數據的均值填充
test.loc[pd.isnull(test.Fare), 'Fare'] = fare_mean
embarked_mode = train['Embarked'].mode() # 用衆數填充
train.loc[pd.isnull(train.Embarked), 'Embarked'] = embarked_mode[0]
train.loc[pd.isnull(train.Age), 'Age'] = train['Age'].mean() # 用均值填充年齡
test.loc[pd.isnull(test.Age), 'Age'] = train['Age'].mean()
return train, test
new_train, new_test = handle_na(train, test) # 填充缺失值
由於Embarked,Sex,Pclass特徵是離散特徵,所以對其進行one-hot/get_dummies編碼
# 對Embarked和male特徵進行one-hot/get_dummies編碼
new_train = pd.get_dummies(new_train, columns=['Embarked', 'Sex', 'Pclass'])
new_test = pd.get_dummies(new_test, columns=['Embarked', 'Sex', 'Pclass'])
然後再去除掉PassengerId,Name,Ticket,Cabin, Survived列,這裏不使用這些特徵做預測
target = new_train['Survived'].values
# 刪除PassengerId,Name,Ticket,Cabin, Survived列
df_train = new_train.drop(['PassengerId','Name','Ticket','Cabin','Survived'], axis=1).values
df_test = new_test.drop(['PassengerId','Name','Ticket','Cabin'], axis=1).values
三. XGBoost模型
在用XGB模型進行預測之前先對XGBoost進行簡單的介紹
XGBoost模型有兩種使用方式,一種是原生版本,一種是實現了sklearn接口的版本。
3.1 XGBoost的原生版本
這裏介紹一些重要的參數,具體的根據實際的應用情況再來查看API。
XGBoost參數(需要設置的參數):
3.1.1 General Parameters
- booster [default=gbtree]:可選項爲gbtree,gblinear或dart;其中gbtree和dart是使用基於樹模型的,而gblinear是使用基於線性模型的;
- silent [default=0]:0表示輸出運行信息,1表示不輸出;
- nthread [如果不進行設置,默認是最大線程數量]:表示XGBoost運行時的並行線程數量;
- disable_default_eval_metric [default=0]:標記以禁用默認度量標準。設置 >0 表示禁用;
- num_pbuffer [通過XGBoost自動設置,不需要用戶來設置]:預測緩衝區的大小,通常設置爲訓練實例的數量;
- num_feature [通過XGBoost自動設置,不需要用戶來設置]:被使用在boosting中的特徵維度,設置爲最大化的特徵維度;
3.1.2 Parameters for Tree Booster:
- eta (default=0.3, 別名: learning_rate) :eta表示學習率:range:[0, 1] ,作用:防止過擬合;
- gamma [default=0, 別名: min_split_loss]: 在樹的葉節點上進一步分區所需的最小化損失減少,gamma越大算法越保守 range:[0, ∞];
- max_depth [default=6]:表示樹的深度,值越大模型越複雜,越容易過擬合。0表示不限制;
- min_child_weight [default=1]:子節點所需要的最小樣本權重之和。如果一個葉子節點的樣本權重和小於min_child_weight結束節點進一步的切分。在線性迴歸模型中,這個參數是指建立每個模型所需要的最小樣本數。該值越大,算法越保守;
- max_delta_step [default=0]:我們允許每個葉子輸出的最大的delta step,該值爲0,表示不限制。該值爲正數,可以幫助使更新步驟更加保守。通常該參數不需要設置,但是在logistic迴歸中,分類類別極度不平衡的時候,將該值設置在1_10之間可以幫助控制更新步驟;
- subsample [default=1]:訓練數據的子樣本,subsample=n,表示在訓練數據中隨機採樣n%的樣本,可以防止過擬合。 range:(0, 1] ;
- lambda [default=1, 別名: reg_lambda]: L2正則化項係數;
- alpha [default=0, 別名: reg_alpha]: L1正則化項係數;
- tree_method string [default= auto]:在分佈式和外存的版本中,僅支持 tree_method=approx;可選項爲:auto, exact, approx, hist, gpu_exact, gpu_hist
- auto:表示使用啓發式的方法來選擇使運行速度最快的算法,如下:
- 對於小到中等的數據集,Exact Greedy Algorithm將被使用;
- 對於大數據集,Approximate Algorithm將被使用;
- 因爲以前的行爲總是在單個機器中使用Exact Greedy Algorithm,所以當選擇Approximate Algorithm來通知該選擇時,用戶將得到消息。
- exact:Exact Greedy Algorithm
- approx:Approximate Algorithm
- hist:快速直方圖優化近似貪心算法。它使用了一些可以改善性能的方法,例如bins caching;
- gpu_exact:在GPU上執行Exact Greedy Algorithm;
- gpu_hist:在GPU上執行hist算法;
- auto:表示使用啓發式的方法來選擇使運行速度最快的算法,如下:
- max_leaves [default=0]:設置葉節點的最大數量,僅僅和當row_policy=lossguide才需要被設置;
- max_bin, [default=256]:僅僅tree_method=hist時,該方法需要去設置。bucket連續特徵的最大離散bins數量;
- objective [default=reg:linear]
- reg:linear:線性迴歸;
- reg:logistic:邏輯迴歸;
- binary:logistic: 二分類邏輯迴歸,輸出概率;
- binary:logitraw: 二分類邏輯迴歸,在logistic transformation之前輸出score;
- binary:hinge: 二分類的hinge損失,讓預測爲0或1,而不是概率;
- multi:softmax:多分類的使用softmax目標函數,使用此含參數時需要指定多分類分爲幾類,設置num_class=n;
- multi:softprob: 和softmax相同,但是輸出的是每個樣本點屬於哪個類的預測概率值;
- rank:pairwise:使用XGBoost做排序任務使用的。
- eval_metric [default according to objective] :默認:根據objective參數(迴歸:rmse, 分類:error)。還有許多可以自己查官方API。