XGBoost Python實戰

一. 前言

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算法;
  • 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。

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章