タイトルのテキスト
タイトルのテキスト
タイトルのテキスト
タイトルのテキスト

LightGBMでサイン波の予測

AI Python

t f B! P L
科学

LightGBMとは?

LightGBM(ライト・ジー・ビー・エム) は、Microsoft(マイクロソフト)が開発した機械学習ライブラリです。

 名前の由来は "Light Gradient Boosting Machine" の略です。

 とても高速で高精度な予測ができるため、実務やコンペティションで広く使われています。

 LightGBMの特徴:

 特徴       説明

高速学習              大量のデータを短時間で学習できます

高精度    少ない調整でも良い結果が出やすい

柔軟性    分類(例:スパムかどうか)にも回帰(例:家の価格)にも使えます

 〇 今回のテーマ:「回帰」とは?

**回帰(regression**とは、「数値を予測すること」です。

 分類(classification)との違い:

 問題       内容       モデル例

分類       このメールはスパムか?(はい or いいえ) XGBoost, LightGBMなど

回帰       家の値段はいくらか?(数値)       LightGBM, 線形回帰など

 今回は、サインカーブ(sin波)という「波の形をした数値データ」を予測する回帰問題に挑戦します。

 〇 使うもの一覧

ライブラリ           用途

numpy   数値データの操作

matplotlib            グラフの描画

sklearn   データの分割・評価など

lightgbm 機械学習モデルの構築と予測

 〇 ライブラリのインストール(最初に一度だけ)

ターミナルやコマンドプロンプトで以下を実行します:

  pip install lightgbm scikit-learn matplotlib numpy

〇 ステップ1:サイン波のデータを作る

import numpy as np

import matplotlib.pyplot as plt

 # 0までの範囲で1000個のxを生成(1列ベクトル)

X = np.linspace(0, 2 * np.pi, 1000).reshape(-1, 1)

 # y = sin(x) に少しだけノイズ(揺らぎ)を加える

y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

補足:

np.linspace は「指定範囲を等間隔で分ける関数」です。

 .reshape(-1, 1) はデータの形を「1000×1列」に整えます。

 np.random.normal(0, 0.1, ...) は正規分布に従うノイズを追加しています。

 〇 ステップ2:学習用とテスト用にデータを分ける

 from sklearn.model_selection import train_test_split

 # 学習用:80%、テスト用:20% に分割

X_train, X_test, y_train, y_test = train_test_split(

    X, y, test_size=0.2, random_state=42

)

補足:

テスト用データは、モデルの「予測精度を確認するため」に使います。

 〇 ステップ3LightGBMでモデルを学習させる

import lightgbm as lgb

 # LightGBM用データ形式に変換

train_data = lgb.Dataset(X_train, label=y_train)

 # モデルの設定(回帰)

params = {

    'objective': 'regression',    # 回帰問題であることを指定

    'metric': 'l2',               # 損失関数(平均二乗誤差)

    'learning_rate': 0.1,         # 学習のスピード

    'num_leaves': 31,             # 木の枝の数(複雑さ)

    'verbose': -1                 # ログ出力を抑える

}

 # 学習(100回繰り返し)

model = lgb.train(params, train_data, num_boost_round=100)

〇 ステップ4:予測してグラフで確認

# テスト用データで予測

y_pred = model.predict(X_test)

 # 結果をグラフに描画

plt.figure(figsize=(10, 5))

 # 正解データ(青)

plt.scatter(X_test, y_test, label='正解(sin値)', color='blue', alpha=0.5)

 # 予測データ(赤)

plt.scatter(X_test, y_pred, label='予測(LightGBM', color='red', alpha=0.5)

 plt.title("LightGBMによるsin関数の予測")

plt.xlabel("xの値")

plt.ylabel("sin(x)")

plt.legend()

plt.show()

〇 ステップ5:予測の誤差を数値で確認する

from sklearn.metrics import mean_squared_error

 # 平均二乗誤差(MSE)を計算

mse = mean_squared_error(y_test, y_pred)

print(f"平均二乗誤差(MSE):{mse:.4f}")

補足:

MSEが小さいほど、予測と正解のズレが少ない(=よく当たっている)ということになります。

 〇 全体コードまとめ

import numpy as np

import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

import lightgbm as lgb

 

# データ作成

X = np.linspace(0, 2 * np.pi, 1000).reshape(-1, 1)

y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

 

# データ分割

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

 

# LightGBM用のデータ形式に変換

train_data = lgb.Dataset(X_train, label=y_train)

 

# モデル設定

params = {

    'objective': 'regression',

    'metric': 'l2',

    'learning_rate': 0.1,

    'num_leaves': 31,

    'verbose': -1

}

 

# モデル学習

model = lgb.train(params, train_data, num_boost_round=100)

 # 予測

y_pred = model.predict(X_test)

 # 評価

mse = mean_squared_error(y_test, y_pred)

print(f"平均二乗誤差(MSE):{mse:.4f}")

 # グラフ描画

plt.figure(figsize=(10, 5))

plt.scatter(X_test, y_test, label='正解(sin値)', color='blue', alpha=0.5)

plt.scatter(X_test, y_pred, label='予測(LightGBM', color='red', alpha=0.5)

plt.title("LightGBMによるsin関数の予測")

plt.xlabel("xの値")

plt.ylabel("sin(x)")

plt.legend()

plt.show()

〇 最後に

今回は「LightGBMとは?」からはじまり、回帰問題でサイン波の予測を行いました。

 次のステップとして:

 他の波(cos、三角関数以外の関数)も予測してみる

 学習回数(num_boost_round)やパラメータを調整してみる

 実際の時系列データ(気温、株価など)に応用してみる

 といった発展も可能です。

koneka1208

koneka1208

自己紹介

自分の写真
エクセル好きの窓際会社員です。 エクセルの操作法や日々の会社で得た知見などを発信していきます。 よろしくお願いします。

ブログ アーカイブ

連絡フォーム

名前

メール *

メッセージ *

QooQ