統合学習-個人ノート


統合学習は、ある戦略によって単一の学習器を結合し、通常、単一の学習器よりも著しく優れた汎化性能を得ることができるため、多くの学習タスクに統合学習が適用される.本文はまず集積学習の基本理論思想を紹介し,scikit-learn公式文書と結びつけてよく見られるいくつかの集積学習アルゴリズムのPython実現を与えた.
統合学習の一般的な構造:まず「個体学習器」のセットを生成し、ある戦略でそれらを結合します.統合に同じタイプの学習器しか含まれていない場合、このような統合は「同質」であり、各学習器を「ベース学習器」と呼ぶ.統合に複数のタイプの学習器が含まれている場合、この統合は「異質」であり、各学習器を「コンポーネント学習器」と呼び、個人学習器とも直接呼ぶことができる.
通常、良いものと悪いものを結びつけると、結果は良いものよりも悪いものよりも悪くなります.統合が最良の個体学習器よりも優れた性能を得るためには、個体学習器は「良くて異なる」べきである.すなわち、個体学習器には一定の「正確性」があり、各学習器間に差がある.ベース学習器の誤差が互いに独立していると仮定すると,集積種個体分類器の数が増加するにつれて,集積の誤り率は指数的に低下し,最終的には0に向かう傾向にある.
個体学習器の生成方式によって、集積学習を二つの大類に分けることができる:一つは個体学習器間に強い依存関係が存在せず、同時に生成できる並列化集積であり、その代表はBaggingとRandom Forestである.もう1つのクラスは,個体学習器間に強い依存関係が存在し,シリアル生成のみ可能なシーケンス化集積であり,Boostingを表す.
Bagging
個体学習器をできるだけ独立させるには,訓練サンプルをサンプリングし,いくつかのランダムサブセットを生成し,各サブセットからベース学習器を訓練することができる.異なるサンプリング法に基づいて,異なる集積アルゴリズムを得た.セルフサンプリング法に基づいてサブセットを生成するアルゴリズムがBaggingアルゴリズムである.結合戦略Baggingは通常、分類タスクに対して簡単な投票法を採用し、回帰タスクに対して簡単な平均法を採用する.
公式文書のサンプルPythonコード:
>>> from sklearn.ensemble import BaggingClassifier
>>> from sklearn.neighbors import KNeighborsClassifier
>>> bagging = BaggingClassifier(KNeighborsClassifier(),
...                             max_samples=0.5, max_features=0.5)

ここでは、いくつかの主要なパラメータを示します.
base_estimator:ベース学習器タイプ、デフォルトは決定ツリー
n_estimators:統合におけるベース学習器の数、デフォルト10
max_samples:サブトレーニングセットごとのサンプリング回数、デフォルトは1.0、すなわち回数=元のトレーニングセット数
max_Features:各サンプルで取得した属性の個数、デフォルトは1.0、すなわち全取
bootstrap:サンプリングを戻すかどうか、デフォルトはTrueです.(セルフサンプリングは戻しがあります)
bootstrap_Features:属性選択を戻したかどうか、デフォルトはTrue
oob_score:「パッケージ外サンプル」を使用して汎化性能を推定するかどうか、デフォルトFalse(セルフサンプリングは戻りサンプルで、各サブセットには一部のサンプルのみが含まれ、残りのサンプルはパッケージ外サンプル)
Random Forest(ランダム森林、RF)
RFはBaggingに基づいており、そのベース学習器は決定ツリーであり、それに基づいてランダム属性を導入する.すなわち、決定ツリーの各ノードについて、属性セットdからk個の属性を含むサブセットを選択して区分し、k=log(2)dを推奨する.ランダム森林の開始性能は,属性摂動が導入されたため相対的に劣ることが多いが,個体学習器数の増加に伴い,ランダム森林は通常より低い汎化誤差に収束する.
サンプルPythonコード
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.datasets import make_classification
>>>
>>> X, y = make_classification(n_samples=1000, n_features=4,
...                            n_informative=2, n_redundant=0,
...                            random_state=0, shuffle=False)
>>> clf = RandomForestClassifier(max_depth=2, random_state=0)
>>> clf.fit(X, y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=2, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=0, verbose=0, warm_start=False)
>>> print(clf.feature_importances_)
[ 0.17287856  0.80608704  0.01884792  0.00218648]
>>> print(clf.predict([[0, 0, 0, 0]]))
[1]

n_estimators:ベース学習器個数
criterion:属性区分基準、デフォルト「gini」
max_Features:デフォルトの「auto」、すなわち属性セットの開方
max_depth:決定ツリー層数
......
Boosting基本動作メカニズム:まず初期訓練セットから1つのベース学習器を訓練し、ベース学習器の表現に基づいて訓練データサンプル分布を調整し、以前のベース学習器が間違っていたサンプルが後続でより多くの注目を集めた後、調整後のサンプル分布に基づいて次のベース学習器を訓練し、このように繰り返し、ベース学習器が事前に指定された値Tに達するまで、このT個の学習器を重み付け結合する.代表者:AdaBoost
AdaBoost公式コード:
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
n_estimators = 400
learning_rate = 1.0
X, y = datasets.make_hastie_10_2(n_samples=12000, random_state=1)

X_test, y_test = X[2000:], y[2000:]
X_train, y_train = X[:2000], y[:2000]
ada_real = AdaBoostClassifier(
    base_estimator=dt_stump,
    learning_rate=learning_rate,
    n_estimators=n_estimators,
    algorithm="SAMME.R")
ada_real.fit(X_train, y_train)

具体的なパラメーターの意味は博文を参考にします:クリックしてリンクを開けます
公式ドキュメントには、具体的な結合ポリシーも含まれています.ここでは書かないでください.ただのメモですが、これから使えるようにしてほしいです.