非情報系、非理系の人にもわかりやすいけど、厳密に言うと正しくなくて、でもG検定の問題を回答するには十分な理解というコンセプトでG検定に出てくる統計学的分手法(主に回帰と分類)のアルゴリズムやモデルをまとめました(ニューラルネットワーク関係は別記事でまとめます)。

こういうことって数学的に理解することが正しいアプローチだと思うのですが、それだとまず数学のお勉強からになってしまうので、このページでは図や具体例を使ってあくまで感覚的に理解することを目指します。一部中学レベルの数学を使うことがありますがご容赦ください・・・。

 

ニューラルネットワークではない統計学的な機械学習の手法

 

分類

 

分類とは、2つもしくは、複数のグループが存在する中で、どのグループに属するのかわからないモノをその特徴を表すデータから予測するというものです。

例えば数千人の栃木県民と群馬県民と茨城県民のデータ(好きな食べ物や、好きな曲のジャンル、体重、身長など)があるとします。僕は栃木で育ちましたが、正直言って北関東民は文化的にはだいたい同じなので、誰がどこの出身なのかパっと見ではわかりません。

そこで、分類の手法を使うと各県民の微妙な傾向を自動的に分析し、得られた傾向をもとにどの県の人かわからない人(記憶喪失?)をその人のデータから当てることができます。

 

サポートベクターマシン(SVM) [教師あり]

1963年に発表されたので第一次AIブーム時の技術です。

二つのグループに属する物事をあるパラメータ(体重でも、大きさでも、お金でもなんでもOK)で並べてグラフ上にプロットし、一番よく分けらるところに線を引いて、どっちのグループに属するのかわからないものを分類するという方法です。

なんのこっちゃ、という方は犬と猫を分類するときのことを思い浮かべてください。

例えば足の速さと体長で数種の猫(アメショーとかマンチカン)と数種の犬(シバとかトイプーとか)を分ける線を書くとします(例えがよくないですね笑)。この時線と両グループの線に一番近い点(サポートベクトル)との距離(マージン)が犬と猫とで最大になるような線を引くようにします。

このあらかじめ分類が分かっているデータを教師用データといいます。教師用データからそれぞれのグループの傾向をつかんで、分類が分からないデーターが来た時にそれがどっちの分類か当てるわけです。

このグラフの上にペキニーズという猫か犬かわからない動物(よく見れば犬ってわかる)の特徴をプロットします。すると犬側に来るのでペキニーズは犬とわかります。

 

 

この方法では線形なもの(直線で分けられる単純なもの)しか分けられません。しかし、1992年にカーネル法というものが発表され非線形なもの(例えば楕円やもっと複雑な関数)でも分けらるようになりました。

 

 

kNN法 [教師あり]

k-nearest neighborの略で、日本語に訳したら「k番目までに近い隣人法」ですね。そのデータにk番目までに近いデータのグループは何かを調べて、一番属しているのが多かったグループがそのデータのグループになるという方法です。

例えばアビシニアンという種類の動物がいます。その特徴を先ほどのグラフにプロットし、近傍の5点は猫が3種、猫が2種だったとします。すると多数決でアビシニアンは猫だということが分かるのです(まぁ見れば猫だってわかりますが笑)。

kNN法は使えない?

 

 

 

決定木分析  [教師あり]

英語で言うと decision treeです。ロジックツリーみたいなものだと思ってください。

あるものを2つもしくは複数の条件でどんどん分けていき分類していくという方法です。図は動物をエラや肺といった身体的な特徴で分けていますが、これによって田中さんという方を哺乳類に分類することができます。田中さんが飼っているカエルのケロちゃんはエラがあって肺があるので両生類ですね。

 

決定木で田中さんが哺乳類だと わかる G検定

 

多分岐が可能なCHAIDや2分岐のみしか許されないCARTなどのモデルが存在します。

 

 

ランダムフォレスト  [教師あり]

決定木の進化版です。木(ツリー)が進化したから森(フォレスト)なわけです。

じゃぁどこら辺がフォレストでどこら辺がランダムなのかというと、ランダムフォレストでは学習用のデータセット(複数の教師用データがまとめられたもの)から一部をランダムに取り出して複数のブーストラップ標本と呼ばれる小さな学習データセットを作ります。

で、この学習データセットごとに決定木を作っていくわけですが、この方法だと一つデータセットからいくつもの決定木が作られるので、全体をフォレストと呼びます。

