1. 程式人生 > 其它 >CatBoost:一個自動處理分類(CAT)資料的機器學習庫

CatBoost:一個自動處理分類(CAT)資料的機器學習庫

在使用“sklearn”構建機器學習模型時,想必大家應該都遇到過下面這個錯誤吧:

當處理分類(字串)變數時,這個錯誤就發生了。在sklearn中,你需要在數值格式中轉換這些分類。為了實現這種轉換,我們使用了一些預處理方法,如“標籤編碼”、“獨熱編碼”等。

在這篇文章中,我將討論一個最近開源的梯度提升機器學習庫“CatBoost”,由俄羅斯最大的搜尋引擎Yandex開發和貢獻。CatBoost可以直接使用分類功能,而且在本質上是可擴充套件的。

內容

  • CatBoost是什麼?
  • CatBoost庫的優勢
  • 與其他提升(Boosting)演算法相比,CatBoost怎麼樣?
  • 安裝CatBoost
  • 使用CatBoost解決ML挑戰
  • 備註

CatBoost是什麼?

CatBoost一款最近開源的機器學習演算法。它可以很容易地與像谷歌的TensorFlow和蘋果的CoreML這樣的深度學習框架整合在一起。同時,它也可以使用不同的資料型別來幫助企業解決各種各樣的問題。最重要的是,它提供了最佳的精確度。

CatBoost在兩方面尤其強大:

  • 它產生了最先進的結果,而且不需要進行廣泛的資料訓練(通常這些訓練是其他機器學習方法所要求的)。
  • 為更多的描述性資料格式提供了強大的“開箱即用”支援。“CatBoost”這個名字來自兩個詞“Category”和“Boosting”。

如前所述,該庫可以很好地處理各種型別的資料,如音訊、文字、影象,包括歷史資料。“Boost”來源於梯度提升機器學習演算法,該演算法基於梯度提升庫。梯度提升是一種強大的機器學習演算法,它被廣泛應用於各種型別的商業挑戰,如欺詐檢測、推薦專案、預測等等。它還可以使用相對較少的資料得到非常好的結果,不像DL模型那樣需要從大量資料中學習。

這裡有一個關於CatBoost的視訊:https://youtu.be/s8Q_orF4tcI

CatBoost庫的優勢

  • 效能:CatBoost提供了一種先進效果,它在效能方面與任何領先的機器學習演算法都可以抗衡。
  • 自動處理分類特性:我們可以使用CatBoost,而不需要任何顯式的預處理來將類別轉換為數字。CatBoost使用在各種統計上的分類特徵和數值特徵的組合將分類值轉換成數字。你可以在這裡讀到更多相關資訊。
  • 魯棒性/強健性:它減少了對廣泛的超引數調優的需求,並降低了過度擬合的機會,這也導致了模型變得更加具有通用性。雖然CatBoost有多個引數可以調優,但它還包含一些引數,比如樹的數量、學習速率、正則化、樹的深度等等。 你可以在這裡閱讀這些引數。
  • 易於使用:你可以使用來自命令列的CatBoost,使用針對Python和R語言這樣的易於使用的API。

與其他提升(Boosting)演算法相比,CatBoost怎麼樣?

我們有多個提升庫,比如XGBoost、H2O和LightGBM,所有這些庫都能在各種問題上有著出色的表現。CatBoost的開發人員將其效能與標準ML資料集的競爭對手進行了比較:

上面的比較顯示了測試資料的對數損失(log-loss)值,在CatBoost的大多數情況下,它是最低的。圖中清楚地表明瞭CatBoost對調優和預設模型的效能都更好。

此外,CatBoost不需要像XGBoost和LightGBM那樣將資料集轉換為任何特定格式。

安裝CatBoost

對於Python和R語言,CatBoost很容易安裝,你需要有64位版本的Python和R語言。

Python安裝

pip install catboost

R語言安裝

install.packages('devtools')
devtools::install_github('catboost/catboost', subdir = 'catboost/R-package')

使用CatBoost解決ML挑戰

CatBoost庫可以用來解決分類和迴歸挑戰。對於分類,你可以使用“CatBoostClassifier”,對於迴歸,使用“CatBoostRegressor”。

在這篇文章中,我用CatBoost解決了“Big Mart Sales”的實踐問題。這是一個迴歸挑戰,所以我們需要使用 CatBoostRegressor。

import pandas as pd
import numpy as np
from catboost import CatBoostRegressor

#Read trainig and testing files
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

#Identify the datatype of variables
train.dtypes
#Finding the missing values
train.isnull().sum()
#Imputing missing values for both train and test
train.fillna(-999, inplace=True)
test.fillna(-999,inplace=True)
#Creating a training set for modeling and validation set to check model performance
X = train.drop(['Item_Outlet_Sales'], axis=1)
y = train.Item_Outlet_Sales

from sklearn.model_selection import train_test_split
X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)
#Look at the data type of variables
X.dtypes

現在,你會發現我們只會識別分類變數。我們不會對分類變數執行任何預處理步驟:

categorical_features_indices = np.where(X.dtypes != np.float)[0]
#importing library and building model
from catboost import CatBoostRegressor
model=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE')
model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True)

正如你所看到的,一個基本的模型給出了一個公平的解決方案,並且訓練和測試錯誤是同步的。你可以優化模型引數和特性,以改進解決方案。

現在,下一個任務是預測測試資料集的結果。

submission = pd.DataFrame()
submission['Item_Identifier'] = test['Item_Identifier']
submission['Outlet_Identifier'] = test['Outlet_Identifier']
submission['Item_Outlet_Sales'] = model.predict(test)
submission.to_csv("Submission.csv")

就是這樣! 我們已經建立了第一個模型。

備註

我們已經討論了這個庫的基本細節,並在本文中解決了迴歸挑戰。我還建議你使用這個庫來處理業務解決方案,並檢查其它先進模型的效能。