def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

消滅しかけてたデータで線形回帰モデルを作る話。

前回、機械学習の勉強をしようと思ったが本が古かったのでデータセットが消滅していた。

でもググったらなんとかなった。という話をした。

 

defpediatric.hatenablog.comんで、その時紹介した本↓

 

この本での機械学習のところで、BostonHousingデータセットを使って線形回帰モデルを作る、というところがある。今回はその内容。

 

線形回帰って何なんやろな。

回帰モデルというのは1つの従属変数を1つ以上の独立変数で記述した関係式ということらしい。

y = w0 + w1x1 + w2X2 +w3x3 + …って感じなので

これがデータ分存在する感じ。

全てのデータで最も当てはまりの良いベクトル[w0 ; w1 ; w2 ; w3 ; …]を機械にお願いする。

 

具体的には今回は最小二乗法というやり方をやるみたいである。

全てのデータとの距離の2乗が最小になるy = f(x1,x2,x3,…)を見つける感じ。

全てのデータで数値を代入してw0,w1,w2,w3,w4を決めるということですか。

最小の値を取る時偏微分=0になるからそれで計算する、と。

まぁこの辺は機械がやってくれるから任せる。

 

自分はPyCharmを用いてコードを書いている(というかそれしかできない)のだが、

この本ではJupyter Notebookを使っているので、

 

%matplotlib inline のコードが出現する。

↑これの意味がわからなさすぎて30分くらい悩んだ。

結局Jupyter Notebookを使わないなら要らないみたい。

 

あとは前回のブログ通りデータセットはsklearnにないので、

load_boston()

とかやっても何も起きない。

 

なので

df=pd.read_csv("Boston.csv")

csvから読み込み。

df_data = df.loc[:, ["crim","zn","indus","chas","nox","rm","age","dis","rad","tax","ptratio","black","lstat"]]
df_label = df["medv"]

んでここなんだけど、dataframeから特定の範囲の列を抽出するのってこうしないとダメ?df[:"medv"]とかでできんのかなぁと思ったら案の定できなかった。

ここ短くできる人いたら教えてください、、

 

そのあとは特に変わりなく本に従っていくだけ。

model = linear_model.Ridge()

今回はL2正規化(Ridge回帰)でモデルを作成。

L2っていうのはL2ノルムのことで、ユークリッド距離と一緒です。

ユークリッド距離については九州大学数理・データサイエンスセンターが公開しているスライドがわかりやすい。(↓ここの「4.データ間の距離と類似度」ってやつ)

mdsc.kyushu-u.ac.jpっていうかこれに限らずこのスライドわかりやすくてとても良いです。

九州大学(か東北大学)入りたかった。学生時代偏差値あと10くらい高ければなぁ。

# 75%を学習用、25%を検証用データにするよう分割
X_train, X_test, y_train, y_test = train_test_split(df_data, df_label, test_size=0.25, random_state=100)

# 学習用データでパラメータ推定
model.fit(X_train, y_train)

# 作成したモデルから予測(学習用、検証用モデル使用)
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)

んでデータを学習用とテスト用に分けて、、、

# 学習用、検証用データに関して平均二乗誤差を出力
print('MSE Train : %.3f, Test : %.3f' % (mean_squared_error(y_train, y_train_pred), mean_squared_error(y_test, y_test_pred)))

# 学習用、検証用データに関してR^2を出力
print('R^2 Train : %.3f, Test : %.3f' % (model.score(X_train, y_train), model.score(X_test, y_test)))

モデルをチェック。

MSE Train : 20.632, Test : 27.977
R^2 Train : 0.741, Test : 0.716

 

となりました。

 

これを色々いじって性能をよくしていく、ということですなぁ。。

 

なんだろう、学生時代から数学の成績は悪かったんだけど学問としては好きだったので結構楽しい。

今日はここまで。

 

2023/4/15修正