LightGBMを使ったクラス分類モデルの構築

投稿者: | 2020-09-15
Table of Content

LightGBMを使ったクラス分類モデルの構築

LightGBMを使ったクラス分類モデルの構築をやっていきたいと思います。

LightGBMとは

LightGBMとは決定木アルゴリズムに基づいた勾配ブースティング(Gradient Boosting)の機械学習フレームワークです。

Kaggleなどの機械学習コンペでもよく使われています。

LightGBMの主な特徴は以下の点になります。

高い精度が出しやすい

他のクラス分類のモデルである「ロジスティック回帰」や「決定木」と比べて、高い精度が出しやすいアルゴリズムです。

過学習しやすい

精度が出しやすい反面、過学習しやすくパラメータの調整などを慎重に行う必要があります。

ライブラリのインポート

必要なライブラリをインポートします。

In [ ]:
import numpy as np
import pandas as pd
import lightgbm
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix, precision_score, recall_score 
import warnings
warnings.filterwarnings('ignore')

import matplotlib.pyplot as plt
%matplotlib inline

データセットのロードとデータの確認

関数load_wineを使ってワインの品種分類についてのデータを読み込みます。

このデータを使って、ワインの品種を分類するモデルを作成します。

In [ ]:
data = load_wine()

特徴量データと教師データの作成

load_wineで読み込んだデータはディクショナリ形式でデータが入っているので、
モデルに入力できるように、pandasのデータフレームとnumpy配列に読み込みます。

In [ ]:
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
print(X.shape)
print(y.shape)
In [ ]:
X.dtypes
Out[ ]:
alcohol                         float64
malic_acid                      float64
ash                             float64
alcalinity_of_ash               float64
magnesium                       float64
total_phenols                   float64
flavanoids                      float64
nonflavanoid_phenols            float64
proanthocyanins                 float64
color_intensity                 float64
hue                             float64
od280/od315_of_diluted_wines    float64
proline                         float64
dtype: object

トレーニングデータと検証用データの分割

scikit-learnのtrain_test_splitを使って、トレーニングデータの一部を検証用データとして分けておきます。

In [ ]:
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

モデルの作成と学習

モデルを構築します。

LightGBMで良く使うパラメーターは以下になります。

パラメーター変数 概要 設定可能な値 デフォルト値
num_leaves 木を分割したあとの葉の数を指定します。 0以上の整数 31
max_depth 木の深さを設定します。(深いほど過学習しやすくなります。) 0以上の整数(0以下の場合は、木の深さの制限なし) -1
n_estimators 木の数を設定します。(増やすほど過学習しやすくなります。) 0以上の整数 100
learning_rate 学習率を設定します 0から1の間 0.1
class_weight クラスごとの重みの調整 balanced' 又は None, クラスごとの重みのdict None
reg_alpha L1正則化のパラメータ(大きくするほど正則化が強くなる(過学習を抑えやすくなる)) 0以上の実数 0.0
reg_lambda L2正則化のパラメータ(大きくするほど正則化が強くなる(過学習を抑えやすくなる)) 0以上の実数 0.0
In [ ]:
lgb_clf = lightgbm.LGBMClassifier(max_depth=5)
lgb_clf.fit(X_train, y_train)
Out[ ]:
LGBMClassifier(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,
               importance_type='split', learning_rate=0.1, max_depth=5,
               min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,
               n_estimators=100, n_jobs=-1, num_leaves=31, objective=None,
               random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=True,
               subsample=1.0, subsample_for_bin=200000, subsample_freq=0)

検証データでの精度の検証

検証データを使ってモデルの精度を検証します。
今回は正解率を出してみます。

In [ ]:
y_pred = lgb_clf.predict(X_val)
accuracy_score(y_val, y_pred)
Out[ ]:
0.9722222222222222

検証データでの正解率は約97%でした。

特徴量の重要度の可視化

LightGBMでは学習したモデルに各特徴量の重要度が保存されます。
そちらを可視化して、どの特徴量がクラスの分類に影響が大きいかを見ることができます。

In [ ]:
lightgbm.plot_importance(lgb_clf)
Out[ ]:

まとめ

この記事ではLightGBMを使ったクラス分類をワインのサンプルデータを使って紹介しました。

LIghtGBMは、精度を出しやすいアルゴリズムですが、過学習に気を付ける必要があります。

また、特徴量の重要度も表示してモデルがどの特徴量を使って結果を出しているかを理解できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です