|
作者: 章華燕 編輯: 趙一帆 引 言 如果你是一個機器學習社區(qū)的活躍成員,你一定知道 **提升機器**(Boosting Machine)以及它們的能力。提升機器從AdaBoost發(fā)展到目前最流行的XGBoost。XGBoost實際上已經成為贏得在Kaggle比賽中公認的算法。這很簡單,因為他極其強大。但是,如果數據量極其的大,XGBoost也需要花費很長的時間去訓練。 絕大多數人可能對 Light Gradient Boosting 不熟悉,但是讀完本文后你就會對他們很熟悉。一個很自然的問題將進入你的思索:為什么又會出現另一個提升機器算法?它比XGBoost要好嗎? 注意:本文假設讀者已經對 GBMs 和 XGBoost 算法有一定的了解。如果你不了解他們,請先了解一下他們的原理再來學習本文。 什么是LightGBM LightGBM是個快速的、分布式的、高性能的基于決策樹算法的梯度提升框架??捎糜谂判颉⒎诸?、回歸以及很多其他的機器學習任務中。 因為他是基于決策樹算法的,它采用最優(yōu)的leaf-wise策略分裂葉子節(jié)點,然而其它的提升算法分裂樹一般采用的是depth-wise或者level-wise而不是leaf-wise。因此,在LightGBM算法中,當增長到相同的葉子節(jié)點,leaf-wise算法比level-wise算法減少更多的loss。因此導致更高的精度,而其他的任何已存在的提升算法都不能夠達。與此同時,它的速度也讓人感到震驚,這就是該算法名字 Light 的原因。 前文是一個由LightGBM算法作者的概要式的描述來簡要地解釋LightGBM的不同之處。
Leaf-Wise分裂導致復雜性的增加并且可能導致過擬合。但是這是可以通過設置另一個參數 **max-depth** 來克服,它分裂產生的樹的最大深度。 接下來我們將介紹安裝LightGBM的步驟使用它來跑一個模型。我們將對比LightGBM和XGBoost的實驗結果來證明你應該使用LightGBM在一種輕輕的方式(Light Manner)。 LightGBM的優(yōu)勢 首先讓我們看一看LightGBM的優(yōu)勢。
安裝LightGBM 本節(jié)介紹如何在各種操作系統下安裝LightGBM。眾所周知,桌面系統目前使用最多的就是Windows、Linux和macOS,因此,就依次介紹如何在這三種操作系統下安裝LightGBM。 1.Windows 對于Windows操作系統,由于其并非開源操作系統,因此一直以來Windows系統對開發(fā)者來說并不友好。我們需要安裝相應的編譯環(huán)境才能對LightGBM源代碼進行編譯。對于Windows下的底層C/C++編譯環(huán)境,目前主要有微軟自己的Visual Studio(或者MSBuild)或者開源的MinGW64,下面我們依次介紹這兩種編譯環(huán)境下的LightGBM的安裝。 注意,對于以下兩種編譯環(huán)境,我們都共同需要確保系統已經安裝Windows下的Git和CMake工具。
git clone --recursive https://github.com/Microsoft/LightGBMcd LightGBMmkdir buildcd buildcmake -DCMAKE_GENERATOR_PLATFORM=x64 ..cmake --build . --target ALL_BUILD --config Release最終編譯生成的exe和dll會在 LightGBM/Release 目錄下。
git clone --recursive https://github.com/Microsoft/LightGBMcd LightGBMmkdir buildcd buildcmake -G 'MinGW Makefiles' ..mingw32-make.exe -j最終編譯生成的exe和dll會在 LightGBM/ 目錄下。 1.Linux 在Linux系統下,我們同樣適用cmake進行編譯,運行如下的shell命令: git clone --recursive https://github.com/Microsoft/LightGBMcd LightGBMmkdir buildcd buildcmake ..make -j2.macOS LightGBM依賴OpenMP來編譯,但是它不支持蘋果的Clang,請使用gcc/g++替代。運行如下的命令進行編譯: brew install cmakebrew install gcc --without-multilibgit clone --recursive https://github.com/Microsoft/LightGBMcd LightGBMmkdir build cd buildcmake ..make -j現在,在我們投入研究構建我們第一個LightGBM模型之前,讓我們看一下LightGBM的一些參數,以更好的了解其基本過程。 LightGBM的重要參數
LightGBM與XGBoost對比 現在讓我們通過在同一個數據集上進行訓練,對比一下LightGBM和XGBoost的性能差異。 在這里我們使用的數據集來自很多國家的個人信息。我們的目標是基于其他的基本信息來預測每個人的年收入是否超過50K(<=50k 和="">50K兩種)。該數據集包含32561個被觀測者和14個描述每個個體的特征。這里是數據集的鏈接: http://archive.ics./ml/datasets/Adult。通過對數據集的預測變量有一個正確的理解這樣你才能夠更好的理解下面的代碼。 #importing standard libraries import numpy as np import pandas as pd from pandas import Series, DataFrame #import lightgbm and xgboost import lightgbm as lgb import xgboost as xgb #loading our training dataset 'adult.csv' with name 'data' using pandas data=pd.read_csv('adult.csv',header=None) #Assigning names to the columns data.columns=['age','workclass','fnlwgt','education','education-num','marital_Status','occupation','relationship','race','sex','capital_gain','capital_loss','hours_per_week','native_country','Income'] #glimpse of the dataset data.head() # Label Encoding our target variable from sklearn.preprocessing import LabelEncoder,OneHotEncoderl=LabelEncoder() l.fit(data.Income) l.classes_ data.Income=Series(l.transform(data.Income)) #label encoding our target variable data.Income.value_counts() #One Hot Encoding of the Categorical features one_hot_workclass=pd.get_dummies(data.workclass) one_hot_education=pd.get_dummies(data.education) one_hot_marital_Status=pd.get_dummies(data.marital_Status) one_hot_occupation=pd.get_dummies(data.occupation)one_hot_relationship=pd.get_dummies(data.relationship) one_hot_race=pd.get_dummies(data.race) one_hot_sex=pd.get_dummies(data.sex) one_hot_native_country=pd.get_dummies(data.native_country) #removing categorical features data.drop(['workclass','education','marital_Status','occupation','relationship','race','sex','native_country'],axis=1,inplace=True) #Merging one hot encoded features with our dataset 'data' data=pd.concat([data,one_hot_workclass,one_hot_education,one_hot_marital_Status,one_hot_occupation,one_hot_relationship,one_hot_race,one_hot_sex,one_hot_native_country],axis=1) #removing dulpicate columns _, i = np.unique(data.columns, return_index=True) data=data.iloc[:, i] #Here our target variable is 'Income' with values as 1 or 0. #Separating our data into features dataset x and our target dataset y x=data.drop('Income',axis=1) y=data.Income #Imputing missing values in our target variable y.fillna(y.mode()[0],inplace=True) #Now splitting our dataset into test and train from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.3)1.使用XGBoost #The data is stored in a DMatrix object #label is used to define our outcome variabledtrain=xgb.DMatrix(x_train,label=y_train)dtest=xgb.DMatrix(x_test)#setting parameters for xgboostparameters={'max_depth':7, 'eta':1, 'silent':1,'objective':'binary:logistic','eval_metric':'auc','learning_rate':.05}#training our model num_round=50from datetime import datetime start = datetime.now() xg=xgb.train(parameters,dtrain,num_round) stop = datetime.now()#Execution time of the model execution_time_xgb = stop-start print(execution_time_xgb)#datetime.timedelta( , , ) representation => (days , seconds , microseconds) #now predicting our model on test set ypred=xg.predict(dtest) print(ypred)#Converting probabilities into 1 or 0 for i in range(0,9769): if ypred[i]>=.5: # setting threshold to .5 ypred[i]=1 else: ypred[i]=0 #calculating accuracy of our model from sklearn.metrics import accuracy_score accuracy_xgb = accuracy_score(y_test,ypred) print(accuracy_xgb)2.使用LightGBM train_data=lgb.Dataset(x_train,label=y_train)setting parameters for lightgbmparam = {'num_leaves':150, 'objective':'binary','max_depth':7,'learning_rate':.05,'max_bin':200}param['metric'] = ['auc', 'binary_logloss']#Here we have set max_depth in xgb and LightGBM to 7 to have a fair comparison between the two.#training our model using light gbmnum_round=50start=datetime.now()lgbm=lgb.train(param,train_data,num_round)stop=datetime.now()#Execution time of the modelexecution_time_lgbm = stop-startprint(execution_time_lgbm)#predicting on test setypred2=lgbm.predict(x_test)print(ypred2[0:5]) # showing first 5 predictions#converting probabilities into 0 or 1for i in range(0,9769): if ypred2[i]>=.5: # setting threshold to .5 ypred2[i]=1 else: ypred2[i]=0#calculating accuracyaccuracy_lgbm = accuracy_score(ypred2,y_test)accuracy_lgbmy_test.value_counts()from sklearn.metrics import roc_auc_score#calculating roc_auc_score for xgboostauc_xgb = roc_auc_score(y_test,ypred)print(auc_xgb)#calculating roc_auc_score for light gbm. auc_lgbm = roc_auc_score(y_test,ypred2)auc_lgbm comparison_dict = {'accuracy score':(accuracy_lgbm,accuracy_xgb),'auc score':(auc_lgbm,auc_xgb),'execution time':(execution_time_lgbm,execution_time_xgb)}#Creating a dataframe ‘comparison_df’ for comparing the performance of Lightgbm and xgb. comparison_df = DataFrame(comparison_dict) comparison_df.index= ['LightGBM','xgboost'] print(comparison_df)3.性能對比 下面的表格列出了算法的各項指標對比結果:
從上述的性能對比結果來看,LightGBM對比XGBoost的準確率和AUC值都只有很小的提升。但是,一個至關重要的差別是模型訓練過程的執(zhí)行時間。LightGBM的訓練速度幾乎比XGBoost快7倍,并且隨著訓練數據量的增大差別會越來越明顯。
這證明了LightGBM在大數據集上訓練的巨大的優(yōu)勢,尤其是在具有時間限制的對比中。 4.詳細對比
6 LightGBM的參數調優(yōu) 1.為了最好的擬合
2.為了更快的速度
3.為了更高的準確率
在本文中,我給出了關于LightGBM的直觀的想法。現在使用該算法的一個缺點是它的用戶基礎太少了。但是種局面將很快得到改變。該算法除了比XGBoost更精確和節(jié)省時間以外,現在被使用的很少的原因是他的可用文檔太少。 end 機器學習算法全棧工程師 一個用心的公眾號 進群,學習,得幫助 你的關注,我們的熱度, 我們一定給你學習最大的幫助 |
|
|