単変量統計で特徴選択

単変量統計を使用した特徴選択(Feature Selection)は、個々の特徴量が目的変数との関係性を持つかどうかを評価する手法です。これにより、モデルに含めるべき重要な特徴を選び出します。ただし、各特徴量を独立に評価し、ターゲット変数との関係のみを考慮するため、特徴量同士の相互作用は考慮されません。

Google Corabでいくつかの単変量統計を確認してみます。

ピアソンの相関係数(Pearson Correlation Coefficient)

ピアソンの相関係数を計算し、ターゲット変数との相関が高い特徴を選択します。

iris データセットを用いて相関係数を計算してみます。
まずはデータセットを読み込みます。

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target

相関係数を計算します。

correlation_matrix = df.corr()

correlation_matrix
target_corr = correlation_matrix['target'].abs().sort_values(ascending=False)

target_corr

ターゲット変数と他の特徴量との相関関係を取得し、それを絶対値の降順でソートしています。これによって最も強い相関を持つ特徴量を確認出来ます。

target               1.000000
petal width (cm)     0.956547
petal length (cm)    0.949035
sepal length (cm)    0.782561
sepal width (cm)     0.426658
Name: target, dtype: float64

カイ二乗検定(Chi-Square Test)

カイ二乗検定(Chi-Square Test)は、観測データと予想データとの間の差異が有意かどうかを評価するための統計手法です。主にカテゴリカルデータに対して使用されます。この検定は、データが特定の分布に従っているかどうか、あるいは2つのカテゴリカル変数の間に独立性があるかどうかを検証するのに適しています。

scikit-learnライブラリに実装があります。chi2を利用します。

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.feature_selection import chi2

data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target

同じようにiris データセットを読み込みます。

df['sepal length (cm)'] = pd.qcut(df['sepal length (cm)'], 3, labels=False)
df['sepal width (cm)'] = pd.qcut(df['sepal width (cm)'], 3, labels=False)
df['petal length (cm)'] = pd.qcut(df['petal length (cm)'], 3, labels=False)
df['petal width (cm)'] = pd.qcut(df['petal width (cm)'], 3, labels=False)

X = df.drop('target', axis=1)
y = df['target']

カイ二乗検定がカテゴリカルデータに対して適用されるため、連続値の特徴量をカテゴリカルに変換しています。

chi2_scores, p_values = chi2(X, y)

chi2_results = pd.DataFrame({
    'Feature': X.columns,
    'Chi2 Score': chi2_scores,
    'p-value': p_values
})

chi2_results

カイ二乗検定を実行しています。

相互情報量(Mutual Information)

相互情報量(Mutual Information)は、2つのランダム変数間の依存関係を測定する指標です。具体的には、ある変数の知識が別の変数に対する不確実性をどれだけ減少させるかを定量化します。相互情報量は、情報理論の概念に基づいており、2つの変数がどれだけ互いに情報を共有しているかを示します。

scikit-learnライブラリに実装があります。mutual_info_classifを利用します。

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.feature_selection import mutual_info_classif
import matplotlib.pyplot as plt

data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target

同じようにiris データセットを読み込みます。相互情報量をmutual_info_classifを使い算出してみます。

X = df.drop('target', axis=1)
y = df['target']

mi_scores = mutual_info_classif(X, y, random_state=42)

mi_df = pd.DataFrame({
    'Feature': X.columns,
    'Mutual Information': mi_scores
}).sort_values(by='Mutual Information', ascending=False)

mi_df

下記のようにスコアが算出されます。