LoginSignup
38
47
記事投稿キャンペーン 「AI、機械学習」

[機械学習]データ用意してrunするだけで10種類の回帰モデルを作成するコード

Last updated at Posted at 2023-11-11

ノーコードツールが流行っていますが、パラメータチューニングなど痒いところに手が届かないケースが見られます。

本コードは機械学習で回帰モデルを自動で作成します。
モデルは10種類で、簡単なパラメータチューニングも行います(ガウス回帰を除く)

実行手順
①csvファイルにデータを格納して(A列目:ID、B列目:目的変数、C列目移行:説明変数)、google colaboratoryにアップロードする
②google colaboratoryに以下のコードをコピペしてrunr

今回はsklearn.datasetsを用いてデータを作成しました(""regression_data.csv"")

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso, Ridge, ElasticNet
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.svm import SVR
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score

# CSVファイルからデータを読み込み
df = pd.read_csv("regression_data.csv")

# 特徴量Xと目標変数yを定義
X = df.iloc[:, 2:]
y = df.iloc[:, 1]

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 特徴量のスケーリング
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

models = {
    "Lasso": Lasso(),  # L1正則化を使用した線形回帰
    "Ridge": Ridge(),  # L2正則化を使用した線形回帰
    "ElasticNet": ElasticNet(),  # L1とL2正則化の両方を使用した線形回帰
    "Random Forest": RandomForestRegressor(random_state=42),  # 複数の決定木を組み合わせたアンサンブル回帰
    "XGBoost": XGBRegressor(random_state=42),  # 勾配ブースティングに基づく強力なアンサンブル回帰
    "LightGBM": LGBMRegressor(random_state=42),  # XGBoostと似ているが、より高速な勾配ブースティングアンサンブル回帰
    "Linear SVM": SVR(kernel='linear'),  # 線形カーネルを使用したサポートベクターマシン回帰
    "RBF SVM": SVR(kernel='rbf'),  # 放射基底関数(RBF)カーネルを使用したサポートベクターマシン回帰
    "Polynomial SVM": SVR(kernel='poly'),  # 多項式カーネルを使用したサポートベクターマシン回帰
    "Gaussian Process": GaussianProcessRegressor(kernel=C(1.0, (1e-3, 1e3)) * RBF(10, (1e-2, 1e2)), n_restarts_optimizer=10, random_state=42)  # カーネルに基づくガウス過程回帰
}

# 各モデルのハイパーパラメータグリッド
param_grids = {
    "Lasso": {'alpha': np.logspace(-4, 1, 50)},
    "Ridge": {'alpha': np.logspace(-4, 1, 50)},
    "ElasticNet": {'alpha': np.logspace(-4, 1, 50), 'l1_ratio': [.1, .5, .7, .9, .95, .99, 1]},
    "Random Forest": {'n_estimators': [100, 200, 300], 'max_depth': [10, 20, 30]},
    "XGBoost": {'n_estimators': [100, 200, 300], 'max_depth': [3, 5, 7]},
    "LightGBM": {'n_estimators': [100, 200, 300], 'max_depth': [-1, 10, 20]},
    "Linear SVM": {'C': [0.1, 1, 10]},
    "RBF SVM": {'C': [0.1, 1, 10], 'gamma': [0.001, 0.01, 0.1]},
    "Polynomial SVM": {'C': [0.1, 1, 10], 'degree': [2, 3, 4]},
    "Gaussian Process": {}  # ガウス過程回帰のパラメータチューニングは一般的ではないため空
}

# 各モデルの設定、パラメータチューニング、訓練、評価
tuned_results = []
plt.figure(figsize=(15, 10))

all_predictions = {}

for i, (name, model) in enumerate(models.items(), 1):
    grid_search = GridSearchCV(model, param_grids[name], cv=5)
    grid_search.fit(X_train_scaled, y_train)
    best_model = grid_search.best_estimator_
    predictions = best_model.predict(X_test_scaled)
    
    # 予測結果を辞書に保存
    all_predictions[name] = predictions

    mse = mean_squared_error(y_test, predictions)
    r2 = r2_score(y_test, predictions)
    
    # チューニング後の結果を保存
    tuned_results.append([name, grid_search.best_params_, mse, r2])

    # 個別の散布図
    plt.subplot(3, 4, i)
    plt.scatter(y_test, predictions)
    plt.title(name)
    plt.xlabel("Actual Values")
    plt.ylabel("Predicted Values")

# 全体の散布図
plt.subplot(3, 4, 12)
for name, predictions in all_predictions.items():
    plt.scatter(y_test, predictions, label=name)
plt.title("All Models")
plt.xlabel("Actual Values")
plt.ylabel("Predicted Values")
plt.legend()

plt.tight_layout()
plt.show()

# チューニング後の結果をCSVファイルに保存
tuned_results_df = pd.DataFrame(tuned_results, columns=["Model", "Best Parameters", "MSE", "R2"])
tuned_results_df.to_csv("model_performance_with_tuning.csv", index=False)

実行すると、R^2値、MSE、予測結果が出力されます
ノイズの少ないデータを用いたので、線形モデルが良さそうです。
スクリーンショット 2023-11-11 12.36.34.png

38
47
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
47