Pythonを使用したML-データ特徴選択
前の章では、機械学習用のデータを前処理して準備する方法について詳しく説明しました。この章では、データ特徴選択とそれに関連するさまざまな側面について詳しく理解しましょう。
データ特徴選択の重要性
機械学習モデルのパフォーマンスは、モデルのトレーニングに使用されるデータ機能に正比例します。MLモデルに提供されるデータ機能が無関係である場合、MLモデルのパフォーマンスは悪影響を受けます。一方、関連するデータ機能を使用すると、MLモデル、特に線形回帰とロジスティック回帰の精度を高めることができます。
ここで、自動特徴選択とは何かという疑問が生じます。これは、関心のある出力変数または予測変数に最も関連するデータ内の特徴を選択するプロセスとして定義できます。属性選択とも呼ばれます。
以下は、データをモデル化する前の自動特徴選択の利点の一部です。
データモデリングの前に特徴選択を実行すると、過剰適合が減少します。
データモデリングの前に特徴選択を実行すると、MLモデルの精度が向上します。
データモデリングの前に特徴選択を実行すると、トレーニング時間が短縮されます
特徴選択手法
以下は、PythonでMLデータをモデル化するために使用できる自動特徴選択手法です。
一変量の選択
この特徴選択手法は、統計的検定の助けを借りて、予測変数と最も強い関係を持つこれらの特徴を選択するのに非常に役立ちます。scikit-learn PythonライブラリのSelectKBest0classを使用して、単変量特徴選択手法を実装できます。
Example
この例では、Pima Indians Diabetesデータセットを使用して、カイ2乗統計検定を使用して最高の機能を持つ4つの属性を選択します。
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
次に、配列を入力コンポーネントと出力コンポーネントに分割します-
X = array[:,0:8]
Y = array[:,8]
次のコード行は、データセットから最適な機能を選択します-
test = SelectKBest(score_func=chi2, k=4)
fit = test.fit(X,Y)
選択に応じて、出力用のデータを要約することもできます。ここでは、精度を2に設定し、各属性の最高のスコアとともに、最高の機能を備えた4つのデータ属性を表示しています。
set_printoptions(precision=2)
print(fit.scores_)
featured_data = fit.transform(X)
print ("\nFeatured data:\n", featured_data[0:4])
Output
[ 111.52 1411.89 17.61 53.11 2175.57 127.67 5.39 181.3 ]
Featured data:
[
[148. 0. 33.6 50. ]
[ 85. 0. 26.6 31. ]
[183. 0. 23.3 32. ]
[ 89. 94. 28.1 21. ]
]
再帰的特徴の除去
名前が示すように、RFE(再帰的特徴除去)特徴選択手法は、属性を再帰的に削除し、残りの属性を使用してモデルを構築します。scikit-learn PythonライブラリのRFEクラスを使用して、RFE特徴選択手法を実装できます。
例
この例では、ロジスティック回帰アルゴリズムを使用したRFEを使用して、Pima IndiansDiabetesデータセットから最高の機能を持つ最高の3つの属性を選択します。
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
次に、配列を入力コンポーネントと出力コンポーネントに分離します-
X = array[:,0:8]
Y = array[:,8]
次のコード行は、データセットから最適な機能を選択します-
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print("Number of Features: %d")
print("Selected Features: %s")
print("Feature Ranking: %s")
出力
Number of Features: 3
Selected Features: [ True False False False False True True False]
Feature Ranking: [1 2 3 5 6 1 1 4]
上記の出力からわかるように、RFEは、最初の3つの最良の機能として、preg、mass、およびpediを選択します。それらは出力で1としてマークされます。
主成分分析(PCA)
一般にデータ削減手法と呼ばれるPCAは、線形代数を使用してデータセットを圧縮形式に変換するため、非常に便利な特徴選択手法です。scikit-learn PythonライブラリのPCAクラスを使用して、PCA特徴選択手法を実装できます。出力で主成分の数を選択できます。
例
この例では、PCAを使用して、Pima IndiansDiabetesデータセットから最良の3つの主成分を選択します。
from pandas import read_csv
from sklearn.decomposition import PCA
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
次に、配列を入力コンポーネントと出力コンポーネントに分割します-
X = array[:,0:8]
Y = array[:,8]
次のコード行は、データセットから特徴を抽出します-
pca = PCA(n_components=3)
fit = pca.fit(X)
print("Explained Variance: %s") % fit.explained_variance_ratio_
print(fit.components_)
出力
Explained Variance: [ 0.88854663 0.06159078 0.02579012]
[
[
-2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-02
9.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03
]
[
2.26488861e-02 9.72210040e-01 1.41909330e-01 -5.78614699e-02
-9.46266913e-02 4.69729766e-02 8.16804621e-04 1.40168181e-01
]
[
-2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-01
2.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01
]
]
上記の出力から、3つの主成分がソースデータとほとんど類似していないことがわかります。
機能の重要性
名前が示すように、特徴重要度手法を使用して重要度特徴を選択します。基本的に、訓練された教師あり分類器を使用して特徴を選択します。この機能選択手法は、scikit-learnPythonライブラリのExtraTreeClassifierクラスを使用して実装できます。
例
この例では、ExtraTreeClassifierを使用して、Pima IndiansDiabetesデータセットから機能を選択します。
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
path = r'C:\Desktop\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(data, names=names)
array = dataframe.values
次に、配列を入力コンポーネントと出力コンポーネントに分割します-
X = array[:,0:8]
Y = array[:,8]
次のコード行は、データセットから特徴を抽出します-
model = ExtraTreesClassifier()
model.fit(X, Y)
print(model.feature_importances_)
出力
[ 0.11070069 0.2213717 0.08824115 0.08068703 0.07281761 0.14548537 0.12654214 0.15415431]
出力から、各属性にスコアがあることがわかります。スコアが高いほど、その属性の重要性が高くなります。