古典的機械学習
表形式データや小規模データセットで今なお勝つモデル群。線形回帰とロジスティック回帰、決定木、ランダムフォレスト、勾配ブースティング、SVM、k近傍法、クラスタリング、PCAを、それぞれの使いどころとともに解説します。
概要
古典的機械学習とは、ディープラーニングより前からあり、今も消えていないモデル群のことです。線形回帰とロジスティック回帰、決定木とそれを組み合わせたアンサンブル、サポートベクターマシン、最近傍法、クラスタリング、主成分分析などです。ラップトップで数秒で学習でき、GPUは不要で、表形式のビジネスデータでは依然としてたいてい最良の選択です。Grinsztajn et al.は2022年に45の表形式データセットで木のアンサンブルとチューニング済みニューラルネットワークを比較し、ほとんどのデータセットで木が、はるかに少ないチューニングで先行していることを見いだしました。
現場のエンジニアにとって、このハブは選択の話です。プロダクトチームが係数を読める、今週出荷できるロジスティック回帰は、来四半期に出荷されるトランスフォーマーに勝つことがよくあります。どのモデルがどのデータ形状に合うか、各モデルが特徴量に何を求めるかを知ることが、スキルの大部分です。
重要な考え方
線形モデルはベースラインであり、しばしば答えそのもの
線形回帰は特徴量の重み付き和を数値に当てはめます。ロジスティック回帰は同じ和をシグモイドに通して確率を得ます。どちらも凸なので学習は常に同じ最適解に到達し、どちらも読めます。係数とは、他を固定したときに特徴量が1単位変化したときの出力の変化量です。リッジとラッソは重みにペナルティを加えて分散を制御し、ラッソの場合は役に立たない係数を正確にゼロにします。
線形モデルが求めるのは、ペナルティがすべての係数を同じに扱うためスケールされた特徴量であること、そして直線は自分では曲がれないため交互作用や変換を明示的に与えることです。ワンホット符号化したカテゴリ、多項式特徴量、少しのドメイン知識があれば、線形モデルは人々が思うより遠くまで届き、しかも静かにではなく大きな音を立てて失敗します。
木とそれから作るアンサンブル
決定木は一度に1つの特徴量でデータを分割し、不純度を最も減らす分割を選び、葉が純粋になるかサイズ上限に達するまで分割を続けます。1本の木は読めますが不安定で、データのわずかな変化で違う木になります。ランダムフォレストは数百本の木を平均して不安定さを解消します。各木はブートストラップ標本で、各分割では特徴量のランダムな部分集合を使って学習します。勾配ブースティングは別のこと、そしてたいていより良いことをします。小さな木を次々に学習し、それぞれをそれまでのアンサンブルの残差誤差に当てはめ、学習率でスケールします。
木のアンサンブルは特徴量にほとんど何も求めません。スケーリング不要、LightGBMとCatBoostではワンホット符号化も不要で、欠損値も許容します。調整するのは木の深さ、学習率、早期終了による木の本数、そしてサブサンプリングです。弱点は外挿で、木は見たことのある範囲の外を予測できません。また生のテキストのような非常に高カーディナリティの疎な入力も苦手で、そこでは線形モデルやニューラルネットワークのほうが優れています。
マージンと近傍
サポートベクターマシンは最も広いマージンをもつ分離境界を見つけ、カーネルトリックによって、暗黙の高次元空間で計算せずにそれを行えます。RBFカーネルを使えば、小さく密でスケール済みのデータセットに対して、数万行までは強力な選択肢です。それを超えると学習時間が急激に伸びます。k近傍法には学習がまったくありません。データを保存し、クエリ時に最も近いk点から予測します。考えうる最も単純なモデルであり、保存された点がエンベディングである類似検索の背後にあるモデルでもあります。どちらも特徴量のスケールと無関係な特徴量に敏感です。距離はすべての次元を同じに扱うからです。
ラベルなしで構造を見つける
k-meansは点をセントロイドの周りのk個のクラスタに分割します。高速で推論しやすい一方、ほぼ球状で似た大きさのクラスタを仮定し、kを事前に決める必要があります。DBSCANは密度によって任意の形のクラスタを見つけ、疎な点をノイズとしてラベル付けします。階層的クラスタリングは、任意の高さで切れるマージの木を構築します。いずれもスケールした特徴量の上で動き、いずれも純粋なノイズの中にもクラスタを見つけてしまうので、シルエットスコアだけを信じるのではなく結果を確認してください。
PCAはデータを分散が最大となる方向に回転させます。これは中心化したデータ行列の特異値分解です。最初の数成分は、プロット用の2次元ビュー、線形モデル向けの無相関な入力、あるいはノイズを落とした圧縮表現を与えます。成分は元の特徴量の組み合わせなので、名前を付ける前に負荷量を読んでください。
どこから始めるか
線形回帰とロジスティック回帰をゼロからから始め、次に決定木と勾配ブースティングに進んでください。後者は付属のデータセットで図のアンサンブルを学習します。嘘をつかない評価は両者を公平に比較する方法を扱います。エンベディングと類似検索は現代の衣をまとったk-NNです。表形式分類器プロジェクトは勾配ブースティングモデルを動作するエンドポイントに仕立てます。
ツールとプラットフォーム
| ツール | 用途 | ライセンス | プラットフォーム |
|---|---|---|---|
| scikit-learn | このページのすべてのモデルに加え、パイプライン、指標、交差検証 | BSD-3 | オープンソース |
| XGBoost | GPU対応と成熟したAPIをもつ勾配ブースティング | Apache-2.0 | オープンソース |
| LightGBM | 高速なヒストグラムベースのブースティング、カテゴリ特徴量をネイティブ対応 | MIT | Microsoft |
| CatBoost | カテゴリ変数向けの順序付きターゲットエンコーディングを備えたブースティング | Apache-2.0 | オープンソース |
| statsmodels | 標準誤差、p値、診断付きの回帰 | BSD-3 | オープンソース |
| cuML (RAPIDS) | 大きな表向けのNVIDIA GPU上のscikit-learn風モデル | Apache-2.0 | NVIDIA |
| Optuna | 枝刈り付きハイパーパラメータ探索 | MIT | オープンソース |
よくある間違い
- SVM、k-NN、ラッソ、k-meansにスケールしていない特徴量を与える。数千単位で測られた1つの特徴量が距離やペナルティを支配します。
- フォレストの不純度ベースの特徴量重要度を因果関係のように読む。検証セットでのパーミュテーション重要度を優先し、相関する特徴量は手柄を分け合うことを忘れないでください。
- ブースティングのラウンド数をテストセットで決める。検証フォールドで早期終了を使い、テストセットは最終的な数値のために残してください。
- 木モデルに外挿させる。100万未満の住宅で学習した住宅価格モデルは、500万の住宅に対して約100万と予測します。
- シルエットスコアが良さそうだったという理由でk-meansの出力を信じる。クラスタリングは常にクラスタを返します。プロットしてください。
- データセット全体で
fitを呼んでから分割する。データと特徴量を参照してください。
さらに深く
- Hastie, Tibshirani and Friedman, The Elements of Statistical Learning, 2009。このページのすべてに関する標準的な参考書です。
- James, Witten, Hastie and Tibshirani, An Introduction to Statistical Learning。Pythonの演習付きの、より平易な版です。
- Chen and Guestrin, XGBoost: A Scalable Tree Boosting System, 2016。
- Breiman, Random Forests, Machine Learning, 2001。
- Grinsztajn, Oyallon and Varoquaux, Why do tree-based models still outperform deep learning on tabular data?, 2022。
- scikit-learnユーザーガイド。各推定器をその仮定とともに文書化しています。