基礎編
代表的なアルゴリズム
線形回帰・決定木・ランダムフォレスト・GBDT・k 近傍法・SVM・ニューラルネットを 1 つずつ。表形式データで GBDT が強い理由、アンサンブル、解釈性との兼ね合い。
この記事の要点
- アルゴリズムはどれも「データから規則を決める手続き」で、得意なデータの形が違うだけです。
- 表形式のデータでは、勾配ブースティング木(GBDT)が第一候補になることが多いです。前処理に強く、複雑な関係も拾えます。
- 最初に単純なモデルでベースラインを作ります。比べる相手が無いと、良い数字なのかどうか判断できません。
まず一覧で
以下は代表的なアルゴリズムの早見表です。 このあと 1 つずつ、仕組みと向き・不向きを説明します。
| モデル | 考え方 | 向いている場面 |
|---|---|---|
| 線形回帰 / ロジスティック回帰 | 各特徴量に重みを付けて足し合わせる | 説明のしやすさが要るとき、データが少ないとき |
| 決定木 | 条件で枝分かれさせて分ける | ルールとして読みたいとき |
| ランダムフォレスト | 少しずつ違う木を多数作り、平均・多数決する | 手早く安定した精度が欲しいとき |
| 勾配ブースティング木(GBDT) | 前の木の間違いを次の木が補うように積み重ねる | 表形式データ全般。多くの場面で第一候補 |
| k 近傍法 | 似ている過去の事例を探して真似る | データが少なく、次元も少ないとき |
| サポートベクターマシン(SVM) | クラスの境目を、余白が最大になる位置に引く | 件数が中規模で、列が多いとき |
| ナイーブベイズ | 分類先ごとに特徴量が独立と仮定して確率を掛け合わせる | 文章分類など、とにかく速さが要るとき |
| ニューラルネットワーク | 層を重ねて複雑な関数を近似する | 画像・音声・文章など、生の信号を扱うとき |
線形回帰・ロジスティック回帰
もっとも素朴な形です。特徴量それぞれに重みを掛けて足し合わせ、 その合計を予測値とします。数値を当てるのが線形回帰、 合計を 0〜1 の確率に変換して「起きる / 起きない」を当てるのがロジスティック回帰です。
学習とは、この重みを決める作業にほかなりません。 重みが決まれば各特徴量の効き方を数字で示せるので、結果を人に説明しやすいのが最大の利点です。 ただし読み方は 2 つで違います。
- 線形回帰 … 「この特徴量が 1 増えると、予測値が◯だけ動く」とそのまま読めます
- ロジスティック回帰 … 1 増えたときに一定量動くのは確率ではなく対数オッズです。 確率がどれだけ動くかは今の水準しだいで、 50% 付近では大きく、0% や 100% に近いところではわずかしか動きません
重みが大きくなりすぎないように罰則を掛ける(正則化)と、 データが少ないときでも安定します。
- 得意 … 説明責任がある場面、データが少ない場面、 特徴量と結果の関係がおおむね直線的な場面
- 苦手 … 「ある値を超えると急に効く」ような関係、 特徴量どうしの掛け合わせ(自分で作って渡さないと表現できない)
- 注意 … 罰則の無い線形回帰なら、桁が違っても係数がそのぶん変わるので 予測は同じです。スケーリングが効いてくるのは、正則化の罰則を列ごとに公平にかけたいときと、 最適化を安定させたいとき、そして係数の大小をそのまま比べたいときです
決定木
「この特徴量が◯以上か」という条件でデータを 2 つに分け、 分けた先でまた別の条件で分ける ── これを繰り返して、 最後にたどり着いた区画の平均値や多数派を答えとします。 出来上がるのはフローチャートそのもので、 人が読んで理解できる形になります。
分ける条件は「分けたあとの各グループがなるべく同じ答えで揃うように」自動で選ばれます。 深く分けるほど学習データには合いますが、行き過ぎれば過学習です。深さの上限や、1 つの区画に最低何件残すかで歯止めをかけます。
- 得意 … ルールとして読みたいとき。 値の大小関係だけを見るのでスケーリング不要
- 苦手 … 単体では精度が伸びにくく、 データが少し変わるだけで木の形が大きく変わる(不安定)
この不安定さを、たくさん作って打ち消そうというのが次の 2 つです。
ランダムフォレスト
データの一部と特徴量の一部だけを使って少しずつ違う決定木を何百本も作り、 その予測を平均(分類なら多数決)します。 1 本 1 本は粗い木ですが、間違え方がばらけているので、 まとめると誤差が打ち消し合って安定します。
木を並列に作るだけなので学習は速く、 パラメータをあまり調整しなくてもそこそこの精度が出るのが強みです。 「まず何か動くものを」という段階に向きます。
- 得意 … 手早く安定した精度、外れ値や欠損への強さ
- 苦手 … 突き詰めたときの精度は GBDT に一歩譲ることが多い。 木が多いのでモデルの中身は読めない
- 主なパラメータ … 木の本数(多いほど安定するが遅くなる)、 木の深さ、1 本あたりに使う特徴量の数
勾配ブースティング木(GBDT)
こちらも木をたくさん作りますが、並列ではなく直列です。 まず 1 本目の木を作り、その予測が外した分(残差)を 2 本目の木に学ばせる。さらに残った誤差を 3 本目が埋める ──前の木の間違いを次の木が補う形で少しずつ精度を上げていきます。
1 本ずつの補正をどれだけ効かせるかが学習率で、 小さくするほど慎重に進むので木の本数が要ります (学習率を下げて本数を増やすのが定石)。 代表的な実装に LightGBM・XGBoost・CatBoost があり、 仕組みは同じ系統で、速度や欠損・カテゴリの扱いといった細部が違います。
なぜ表形式データで強いのか
- 前処理にあまり手をかけなくてよい… 値の桁がそろっていなくても、外れ値があっても、 分岐の条件で切るだけなので影響が小さい
- 「ある値を超えると急に効く」といった関係を素直に表現できる
- 特徴量どうしの組み合わせ(A が大きく、かつ B が小さいとき)を、深さのある木が自然に拾う
- 苦手 … 調整しだいで簡単に過学習する(検証データが必須)。 学習は直列なので、本数が増えると時間がかかる
- 主なパラメータ … 学習率、木の本数、木の深さ(または葉の数)、 1 つの葉に必要な最低件数
k 近傍法(k-NN)
学習らしい学習をしません。予測したいとき、過去のデータの中から似ている事例を k 件探し、 その答えの平均や多数決を返します。「似た条件のときはこうだった」を そのまま使う、いちばん直感的な方法です。
- 得意 … 仕組みが説明しやすい。データが少なく、 特徴量も少ないとき
- 苦手 … 特徴量が増えると「似ている」が意味を失う (次元の呪い)。 予測のたびに全データと距離を測るので、件数が増えると遅い
- 注意 … 距離で測るので、スケーリングをしないと 桁の大きい特徴量だけで「似ている」が決まってしまいます
サポートベクターマシン(SVM)
2 つのクラスを分ける境界線を引くとき、境界と、いちばん近いデータ点との余白(マージン)が最大になる位置を選びます。境目のぎりぎりにある少数の点だけが位置を決め、 遠くの点は影響しません。
まっすぐな線では分けられないデータも、 カーネルという仕掛けで「高次元に持ち上げてから直線で分ける」ことで扱えます (結果として、元の空間では曲がった境界になります)。
- 得意 … 件数のわりに特徴量が多いデータ、境界がはっきりしている問題
- 苦手 … 件数が数万を超えると学習が重い。 出力がそのままでは確率にならない。スケーリング必須
ナイーブベイズ
分類先を 1 つに決めたうえで見れば、特徴量どうしは互いに独立という(たいてい成り立たない)仮定を置く手法です。 この仮定のおかげで、分類先ごとに「その分類なら、この特徴量がこの値になる確率」を 別々に求めて掛け合わせるだけで済みます。 仮定は雑ですが計算が非常に軽く、文章の分類のように特徴量が大量にある場面では今でも実用的です。 ベースラインとして数秒で用意できるのが利点です。
ニューラルネットワーク・深層学習
入力に重みを掛けて足し、非線形の関数を通す ── この層を何段も重ねて、 複雑な関数を近似します。層を深くしたものが深層学習で、画像・音声・文章のような「生の信号」から特徴量そのものを学べるのが最大の強みです。
- 得意 … 画像・音声・自然言語、系列データ、 大量のデータがある問題
- 苦手 … 列がそろった表形式データでは、 手間のわりに GBDT を上回りにくい。データ量と計算資源を要求し、 中身の説明も難しい
- 注意 … スケーリングが要り、 学習率や層の構成など決めることが多くなります
アンサンブル学習 ── 複数のモデルを組み合わせる
1 つのモデルで当てにいくのではなく、いくつものモデルの予測をまとめて 1 つの答えにする考え方をアンサンブル学習と呼びます。 1 人の判断より、間違え方の違う複数人の多数決のほうが安定する、という発想です。
| 方式 | やること | 代表例 |
|---|---|---|
| バギング | データを少しずつ変えて多数のモデルを並列に作り、平均または多数決を取る | ランダムフォレスト |
| ブースティング | 前のモデルが間違えたところを次のモデルが補うように、直列に積み重ねる | GBDT(LightGBM など) |
| スタッキング | 種類の違うモデルの予測値を入力として、もう 1 段のモデルにまとめさせる | 線形モデル + 木 + ニューラルネット |
| 単純な平均・多数決 | 複数モデルの出力をそのまま平均する、投票させる | ブレンド |
つまりランダムフォレストと GBDT は、それ自体がアンサンブルです。 さらにその上で、種類の違うモデル同士を組み合わせることもできます。
ただし混ぜれば必ず良くなるわけではありません。 効果が出るのは、組み合わせるモデルの間違え方が違うときだけです。 よく似たモデルをいくつ足しても、同じ方向に間違えるので精度は変わりません。 代償として、学習・予測にかかる時間は増え、中身の説明はさらに難しくなります。
まずベースラインを作る
いきなり複雑なモデルを組むより、単純な方法で最初の 1 本を作るほうが結局は早く進みます。 「いつも多数派を答える」「平均値を答える」「1 つの分かりやすい指標で並べる」といった 素朴な方法の成績を先に測っておくと、そのあと作るモデルの数字が本当に価値のある改善なのかを判断できます。
比較相手が無いまま「正解率 92%」と言われても、それが良いのか悪いのかは分かりません。 実際、偏ったデータでは何も学習しなくても高い正解率が出ます。
解釈性と精度は、たいてい引き換え
線形モデルは「どの項目がどれだけ効いているか」を数字で説明できます。 木を何百本も積み上げたモデルは精度が出やすい代わりに、 中身をそのまま人が読むことはできません。 重要度や部分依存プロットといった道具で近似的に覗くことはできますが、説明が要る場面では、あえて単純なモデルを選ぶ判断もあります。
ハイパーパラメータ
学習の前に人が決める設定(木の本数・深さ・学習率など)をハイパーパラメータと呼びます。大きくすれば良くなるものではありません。 木を深く・本数を多くすれば学習データにはいくらでも合わせられますが、 その先にあるのは過学習です。
調整するときは、必ず検証用のデータで良し悪しを測ります。 そして探せば探すほど、その検証成績は甘くなっていくという厄介な性質があります。これも学習と検証で扱います。