[latexpage]
今回は機械学習の分類問題に関する基礎知識を一問一答形式でまとめていこうと思います!
もし間違いがあれば指摘していただけると嬉しいです!
Q「2値分類の3種のアルゴリズム」
特徴量数$m$の2値分類問題に利用されるアルゴリズムを基礎的なものから順に列挙し、特徴を説明せよ。
A
パーセプトロン
パーセプトロンでは総入力$w^T{x}$が0以上のとき1、0未満のとき-1と判定します
重み$w$の学習は0や値の小さい乱数で初期化した後、トレーニングサンプル1つ1つに対し、$m$次元の重みを再計算します
$i$番目のトレーニングサンプルにおける、$j$番目の特徴量の重み$w_j$の変化量$\Delta{w_j}$を式で表すと以下の通りです
$\Delta{w_j}=\eta(y^i-y_p^i)x_j^i$
($\eta$:学習率,$y^i$:真のラベル,$y_p^i$:予測ラベル,$x_j^i$:$i$番目のトレーニングサンプルの内、$j$個目の特徴量)
ただし全ての$w_j$は同時に更新します
ADALINE
パーセプトロンの進化系
凸関数であるコスト関数$J(w)$を以下のように定義し、勾配降下法を用いて、コスト関数を最小にする重み$w$を求めます
$$J(w)=\frac{1}{2}\sum_{i} (y^i-{\phi}(z^i))^2$$
($z^i$:$i$番目のトレーニングサンプルに対する総入力,${\phi}(z^i)$:活性化関数を表しADALINEでは${\phi}(z^i)=z^i$を満たす線形活性化関数)
上式にシグマが含まれていることからわかるように、重みをサンプルごとに少しずつ変化させるのではなく、常に全サンプルに基づいて大局的最小値に近づいていく方法でとります
ロジスティック回帰
ADALINEの進化系
総入力に対しクラスラベルを予測するだけでなく、 以下のシグモイド関数で定義される活性化関数${\phi}(z^i)$を用いて、そのクラスラベルである確率まで算出します
$${\phi}(z^i)=\frac{1}{1+e^{-{z^i}}}$$
補足
パーセプトロンやADALINEでは予測の際に、総入力の正負の値によって-1と1をとるステップ関数を考えました
これを確率で言い換えると、総入力の値が大きければ大きいほど1をとる確率が高かったと言えそうですよね
そこでシグモイド関数を用いると、総入力の値に対応する、クラスラベルが1である確率を算出することが出来ます
最終的には、その確率が0.5以上か以下(総入力でいうと0以上か以下)で2値分類を行います
また重みを計算するためのコスト関数も確率で考えています
具体的には$y^i=1$の時は${\phi}(z^i)$が、$y^i=0$の時は$1-{\phi}(z^i)$がそれぞれ出来るだけ大きくなって欲しいです
そこで最大化したい尤度を上記の同時確率を全サンプルで掛けた値で定義します
$$\prod_{i} (\phi}(z^i))^{y^i}(1-\phi}(z^i))^{1-y^i}$$
コスト関数は最小化したいので、対数尤度にマイナスをつけた値で定義すると
$$ J(w)=\sum_{i} [-y^{i}log({\phi}(z^i))-(1-y^i)log(1-{\phi}(z^i))] $$
あとはADALINEと同じように勾配降下法を用いていきます
Q「勾配降下法における素早い収束」
勾配降下法による学習において素早く収束させるためにすべき工夫は?
A
特徴量のスケーリング
スケーリングの有名な手法の1つに標準化があります
標準化では各特徴量の平均が0、標準偏差が1にすることで、最適解を見つけるまでのステップ数を少なくすることが可能です
学習データをtrainデータとvalidデータに分け、それぞれを標準化するときは、どちらもtrainデータの平均値と標準偏差を用います(互いに値を比較できるようにするため)
Q「バイアスとバリアンスについて」
バイアスが低いとバリアンスが低いとは?
またそれらのトレードオフが成り立つのはどういうとき?
A
トレーニングデータセットの内、異なるタイプセットごとに学習モデルを構築しテストデータで予測を行うとします
このとき、バイアスorバライアンスが低いとは以下の意味です
バイアスが低い→予測値の平均(単位学習モデルあたりの予測値)が真の値に近い
バライアンスが低い→複数の学習モデルでの予測値のばらつき度合いが低い
またテストサンプルの一つに注目して(単位サンプルあたりをイメージして)、よくダーツの例に例えて説明されます
その際の用語の対応関係は以下の通りです
現実 | ダーツ |
学習モデルにテストサンプルを突っ込む | ダーツを投げる(学習モデルの数だけ) |
予測値 | ダーツの刺さった位置 |
真の値 | ブル |
バイアスが低い | 複数のダーツが平均的にはブルに刺さってる |
バライアンスが低い | 複数のダーツのグルーピングが良い |
またデータにある程度ばらつきがある場合、バイアスとバライアンスのトレードオフが成り立ちます
これは学習不足と過学習に対応させると理解しやすいです
学習不足
単純な学習モデルなので、タイプセットを変えた学習モデルで予測を行っても予測値が真の値に近づかない(正解率は上がらない)が、予測値はだいたい同じ値を取る
=高バイアスかつ低バライアンス
過学習
複雑な学習モデルなので、タイプセットを少しだけ変えた学習モデルであっても、予測値がばらついてしまうが、平均的(単位学習モデルあたりの予測値)は真の値に近づく
=高バライアンスかつ低バイアス
Q「エンコーディングの違い」
ラベルエンコーディングとone-hotエンコーディングの違いは?
またどう使い分ける?
A
カテゴリカルな変数に対し、
各カテゴリを0,12,3,4...と単に数字に変換するのがラベルエンコーディングです
そのため、追加するカラムは1つで済みます
一方、one-hotエンコーディングは各カテゴリをone-hotベクトル(特定の要素だけ1で他が全て0のベクトル)で置き換えます
そのため、追加するカラムはカテゴリ数分だけ増えることになります
カテゴリ数が2つだけのときはラベルエンコーディングを用いることが多いです
Q「欠損値の取扱い」
学習データの欠損値の基本的な対処法は?
A
XgBoost
xgboostでは欠損値をそのまま突っ込んでもよしなにやってくれます
ただロジスティック回帰やNeural Networkのようにxgboost以外を用いる場合は以下のようにカテゴリ変数と数値変数で扱い方をかえると良いです
カテゴリ変数
欠損値を新たなカテゴリに追加します
よってカテゴリ数がn個だった場合、カテゴリ数をn+1個に増やした後に、one-hotエンコーディングに突っこむことになります
数値変数
定番の平均値or中央値で欠損値を埋め、精度が良い方を選びます
そのままだと欠損値であったという特徴が考慮されないので、新たな2値変数「欠損値かどうか」も特徴量に加えると良いです
Q「PR曲線」
PR曲線ってなんのこと?
A
Precision(縦軸)-Recall(横軸)曲線のことです
顧客データの中から優先してアプローチすべき顧客を選ぶシステムや動物の写真データの中から猫の画像だけを選び出す検索システムなど、検索をかけて特定のサンプルを抽出するシステムを評価する際に用いることができます
Precision(適合率)
抽出した特定サンプル数/検索結果数(判定数)
です
つまり検索結果の中に抽出したかった特定のサンプルがどれくらい含まれるかを表します
Precisionが高いということは「検索による無駄が少なかった」ということになります
Recall(再現率)
抽出した特定サンプル数/全特定サンプル数
です
つまり全特定サンプル数の内どれくらい抽出できたのかを表します
Recallが高いということは「検索による取りこぼしが少なかった」ということになります
両者の関係性
互いにトレードオフの関係にあります
例えばすべてのサンプルを検索して、全サンプルを特定のサンプルだと判定すれば再現率は1になりますが、適合率は下がりますよね
(どれくらい下がるかはサンプルによる)
つまり、
ある判定のPrecisionが高いがRecallが低い
→無駄撃ちは少ないが取りこぼしの多い判定である
ある判定のRecallが高いがPrecisionが低い
→取りこぼしが少ないが無駄撃ちが多い判定である
ということが出来ます
また2値分類問題(AorB)でロジスティック回帰などを用いた際に、Aである確率が高い順にランキングを作成し、注目するものを変化させてPR曲線を引けます
PR曲線の下の面積AUC (Area Under the Curve)が高ければ高いほうが良いです