前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/05 11:23
2019/03/05 23:51
2019/03/08 08:24