LightGBM
2値分類
2値分類
(Jupyter Lab などで、順にコードを実行することで動作)
初期準備 データ準備 モデル作成〜訓練 評価
・初期準備
・データ準備
・モデル作成〜訓練
・評価
2値分類
2値分類
(Jupyter Lab などで、順にコードを実行することで動作)
初期準備 データ準備 モデル作成〜訓練 評価
・初期準備
import lightgbm as lgb
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
plt.style.use('dark_background')
2値分類に戻る
・データ準備
data = load_breast_cancer()
print(data.keys())
print(data.data.shape, data.target.shape)
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, stratify=y_train)
2値分類に戻る
・モデル作成〜訓練
Parameters(外部リンク):https://lightgbm.readthedocs.io/en/latest/Parameters.html
params = {
# 目的関数(binary, multiclass, regression, cross_entropy, etc)
'objective': 'binary',
# 各特徴量の最大分割数(default=255, 大->精度UP & 過学習)
'max_bin': 255,
# 各決定木の分岐最大数(default=31, 大->精度UP & 過学習)
'num_leaves': 31,
# 学習率(default=0.1, 小->緩やかに精度UP & 時間長)
'learning_rate': 0.1,
# 木の深さ(-1:制限なし)
'max_depth': -1,
# 葉の最少データ数(default=20)
"min_data_in_leaf": 20,
"early_stopping_rounds": 50,
"verbosity": -1,
"random_state": 0,
}
train_data = lgb.Dataset(X_train, label=y_train)
val_data = lgb.Dataset(X_val, label=y_val)
model = lgb.train(
params,
train_data,
num_boost_round=200, # default=100
valid_names=['train','valid'],
valid_sets=[train_data,val_data],
)
pred = model.predict(X_val, num_iteration=model.best_iteration)
pred = np.where(pred >= 0.5, 1, 0)
print('\naccuracy:', accuracy_score(y_val, pred).round(3), '\n')
# パラメータ確認
# print('params:\n', model.params, '\n')
print('Done!')
2値分類に戻る
・評価
# テストデータ
pred = model.predict(X_test, num_iteration=model.best_iteration)
pred = np.where(pred >= 0.5, 1, 0)
print('accuracy:', accuracy_score(y_test, pred).round(3), '\n')
# 特徴量重要度
importances = pd.DataFrame({'feature_name': data.feature_names,
'feature_importance': model.feature_importance()})
importances.sort_values('feature_importance', ascending=False, inplace=True)
print(importances, '\n')
# 特徴量重要度上位をグラフ化
fig, ax = plt.subplots(figsize=(12,5))
ax.bar(importances.feature_name, importances.feature_importance)
fig.autofmt_xdate(rotation=45)
ax.set_title('Feature Importance');
2値分類に戻る