Skip to content

Instantly share code, notes, and snippets.

@hotchpotch
Created April 24, 2023 04:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hotchpotch/81cf130279f4df9aeccd20e51678cff4 to your computer and use it in GitHub Desktop.
Save hotchpotch/81cf130279f4df9aeccd20e51678cff4 to your computer and use it in GitHub Desktop.

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_trainX_validX_testy_trainy_validy_testに格納しています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment