0
0

モデルの精度以前に特徴量が適しているかを疑う

Last updated at Posted at 2024-05-02

私が保有している資格の一つにビジネス統計スペシャリストというものがあって、その内容にあまりにも実データと乖離している予測結果のデータは説明変数で説明しきれていないというものがありました。
それは重回帰分析を使った回帰とそれを使った分類で行っていましたが、せっかく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()

image.png

説明変数と目的変数を分ける

なお質的変数が入っているため多重共線性を考慮して削除します。

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()

image.png

交差検証

データを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()

image.png

説明変数と目的変数を分ける

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

image.png
R2を指標にしていますが、物凄く精度が悪いとマイナスの値になる事もあるそうです(値域は-∞から1)。
精度の分布を見てみると最小値など外れ値でボストン住宅価格のデータセットは平均値が低いですが下位25%から最大値まで見てみると精度の違いが明らかだと思います。

まとめ

よく精度を意識するならGBDT→ディープラーニング→他機械学習→数理モデルなど言われていますが、そもそもデータセットが正しいかどうかも検討しないといけません。

参考文献

回帰分析における評価指標―⑤R2(決定係数)― | 評価指標(回帰) | ブログ | SCSK AI AutoML

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0