F 検定と相互情報量の比較

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、単変量 F 検定統計量と相互情報量の違いについて学びます。scikit-learn ライブラリを使って、データセットに対して F 検定と相互情報回帰を行い、結果を比較します。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題があった場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

ライブラリのインポート

この実験に必要なライブラリをインポートして始めましょう。この実験では numpy、matplotlib、scikit-learn を使用します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_selection import f_regression, mutual_info_regression

データセットの作成

3 つの特徴量を持つデータセットを作成します。最初の特徴量は目的変数と線形関係があり、2 番目の特徴量は目的変数と非線形関係があり、3 番目の特徴量は全く無関係です。このデータセットには 1000 個のサンプルを作成します。

np.random.seed(0)
X = np.random.rand(1000, 3)
y = X[:, 0] + np.sin(6 * np.pi * X[:, 1]) + 0.1 * np.random.randn(1000)

F 検定の計算

ここで、各特徴量に対する F 検定のスコアを計算します。F 検定は、変数間の線形依存のみを捉えます。F 検定のスコアを最大の F 検定スコアで割ることにより、正規化します。

f_test, _ = f_regression(X, y)
f_test /= np.max(f_test)

相互情報量の計算

ここで、各特徴量に対する相互情報量のスコアを計算します。相互情報量は、変数間のあらゆる種類の依存関係を捉えることができます。相互情報量のスコアを最大の相互情報量スコアで割ることにより、正規化します。

mi = mutual_info_regression(X, y)
mi /= np.max(mi)

結果をプロットする

ここで、目的変数と各特徴量の依存関係と、各特徴量に対する F 検定と相互情報量のスコアをプロットします。

plt.figure(figsize=(15, 5))
for i in range(3):
    plt.subplot(1, 3, i + 1)
    plt.scatter(X[:, i], y, edgecolor="black", s=20)
    plt.xlabel("$x_{}$".format(i + 1), fontsize=14)
    if i == 0:
        plt.ylabel("$y$", fontsize=14)
    plt.title("F-test={:.2f}, MI={:.2f}".format(f_test[i], mi[i]), fontsize=16)
plt.show()

まとめ

この実験では、単変量 F 検定統計量と相互情報量の違いについて学びました。データセットに対して F 検定と相互情報量回帰を行い、結果を比較しました。その結果、F 検定は変数間の線形依存のみを捉えるのに対し、相互情報量は変数間のあらゆる種類の依存関係を捉えることができることがわかりました。