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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for tatamiya tatamiya
April 25, 2019

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

Avatar for tatamiya

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⾏⽬