質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

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

Python

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

Q&A

解決済

1回答

2270閲覧

SVRにおけるスケーリング

fuma3

総合スコア17

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2019/03/05 09:12

前提・実現したいこと

kaggleのHousePricesに挑戦しています。
勾配ブースティングとSVRのスタッキングをしました。

そこで、SVRにおいてMinMaxScalerを使ったらスコアが上がりましたが、勾配ブースティングにおいては上がりませんでした。

なぜSVRだと効果があって、勾配ブースティングだと効果がないのか教えていただきたいです。

自分が書いたコード載せておきます。予測値出したり、スタッキングはまだしていないです。

Python

1import numpy as np 2import pandas as pd 3import seaborn as sns 4%matplotlib inline 5import matplotlib.pyplot as plt 6from sklearn.model_selection import train_test_split 7from sklearn.ensemble import GradientBoostingRegressor 8from sklearn.svm import SVR 9from sklearn.preprocessing import MinMaxScaler 10import numpy as np 11import pandas as pd 12import seaborn as sns 13%matplotlib inline 14import matplotlib.pyplot as plt 15from sklearn.model_selection import train_test_split 16from sklearn.ensemble import GradientBoostingRegressor 17from sklearn.svm import SVR 18from sklearn.preprocessing import MinMaxScaler 19 20#データの読み込み 21df_train = pd.read_csv("train.csv") 22df_test = pd.read_csv("test.csv") 23 24y_train = df_train["SalePrice"] 25train_id = df_train["Id"] 26test_id = df_test["Id"] 27train = df_train.drop(["Id", "SalePrice"], axis=1) 28test = df_test.drop(["Id"], axis=1) 29 30#欠損値の処理を行うためにデータをくっつける。 31all = pd.concat((train, test)).reset_index(drop=True) 32 33#欠損値の確認と表示 34null_counts = all.isnull().sum()[all.isnull().sum() > 0] 35 36#欠損値を含むインデックスのタイプを表示 37Dtypes = all[null_counts.index.tolist()].dtypes 38 39 40#Dtypesの中で、float64とobjectに分ける 41na_float_columns = Dtypes[Dtypes=="float64"].index.tolist() 42na_object_columns = Dtypes[Dtypes=="object"].index.tolist() 43 44#float64には0, objectにはNAを代入 45for i in na_float_columns: 46 all[i].fillna(0, inplace=True) 47for i in na_object_columns: 48 all[i].fillna("NA", inplace=True) 49 50 51#分析に使うために、ダミー変数作る 52New_all = pd.get_dummies(all) 53 54 55#欠損値の処理とダミー変数できたから、くっつけたデータを元に戻す。 56New_train = New_all[:train.shape[0]] 57New_test = New_all[train.shape[0]:] 58 59 60#目的変数が正規分布に従っているかチェック 61ax = sns.distplot(y_train) 62plt.show() 63 64#従っていないので、対数変換 65ln_y = np.log(y_train) 66ax = sns.distplot(ln_y) 67plt.show() 68 69訓練データ 70#ダミー変数をつくったNew_trainとSalePricesだけのln_yをテストデータと訓練データに分ける 71X_train, X_test, y_train, y_test = train_test_split(New_train, ln_y, random_state=0) 72 73#最良のパラメーターを探す。 74best_score = 0 75for max_depth in [1, 2, 3, 4, 5]: 76 for learning_rate in [0.01,0.03, 0.05, 0.07, 0.1]: 77 gbr = GradientBoostingRegressor(max_depth=max_depth, learning_rate=learning_rate, n_estimators=500, random_state=0).fit(X_train, y_train) 78 score_test = gbr.score(X_test, y_test) 79 if score_test > best_score: 80 best_score = score_test 81 best_parameters = {"max_depth" : max_depth, "learning_rate" : learning_rate} 82print("best_score : {}".format(best_score)) 83print("best_parameters : {}".format(best_parameters)) 84 85best_score : 0.9032482825982191 86best_parameters : {'max_depth': 3, 'learning_rate': 0.1} 87 88#勾配ブースティングでスコアをだす。 89gbr = GradientBoostingRegressor(n_estimators=500, max_depth=3, learning_rate=0.1, random_state=0).fit(X_train, y_train) 90print("Traing set score: {}".format(gbr.score(X_train, y_train))) 91print("Test set score: {}".format(gbr.score(X_test, y_test))) 92 93Traing set score: 0.9935239671523681 94Test set score: 0.9032482825982191 95 96#スケーリングする 97scaler = MinMaxScaler() 98X_train_scaled = scaler.fit_transform(X_train) 99X_test_scaled = scaler.transform(X_test) 100 101#最良のパラメーターを探す。 102best_score = 0 103for C in [0.001, 0.01, 0.1, 1, 10, 100]: 104 for gamma in [0.001, 0.01, 0.1, 1, 10, 100]: 105 svr = SVR(C=C, gamma=gamma).fit(X_train_scaled, y_train) 106 score_test = svr.score(X_test_scaled, y_test) 107 if score_test > best_score: 108 best_score = score_test 109 best_parameters = {"C" : C, "gamma" : gamma} 110print("best_score : {}".format(best_score)) 111print("best_parameters : {}".format(best_parameters)) 112 113best_score : 0.8590659245202418 114best_parameters : {'C': 1, 'gamma': 0.01} 115 116#svrのスコアだす 117svr = SVR(C=1, gamma=0.01).fit(X_train_scaled, y_train) 118print("Traing set score: {}".format(svr.score(X_train_scaled, y_train))) 119print("Test set score: {}".format(svr.score(X_test_scaled, y_test))) 120 121Traing set score: 0.929808431553013 122Test set score: 0.8590659245202418

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

SVMの場合は入力のベクトルをそのまま使って計算する要素があります。基本的に最適化問題なので、スケーリングした方が収束が良かったりもしますし、識別関数にもそのまま入力のベクトルが使われます。

Scikit-learnによるサポートベクターマシン
サポートベクターマシンを手計算して理解する - HELLO CYBERNETICS
SVMについて整理してみた。 - Qiita

勾配ブースティングは決定木のアンサンブル系の手法ですが、決定木はデータのスケールに依存しないという特徴があり、その特徴を引き継いでいます(アダブースト、ランダムフォレストなども同様の性質を持ちます)。

投稿2019/03/05 10:14

hayataka2049

総合スコア30933

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

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

fuma3

2019/03/05 11:23

わかりやすくありがとうございます! 少し話は変わってしまうのですが、 回帰の時に目的変数を対数変換して正規分布に近づけると精度が上がる理由について追加で教えていただきたいです。 可能でしたら、よろしくお願いいたします!
hayataka2049

2019/03/05 23:51

一般的として答えるのは難しいですが ・データにそういう関係があった ・モデルが正規分布を仮定していたか、そうでなくても正規分布に近いほうが学習しやすい性質だった ・線形に近づけたことで結果にシビアに影響する学習パラメータを減らせて汎化性能を上げられた あたりの複合要因ですかね。
fuma3

2019/03/08 08:24

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問