[機械学習]機械学習教科書Ch 04-(2)

5201 ワード

モデルに関連する高属性の選択


プロパティスケールは、前処理パイプラインの重要なステップです.
決定ツリーとランダムツリーでは、プロパティのスケールを心配する必要はありません.
異なる規模の特性に適した典型的な方法
1.規範化(規範化)
2.標準化(標準化)

🥰 正規化


ほとんどの標準化は、特性範囲[0,1]に調整できます.(最小-最大規模変換は特殊な場合)
  • 最小-最大スケール:

    最小から最大までのスケールの変化を標準化することは、範囲の値を指定する必要がある場合に便利です.
  • 😗ひょうじゅんか


    標準化は例外値情報を保持するため、データを有限範囲に調整する最小-最大スケール変換と比較して、例外値に敏感ではない

    😙RobustScaler


    コース運転中に特性規模を調整する他の方法RostScale->異常値が多数含まれる小さなデータセットに適したマシン学習アルゴリズムが容易に組み合わせる場合は、推奨します

    RobustScalerは、中間値(q 2)を減算し、データの規模を調整するために1つの四分位(q 1)と3つの四分位(q 3)に分割する
    モデルのトレーニングデータセットでの性能がテストデータセットよりはるかに高い場合、オーバーフィットの強い信号.
    モデルの分散が大きすぎます.新しいデータはあまり通用しません.
    誇張理由:与えられた訓練データに比べてモデルが複雑すぎる
    so,一般化誤差を低減するために用いる方法
  • より多くのトレーニングデータ
  • パラメータの少ない単純モデル
  • 法規による複雑性の制御
  • データ削減
  • 😚 規制による複雑さの管理->階層1および階層2
    レイヤ2コントロール:モデルの複雑さを軽減するために単一のウェイト値を制限

    L 1制限:(l 2の重み付け二乗を重み付け終端値に変換する)モデルの複雑さを低減する方法

    🙂 シーケンス属性選択アルゴリズム


    一般化誤差を低減する方法におけるデータ次元ダウン(次元ダウン)
    特に制限のないモデルに適しています.
    次元折りたたみテクノロジーには、プロパティの選択とプロパティの抽出が含まれます.
    選択プロパティは、一連のプロパティから得られた情報に基づいて新しいプロパティを作成する選択ソースプロパティの一部です.
    シーケンス特性選択はgreddyナビゲーションアルゴリズムであり,初期d次元の特性光間をk従来のシーケンスフィーチャー選択アルゴリズムはシーケンス逆配列である
    SBS:すべての特性から順次特性を削除し、新しい特性の部分空間が目標特性数に達するまで
    SBSアルゴリズムはコース運行中にXを実施している
    このアルゴリズムのPythonコード
    from sklearn.base import clone
    from itertools import combinations
    import numpy as np
    from sklearn.metrics import accuracy_score
    from sklearn.model_selection import train_test_split
    
    
    class SBS():
        def __init__(self, estimator, k_features, scoring=accuracy_score,
                     test_size=0.25, random_state=1):
            self.scoring = scoring
            self.estimator = clone(estimator)
            self.k_features = k_features
            self.test_size = test_size
            self.random_state = random_state
    
        def fit(self, X, y):
            
            X_train, X_test, y_train, y_test = \
                train_test_split(X, y, test_size=self.test_size,
                                 random_state=self.random_state)
    
            dim = X_train.shape[1]
            self.indices_ = tuple(range(dim))
            self.subsets_ = [self.indices_]
            score = self._calc_score(X_train, y_train, 
                                     X_test, y_test, self.indices_)
            self.scores_ = [score]
    
            while dim > self.k_features:
                scores = []
                subsets = []
    
                for p in combinations(self.indices_, r=dim - 1):
                    score = self._calc_score(X_train, y_train, 
                                             X_test, y_test, p)
                    scores.append(score)
                    subsets.append(p)
    
                best = np.argmax(scores)
                self.indices_ = subsets[best]
                self.subsets_.append(self.indices_)
                dim -= 1
    
                self.scores_.append(scores[best])
            self.k_score_ = self.scores_[-1]
    
            return self
    
        def transform(self, X):
            return X[:, self.indices_]
    
        def _calc_score(self, X_train, y_train, X_test, y_test, indices):
            self.estimator.fit(X_train[:, indices], y_train)
            y_pred = self.estimator.predict(X_test[:, indices])
            score = self.scoring(y_test, y_pred)
            return score
    import matplotlib.pyplot as plt
    from sklearn.neighbors import KNeighborsClassifier
    
    knn = KNeighborsClassifier(n_neighbors=5)
    
    # 특성을 선택합니다
    sbs = SBS(knn, k_features=1)
    sbs.fit(X_train_std, y_train)
    
    # 선택한 특성의 성능을 출력합니다
    k_feat = [len(k) for k in sbs.subsets_]
    
    plt.plot(k_feat, sbs.scores_, marker='o')
    plt.ylim([0.7, 1.02])
    plt.ylabel('Accuracy')
    plt.xlabel('Number of features')
    plt.grid()
    plt.tight_layout()
    # plt.savefig('images/04_08.png', dpi=300)
    plt.show()

    データセットの有用なプロパティの選択方法-ランダムツリーの使用(組合せテクノロジーを使用)


    ランダムforestを用いて,組み合わせに関与するすべての決定木で計算した平均不純度の減少により特性重要度を測定できた.
    Sikit RunのRandom ForestClassifierモデルのトレーニング後、プロパティで検証できます)
    from sklearn.ensemble import RandomForestClassifier
    
    feat_labels = df_wine.columns[1:]
    
    forest = RandomForestClassifier(n_estimators=500,
                                    random_state=1)
    
    forest.fit(X_train, y_train)
    importances = forest.feature_importances_
    
    indices = np.argsort(importances)[::-1]
    
    for f in range(X_train.shape[1]):
        print("%2d) %-*s %f" % (f + 1, 30, 
                                feat_labels[indices[f]], 
                                importances[indices[f]]))
    
    plt.title('Feature Importance')
    plt.bar(range(X_train.shape[1]), 
            importances[indices],
            align='center')
    
    plt.xticks(range(X_train.shape[1]), 
               feat_labels[indices], rotation=90)
    plt.xlim([-1, X_train.shape[1]])
    plt.tight_layout()
    # plt.savefig('images/04_09.png', dpi=300)
    plt.show()