🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6991閲覧

catboostによる回帰予測のパラメータ調整

kouji_39

総合スコア164

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/28 05:20

catboostを使い、boston住宅価格の回帰予測を行いました。
catboostアルゴリズムの結果は、同様なアルゴリズムであるxgboost
より、mse値が大きく出てきます。
Xgboostのmse値:trainが0.68、testが16.64(パラメータ調整後)
catboostのmse値:trainが0.01、testが22.11(パラメータ調整後、
iterations=2000, learning_rate=0.05, depth=4が最適値)
ご助言等をお願いいたします。

1.該当コード

#python3 %matplotlib inline import matplotlib.pyplot as plt import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score !pip install catboost -U from catboost import CatBoostRegressor import pandas as pd from sklearn.datasets import load_boston X, y = load_boston(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8,random_state=0) model = CatBoostRegressor(iterations=2000, learning_rate=0.05, depth=4) model.fit(X_train, y_train) # 訓練データ、テストデータの予測 y_train_pred = model.predict(X_train) y_test_pred = model.predict(X_test) # 正解と予測のMSEを計算 print('MSE train: %.2f, test: %.2f' % ( mean_squared_error(y_train, y_train_pred), mean_squared_error(y_test, y_test_pred))) # 残差プロット plt.figure(figsize=(8,4)) #プロットのサイズ指定 plt.scatter(y_train_pred, y_train_pred - y_train, c='red', marker='o', edgecolor='white', label='Training data') plt.scatter(y_test_pred, y_test_pred - y_test, c='blue', marker='s', edgecolor='white', label='Test data') plt.xlabel('Predicted values') plt.ylabel('Residuals') plt.legend(loc='upper left') plt.hlines(y=0, xmin=-10, xmax=50, color='black', lw=2) plt.xlim([-10, 50]) plt.tight_layout() plt.show()

2.自分で試したこと
iterations=2000, learning_rate=0.05, depth=4については、
パラメータ調整し、以下のmse値を得た。
catboostのmse値:trainが0.01、testが22.11
しかし、質問内容でもあるように、同様なアルゴリズムであるxgboost
より、mse値が大きく出てきます。
Xgboostのmse値:trainが0.68、testが16.64(パラメータ調整後)

catboostではtrain値が小さく出てきており、過学習しているのではと感じます。
こういった過学習対策するcatboostに効果的なパラメータ調整が必要
と感じます。ご指導をお願いいたします。

3.補足情報(FW/ツールのバージョンなど)
開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

特に不具合は無いように見えます。厳密に言うと過学習していますが影響は軽微です。

train_lossを過剰に気にするよりはtest_lossを見たほうがよく、このくらいは誤差だと思います。実際に、random_state=0を切って何回か実行してみると、test_lossが10未満な場合が多く、今回のtest_lossはかなり運が悪かったケースに思えます。

あえて2点ほどコメントすると、以下があります。

  • model.fit(X_train, y_train, eval_set=(X_test, y_test)) と学習の時に検証データをセットしましょう。これによりtest_lossが最小の学習結果を得ることができます。random_state=0を入れてやってみると、793イテレーションで最小値になっています。よって、厳密にはこれ以降の2000イテレーションまでは「過学習」していることになります。test_loss値としては若干の改善にとどまるので、「影響は軽微」と冒頭に記載しました。
  • learning_rateが初期値より高いです。learning_rateが高いと過学習しやすいです。これも初期値にしてあげると、若干test_lossが改善します。

投稿2021/02/28 09:19

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouji_39

2021/02/28 22:15

toast-uzさん、回答ありがとうございます。 1. model.fit(X_train, y_train, eval_set=(X_test, y_test))で、学習時に検証データをセット した場合、mse値は、train=0.02、test=22.09となりました。ほぼmse値は変化なしです。 2. learning_rateを初期値である0.03にしてみる。(1.の検証データセットに加えて実施) mse値は、train=0.54、test=23.68となりました。若干ですがmse値は大きくなりました。 3. l2_leaf_reg値を変化させていた事例もあったので、l2_leaf_regを1,3,7と変化させました。 (1.と2.の改善はしていない状態でl2_leaf_regを変化)l2_leaf_reg=7のmse値がベストですが、 mse値は、train=0.06、test=23.09となりました。 他のXGBoostやlightBGMのライブラリに比べ、CatBoostはパラメータ調整でのmse値変化が少ない ようです。「変数間の相互作用が重要なケースで高い精度が出るライブラリ」という解説がありました。 また、XGBoostやlightBGMに比べ、分析コンペでの使用例は少ないようです。 引き続き、改善方法を試行してみたいです。何か、情報があれば、お願いいたします。
jbpb0

2021/03/01 09:38

質問者さんへ https://datachemeng.com/gradient_boosting/ から辿れるgithubのコードに、optunaで勾配ブースティング(scikit-learn、XGBoost、LightGBM)のハイパーパラメータを最適化するコード例があり、回帰ではボストン住宅価格データを使ってます これにCatBoost対応を追加して、比較してみたらいかがでしょうか?
kouji_39

2021/03/01 15:09

jbpb0さん、助言をありがとうございます。 早速、CatBoost対応を追加してみました。誤差評価をrmse(二乗平均平方誤差)で比較すると、 scikit-learn(3.45)、XGBoost(3.78)、CatBoost(4.24)、LightGBM(4.31) となりました。なお、optunaでのハイパーパラメータ最適化のコード例が見つからなく、 交差検証を使って勾配ブースティング(scikit-learn、XGBoost、LightGBM)の3例を しているもので、比較しました。 optunaでのハイパーパラメータ最適化のコード例を示していただけると助かります。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問