The Art of Finding Best Features for Machine Learning

Feature Selection

多くの状況で、データセットで利用可能なすべての特徴を使用しても、最も予測性の高いモデルにはならないでしょう。 使用するモデルの種類によっては、データセットのサイズや、過剰な特徴を含む他のさまざまな要因によって、モデルのパフォーマンスが低下する可能性があります。

  • 新しいデータに対してモデルが予測できる精度を向上させる。
  • 計算コストを削減する。
  • より解釈しやすいモデルを生成する。

ある特徴を他よりも削除する理由は数多く存在します。 5532>

特徴の選択は、トレーニング前後のデータセットの分析によって手動で行うことも、自動化された統計的手法によって行うこともできる。 例えば、

  • データセット内の他の特徴と高い相関がある特徴。 このような場合、両方の特徴が本質的に同じ情報を提供していることになります。
  • ほとんどあるいは全く情報を提供しない特徴。
  • ターゲット変数との統計的関係がほとんどない特徴。

特徴はモデルのトレーニング前または後に実行されるデータ分析によって選択することができる。 5532>

Correlation plot

特徴選択を行うための手動技術の1つは、データセット内のすべての特徴の相関尺度をプロットする可視化を作成することである。 Seabornはこのために使用する良いPythonライブラリです。

# library imports
import pandas as pd
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import numpy as np# load the breast_cancer data set from the scikit-learn api
breast_cancer = load_breast_cancer()
data = pd.DataFrame(data=breast_cancer, columns = breast_cancer)
data = breast_cancer
data.head()# use the pands .corr() function to compute pairwise correlations for the dataframe
corr = data.corr()
# visualise the data with seaborn
mask = np.triu(np.ones_like(corr, dtype=np.bool))
sns.set_style(style = 'white')
f, ax = plt.subplots(figsize=(11, 9))
cmap = sns.diverging_palette(10, 250, as_cmap=True)
sns.heatmap(corr, mask=mask, cmap=cmap,
square=True,
linewidths=.5, cbar_kws={"shrink": .5}, ax=ax)

結果の可視化では、密接に相関しているいくつかの特徴を識別でき、したがって、これらのいくつかを削除したいかもしれませんし、ターゲット変数と非常に低い相関を持っているいくつかの特徴も削除したいかもしれません。

Feature importances

一度モデルを学習すると、さらに統計分析を適用して特徴がモデルの出力に与える影響を理解し、そこからどの特徴が最も有用かを決定することができるようになる。

特徴の重要性を決定するために利用可能なツールやテクニックは数多くあります。 5532>

特徴の重要性を説明するために、scikit-learn のランダムフォレスト分類器に対する組み込みの特徴の重要性メソッドを使用することにします。

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split# Spliiting data into test and train sets
X_train, X_test, y_train, y_test = train_test_split(data.drop('target', axis=1), data, test_size=0.20, random_state=0)# fitting the model
model = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42)
model.fit(X_train, y_train)# plotting feature importances
features = data.drop('target', axis=1).columns
importances = model.feature_importances_
indices = np.argsort(importances)plt.figure(figsize=(10,15))
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances, color='b', align='center')
plt.yticks(range(len(indices)), for i in indices])
plt.xlabel('Relative Importance')
plt.show()

これは、モデルに影響を与えている特徴とそうでない特徴の良い指標を与えます。 このグラフを分析した後、重要度の低い特徴を削除することもできます。

Automated feature selection

統計手法を用いて、モデルで使用する特徴の最適セットを自動的に見つけ出すメカニズムが数多く存在します。 scikit-learn ライブラリには、これらの手法の多くについて非常にシンプルな実装を提供するメソッドが多数含まれています。

統計学において、分散とはその平均からの変数の平方偏差であり、言い換えれば、データ ポイントが与えられた変数に対してどの程度広がっているのかということです。 このデータセットはほぼ完全に1つの性別で構成される可能性が高く、したがってほぼすべてのデータポイントが1になります。 この変数は分散が非常に低く、ターゲット変数の予測には全く役に立たないでしょう。

これは特徴選択に対する最も単純なアプローチの1つです。 scikit-learnのライブラリにはVarianceThresholdというメソッドがあります。 このメソッドは閾値を取り、特徴量セットにフィットさせると、この閾値以下の特徴を削除する。

このデフォルトの設定を、先ほど使った乳がんのデータセットに適用して、どのような特徴が除去されるかを調べてみましょう。

from sklearn.feature_selection import VarianceThresholdX = data.drop('target', axis=1)
selector = VarianceThreshold()
print("Original feature shape:", X.shape)new_X = selector.fit_transform(X)
print("Transformed feature shape:", new_X.shape)

