LightGBM アルゴリズムの一般的な理解

機械学習は世界で最も急速に成長している分野の1つであり、新しいアルゴリズムが次々とリリースされていますが、最近ではMicrosoftが導入したブースティングフレームワーク – LightGBM がkaggleのデータコンペティションで広く使われていることが判明したようです。川や湖での xgboost の現状に挑戦したいと考えていますが、データ マイニング (競争) 愛好家にとっては、別の優れたツールがあります。この記事では、LightGBMのアルゴリズムとは何なのか、そしてLightGBMを実戦でどのように使うのかを分かりやすく紹介していきます。

LightGBMとは何ですか?

LightGBM は、デシジョン ツリー ベースの学習アルゴリズムを使用した勾配ブースティング フレームワークです。分散型かつ効率的に設計されており、次のような利点があります。

  • トレーニング効率の向上

  • メモリ使用量が少ない

  • より良い精度

  • 並列学習とGPU学習をサポート

  • 大規模なデータも扱える

  • カテゴリ特徴量のサポート

データ量の増加に伴い、従来のデータ サイエンス アルゴリズムの実行速度はリズムに追いつけなくなりますが、LightGBM の高速性と GPU 学習のサポートにより、データ サイエンティストはこのアルゴリズムをデータ サイエンス アプリケーションの開発に広く使用しています。

他のツリーベースのアルゴリズムとどう違うのですか?

LightGBM アルゴリズムはツリーを垂直方向に成長させますが、他のアルゴリズムはツリーを水平方向に成長させます。つまり、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

おすすめ

転載: blog.csdn.net/lomodays207/article/details/88045852