機械学習は世界で最も急速に成長している分野の1つであり、新しいアルゴリズムが次々とリリースされていますが、最近ではMicrosoftが導入したブースティングフレームワーク – LightGBM がkaggleのデータコンペティションで広く使われていることが判明したようです。川や湖での xgboost の現状に挑戦したいと考えていますが、データ マイニング (競争) 愛好家にとっては、別の優れたツールがあります。この記事では、LightGBMのアルゴリズムとは何なのか、そしてLightGBMを実戦でどのように使うのかを分かりやすく紹介していきます。
LightGBMとは何ですか?
LightGBM は、デシジョン ツリー ベースの学習アルゴリズムを使用した勾配ブースティング フレームワークです。分散型かつ効率的に設計されており、次のような利点があります。
-
トレーニング効率の向上
-
メモリ使用量が少ない
-
より良い精度
-
並列学習とGPU学習をサポート
-
大規模なデータも扱える
-
カテゴリ特徴量のサポート
データ量の増加に伴い、従来のデータ サイエンス アルゴリズムの実行速度はリズムに追いつけなくなりますが、LightGBM の高速性と GPU 学習のサポートにより、データ サイエンティストはこのアルゴリズムをデータ サイエンス アプリケーションの開発に広く使用しています。
他のツリーベースのアルゴリズムとどう違うのですか?
LightGBM アルゴリズムはツリーを垂直方向に成長させますが、他のアルゴリズムはツリーを水平方向に成長させます。つまり、LightGBM アルゴリズムはリーフの順序で成長するのに対し、他のアルゴリズムは水平方向の順序で成長し、損失が最も大きいリーフを選択して成長します。同じ葉で成長する場合、葉を分割するアルゴリズムは、階層化されたアルゴリズムよりも損失を軽減します。
次の図は、LightGBM と他のブースティング アルゴリズムの主な違いを直感的に理解できます。
LightGBM は小さなデータに簡単にオーバーフィットするため、小さなデータ セットで LightGBM を使用することはお勧めできません。通常は、10000 行を超えるデータにのみ使用することをお勧めします。
LightGBM の使い方は実は簡単で、複雑なのはパラメータの調整だけです LightGBM には 100 以上のパラメータがありますが、すべてのパラメータを覚える必要はありませんのでご安心ください。
パラメータの説明とチューニング
制御パラメータ 制御パラメータ
- num_leaves : このパラメータは、ツリー内に形成されるリーフ ノードの数を設定するために使用されます。理論的には、num_leaves = 2^(max_ Depth) となります。ただし、これは適切な推定ケースではありません。LightGBM の場合、num_leaves は 2 ^ (max_ Depth) 未満でなければなりません。そうでない場合は、過剰学習が発生する可能性があります。
max_ Depth:ツリーの最大の深さ。このパラメーターはモデルの過学習に対処するために使用されます。モデルが過学習していると感じた場合は、まず最大深度を減らすことを検討する必要があります。
min_data_in_leaf:これは、リーフ ノードが持つことができるレコードの最小数です。デフォルトは最適値の 20 です。オーバーフィッティングに対処するためにも使用されます。
early_stopping_round:このパラメータは、分析の高速化に役立ちます。検証データ内のメトリクスが最後の停止ラウンドで改善しない場合、モデルはトレーニングを停止するため、モデルの反復数が削減される可能性があります。
ラムダ:正則化。一般的な値の範囲は 0 から 1 です。
コアパラメータ コアパラメータ
application : これは最も重要なパラメーターであり、回帰や分類の問題など、モデルのアプリケーションを指定します。Lightgbm は、デフォルトでモデルを回帰モデルとして扱います。
- regression : 回帰回帰問題用
- binary : バイナリ分類用
- multiclass : マルチクラス分類問題の多重分類用
ブースティング:実行するアルゴリズムのタイプを定義します。デフォルトはgdbtです。
- gbdt:従来の勾配ブースティング デシジョン ツリー 従来の勾配ブースティング デシジョン ツリー
- rf:ランダム フォレスト ランダム フォレスト
- ダーツ:ドロップアウトと多重加法回帰ツリーの出会い ドロップアウト + 多重加法回帰ツリー
- goss:勾配ベースの片側サンプリング Goss: 勾配ベースの片側サンプリング
num_boost_round:ブースト反復回数、通常は 100 以上
learning_rate:これは、最終結果に対する各ツリーの影響を決定します。GBM の仕組みは、初期推定値から開始し、各ツリーの出力を使用して推定値を更新することです。学習パラメータは、推定値の変化の大きさを制御するために使用されます。一般的な値は: 0.1、0.001、0.003…
デバイス:デフォルトでは CPU を使用しますが、GPU を渡すこともできます
メトリックパラメータ メトリックパラメータ
metric:モデルの損失を評価する方法を指定するため、これも重要なパラメーターです。以下は、一般回帰と分類のためのいくつかの損失関数です。
- mae : 平均絶対誤差 平均絶対誤差
- mse: mean squared error 均方差
- binary_logloss : バイナリ分類の損失
- multi_logloss : 複数分類の損失 複数分類の損失
LightGBMをインストールする
LightGBM の CPU バージョンのインストールは簡単で pip 経由でインストールできますが、GPU バージョンには手順が多く、Cuda、Boost、CMake、MS Build または Visual Studio、および MinGW のインストールが必要です。
インストール方法はプラットフォームごとに異なります。詳細については公式ドキュメントを参照してください:
https://lightgbm.readthedocs.io/en/latest/ Installation-Guide.html
ここでは、より簡単な共有方法を紹介します。Anaconda をインストールしている場合は、Anaconda に LightGBM をインストールする方がずっと便利です。インストールには 1 行のコマンドのみが必要です。
conda install -c conda-forge lightgbm
LightGBMを使用する
データセット
この記事で使用されているデータ セットには、さまざまな国の個人情報が含まれています。私たちの目標は、他の利用可能な情報に基づいて、ある人の年収が 50,000 未満か 50,000 を超えるかを予測することです。データ セットは 32,561 のトレーニング データと 14 の特徴で構成されています。データセットはここからダウンロードできます。
http://archive.ics.uci.edu/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
#loading our training dataset
data=pd.read_csv("../input/train_data.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']
# Label Encoding our target variable
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
le=LabelEncoder()
le.fit(data.Income)
#label encoding our target variable
data.Income=Series(le.transform(data.Income))
#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)
data.head()
#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 用众数(就是频数最高的那个)来填充缺失项
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)
モデルの構築とトレーニング
トレーニング データを LightGBM でサポートされるデータセット形式に変換する必要があります。その後、パラメーターとその値を含む Python 辞書を作成します。モデルの精度は、パラメーターに指定された値に完全に依存します。
import lightgbm as lgb
# Light GBM
train_data=lgb.Dataset(x_train,label=y_train)
#setting parameters for lightgbm
param = {
'num_leaves':150,
'objective':'binary',
'max_depth':7,
'learning_rate':0.05,
'max_bin':200}
param['metric'] = ['auc', 'binary_logloss']
#training our model using light gbm
num_round=50
from datetime import datetime
start=datetime.now()
lgbm=lgb.train(param,train_data,num_round)
stop=datetime.now()
#Execution time of the model
execution_time_lgbm = stop-start
execution_time_lgbm
#datetime.timedelta( , , ) representation => (days , seconds , microseconds)
パラメータの簡単な説明:
- 目的の値は二項分類問題です
- メトリック メトリックは、binary_loglossバイナリ対数損失を使用します。
- type」は gbdt (ランダムフォレストを試すことができます)
モデル予測
出力は確率のリストになり、バイナリ分類のしきい値 0.5 を介して確率を転置します。
#Prediction
#now predicting our model on test set
ypred=lgbm.predict(x_test)
#convert into binary values
#converting probabilities into 0 or 1
for i in range(0,9769):
if ypred[i]>=0.5: # setting threshold to 0.5
ypred[i]=1
else:
ypred[i]=0
評価モデル
精度を直接計算して結果を確認したり、ROCの値を計算して評価したりできます。
#calculating accuracy of our model
from sklearn.metrics import accuracy_score
accuracy_lgbm = accuracy_score(ypred,y_test)
accuracy_lgbm # 0.8624219469751254
from sklearn.metrics import roc_auc_score
#calculating roc_auc_score for xgboost
auc_xgb = roc_auc_score(y_test,ypred)
auc_xgb # 0.7629644010391523
このアルゴリズムは良好な結果を示しており、既存のブースティング アルゴリズムよりも優れていると言えます。LightGBM を使用して他のアルゴリズム (xgboost など) と詳細に比較すると、違いがわかりますが、LightGBM他のアルゴリズムとは異なります。機械学習アルゴリズムと同様に、モデルをトレーニングする前にパラメーターを正しく調整する必要があります。
参考文献
https://www.zhihu.com/question/51644470
https://lightgbm.readthedocs.io/en/latest/Python-Intro.html