さらに、それぞれの決定木の分岐の指標となる特徴量(上の例ではエラや肺などの身体的特徴)もランダムで選ばれます。となると一つ一つのツリーは別のものになるわけですが、新しいデータを分類する際はすべてのツリーで分類を行って一番多かった分類を正しいことにします。この複数のモデル(ここでは複数の決定木)を並列的に学習させる方法をアンサンブル学習と呼び。データのうち一部を使って学習することをバギングと呼ぶそうです。

 

クラスタリング

 

これまでに挙げた分類は、すでに分類が分かっているデータを教師用データにしていました。ただ、クラスタリングではデータだけ与えられてそれらのデータにどういう分類があるのかはわかりません。じゃあどうやってデータを分類するかというと、データのまとまりからどういうグループ分けができるか探ります

下の図を見てください。なんとなく2つのグループが存在すると思いませんか?

 

 

こんな感じ。

 

 

でもし、新しいデータが出てきてプロットしたら(緑の点)明らかに青いグループに入りそうですよね。

 

 

これがクラスタリングです。

 

k-means法 [教師なし]

重心を計算することでデータをグループ分けする方法です。

まずは適当にグループ分けします

 

 

それぞれのグループの重心を求めます。

 

 

求めた重心に近い点がグループに所属するようにグループ分けをし直します。

 

 

ふりなおしたグループでまた重心を求めます。

 

 

その重心に近い点でまたグループ分けします。

 

 

この手順をグループ分けが変わらなくなるまで繰り返すと分類ができます。

教師データがなくてもこのように分類することができました。こんな感じで教師データがなしで学習をすることを教師なし学習と呼びます。

今回紹介する手法はほとんど教師あり学習ですが、教師あり学習は学習データを人間が作る必要があったり、そもそも人間が分類できないことは対応できないといった限界があったりするのですが、教師なし学習はそういう手間が少ないというメリットがあります。

 

 

回帰

 

分類は複数グループのデータでそれぞれの境界線を引くのに対して、回帰は一つのグループに対してコアとなる中心線を引きます。一番わかりやすい例が最小の2乗法だと思うのでまずはそこから行きましょう。

 

単回帰分析(最小の2乗法)  [教師あり]

回帰といったらこれです。大学で使ったことがあるという人も多いのではないでしょうか?ただ、これが考案された1805年は機械ではなく人間が計算していたので機械学習というよりは統計的な分析手法です。機械学習の世界では線形回帰とかリニアリグレッションとか言います。

やっていることはサポートベクターマシンの反対のことになります。

犬の足の速さと体長のデータをグラフにプロットし、その中心を通る線を引くのですが、前提として犬の足の速さと体長には相関があることが必要になります(実際に足の速と体長が関連しているかは知りません)。

で、サポートベクターマシンで引いた線は各データからの距離が一番大きくなる線でした。ただ、最小の2乗法では一番近い距離をとる線を引きます。

すると、ものすごく体長が長い新種の犬種が発見された場合その体長から大体の足の速さを予想することができるわけです。

 

線形回帰を最小の2除法でG検定する

 

ここから犬の足の速さは体長から一次関数「足の速さ=体長×α+β」という式で計算できることが分かりました。このように一つ(一次元)のデータから一つの値を予測するものを単回帰分析と呼びます。

 

重回帰分析 [教師あり]

先ほど、犬のデータは体長から足の速さを予測するというものでした。

でも、実際の犬のデータは体重とか平均心拍数とか足の長さとかめちゃめちゃいっぱいありますし、どれが足の速さに関係しているかわかりません(個人的には足の長さが重要だと思ってます。短足の犬種はトロトロ走るのが多いです。ダックスとかコーギーとか。逆にボルゾイみたいに足が長いと速くなります)。

ということで複数(多重・多次元)のデータから求めたい値を予測する重回帰分析が考え出されました。

これを視覚的に考えてみましょう。足の長さがx軸、心拍数がy軸、そして予想する値である足の速さをz軸にとるグラフを想像してください。

先ほど同じように最小の2乗法によって各データの中心を通る線を引きます。すると、2つのデータ(足の長さと心拍数)から足の速さを求める式が得られるわけです。

 

重回帰分析でG検定をクリアする

 

情報の重さという概念

さて、重回帰分析で得られた式を少し違う角度から見てみます。

例えば、ある会社の社員100人から得られた「基本給、手当、賞与に対する一年間の平均貯金額の関係」が次の式で表されるとします。

