[機械学習] 特徴の次元削減 - 分散選択方法 VarianceThreshold

「著者のホームページ」:Shibie Sanri wyx
「著者のプロフィール」: CSDNトップ100、Alibaba Cloudブログ専門家、Huaweiクラウド共有専門家、ネットワークセキュリティ分野の質の高いクリエイター 「
おすすめコラム」:ネットワークセキュリティに興味のある友人は有料ですコラム「ネットワークセキュリティを極める入門」に注目

抽出された特徴の中には、関連する(類似した)「冗長な特徴」がいくつかありますが、そのような特徴はカウントする必要はありません。関連する特徴を「削減」し、関係のない特徴を残す必要があります。つまり、「特徴の次元削減」です。

特徴の次元削減には多くの方法があり、ここではそのうちの 1 つを使用します: 分散選択法 (低分散フィルタリング)

1. 分散に関する一般的な科学

まず科学について簡単に説明しましょう。分散 = 二乗の平均値から平均の二乗を引いたものです。式は次のとおりです。

ここに画像の説明を挿入

たとえば、5 つの数字 1、2、3、4、5 の平均は 3 です。

「分散」は、各データ間の差の二乗和の平均と、合計の平均値であり[(1-3)^2+(2-3)^2+(3-3)^2+(4-3)^2+(5-3)^2]/5=22 となります。

分散が小さいということは、特徴のほとんどのサンプルが同様の値を持つことを意味し、分散が大きいということは、特徴のほとんどのサンプルが異なる値を持つことを意味します。

分散選択方法は「低分散フィルタリング」とも呼ばれ、その名の通り分散値を設定し、その分散よりも低い特徴をすべて削除するものです。


2. 分散選択 API

sklearn.feature_selection は機能選択 API です。

sklearn.feature_selection.VarianceThreshold( 閾値=0 )

  • VarianceThreshold.fit_transform( data ): 辞書型の元のデータを受け取り、分散フィルタリング後のデジタル特徴を返します。
  • VarianceThreshold.inverse_transform( data ): フィルター処理されたデジタル特徴を元のデータに変換します。
  • VarianceThreshold.get_feature_names_out(): 機能名を返します
  • VarianceThreshold.variances_: 各特徴に対応する分散値を返します。

3. データセットを取得する

ここでは例として虹彩データセットを使用します

from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()

# 打印数据特征
print(iris.data)
# 打印特征数总结
print(iris.data.shape)

出力:

[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 ......
 [5.9 3.  5.1 1.8]]
(150, 4)

出力結果からわかるように、データ セットには 150 個のデータが含まれており、各データには 4 つの特徴があります。


4. 分散フィルタリングを実行する

次に、分散を 0.2 に指定して分散フィルタリングを実行します。

from sklearn import feature_selection
from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()
# 初始化转换器(指定方差为0.2)
vt = feature_selection.VarianceThreshold(threshold=0.2)

# 使用转换器对数据进行低方差过滤
result = vt.fit_transform(iris.data)

# 打印数据特征
print(result)
print(result.shape)

出力:

[[5.1 1.4 0.2]
 [4.9 1.4 0.2]
 ......
 [5.9 5.1 1.8]]
(150, 3)

出力結果からわかるように、変換されたデータセットには 150 個のデータがあり、各データには 3 つの特徴があり、分散が 0.2 未満の特徴はフィルターで除外されています。

次に、分散を 1 に変更します。

from sklearn import feature_selection
from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()
# 初始化转换器(指定方差为1)
vt = feature_selection.VarianceThreshold(threshold=1)

# 使用转换器对数据进行低方差过滤
result = vt.fit_transform(iris.data)

# 打印数据特征
print(result)
print(result.shape)

出力:

[[1.4]
 [1.4]
 ......
 [5.1]]
(150, 1)

出力結果からわかるように、データセットの特徴は 1 になり、分散が 1 未満の 3 つの特徴がフィルターで除外されます。


5. 特徴量の分散値を取得する

次に、各特徴の分散値を取得して、フィルタリングの精度を検証します。

from sklearn import feature_selection
from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()
# 初始化转换器(指定方差为1)
vt = feature_selection.VarianceThreshold(threshold=0.2)

# 使用转换器对数据进行低方差过滤
result = vt.fit_transform(iris.data)

# 获取特征的方差值
print(vt.variances_)

出力:

[0.68112222 0.18871289 3.09550267 0.57713289]

出力結果から、4 つの特徴の分散値のうち、3 つは 0.2 より大きく、1 つは 1 より大きいことがわかります。上記の実験のフィルタリング結果は予想と一致しています。

おすすめ

転載: blog.csdn.net/wangyuxiang946/article/details/131405338