特徴次元削減のための特徴選択

特徴抽出:新しい特徴を作​​成して、特徴の元の情報を可能な限り失うことなく、特徴行列の次元を削減します。

別の次元削減方法である特徴選択は、情報量の多い特徴を保持し、情報量の少ない特徴を破棄します。

  • 特徴選択方法:
    • フィルタ:フィルタ方法は、特徴の統計情報に基づいて最適な特徴を選択します。
    • ラッパー:試行錯誤を通じて、ラッパーは高品質の予測値モデルを生成できる機能のサブセットを見つけます。
    • 埋め込み方法:この方法は、機械学習アルゴリズムのトレーニングプロセスの一部として最適な特徴サブセットを選択します。

1.数値特徴の分散のしきい値処理

問題の説明:数値特徴のセットから、分散が小さい(つまり、含まれる情報が少ない)特徴を削除します。

解決策:分散が特定のしきい値を超える特徴を選択する

from sklearn import datasets
from sklearn.feature_selection import VarianceThreshold
#加载数据
iris = datasets.load_iris()
#创建features和target
features = iris.data
target = iris.target
#创建VarianceThreshold
threshold = VarianceThreshold(threshold = 0.5)
#创建大方差特征矩阵
features_high_variance = threshold.fit_transform(features)
#显示大方差特征矩阵
features_high_variance[0:3]
outputs:
array([[5.1, 1.4, 0.2],
       [4.9, 1.4, 0.2],
       [4.7, 1.3, 0.2]])

分散しきい値(VT)は、最も基本的な特徴選択方法の1つです。この方法は、分散が小さいフィーチャは分散が大きいフィーチャよりも重要性が低い可能性があるという事実に基づいています。

  • 注意点:
    • 分散は一元化されていないため、特徴データセット内の特徴の単位が異なる場合、VTは機能しません。
    • 分散のしきい値は手動で選択されるため、適切なしきい値の手動選択に依存する必要があります。パラメータvariance_:VarianceThreshold()。fit(features).variances_を使用して、各機能の分散を表示できます。
    • 機能が標準化されている場合、分散しきい値はスクリーニングの役割を果たしません。

2.バイナリ機能の分散のしきい値処理

問題の説明:よく知られている機能データのセットがあり、分散が小さい機能は削除する必要があります。

解決策:与えられた分散のしきい値を持つバイナリ機能を選択します。

from sklearn.feature_selection import VarianceThreshold
#创建特征矩阵
features = [[0,1,0],
            [0,1,1],
            [0,1,0],
            [0,1,1],
            [1,0,0]]
#创建VarianceThreshold对象并运行
thresholder = VarianceThreshold(threshold = (0.75 * (1-0.75)))
thresholder.fit_transform(features)
output:
array([[0],
       [1],
       [0],
       [1],
       [0]])

数値特徴と同様に、情報量の多い分類特徴を選択する方法の1つは、それらの分散を調べることです。バイナリ特徴(つまりベルヌーイ確率変数)では、分散は次のように計算されます。

V ar(x)= p(1 − p)Var(x)= p(1-p) V a r x =p 1p
ここで、pは、観測値が1つのカテゴリに属する​​確率です。pの値を設定することにより、ほとんどの観測値が同じカテゴリに属する​​フィーチャを削除できます。

3.関連性の高い機能の処理

問題の説明:特徴マトリックスの一部の特徴には高い相関関係があります

解決策:相関行列を使用して、相関の高い特徴があるかどうかを確認し、ある場合はそのうちの1つを削除します。

import pandas as pd
import numpy as np
#创建一个特征矩阵,其中包含两个高度相关的特征
features = np.array([[1,1,1],
                     [2,2,0],
                     [3,3,1],
                     [4,4,0],
                     [5,5,1],
                     [6,6,0],
                     [7,7,1],
                     [8,7,0],
                     [9,7,1]])
#将特征矩阵转换成DataFrame
dataframe = pd.DataFrame(features)
print(dataframe)
#创建相关矩阵
corr_matrix = dataframe.corr().abs()
#选择相关矩阵的上三角阵
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape),k =1).astype(np.bool))
#找到相关性大于0.95的特征列的索引
to_drop = [column for column in upper.columns if any(upper[column] > 0.95)]
#删除特征
dataframe.drop(dataframe.columns[to_drop],axis = 1).head(5)
#output:
0	2
0	1	1
1	2	0
2	3	1
3	4	0
4	5	1

