Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゼロから作るアンサンブル学習 第2回資料

tatamiya
April 25, 2019

ゼロから作るアンサンブル学習 第2回資料

tatamiya

April 25, 2019
Tweet

More Decks by tatamiya

Other Decks in Technology

Transcript

  1. このセミナーについて u ⽬的 u アルゴリズムの理解 u OSSから良い実装を学ぶ u スケジュール u

    第1回(3/28) : 決定⽊・ランダムフォレストの理解と実装 u 第2回(4/25 本⽇) : scikit-learnの読解 u 第3回(5⽉下旬) : 勾配ブースティング〜XGBoost, LightGBM
  2. ⽬次 u sklearnレポジトリの辿り⽅ u 決定⽊ u 全体の構成 u アルゴリズム u

    Node : ⽊構造をどう持つか︖ u splitter : 最適な分割の探索⽅法 u ランダムフォレスト u 全体の構成 u fit部分のアルゴリズム
  3. sklearnを使う u `pip install sklearn` u 種類 u 予測・分類 u

    前処理・特徴量選択など u 基本的な使い⽅ u インスタンスを作成する u パラメータ・オプションの設定 u fitで学習, predictで予測 u ほかにも,transform, predict_proba, fit_transform
  4. GitHubレポジトリの構成 u GitHub https://github.com/scikit-learn/scikit-learn u sklearn以下に全部⼊っている u 例︓線形回帰 u sklearn/linear_model/以下

    u コード⾃体はbase.py u この中の367⾏⽬ LinearRegressionクラスを呼び出している u `from sklearn.linear_model import LinearRegression`で読み込めるのは,__init__.pyの中で `__all__`に含めているから。 u 今回扱うもの u 決定⽊︓sklearn/tree/tree.py u ランダムフォレスト︓sklearn/ensemble/forest.py
  5. コードの基本的な構成 u 例︓LinearRegression … fit, predict, score u class LinearRegression内で直接記述されているメソッド

    u fit (503⾏⽬でnumpyのlinalgを呼び出す) u 継承元のクラス u LinearModel … predict u BaseEstimator … set_params, get_params u RegressorMixin … score u MultiOutputMixin
  6. 全体の構成︓ ClassifierとRegressor u ClassifierとRegressorの設計上の違い u Classifier専⽤のメソッド︓predict_proba, predict_log_proba u 継承しているクラス︓ClassifierMixin /

    RegressorMixin u /sklearn/base.pyの中にある u これにより,scoreメソッドの⽤いるmetricsが異なっている。 u BaseTree内でClassifierかRegressorかをチェックしている u 141⾏⽬(fit関数内) : `is_classification = is_classifier(self)` u /sklearn/base.py内のis_classification関数 u 継承元のMixinで定義した”_estimator_type”をチェックして分岐している
  7. 全体の構成︓メインとなる処理 u 340⾏⽬ Build Tree以降 u 別ファイルで定義した関数(Cython)を順次呼び出している u 中核は,380⾏⽬ `builder.build(self.tree_,

    X, y, sample_weight, X_idx_sorted)` u buildまでの流れ u criterionの定義(前⾴) -> self._criterion.pyx u splitterの選択(Best / Random) -> self._splitter.pyx u self.tree_インスタンスの作成 -> self._tree.pyx内のTreeクラス u builderの選択(Depth / Best) -> self._tree.pyx内のDepth/BestFirstTreeBuilderクラス
  8. アルゴリズム︓splitter u ⾃分の実装 u 最適分割探索関数`find_optimal_division`を定義 u numpyのapply_along_axis関数を使ってデータの各列に適⽤ u scikit-learnの実装 u

    Cythonでfor⽂回して記述(_splitter.pyx) u 全探索はしない u impurityが下がらないとわかった特徴量はそれ以降調べない
  9. 全体の構成︓関連ファイル u 基本的な使い⽅ u RandomForestClassifierとRandomForestRegressor u feature_importanceというプロパティ u 場所 u

    sklearn/ensemble/forest.py内 u 決定⽊と異なり,forest.pyだけでほぼ完結 u iforest.pyというのもあるがこれは…︖ u → 外れ値検出アルゴリズムらしいです https://blog.amedama.jp/entry/2019/04/20/124220
  10. 全体の構成︓構造 u 基底クラスからの流れ u BaseForest -> ForestClassifier/Regressor -> RandomForestClassifier/Regressor u

    基本的には,BaseForestがほぼ全ての処理を⾏っている u ForestClassifier/Regressor u RandomForestClassifier/Regressor : インターフェイス部分を整えるの み︖
  11. アルゴリズム︓fit部分 u BaseForestのfitメソッド(125⾏⽬〜) u 315⾏⽬︓複数の決定⽊インスタンスを作成 u 継承元クラスBaseEnsembleの_make_estimatorメソッドを使⽤ u bese_estimator_をcloneしてestimatorsにappendしていく u

    base_estimator⾃体は,__init__で引数としてとる u RandomForestClassifier/Regressorをみると, DecisionTreeClassifier/Regressor()を⼊れている︕ u 325⾏⽬︓ u joblibを使った並列化 u _parallel_build_treesメソッドで → 94⾏⽬