散布図を見ると、高価格帯で誤差が大きいのがありました。外れ値の影響を減らしたロバスト回帰を試してみましょう。
# 前回のプログラムの読込
%run 3.ipynb
X.shape
from sklearn.linear_model import RANSACRegressor
# RANSACの作成
ran = RANSACRegressor(min_samples=int(len(X_train) * 0.9),
random_state=0)
# フィッティング
ran.fit(X_train, y_train)
# パラメータ(定数項と係数)の確認
float(ran.estimator_.intercept_), ran.estimator_.coef_
(-11.991, array([ 6.467, -0.548]))
# 予測値
y_pred = ran.predict(X_test)
# 決定係数
score = r2_score(y_test, y_pred)
float(score)
0.553
# 予測データ(y_pred)と真値(y_test)を描画
scatter(y_pred, y_test)
ロバスト回帰の手法には、いくつかありますが、ここでは、RANSAC(RAndom SAmple Consensus: sklearn.linear_model.RANSACRegressor
)を使います。
RANSACは、ランダムサンプリングに対しパラメーター推定を繰り返し、最も良い推定結果を出します。
基本となるモデルをbase_estimator
オプションで指定できます。省略すると、線形回帰(LinearRegression
)になります。min_samples
オプションで最小サンプル数を指定できます。ここでは、元のデータ数の90%にします。random_state
オプションを指定して、実行ごとに結果が変わらないようにします。
結果のモデルは、estimator_
に入りますので、パラメーターはran.estimator_.intercept_, ran.estimator_.coef_
のように確認できます。
決定係数を見ると0.553となり、単純な線形回帰の0.569より若干悪くなりました。
このことから、単純にロバスト回帰をしても、うまくいくとは限らないことがわかります
コメント