Slide 1

Slide 1 text

0 2023-12-22 第72回NearMe技術勉強会 Takuma Kakinoue フルスクラッチで最強の決定⽊を実装する

Slide 2

Slide 2 text

1 はじめに ● ⼤きな⽬標 ○ 最強の決定⽊をフルスクラッチで作る! ● 前回まで ○ ランダムフォレストの実装を⾏った ■ https://speakerdeck.com/nearme_tech/jue-ding-mu-woshi-zhuang-suru ● 今回のスコープ ○ ⾃作ランダムフォレストの性能評価および改善ポイントの考察

Slide 3

Slide 3 text

2 性能評価⽅法 ● Kaggleの常設の⼊⾨コンテスト「Spaceship Titanic」のデータセットを使う ○ https://www.kaggle.com/competitions/spaceship-titanic ● Spaceship Titanicの主な特徴 ○ チュートリアル問題として有名な「Titanic」の派⽣コンテスト ○ 本家「Titanic」よりデータ数が多いが,⽋損値も多い ● ⾃作RandomForestで学習して性能を評価する ○ ⾃作RandomForestの実装コード ■ https://github.com/kakky-hacker/algorithm_sandbox ○ ⽐較対象は,scikit-learnのRandomForestClassifier ■ https://github.com/scikit-learn/scikit-learn/tree/main

Slide 4

Slide 4 text

3 結果 簡単な⽋損値処理とラベルエンコーディングだけを⾏い,学習させた。 ↓ ⾃作RandomForest ↓ scikit-learnのRandomForestClassifier accuracy:0.77951 accuracy:0.78606

Slide 5

Slide 5 text

4 考察 scikit-learnのRandomForestにaccuracyで 0.6% ほど負けてしまった。 ただ,アルゴリズムの実装⾃体は問題なくできてそう。 結果に対する考察 ● ⾃作RandomForestは計算速度が圧倒的に遅かった(数100倍レベル) ○ よって,⽊の数や深さをそこまで拡張できなかったので若⼲精度が下がった可能性 今後の展望 ● 計算速度を上げる⼯夫をする ○ 計算が重い処理の特定および改善 ● Borutaなどの特徴量選択アルゴリズムを導⼊ ○ 実装済みではあるが,現状,計算速度がネックとなって,使えていない ● 勾配ブースティングを導⼊ ○ ブースティングの仕組みを理解し実装

Slide 6

Slide 6 text

5 計算速度の改善ポイント 右のコードは,エッジの最適な分岐を 算出する関数である。 全特徴量に対して,ユニークな値全て を順番に調べているので⾮効率。 ↓ scikit-learnのソースコードを 解析して,知⾒を得る。 https://github.com/kakky-hacker/algorithm_sandbox/blob/main/decision_tree/core.py

Slide 7

Slide 7 text

6 Thank you