4.分類タスクに関係のない機能を削除します

問題の説明:分類されたターゲットベクトルに従って、情報量の少ない特徴を削除します

解決策:
サブタイプの特徴については、各特徴とターゲットベクトルのカイ2乗統計量を計算します

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2,f_classif
#加载数据
iris = load_iris()
features = iris.data
target = iris.target
#将分类数据转换成整数型数据
features = features.astype(int)
#选择卡方统计量最大的两个特征
chi2_selector = SelectKBest(chi2,k = 2)
features_kbest = chi2_selector.fit_transform(features,target)
#显示结果
print("original number of features:",features.shape[1])
print("Reduced number of features:",features_kbest.shape[1])

出力:

original number of features: 4
Reduced number of features: 2

数値特徴データの場合、各特徴とターゲットベクトル間の分散分析F値を計算します。

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2,f_classif
#加载数据
iris = load_iris()
features = iris.data
target = iris.target
#将分类数据转换成整数型数据
features = features.astype(int)
#选择F值最大的两个特征
fvalue_selector = SelectKBest(f_classif,k = 2)
features_kbest = fvalue_selector.fit_transform(features,target)
#显示结果
print("original number of features:",features.shape[1])
print("Reduced number of features:",features_kbest.shape[1])

固定フィーチャの選択に加えて、フィーチャの上位n%をSelectPercentileメソッドで選択できます。

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2,f_classif
from sklearn.feature_selection import SelectPercentile
#加载数据
iris = load_iris()
features = iris.data
target = iris.target
#将分类数据转换成整数型数据
features = features.astype(int)
#选择F值位于75%的两个特征
fvalue_selector = SelectPercentile(f_classif, percentile = 75)
features_kbest = fvalue_selector.fit_transform(features,target)
#显示结果
print("original number of features:",features.shape[1])
print("Reduced number of features:",features_kbest.shape[1])

出力:

original number of features: 4
Reduced number of features: 3

カイ二乗統計は、2つの分類ベクトルの相互独立性をチェックできます。言い換えると、カイ2乗統計量は、観測されたサンプルサイズと予想されるサンプルサイズの差を表します(特徴がターゲットベクトルに関連していないと仮定)。

特徴とターゲットベクトルのカイ二乗統計量を計算することにより、2つの間の独立性の尺度を取得できます。2つが互いに独立している場合、その特徴はターゲットベクトルとは関係がなく、特徴には分類に必要な情報が含まれていないことを意味します。逆に、特徴とターゲットベクトルの相関が高い場合は、分類モデルのトレーニングに必要な多くの情報が特徴に含まれていることを意味します。

5.再帰的特徴の除去

問題の説明:保持する必要のある最適な機能を自動的に選択します。

解決策:sklearnのRFECVクラスを使用して、相互検証(交差検証、CV)を通じて再帰的特徴除去(REF)を実行します。この方法では、モデルのパフォーマンス(精度など)が低下するまで、モデルを繰り返しトレーニングし、毎回1つの特徴を削除します。残りの機能は最適な機能です。

import warnings
from sklearn.datasets import make_regression
from sklearn.feature_selection import RFECV
from sklearn import datasets,linear_model
#忽略警告信息
#warnings.filterwarnings(action="ingore",module="scipy",message="^internal gelsd")
#生成特征矩阵、目标向量以及系数
features,target = make_regression(n_samples = 10000,
                                  n_features = 100,
                                  n_informative = 2,
                                  random_state = 1)
#创建线性回归对象
ols = linear_model.LinearRegression()
#递归消除特征
rfecv = RFECV(estimator = ols,step = 1,scoring = "neg_mean_squared_error")
rfecv.fit(features,target)
rfecv.transform(features)
#最优特征数量
rfecv.n_features_
#最优特征
rfecv.support_
#将特征从最好到最差排序
rfecv.ranking_

おすすめ

転載: blog.csdn.net/weixin_44127327/article/details/108600365