はじめに
42の課題で、ロジスティック回帰の再実装をペアと一緒に二人で作成したため、その備忘録として書いています。
課題全体の解説というわけではない点についてはご了承ください。
作成したものはこちらにあります。
また42の他の活動についてはこちらにありますので、42自体に興味がある方はぜひこちらもどうぞ。
ちなみに前回解いた課題の記事はこちらになります。
作ったもの
ということで作ったものは、ロジスティック回帰と、あとはデータの統計情報などを表示するdescribeと、ヒストグラム、散布図、ペアプロットになります。
ただ、ロジスティック回帰以外はペアの方が作ってくださったので、ここにはロジスティック回帰についてだけ書こうと思います。(まぁペアの方はロジスティック回帰も作っているのですが)
ちなみに私が作成したロジスティック回帰は、冒頭にあげたレポジトリ内のこちらにあります。
ロジスティック回帰について
ということで私が作ったロジスティック回帰についてですが、詳細についてはこちらを見ていただくのがいいかと思います。
簡単にですが説明しておくと、ロジスティック回帰とはクラス分類に使われるモデルで、もっとも基本的なものは、2つのクラスに分類するタイプのものになります。
中身はシンプルで、多項式の出力に、最終的な出力が0~1になるように関数(シグモイド関数)がついている構造のもので、0に近ければA!、1に近ければB!のように分類をします。
ちなみに途中で書くのをやめてしまいましたが、ロジスティック回帰までは書いているので、私の以下の記事もはっておきます。(露骨な宣伝)
ロジスティック回帰で多クラス分類
今回作成したものは、このもっとも基本的なロジスティック回帰を組み合わせて、多クラス分類をしたものになります。
多クラス分類化させるためには、主に以下の2つの方法があります。
- ロジスティック回帰を複数使う(One vs Rest)
- 多項ロジスティック回帰
詳しくはこちらをご覧ください。
今回は課題の指定で、前者のOne vs Rest(One vs Allともいう)の方法で作成しました。
こちらは、例えばA, B, Cの3つに分類したいとしたら、以下の3つのロジスティック回帰モデルを作成するようなイメージになります。
- 「A」か「BかC」の2分類
- 「B」か「AかC」の2分類
- 「C」か「AかB」の2分類
ロジスティック回帰は出力が0~1になっていて、これは確率を表すと解釈できるので、この3つの中でもっとも確率が高い形で「Aです!」などと主張しているモデルを尊重するというのが、このOne vs Restになります。
※ One vs Restと呼ばれるものが必ず「確率が高いものを採用すること」かどうかはちゃんと調べていません。もしかしたら他の形で採用するタイプ(平均をとるとか?)もあるかもです
勾配降下法
また、今回は勾配降下法という最適化アルゴリズムを使って、モデルをトレーニングしました。
トレーニングといっても、つまり多項式の各係数を、ちゃんと分類できるように更新していったということで、その更新するアルゴリズムが、勾配降下法である、ということになります。
また、おまけとして、他の最適化アルゴリズムの実装もいたしました。(私はSGDとかバッチ使ったやつとかくらいですが、ペアの人はAdamとかも実装しています)
最適化アルゴリズムについての詳細はこちらをご覧ください。
細かい実装ポイント
また、細かい話になりますが、L2正則化や、データを分割して検証すること(train_test_split)や、重みの保存、標準化とか正規化、欠損値処理などの基本的な処置も再実装しています。
これらは今回の課題で対応すべき問題に限らず使うことができるようにするために、できるだけ分割して実装されています。
また、今回の問題に対応するためのクラス(Modelクラス)では、その再実装したものを組み合わせて前処理や学習、推論などができるようになっており、できるだけこのクラスから呼び出してmain関数をすっきりさせるような構成にしています。
おわりに
ということで今回作ったものとその概要の説明になりましたが、私は機会学習関連の仕事をしているため、そんなに苦労はなくこの課題はクリアできました。
とはいっても普段は組み込みに近い感じのお仕事なので、データ分析は最近は仕事ではあまりやっていないのですが……。
ちなみに以前、ゼロから作るDeep Learning 3 ―フレームワーク編 という本を読んで、さらに少しだけ改良した自分用のライブラリを作った経験があります。
このあともしばらくはこういったデータ分析関連の課題を42で行う予定ですが、どれも再実装課題であり、だいたいこの本をやっておけばとりあえず怖いものはないなという感じのようです。