データ内の重要でない/重要な機能を破棄/選択するためにR / Pythonで利用可能なメソッド/実装は何ですか?データにラベルがありません(監視なし)。
データには、タイプが混在する約100の特徴があります。一部は数値ですが、その他はバイナリ(0/1)です。
データ内の重要でない/重要な機能を破棄/選択するためにR / Pythonで利用可能なメソッド/実装は何ですか?データにラベルがありません(監視なし)。
データには、タイプが混在する約100の特徴があります。一部は数値ですが、その他はバイナリ(0/1)です。
回答:
それは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_
これは、記事で説明されているアルゴリズムに厳密に従っています。私はこの方法が有望だと思いますが、正直なところ、監視なしの機能選択に対する最も堅牢なアプローチだとは思いません。もっと良いものがあればアップデートを投稿します。
fit
関数はステップ1をスキップし、元のデータセットでPCAを実行すると思います。
R のsparclパッケージは、スパース階層およびスパースK平均クラスタリングを実行します。これは便利かもしれません。http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2930825/
主要特徴分析は、教師なしの特徴選択に対する解決策のようです。このホワイトペーパーで説明しています。
私は便利なリンクを見つけました。それらはMATLABの実装であり、あなたのためにうまくいくかもしれません http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html それはマルチクラスター機能の選択ですメソッド、あなたは最近の論文でそれについての強い基盤を見つけることができますそれがあなたのために働くかどうか私に知らせてください
には多くのオプションがあります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()
}))
このグラフの結果:
mpg
結果として使用するものであるため、OPが要求する教師なし学習ではありません。教師なしモデルでこのようなメソッドを使用する方法はありますか?
nsprcomp
Rパッケージ、あなたのニーズに合うことができ、スパース主成分分析のための方法を提供します。
たとえば、機能が一般的に線形に相関していると考えられ、上位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が上位に表示されているようです。そうは言っても、このプロセスを最適化することは経験的な努力かもしれません。