Person:
- lightgbmを使って、二値分類したいです。元データは 0 or 1 のラベル、1536次元のfloatの構造です。データは500件あります。データのうち、10%はvalid用、もう10%はテスト用、80%は学習データとしてください。データは分布を考量して偏りがおこらないようにsplitしてください。pythonで学習の実装と、学習後にpredictする実装を書いてください。
ChatGPT:
- はい、以下がlightgbmを使って二値分類を行うためのPythonコードです。データの読み込みや前処理、データの分割はすでに完了しているものとします。
import lightgbm as lgb
import numpy as np
from sklearn.metrics import accuracy_score
# データを読み込み、分割する
X_train, y_train = ...
X_valid, y_valid = ...
X_test, y_test = ...
# LightGBM用のデータセットを作成する
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_valid, label=y_valid)
# パラメータを設定する
params = {
'objective': 'binary',
'metric': 'binary_logloss',
'boosting_type': 'gbdt',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1,
'n_jobs': -1
}
# モデルを学習する
model = lgb.train(
params,
train_data,
num_boost_round=1000,
valid_sets=[train_data, valid_data],
early_stopping_rounds=10,
verbose_eval=10
)
# テストデータで予測し、正解率を計算する
y_pred = model.predict(X_test)
y_pred_binary = np.where(y_pred > 0.5, 1, 0)
accuracy = accuracy_score(y_test, y_pred_binary)
print('Test accuracy:', accuracy)
上記のコードでは、LightGBM用のデータセットを作成しています。パラメータの設定は一例であり、適宜変更してください。モデルの学習では、early stoppingを用いて過学習を防止しています。最後に、テストデータで予測し、正解率を計算しています。
Person:
- 分割の実装も書いてください。
ChatGPT:
- 以下がデータの分割を行うPythonコードです。データのシャッフルや分布の調整、分割の割合などは適宜変更してください。
from sklearn.model_selection import train_test_split
# データを読み込む
data = ...
# ラベルと特徴量に分ける
X = data[:, 1:]
y = data[:, 0]
# データの分割を行う
X_train_valid, X_test, y_train_valid, y_test = train_test_split(
X, y, test_size=0.1, random_state=42, stratify=y
)
X_train, X_valid, y_train, y_valid = train_test_split(
X_train_valid, y_train_valid, test_size=0.1, random_state=42, stratify=y_train_valid
)
上記のコードでは、データを読み込んだ後、ラベルと特徴量に分けています。そして、train_test_split
関数を用いてデータの分割を行っています。test_size
引数でテストデータの割合を設定し、random_state
引数で乱数のシードを指定しています。また、stratify
引数で分布の調整を行っています。最終的に、学習データ、検証データ、テストデータをそれぞれX_train
、X_valid
、X_test
、y_train
、y_valid
、y_test
に格納しています。