出力は、変換された特徴が同じ形状であることを示し、すべての特徴が少なくともいくらかの分散を持っていることがわかります。

Univariate feature selection

一変量特徴選択は特徴に対して一変量の統計検定を適用して、それらの検定で最高の結果を出すものを選択するものである。 一変量検定とは、1つの従属変数のみを含む検定です。

また scikit-learn は、機械学習に最適な特徴を見つけるために、さまざまな異なる一変量検定を適用する特徴選択メソッドを多数提供しています。 この関数は、一変量統計検定に基づいて最適なk個の特徴を選択する。 kのデフォルト値は10なので、10個の特徴が保持され、デフォルトのテストはf_classifです。

f_classifテストは、乳がんデータセットの場合のように、カテゴリターゲットに使用されます。 もしターゲットが連続変数であれば、f_regressionが使用されるべきです。 f_classifテストは分散分析(ANOVA)統計テストに基づいており、いくつかのグループ(この場合は特徴)の平均を比較し、それらの平均のいずれかが互いに統計的に有意であるかどうかを判断するものです。

Recursive feature elimination

この方法は徐々に小さい特徴のセットでモデルの学習を実行するものである。 毎回、特徴の輸入量または係数が計算され、最も低いスコアを持つ特徴が除去される。

この方法では繰り返しモデルを学習させるため、まず推定器をインスタンス化する必要がある。

from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
from sklearn import preprocessingX_normalized = preprocessing.normalize(X, norm='l2')
y = yestimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=2)
selector = selector.fit(X, y)
print("Features selected", selector.support_)
print("Feature ranking", selector.ranking_)

以下の出力は、選択された特徴とその順位を示しています。

Feature engineering

特徴選択の目的が不要な特徴を削除してデータ集合の次元を減らすことであるのに対し、特徴エンジニアリングとは既存の特徴を変換したり新しい特徴を構築してモデルのパフォーマンスを改善することである。

最適なモデルを開発するために特徴エンジニアリングを行う必要がある主な理由は3つあります。

  1. 特徴はそのままの形では使用できません。
  2. 特徴は生のままでも使えるが、データを集約したり別の方法で表現したりすると、特徴に含まれる情報がより強くなる。 例えば、人の年齢を含む素性は、年齢をバケットやビンに集約することで、対象との関係をよりよく表現できる。
  3. 素性は、それだけでは対象との統計的関係が十分強くないが、他の素性と組み合わせることで意味のある関係を持つことができる。 例えば、ある顧客グループのクレジットヒストリーに基づく多くの特徴量と、その顧客がローンを不履行にしたかどうかを示すターゲットを持つデータセットがあるとします。 ローン額と給与の値があるとします。 これらを組み合わせて「貸付額と給与の比率」という新しい特徴にすると、これらの特徴だけよりも多くの、あるいはより良い情報を与えることができる。

Manual Feature Engineering

Feature Engineeringはデータ分析、直感、およびドメイン知識によって行うことができる。 たとえば、特徴がターゲットにどのように相関しているか、特徴の重要性の観点からどのように機能しているかを観察することにより、分析の観点からどの特徴をさらに探索すべきかがわかります。

ローン データセットの例に戻ると、相関プロットからターゲット変数に何らかの関係があるように見える年齢変数があるとします。 この関係をさらに分析すると、デフォルトになるのは特定の年齢層に偏っていることがわかるかもしれません。 この場合、この年齢グループを選択する機能を設計することができ、これはモデルにより良い情報を提供することができます。 5532>

The Featuretools python library は、データ セット上で自動特徴エンジニアリングを実行できるツールの一例です。

Featuretools は pip でインストールできます。

pip install featuretools

Featuretools はリレーショナルデータセット(一意の識別子で結合できるテーブルまたはデータフレーム)で動作するように設計されています。 5532>

乳がんデータセットは1つのエンティティから構成されていますが、featuretoolsを使用して特徴を生成することは可能です。 ただし、最初に一意なIDを含む新しい列を作成する必要があります。

data = data.index + 1

次に、featuretoolsをインポートしてエンティティセットを作成します。

import featuretools as ftes = ft.EntitySet(id = 'data')
es.entity_from_dataframe(entity_id = 'data', dataframe = data, index = 'id')

この結果、以下の出力が得られます。

feature_matrix, feature_names = ft.dfs(entityset=es, 
target_entity = 'data',
max_depth = 2,
verbose = 1,
n_jobs = 3)

Featuretools は 31 個の新しいフィーチャーを作成しました。

以下の実行により、すべての新しいフィーチャーを見ることができます。

feature_matrix.columns

コメントを残す

メールアドレスが公開されることはありません。