貯金額=基本給×0.2+手当×0.1+賞与×0.5-10 (万円)

この各項(基本給や手当)に掛かっている係数を機械学習の世界では重みと呼びます。

この重みは各々データの重要度を表していて、貯金額はボーナスの額に左右されやすいということが分かるわけです。データや信号はすべて等価ではなく重みによって重要なものと無視してよいものがあるという考え方はニューラルネットワークに関する話で何度も出てくるので覚えておいてください。

 

 

リッジ回帰・ラッソ回帰 [教師あり]

最小の2乗法は引いた線と各データをプロットした点の距離を最小にするような一次関数を求めました。

じゃぁこの最小にしなくちゃいけない距離を中学校で習った距離の公式で求めたらどうなるでしょうか?

$$距離 =\sqrt{ 2 (観測されたデータ-線上の一番近い点)^2}$$

距離の公式は2つの点を引き算した差を2乗して平方根をとった値でしたね。

先ほど最小の2乗法を言葉で「距離を最小にする線を引く」といっていましたが、これを数学的に表現するとすべての点の線との距離を計算し、その2乗の合計値がなるべく小さくなるような線の傾きと切片を求めるということになります。

この最小にしなくちゃいけない距離の合計の2乗は損失関数と呼ばれ、

$$損失関数L =\sum2 (観測されたデータ-線上の一番近い点)^2$$

で表されます。

 

損失関数は誤差関数と理解すればG検定は合格できる

 

この損失関数は重みと同様に機械学習の世界では何度も出てくるのですが、だいたいこの概念を勉強した人は損失???ってなります(僕は今でも思ってます)。

ということで損失関数を理解しやすくするために名前を変えて、これからは損失関数ときたら誤差関数と読むようにしましょう。厳密に言うと損失と誤差は違うのかもしれませんが、損失=誤差と理解していても問題ないです。たぶん、

なぜならこの損失が表しているものは回帰による推測値と現実の観測値の誤差を表しているからです。もしも誤差関数の値が0になる直線を引けたとします。するとその直線は現実を完璧に表すモデルであることを意味します(だからといってこの後のデータがすべてその線の上に乗るという確証はありませんが)。ちなみにこの損失関数、誤差関数という考え方はニューラルネットワークではコアとなる考え方ですので、こればっかりは数式で覚えておくことをお勧めします。

さて、ここでやっと本題のラッソ回帰、リッジ回帰の話に入ります。

先ほど、最小の2乗法で引いた線の傾きは情報の重みであり、その要素が予測したい値にどのくらい影響を与えるかを表しています。

 

 

傾きαが大きいほど影響力は大きくなりますが、そもそもその要素(例えば上の犬の足の速さに対する足の長さ)が自意識過剰?なだけで実はそんなに影響を与えてないかもしれないし、もしかすると一見関係なさそうな要素が微妙な調整をするには重要なのかもしれないわけです。

そこでラッソ回帰、リッジ回帰ではαの大きさを誤差関数に加えます。

すると誤差関数は小さくしなくちゃいけいわけですが、一見重要そうな要素も傾きが大きくなると誤差関数が大きくなってしまうのでそこまで大きくならないようなのっぺりとした直線を引くことになります。

 

リッジ回帰ラッソ回帰で傾きが減少し滑らかになる

 

この効果を問題では滑らかになるとかいう表現を使うので回帰で滑らかといったらリッジ・ラッソだと思ってください。わざわざこのような処理を行うのはモデルが教師データだけに通用するような極端な予測をするようになって他のデータに対応できなくなる過学習を抑制するためで正則化と呼ばれています。リッジ回帰とラッソ回帰の違いは傾きの大きさの計算方法が異なるところです。

リッジ解析はL2ノルム、普通の大きさ・ユークリッド(直線)距離を用いているのに対してラッソ解析はL2ノルム、マンハッタン距離・碁盤の目のように移動した距離を用いています。

scikit-learn+Pythonでこのリッジ解析・ラッソ解析を実装している人がいたのでどうぞ。

だいぶ疲れてきませんか?僕は心がもう折れそうです。ということでここからはもうちょっと軽めの説明にしようと思います。

 

 

ロジスティック回帰 [教師あり]

ここまでの回帰の説明で、グラフに引いてきた線はいつも直線でした。

