スクリーニング方法を特徴としては:フィルター(濾過)、ラッパー(包装方法)を、組み込み(埋め込み)
フィルター:ろ過
特徴選択方法:除去小さな変化特性値(低分散を有する取り外し機能)
方法#1シンプルだが使用することは容易ではない、それは予め選択として特徴付けることができ、小さな変化特性値を除去するため
に十分なマシンリソース場合、設定された閾値より高いことが、所望の情報の全てを保存する、または唯一の1つの特徴だけの離散的な特性値を濾過しました。
離散変数:機能の95%が1の値の一例である、それは機能の小さな役割と考えることができます。100%が1である場合、これは何の意味を備えていません。
連続変数:分散が一定の閾値未満である機能を放棄。
sklearn.feature_selectionインポートVarianceThresholdから X = [0、0、1]、[0、1、0]、[1、0、0]、[0、1、1]、[0、1、0]、[ 0、1、1]] 、SEL = VarianceThreshold(閾値=(8×(1 - 0.8))) sel.fit_transform(X)
実装2つの特徴の選択:単変量特徴選択
応答変数と各機能の関係を測定するための単変量独立特徴選択方法、特徴選択は、各機能のための単変量テストを行うことができる
悪い特徴を捨てスコアに基づいて、機能及び応答変数間の関係を測定します。この方法は、簡単な操作、簡単な理解しやすい
一般的に良好な効果を有している(ただし、汎化能力を改善するための最適化機能は、有効ではないかもしれない)データを理解するために
、データ構造、データ、特性を理解するために使用することができる単変量特徴選択をまた、無関係な機能を除外するために使用することができますが、それ冗長機能を見つけることができません。
1.Pearson相関係数(ピアソン相関) - 主に連続的なスクリーニング機能に使用される、敏感のみ線形
NP numpyのインポートAS scipy.statsインポートpearsonrのから np.random.seed(2019) サイズ= 1000 X = np.random.normalは、(0 ,. 1、サイズ) #は、2枚の変数の間の相関係数を算出する プリント(「低ノイズを{} ".format(pearsonr(X、X + np.random.normal(0 ,. 1、サイズ)))) 印刷(" {}高いノイズ「フォーマット(pearsonr(X、X + np.random.normal(0、 10、サイズ))))
2.最大相互情報と係数情報(相互情報および最大情報係数)
エントロピーH(Y)及び条件付きエントロピーH(Y | X)は相互情報量の差と呼ばれる-のみの離散機能を選択するために使用される、離散的に非常に敏感である
相互情報を直接することは容易ではないので特徴選択ので、最大係数情報の導入です。まず、最適離散的を見つける最大データ情報は、次にメトリック相互情報、区間[0,1]の値に値を変換します。
X = np.random.normal(0,10,300) Z = X * X pearsonr(X、Z) #输出-0.1 minepyインポート鉱山から M = MINE() m.compute_score(X、Z) プリント(m.mic( ))
3. 距離の相関係数(距離相関) -生まれのピアソン相関係数の弱点を克服するために。
scipy.spatial.distanceインポートPDIST、squareformから NPとしてインポートnumpyの numbaproインポートJITからのfloat32 :DEF distcorr(X、Y) ""」距離相関関数を計算し 、>>> A = [1,2,3,4 5] >>> B = np.array([1,2,9,4,4]) >>> distcorr(a、b)は 0.762676242417 ""」 X = np.atleast_1d(X) Y = np.atleast_1d( Y) であればnp.prod(X.shape)== LEN(X): X = X [:,なし] もしnp.prod(Y.shape)== LEN(Y): Y = Y [:,なし] X = np.atleast_2d(X) Y = np.atleast_2d(Y) N = X.shape [0] Y.shapeなら[0] = X.shape [0]! 「(ValueErrorを送出しサンプル数は 'と一致しなければなりません) 、A = squareform(PDIST(X)) B = squareform(PDIST(Y)) A = A - a.mean(軸= 0)なし:] - a.mean (軸= 1):,なし] + a.mean() B = B - b.mean(軸= 0)なし:] - b.mean(軸= 1):,なし] + B。 ()を意味 dcov2_xy =(* B).SUM()/フロート(N×n個) dcov2_xx =(* A).SUM()/フロート(N×n個) dcov2_yy =(のB * B).SUMを() /フロート(N * N) DCOR = np.sqrt(dcov2_xy)/np.sqrt(np.sqrt(dcov2_xx)* np.sqrt(dcov2_yy))は DCORを返します
4.学習モデルの機能に基づいて(モデルベースのランキングを)並べ替え
この方法の考え方は、個々の特徴と応答変数の予測モデルを構築するために使用する機械学習アルゴリズムを直接使用することです。特性と応答との間の関係が非線形である場合、このようなツリーに基づく方法(決定木、ランダムフォレスト)、拡張された線形モデルなどの多くの選択肢があります。ツリーベースの方法は、彼らが非線形な関係をシミュレートすることができますので、最も簡単な方法の一つである多くの調整を必要としません。
しかし、ツリーの深さは比較的小さくなければならないので、主として過剰適合を回避するために、クロスバリデーションを適用すべきです。
sklearn.datasetsからload_bostonをインポート sklearn.model_selectionインポートtrain_test_split、cross_val_score、ShuffleSplitから インポートStandardScalerをsklearn.preprocessingから sklearn.ensembleインポートRandomForestRegressorから #from sklearn.metricsインポートr2_score、mean_squared_error、mean_absolute_error 例として#Loadボストンハウジングデータセット ボストン= load_boston () #print(boston.DESCR) #x_train、x_test、y_train、y_test = train_test_split(boston.data、boston.target、random_state = 33、test_size = 0.25) X =ボストン[ "データ"] Y =ボストン[ "ターゲット"] 名=ボストン[" FEATURE_NAMEに"] RF = RandomForestRegressor(n_estimators = 20、MAX_DEPTH = 4) のスコア= [] #は、それぞれが特徴選択のための基礎として、各モデルのスコアリングのための個々のトレーニングモデルを備えています使用してください。 DT = DecisionTreeRegressor() Iの範囲内(X.shape [1])の場合: スコア= cross_val_score(RF、X [:, I:I + 1]、Y、スコア= "R2"、 CV = ShuffleSplit(LEN(X)、3、。 3)) scores.append((ラウンド(np.mean(スコア)、3)、名前[I])) プリント(ソートされた(スコアを、逆= TRUE)) sklearn.svmインポートSVRから l_svr = SVR(カーネル=」 #poly線形')、RBF l_svr.fit(x_train、y_train) l_svr.score(x_test)、y_test sklearn.neighborsからインポートKNeighborsRegressor KNN = KNeighborsRegressor(重み= "均一") knn.fit(x_train、y_train) knn.score (x_test、y_test) からsklearn.treeインポートDecisionTreeRegressorの dt.fit(x_train、y_train) dt.score(x_test、y_test) sklearn.ensembleインポートRandomForestRegressorから RFR = RandomForestRegressor() rfr.fit(x_train、y_train) rfr.score(x_test、y_test) sklearn.ensembleインポートExtraTreesRegressorから ETR = ExtraTreesRegressor() etr.fit( x_train、y_train) etr.score(x_test、y_test) sklearn.ensembleインポートからGradientBoostingRegressor GBR = GradientBoostingRegressor() gbr.fit(x_train、y_train) gbr.score(x_test、y_test)
カイ二乗検定 - のみ分類問題における個別の特徴選択のための
カイ二乗は、2つの独立したイベントを記述する、または実際の観測値との偏差の程度および期待値を記述する。期待値との偏差の実際の観測値テーブル大きく、カイ二乗値が大きいだけでなく、二つの事象の独立性が弱くします。
#インポートライブラリSelectKBestとchi2をsklearn sklearn.feature_selectionインポートSelectKBest、chi2のから 最初の5つの最も関連性の高い機能選択# X_chi2 = SelectKBest(chi2、K = 5).fit_transform(X、Y) X_chi2.shapeを
3つの特徴選択方法を達成:線形モデルが正則で
同じスケール上のすべての機能は、モデルの最高係数の最も重要な機能を持っている必要がありますが、出力特性に関連していない場合はゼロに近い可変係数値を持つ必要があります。でも、単純な線形回帰モデル、データは非常に騒々しい(または機能の数と比較して大量のデータを持っている)と機能(相対)独立でない場合には、この方法でもうまく動作します。
正則は、追加の制約やペナルティ項を置くことである上、改善汎化能力を防ぐために、合併に既存のモデル(損失関数)に追加されます。
線形モデルを使用する場合、L1とL2正則化正則化はまた、ラッソとリッジをいいます。
他の特徴係数が0になる傾向可能にしながら、いくつかの品質の特徴を取り出すことができる投げ縄。ときに、このような機能の数を減らす必要として、それは便利ですが、データを理解するための非常に良いではありません。
リッジ回帰係数が均一にそれぞれのコンテキスト変数に割り当てられますが、より多くの便利な機能を理解するためにL2正則
多重線形回帰式の進化は、θを見つけることができます。各機能は、対応する重みを持つ重み係数の正と負の値を表す目標値が正の機能の相関または負の相関係数の絶対値の特徴を表すの重要重量であることを特徴とする請求COEFは、係数です。
#ボストンデータを取得 sklearn.linear_modelインポート線形回帰から ボストン= load_boston() X = boston.data Y = boston.targetの #の外れ値を濾別 X X = [Y <50] Y = Y [Y <50] (REG =線形回帰を) reg.fit(X、Y) #1 COEFは、要求注文後 coefSort = reg.coef_.argsort() #featureNameSort:それぞれの大きな値に小さいから、タグ値に応じて効果名前機能 #featureCoefSoreを:タグ値に応じて小規模から大規模coef_への影響、 featureNameSort = boston.feature_names [coefSort] featureCoefSore = reg.coef_ [coefSort] 印刷( "featureNameSort:"、featureNameSort) 印刷( "featureCoefSore:"、featureCoefSore) リニア#Aヘルパープリティ印刷方法モデル DEFのpretty_print_linear(coefs、名前=なし、ソート=偽): :名==なし場合 名前= [範囲内のxの"X%sの" %×(LEN(coefs))] LST = ZIP(coefs、名前) 並べ替える場合: ソート= LST(LST、キー=ラムダX:-np.abs(X [ 0])) リターン"+" .join( "%S *%sの" %(ラウンド(COEF、3)、名) LSTでCOEF、名) #投げ縄回归 sklearn.linear_modelインポートからラッソ インポートsklearn.preprocessingからStandardScaler sklearn.datasetsからはload_bostonインポート ボストン= load_boston() スケーラ= StandardScaler() X = scaler.fit_transform(ボストン[ "データ"]) Y =ボストン[ "ターゲット"] 名=ボストン[ "FEATURE_NAMEに"] 投げ縄=ラッソ(アルファ= 0.3) lasso.fit(X、Y) 、印刷( "ラッソモデル:{}"形式( pretty_print_linear(lasso.coef_、名前、ソート=真))) #岭回归 sklearn.linear_model輸入リッジから sklearn.metricsからr2_scoreインポート サイズ= 100 #WEが異なるランダムシードでメソッドを10回実行する 範囲のiについて(10) : 印刷( "ランダムシード{}"形式(I)) np.random.seed(種子= I) X_seed = np.random.normal(0、1、サイズ) X1 = X_seed + np.random.normal(0 、0.1、サイズ) X2 = X_seed + np.random.normal(0、0.1、サイズ) X3 = X_seed + np.random.normal(0、0.1、サイズ) Y = X1 + X2 + X3 + NP。 random.normal(0、1、サイズ) X = np.array([X1、X2、X3])。Tの LR =線形回帰() lr.fit(X、Y) の印刷( "線形モデル:{}"形式(pretty_print_linear(lr.coef_))) リッジ=リッジ(アルファ= 10) ridge.fit(X、Y) の印刷(「リッジモデル: {}」形式(pretty_print_linear(ridge.coef_)))
:特徴と4を実装することを選択したランダムフォレストの選択を
1.平均不純物の減少は(不純物を減少させる平均)
各機能がツリーの数は純度でない減少のために決定木を計算することができる訓練します。森の木のためには、各特徴の不純物の数を減少させ、それが標準的な特徴選択、平均の純度を低下させないの平均値から算出することができます。
インポートload_bostonのsklearn.datasets sklearn.ensembleインポートRandomForestRegressorから インポートnumpyのNPとして ASボストンハウジングデータセットの例を#load ボストンload_boston =() X-ボストン= [ "データ"] Yボストン= [ "ターゲット"] 名ボストン= [ " FEATURE_NAMEに「] #ランダムフォレストモデルのトレーニング、およびfeature_importances_プロパティで各機能のスコアを取得することの重要性。RandomForestRegressor = RF() rf.fit(X-、Y) を印刷( "ソートされた彼らのスコアによって特徴:") を印刷(ソート(ZIP(地図(ラムダX:ラウンド(X ,. 4)、rf.feature_importances_)、名)、 逆=真))
2.平均精度の低下(精度低下を意味します)
特徴選択は、モデルの精度率で各機能の影響を直接測定することによって行われます。
主なアイデアは、それぞれの特徴の特徴値の順序を乱し、そしてモデルの精度の順序の変更の影響を測定することです。
変数が重要でないために、モデルの精度に順序効果はあまりできません混乱させる。
重要な変数では、モデルの精度が低下します秩序を混乱させる。
インポートShuffleSplitのsklearn.model_selection インポートr2_score sklearn.metricsから インポートdefaultdictコレクションから X-ボストン= [ "データ"] Yボストン= [ "ターゲット"] RF = RandomForestRegressor() スコアはdefaultdict(リスト)= ON A番号スコアを#crossvalidateデータの分割の異なるランダム train_idxため、ShuffleSplit(LEN(X-)、100、.3)でtest_idx: X_train、X-X_test = [train_idx]、X- [test_idx] Y_train、Y android.permission.FACTOR = [train_idx]、Y [test_idx。 ] #元の学習モデル、前記後続のシャッフリング固有値ACC比較のための標準である修正前、。 rf.fit = R&LT(X_train、Y_train) ACC = r2_score(android.permission.FACTOR。、rf.predict(X_test)) #各列を通る前記 範囲のiについて(X.shape [1 ])。 X_T = X_test.copy() シャッフリング位この列機能、内部特徴の値との相互作用のため np.random.shuffle(X_T [:I]) shuff_acc = r2_score(android.permission.FACTOR、Rf.predict(X_T)) 機能をシャッフル#値の後に精度の平均減少度を算出します。。スコア[名[I]]のappend((ACC-shuff_acc)/ ACC) を印刷( "ソートされた彼らのスコアによって特徴:") を印刷(ソート([(ラウンド(np.mean(スコア),. 4)、偉業)のために。特技、scores.items()]でスコア 、逆= TRUE))
実装5つの特徴選択:トップの特徴選択
1.安定性(安定性選択)
その主なアイデアは、データの異なるサブセット上で実行することであり、前記特徴選択アルゴリズムのサブセットを、一定の繰り返し、最終的な要約の前記選択結果。統計は、このような特徴は、周波数(試験される数がサブセット内の数で割ったことの重要な特徴として選択した)の重要な特徴と見なすことができます。
理想的には、スコアの重要な特徴は、100%に近くなります。特徴付け少し弱い非スコア数0、最も便利な機能は、0のスコアに近くなりつつ。
sklearn.linear_modelインポートRandomizedLassoから sklearn.datasetsからload_bostonインポート )ボストン= load_boston( ボストンハウジングデータを#using。 #Dataはsklearnの実装によって自動的にスケーリングされます X =ボストン[ "データ"] Y =ボストン[ "ターゲット"] 名=ボストン[ "FEATURE_NAMEに"] rlasso = RandomizedLasso(アルファ= 0.025) rlasso.fit(X、Y) の印刷( "彼らのスコアによってソート機能:") 印刷(ソート(ジップ(マップ(ラムダX:ラウンド(X、4)、rlasso.scores_)、名)、 = Trueのリバース))
2.再帰的な機能の削除(再帰機能の除去、RFE)
その後、再びそれに選出された機能、機能(係数に応じて選択することができる)再帰的な機能の排除の考え方は(例えばSVMや回帰モデルなど)のモデルを構築し、最高(または最悪)を選択するように繰り返され、メイン、およびすべての機能までトラバースされ、残りの機能にこのプロセスを繰り返します。
このプロセスは、排除するために特徴があるソート機能です。したがって、最適な特徴サブセットを見つけるために貪欲なアルゴリズムです。
RFEの安定性は、モデルが使用されたの繰り返しの時に地上階に大きく依存します。
RFE共通リターンが使用された場合は、回帰が不安定である正則されていない場合、RFEは不安定です。
RFEはリッジを使用しますが、リッジ正則のリターンで安定している場合は、RFEは安定しています。
sklearn.feature_selectionインポートRFEから sklearn.linear_modelインポート線形回帰から ボストン= load_boston() X =ボストン[ "データ"] Y =ボストン[ "ターゲット"] 名=ボストン[ "FEATURE_NAMEに"】 モデルとして線形回帰#USE LR =線形回帰は、() すなわち、最後の1つのまで除去を継続し、すべての機能をRANK位 RFE = RFE(LR、n_features_to_select = 1) rfe.fit(X、Y) :プリント( "自分のランクによってソート機能") 、印刷(ソート(ジップ(マップ(ラムダX:ラウンド(X、4)、rfe.ranking_)、名)))
線形モデルの正則化は、特徴選択と機能の理解のために使用することができます。比較正則L1、L2正則より安定した性能は、L2正則は、データが理解するのに適しています。
応答は、多くの場合、変数と特性との非線形な関係であることから、基礎拡張メソッドは、単純な線形モデルの使用を考慮することが、これに基づいて、より適切な特徴空間に変換するために使用することができます。
ランダムフォレストは、使いやすい、非常に人気の特徴選択方法です。しかし、それは2つの大きな問題があります。
- 低得点する可能性が高い重要な機能(問題の特徴を関連付けられています)
- この方法は、特性可変カテゴリとより多くの機能(バイアスの問題)のために有利です
性能を改善するために最適なモデルの機能を選択するときに、クロスバリデーション法は、プロセスが他の方法よりも優れているかどうかを検証するために使用することができます。
注意を払うようにするときの機能の選択データの方法を理解する場合には、安定性の特徴選択モデルは非常に重要であり、安定性が悪いモデルが簡単に間違った結論につながることができます。
参考文献: