私が保有している資格の一つにビジネス統計スペシャリストというものがあって、その内容にあまりにも実データと乖離している予測結果のデータは説明変数で説明しきれていないというものがありました。
それは重回帰分析を使った回帰とそれを使った分類で行っていましたが、せっかくPythonが使えるのでより精度の高い勾配ブースティング回帰木を使って目的変数に対して説明変数が妥当な変数なのかを実際に確かめてみようと思います。
やり方としては交差検証を使って満遍なくデータを調べてみようと思います。
乳がんデータセット
この乳がんのデータセットはScikit-LearnではなくlifelineというライブラリにあるRCTなのかコホート研究なのかのデータセットになります。
ここではガンのサイズについてを目的変数として他を説明変数にします。
ライブラリのインポート
from sklearn.model_selection import cross_val_score as cvs
from sklearn.ensemble import GradientBoostingRegressor as GBR
import pandas as pd
データの読み込み
df = pd.read_csv("gbsg2.csv")
df.head()
説明変数と目的変数を分ける
なお質的変数が入っているため多重共線性を考慮して削除します。
y = df["tsize"]
x = pd.get_dummies(df.drop("tsize", axis=1))
x = x.drop(["horTh_no", "menostat_Pre", "tgrade_II"], axis=1)
x.head()
交差検証
データを100分割して検証してみます。
model = GBR()
score = cvs(model, x, y, cv=100, scoring="r2")
df_score1 = pd.DataFrame(score).describe()
ボストン住宅価格のデータセット
次にScikit-Learnで用意されている回帰用データセットのボストン住宅価格のデータセットではどうなっているか見てみましょう。
データの読み込み
df = pd.read_csv("boston.csv")
df.head()
説明変数と目的変数を分ける
y = df["PRICE"]
x = df.drop("PRICE", axis=1)
交差検証
model = GBR()
score = cvs(model, x, y, cv=100, scoring="r2")
df_score2 = pd.DataFrame(score).describe()
df_score = pd.concat([df_score1, df_score2], axis=1)
df_score.columns = ["gbsg2", "boston"]
df_score
R2を指標にしていますが、物凄く精度が悪いとマイナスの値になる事もあるそうです(値域は-∞から1)。
精度の分布を見てみると最小値など外れ値でボストン住宅価格のデータセットは平均値が低いですが下位25%から最大値まで見てみると精度の違いが明らかだと思います。
まとめ
よく精度を意識するならGBDT→ディープラーニング→他機械学習→数理モデルなど言われていますが、そもそもデータセットが正しいかどうかも検討しないといけません。