1 回帰
回帰とは、実測値に対して、アルゴリズムを選択し、実測値を近似できるように当てはめることです。
近似結果を直線で表現する線形回帰と、直線ではない形で表現する非線形回帰があります。
線形回帰の有名なアルゴリズムは、
単回帰分析、重回帰分、Ridge 回帰(リッジ回帰)、Lasso 回帰(ラッソ回帰)
などがあります。
非線形回帰の有名なアルゴリズムは、
決定木(回帰木)、ランダムフォレスト、ニューラルネットワーク
などがあります。
1.1 正則化とノルム
まず、正則化とノルムについて。
正則化(regularization)とは、過学習を抑制するためによく用いられる手法で、
目的関数に、「正則化項(モデルの複雑性に罰則を科すための追加の項)」を導入します。
ノルムは、平面あるいは空間におけるベクトルの「長さ」の概念です。
3次元までは図で示すことができるんですが、4次元以上になると図で示すことができないんですよね。
でも数式上では表すことができるという、感覚的に理解するのがなかなか難しいものです。
L2ノルムとL1ノルムがあり、
L2ノルム $||w||_2$ = ベクトル成分同士の差の二乗和の平方根
L1ノルム $||w||_1$ = ベクトル成分同士の差の絶対値の和
で表されます。
#2 Lasso回帰
Ridge回帰やLasso回帰は、
・アルゴリズム的に説明性が高いものを使いたい時
・変数の量があまりにも多く、人間の目で確認するのが難しい時で、特徴量の取捨選択をしたい時
に使われるアルゴリズムです。
Lasso回帰は重回帰分析に対して、L1ノルムを使用して正則化を行う手法です。
式で表すと、このようになります。
$ L=||Xw-t||_2^2+\alpha||w||_1$
そもそも目的関数$L$が0に近い時の重みを求めるのが重回帰分析でした。
$||Xw-t||_2^2$はノルムで書いてあるのでややこしく感じますが、
$Xw$は入力変数×重み、つまり実測値$y$
$t$は目標値で、
重回帰分析でいう$L=(y-t)^2$と同じと思って大丈夫です。
(実測値-目標値)の2乗が0に近いほど、目的関数として良いということだけ抑えましょう。
Lasso回帰では、重回帰分析に$\alpha||w||_1$という正則化項が追加されます。
なので、$L$を0に近づけるためには、$||Xw-t||_2^2$の中の$w$が小さくなる必要があります。
すると$w$が小さくなり、0になるものも現れます(こうして0になった$w$を含んでいる状態をスパース性がある、という)。
0になる$w$がいくつか現れれば、結果的に変数の数を減らすことができる、というわけです。
2.1 Lasso回帰の実装
Lasso 回帰も今までと同様に scikit-learn で簡単に実装が可能です。
from sklearn.model_selection import train_test_split
x_train, x_test, t_train, t_test = train_test_split(x, t, test_size=0.3, random_state=0)
train_test_split
で分割したデータをもとに、Lasso回帰をします。
# モデルの定義
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=1)
# モデルの学習
lasso.fit(x_train, t_train)
Lasso(alpha=1)
# モデルの検証
print('train score : ', lasso.score(x_train, t_train))
print('test score : ', lasso.score(x_test, t_test))
ここで、alpha=1
としているのは、正則化の強さを表します。
正則化項の値が大きくなればなるほど、重み$w$が小さくなるということですね。
原理を理解して使うのは骨が折れますが、
とりあえず、使い方だけ覚えておくのでも問題ないかなと思いました。