[機械学習]機械学習教科書Ch 04-(2)
5201 ワード
モデルに関連する高属性の選択
プロパティスケールは、前処理パイプラインの重要なステップです.
決定ツリーとランダムツリーでは、プロパティのスケールを心配する必要はありません.
異なる規模の特性に適した典型的な方法
1.規範化(規範化)
2.標準化(標準化)
🥰 正規化
ほとんどの標準化は、特性範囲[0,1]に調整できます.(最小-最大規模変換は特殊な場合)
最小から最大までのスケールの変化を標準化することは、範囲の値を指定する必要がある場合に便利です.
😗ひょうじゅんか
標準化は例外値情報を保持するため、データを有限範囲に調整する最小-最大スケール変換と比較して、例外値に敏感ではない
😙RobustScaler
コース運転中に特性規模を調整する他の方法RostScale->異常値が多数含まれる小さなデータセットに適したマシン学習アルゴリズムが容易に組み合わせる場合は、推奨します
RobustScalerは、中間値(q 2)を減算し、データの規模を調整するために1つの四分位(q 1)と3つの四分位(q 3)に分割する
モデルのトレーニングデータセットでの性能がテストデータセットよりはるかに高い場合、オーバーフィットの強い信号.
モデルの分散が大きすぎます.新しいデータはあまり通用しません.
誇張理由:与えられた訓練データに比べてモデルが複雑すぎる
so,一般化誤差を低減するために用いる方法
レイヤ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()
Reference
この問題について([機械学習]機械学習教科書Ch 04-(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@vector13/머신러닝-머신러닝-교과서-Ch04-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol