機械学習1
1.回帰問題
回帰問題とは、ある入力から出力の値を予測する問題を指す。機械学習の世界では、回帰問題と分類問題に大きく分かれる。
回帰問題の中でも、関数の勉強で中学で最初に出てくる1次関数の形で推定するものを線形回帰問題と言う。
線形回帰モデル-Boston Housing Data-をいじってみた。
skl_regression.ipynbを使う。内容は以下の通り。
・データセット(sklearn)をインポート
・データフレーム型(pandas)へ変換
・回帰分析
・モデルの検証(平均二乗誤差、R^2決定係数)
一連の計算の中で、RM(一戸当たりの平均部屋数)、CRIM(犯罪率)、AGE(築年数)からPrice(家の価格)を重回帰分析を推定する。
print(model2.coef_)
print(model2.intercept_)
[-0.21102311 8.0328382 -0.05224283]
-23.605561276868794
model2.predict(0.2, 7, 100)
array([27.35781896])
このとき、トータル506個のデータについて、Train(訓練)とTest(テスト)の割合を7:3で分割、推定した時の、相互の平均二乗誤差、R^2決定係数の傾向について調べてみた。
# 平均二乗誤差を評価するためのメソッドを呼び出し
from sklearn.metrics import mean_squared_error
# 学習用、検証用データに関して平均二乗誤差を出力
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 : 39.109, Test : 31.845
R^2 Train : 0.566, Test : 0.554
個人的には、線形回帰よりもむしろ、データをデータフレーム型へあてはめる一連の操作を理解できてためになった。
2.非線形回帰モデル
線形回帰では表現しづらい場合、非線形な構造を適用することで高い精度を得ることができる場合がある。
回帰関数として、基底関数と呼ばれる既知の非線形関数とパラメータベクトルの線型結合で表現される、基底展開法が用いられる。
基底関数の例として以下が挙げられる。
多項式
ガウス型基底
演習問題では、4次の多項式にノイズを加えたデータ分布に対して、1)カーネルリッジ回帰、2)1-5次の多項式による回帰を実施したときの当てはまり度合いを確認した。
カーネルリッジ回帰はほぼ正確に推定できている。多項式は、4次と5次(紫色)は一致しており、ほぼ正確に推定できているが、3次以下では当然ながら推定精度は低下する。
このように、様々な基底関数をつかって回帰式を作成できるが、そのときに未学習や過学習に陥ってないか確認することが重要になる。
未学習:学習データで推定したとき、十分小さな誤差が得られない。→「表現力が低いモデル」
過学習:学習データでは十分小さな誤差が得られるが、テストデータへ適用したとき、誤差が大きくなってしまう。→「表現力が高いモデル」
未学習対策としては、基底関数またはアルゴリズムを変える、説明変数のパラメーターの数を増やす、が挙げられる。
過学習対策としては、サンプル数を増やす、不要な基底変数を削除する、正則化法によって表現力を抑える、ことが挙げられる。
3.ロジスティック回帰モデル
通常の回帰分析で得られるような数値で予測とは異なり、複数の変数からある事象の発生の有無を確率的に予測する。
m次元パラメータの線形結合を入力としたシグモイド関数が出力となる。
補足すると、は各変数がxで表されるとき、事象(Y)が1になる確率である。
演習問題としてタイタニック号の乗客情報と(沈没時の)生死データより、(沈没時の)生死をロジスティック回帰モデルで推定するものだった。
最後のプロットでは、男性より女性の生存率が高い、女性の年齢別では年配の方が生存率が高い、男性の年齢別では若いの方が生存率が高いものでそれなりに推定できている。
少し前にテレビで女性を優先させて沈没時に船へ乗せているシーンがあったなぁ、と思い出した。