でも、これは僕が楽するためにそうしてきただけであって、別にこの線は線形じゃない2次関数でもsinでもなんでもいいんです。じつは・・・(線形回帰ではなくなる)。

それは、学習するデータがどういう形なのかで決めればいいのですが、現実世界にはYesかNo、1か0見たいな問題が結構あります。

その時に引く線がロジスティック関数です。ちなみにニューラルネットワークではこの関数はシグモイド関数と呼ばれますが、その呼び方だと意味わかんないので覚えるときはS字関数って覚えるといいです。

 

ロジスティック回帰ではシグモイド関数が使われる

 

 

ロジスティック関数、シグモイド関数は0から急に立ち上がり1に近づいたら1を超えることがないという特徴を持っています。この特徴を生かすとある閾値で0と1に分かれるような事象にも対応することができるようになります。

 

ロジスティック回帰は実は分類

 

これをどんな時使うかというと、例えばウミガメは羽化する前の気温が低いとオスが生まれやすくて、高いとメスが生まれやすくなるそうです。生物学的なオスとメスという概念に中間は存在しません。つまり1か0なわけです。

このような連続した要素(気温)によって二つのグループに分かれるものをロジスティック関数で表せば、何度でオスが生まれて、何度でメスが生まれるか予想しやすくなります。

手法としては回帰なんですけど、やってることは生まれるヒナがオスグループに属するか、メスグループに属するかなんで分類っぽいですね。

下のブログにはロジスティック回帰を使って「体重2.5kg未満の新生児が出産される原因となる因子」を親の拙攻状態から分析している例が載ってます。

https://www.gixo.jp/blog/2492/

 

 

次元圧縮

 

この記事で挙げた例は分析に使われる要素が2個から3個でした。でも、機械学習を使えばもっとたくさんの要素を同時に分析することができます。ただ、人間がグラフやイメージを使って感覚で理解するのはどうやったって3個までが限界なのです。

それは私たちが3次元の世界を生きている動物でそれ以上の次元のものは理解することができないからなんですよね。逆に次元が少なければわざわざ機械に頼らなくても勘で予想することができます。

でも、多次元(多要素)のデータをどうしても視覚的に見たいということがあります。そんな時よく用いられるのが次元圧縮です。

 

 

主成分解析 (PCA)

次元圧縮で一番よくつかわれる手法が主成分解析、PCAです。

PCAは高次元のデータをそれよりも低い次元の空間に射影することでデータの次元を下げるという方法です。

何言ってるのかさっぱりだと思うので、人間でも認識できる2次元から、人間でも認識できる1次元にデータを圧縮してみます(実際2次元から1次元にデータを圧縮しても意味ないですけどね笑)。

こんな感じにあからさまに2つのグループに分かれているデータセットがあるとします。

2次元ならわざわざ解析する必要はないです。でも、もしこれが5次元とか100次元だったら図に書くことができないのでデータ分析の職人でない限り数字の羅列から2つのグループが存在することに気づけないわけです。

 

で、このグラフ上に一本一次元の線を引いてそこにすべての点を垂直に落とします(射影)。

 

 

一次元に圧縮したらさらにグループが分かりやすくなりますね(でもやっぱり2次元から1次元はありがたみが少ないで・・・)。

ちなみに、射影すればなんでもいいというわけではなくて、線の選び方を間違えるとデータの特徴が失われることがあります。下の図を見てください。

 

 

圧縮後はグループのまとまりが消えてしまいました。このように軸の取り方によっては情報が失われてしまうのですがPCAでは一番データがばらけやすい(分散が大きい)軸を使うことで情報が減ってしまうことを防ぎます。

軸の取り方はこちらに詳しく載っていました。

ちなみにどのくらい情報が残っているかは寄与率という値で表され、例えば寄与率が90%だったら10%の情報は消えてしまったことを意味します。

自分は50次元のデータを3次元や2次元に圧縮していましたが寄与率は75%ぐらいだったと思います(それぐらいでも役に立ちます)。

 

とりあえず、統計学的な手法はこれくらい勉強しておけばG検定のこの類の問題は解けるのではないでしょうか。ただ、G検定は深層学習がメインのテーマで回帰や分類よりもニューラルネットワーク(パーセプトロンやCNNなど)の方がたくさん出題されるので、今度はそっちの内容もまとめたいと思います。

最後に、間違っているところ、改善したほうがいいところ、追記したほうがいいところがありましたら教えていただけると助かります(あとわかりにくいところも)。

 

それでは。