ロバスト回帰

散布図を見ると、高価格帯で誤差が大きいのがありました。外れ値の影響を減らしたロバスト回帰を試してみましょう。

# 前回のプログラムの読込
%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より若干悪くなりました。
このことから、単純にロバスト回帰をしても、うまくいくとは限らないことがわかります

コメント

タイトルとURLをコピーしました