「著者のホームページ」: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=2
2 となります。
分散が小さいということは、特徴のほとんどのサンプルが同様の値を持つことを意味し、分散が大きいということは、特徴のほとんどのサンプルが異なる値を持つことを意味します。
分散選択方法は「低分散フィルタリング」とも呼ばれ、その名の通り分散値を設定し、その分散よりも低い特徴をすべて削除するものです。
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 より大きいことがわかります。上記の実験のフィルタリング結果は予想と一致しています。