scikit-learn
機能の選択
サーチ…
低分散機能の削除
これは非常に基本的なフィーチャ選択手法です。
その基本的な考え方は、フィーチャが一定である(すなわち、分散が0である)場合、興味深いパターンを見つけるために使用することができず、データセットから削除することができるということです。
したがって、フィーチャ除去に対するヒューリスティックなアプローチは、分散がある(低い)閾値を下回るすべてのフィーチャを最初に除去することである。
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
ここには6 つのブール関数があり、それぞれ6つのインスタンスがあります。インスタンスの少なくとも80%で一定であるインスタンスを削除したいとします。いくつかの確率計算は、これらの特徴が0.8 *(1 - 0.8)より小さい分散を有する必要があることを示している。その結果、
from sklearn.feature_selection import VarianceThreshold
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
# Output: array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])
最初の機能がどのように削除されたかに注意してください。
この方法は慎重に使用する必要があります。なぜなら、分散が低いということは必ずしも機能が「面白くない」という意味ではないからです。次の例では、 3つのフィーチャを含むデータセットを作成します。最初の2つは、ランダムに分布する変数と3つ目の一様分布の変数で構成されています。
from sklearn.feature_selection import VarianceThreshold
import numpy as np
# generate dataset
np.random.seed(0)
feat1 = np.random.normal(loc=0, scale=.1, size=100) # normal dist. with mean=0 and std=.1
feat2 = np.random.normal(loc=0, scale=10, size=100) # normal dist. with mean=0 and std=10
feat3 = np.random.uniform(low=0, high=10, size=100) # uniform dist. in the interval [0,10)
data = np.column_stack((feat1,feat2,feat3))
data[:5]
# Output:
# array([[ 0.17640523, 18.83150697, 9.61936379],
# [ 0.04001572, -13.47759061, 2.92147527],
# [ 0.0978738 , -12.70484998, 2.4082878 ],
# [ 0.22408932, 9.69396708, 1.00293942],
# [ 0.1867558 , -11.73123405, 0.1642963 ]])
np.var(data, axis=0)
# Output: array([ 1.01582662e-02, 1.07053580e+02, 9.07187722e+00])
sel = VarianceThreshold(threshold=0.1)
sel.fit_transform(data)[:5]
# Output:
# array([[ 18.83150697, 9.61936379],
# [-13.47759061, 2.92147527],
# [-12.70484998, 2.4082878 ],
# [ 9.69396708, 1.00293942],
# [-11.73123405, 0.1642963 ]])
今では、第1の機能は分散が低いために削除されていますが、第3の機能(それは最も興味深い)が保持されています。この場合、スケーリングとは無関係であるため、変動係数を考慮することがより適切であろう。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow