教師なし学習で特徴選択を実行するRまたはPythonのメソッド[終了]


11

データ内の重要でない/重要な機能を破棄/選択するためにR / Pythonで利用可能なメソッド/実装は何ですか?データにラベルがありません(監視なし)。

データには、タイプが混在する約100の特徴があります。一部は数値ですが、その他はバイナリ(0/1)です。


どのような教師なし学習アルゴリズムを使用していますか?データはどのように見えますか?
Max Candocia 14

@ user1362215、監視なしのアルゴリズムを適用する前に、機能の削除を実行する方法を見つけようとしています。
学習者

このscikit-learn チートシートを見たことがありますか?それはあなたが始めるのに役立つかもしれません...
スティーブ・S 14

監視なしモードでランダムフォレストのように、それ自体で機能選択を実行する監視なしメソッドを使用しないのはなぜですか?
JEquihua 2014

1
私は完全には確信がありません。つまり、ランダムフォレストは完全に非パラメトリックであるため、仮定について心配する必要はありません。それがあなたの目的に役立つかどうかはわかりません。私が言えることは、隔離フォレストと呼ばれる「異常検出」専用のランダムフォレストのバージョンがあるということです:cs.nju.edu.cn/zhouzh/zhouzh.files/publication/…Rに実装がありましたが、私は現時点で稼働しているかどうかはわかりません。
JEquihua 14

回答:


7

それは1年前ですが、それでも関連があると感じているので、Charlesが彼の回答でリンクした論文で提案されているPrincipal Feature Analysis(PFA)のpython実装を共有したいと思いました。

from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from collections import defaultdict
from sklearn.metrics.pairwise import euclidean_distances
from sklearn.preprocessing import StandardScaler

class PFA(object):
    def __init__(self, n_features, q=None):
        self.q = q
        self.n_features = n_features

    def fit(self, X):
        if not self.q:
            self.q = X.shape[1]

        sc = StandardScaler()
        X = sc.fit_transform(X)

        pca = PCA(n_components=self.q).fit(X)
        A_q = pca.components_.T

        kmeans = KMeans(n_clusters=self.n_features).fit(A_q)
        clusters = kmeans.predict(A_q)
        cluster_centers = kmeans.cluster_centers_

        dists = defaultdict(list)
        for i, c in enumerate(clusters):
            dist = euclidean_distances([A_q[i, :]], [cluster_centers[c, :]])[0][0]
            dists[c].append((i, dist))

        self.indices_ = [sorted(f, key=lambda x: x[1])[0][0] for f in dists.values()]
        self.features_ = X[:, self.indices_]

次のように使用できます。

import numpy as np
X = np.random.random((1000,1000))

pfa = PFA(n_features=10)
pfa.fit(X)

# To get the transformed matrix
X = pfa.features_

# To get the column indices of the kept features
column_indices = pfa.indices_

これは、記事で説明されているアルゴリズムに厳密に従っています。私はこの方法が有望だと思いますが、正直なところ、監視なしの機能選択に対する最も堅牢なアプローチだとは思いません。もっと良いものがあればアップデートを投稿します。


リンク先の論文で説明されている方法では、ステップ1は共分散行列を計算し、ステップ2はステップ1の共分散行列のPCAを計算します。fit関数はステップ1をスキップし、元のデータセットでPCAを実行すると思います。
user35581 2018年

@ user35581良い点。ただし、それらは、(1)元のデータから共分散行列を生成し、(2)SVDメソッドを使用して共分散行列の固有ベクトルと固有値を計算することです。これらの2つのステップを組み合わせたものがPCAです。主成分は、元のデータの共分散行列の固有ベクトルです。
Ulf Aslak、2018年

@Ulf Aslakが、教師なし機能選択への最も堅牢なアプローチではないと思う理由を詳しく説明できますか?
ヒポグルシド

1
@hipoglucido正直なところ、私が書いたときの自分の考えを説明することはできません。3年前です。コードをもう一度確認すると、KMeansの使用(これは非決定的)に関係していると思います。また、これがPCA以外で変換された機能をクラスタリングすることとどのように比較されるのかを確認したいと思います。
Ulf Aslak



0

私は便利なリンクを見つけました。それらはMATLABの実装であり、あなたのためにうまくいくかもしれません http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html それはマルチクラスター機能の選択ですメソッド、あなたは最近の論文でそれについての強い基盤を見つけることができますそれがあなたのために働くかどうか私に知らせてください


0

には多くのオプションがありますR。見栄えの良い場所は、caret他の多くのパッケージやオプションへの素晴らしいインターフェイスを提供するパッケージです。こちらのウェブサイトをご覧ください。そこに多くのオプションがありますが、私は1つを説明します。

以下は、組み込みのR「mtcars」データセットを使用した単純なフィルターの使用例です(以下を参照)。

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

今いくつかのコードのセットアップ(パッケージの読み込みなど):

# setup a parallel environment
library(doParallel)
cl <- makeCluster(2) # number of cores to use
registerDoParallel(cl)
library(caret)

そして、変数を選択する単純なモデルを適合させることができます:

fit1 <- sbf(mtcars[, -1], mtcars[, 1],
  sbfControl =
    sbfControl(functions = rfSBF, method = "repeatedcv", repeats = 10)
)

結果を表示すると、以下が得られます。

fit1
Selection By Filter

Outer resampling method: Cross-Validated (10 fold, repeated 10 times) 

Resampling performance:

  RMSE Rsquared RMSESD RsquaredSD
 2.266   0.9224 0.8666     0.1523

Using the training set, 7 variables were selected:
   cyl, disp, hp, wt, vs...

During resampling, the top 5 selected variables (out of a possible 9):
   am (100%), cyl (100%), disp (100%), gear (100%), vs (100%)

On average, 7 variables were selected (min = 5, max = 9)

最後に、選択した変数(内fit1$optVariables)を結果に対してプロットできますmpg

library(ggplot2)
library(gridExtra)
do.call(grid.arrange, 
lapply(fit1$optVariables, function(v) {
  ggplot(mtcars, aes_string(x = v, y = "mpg")) +
    geom_jitter()
}))

このグラフの結果: 散布図


1
これはモデルがmpg結果として使用するものであるため、OPが要求する教師なし学習ではありません。教師なしモデルでこのようなメソッドを使用する方法はありますか?
Max Ghenis

0

nsprcompRパッケージ、あなたのニーズに合うことができ、スパース主成分分析のための方法を提供します。

たとえば、機能が一般的に線形に相関していると考えられ、上位5つを選択する場合、最大5つの機能でスパースPCAを実行し、最初の主成分に制限できます。

m <- nsprcomp(x, scale.=T, k=5, ncomp=1)
m$rotation[, 1]

または、機能の直交性をキャプチャする場合は、上位5つのPCのそれぞれから上位の機能を選択して、各PCを1つの機能に制限できます。

m <- nsprcomp(x, scale.=T, k=1, ncomp=5)
m$rotation

これらのアンサンブルも役に立ちます。つまり、さまざまな方法で一貫して上位に来る特徴は、特徴空間の大きな変動を説明する可能性があります。nsprcomp少し遊んでみたところ、最初の2つの方法では同じ機能の約1/2が上位に表示されているようです。そうは言っても、このプロセスを最適化することは経験的な努力かもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.