Catboost算法原理解析及代碼實現(xiàn)
前言
今天博主來介紹一個超級簡單并且又極其實用的boosting算法包Catboost,據(jù)開發(fā)者所說這一boosting算法是超越Lightgbm和XGBoost的又一個神器。
catboost 簡介
在博主看來catboost有一下三個的優(yōu)點:
它自動采用特殊的方式處理類別型特征(categorical features)。首先對categorical features做一些統(tǒng)計,計算某個類別特征(category)出現(xiàn)的頻率,之后加上超參數(shù),生成新的數(shù)值型特征(numerical features)。這也是我在這里介紹這個算法最大的motivtion,有了catboost,再也不用手動處理類別型特征了。
catboost還使用了組合類別特征,可以利用到特征之間的聯(lián)系,這極大的豐富了特征維度。
catboost的基模型采用的是對稱樹,同時計算leaf-value方式和傳統(tǒng)的boosting算法也不一樣,傳統(tǒng)的boosting算法計算的是平均數(shù),而catboost在這方面做了優(yōu)化采用了其他的算法,這些改進都能防止模型過擬合。
catboost 實戰(zhàn)
這里博主采用的是之前參加一個CTR點擊率預(yù)估的數(shù)據(jù)集,首先通過pandas讀入數(shù)據(jù)。
from catboost import CatBoostClassifier
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
data = pd.read_csv("ctr_train.txt", delimiter="\t")
del data["user_tags"]
data = data.fillna(0)
X_train, X_validation, y_train, y_validation = train_test_split(data.iloc[:,:-1],data.iloc[:,-1],test_size=0.3 , random_state=1234)
這里我們可以觀察一下數(shù)據(jù)的特征列,這里有很多列特征比如廣告的寬高,是否可以下載,是否會跳轉(zhuǎn)等一些特征,而且特征的數(shù)據(jù)類型各不一樣,有數(shù)值型(creative_height),布爾型(creative_is_js)等不同類型的特征。

data
下圖我們對所有特征做了一個統(tǒng)計,發(fā)現(xiàn)整個訓(xùn)練數(shù)據(jù)集一共有34列,除去標(biāo)簽列,整個數(shù)據(jù)集一共有33個特征,其中6個為布爾型特征,2個為浮點型特征,18個整型特征,還有8個對象型特征。

data_information
如果按照正常的算法,此時應(yīng)該將非數(shù)值型特征通過各種數(shù)據(jù)預(yù)處理手段,各種編碼方式轉(zhuǎn)化為數(shù)值型特征。而在catboost中你根本不用費心干這些,你只需要告訴算法,哪些特征屬于類別特征,它會自動幫你處理。代碼如下所示:
categorical_features_indices = np.where(X_train.dtypes != np.float)[0]
model = CatBoostClassifier(iterations=100, depth=5,cat_features=categorical_features_indices,learning_rate=0.5, loss_function='Logloss',
logging_level='Verbose')
最后就是將數(shù)據(jù)喂給算法,訓(xùn)練走起來。
model.fit(X_train,y_train,eval_set=(X_validation, y_validation),plot=True)
將plot = ture 打開后,catboot包還提供了非常炫酷的訓(xùn)練可視化功能,從下圖可以看到我的Logloss正在不停的下降。

training
訓(xùn)練結(jié)束后,通過model.feature_importances_屬性,我們可以拿到這些特征的重要程度數(shù)據(jù),特征的重要性程度可以幫助我們分析出一些有用的信息。
import matplotlib.pyplot as plt
fea_ = model.feature_importances_
fea_name = model.feature_names_
plt.figure(figsize=(10, 10))
plt.barh(fea_name,fea_,height =0.5)
執(zhí)行上方代碼,我們可以拿到特征重要程度的可視化結(jié)構(gòu),從下圖我們發(fā)現(xiàn)campaign_id是用戶是否點擊這個廣告的最關(guān)鍵的影響因子。

feature_importance
結(jié)語
至此整個catboot的優(yōu)點和使用方法都介紹完了,是不是覺得十分簡單易用,而且功能強大。深度學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)減弱了我們對特征工程的依賴,catboost也在朝著這方面努力。所以有時候碰到需要特別多的前期數(shù)據(jù)處理和特征數(shù)值化的任務(wù)時,可以嘗試用一下catboost,python pip install catboost 即可安裝哦。


Python“寶藏級”公眾號【Python之王】專注于Python領(lǐng)域,會爬蟲,數(shù)分,C++,tensorflow和Pytorch等等。
近 2年共原創(chuàng) 100+ 篇技術(shù)文章。創(chuàng)作的精品文章系列有:
日常收集整理了一批不錯的 Python 學(xué)習(xí)資料,有需要的小伙可以自行免費領(lǐng)取。
獲取方式如下:公眾號回復(fù)資料。領(lǐng)取Python等系列筆記,項目,書籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊和 C++ 等學(xué)習(xí)資料!
