R或Python中在无监督学习中执行特征选择的方法


11

R / Python中有哪些可用的方法/实现来丢弃/选择数据中不重要/重要的功能?我的数据没有标签(无监督)。

数据具有约100种混合类型的要素。一些是数字的,而另一些是二进制的(0/1)。


您正在使用哪种无监督学习算法?您的数据是什么样的?
Max Candocia

@ user1362215,在应用任何非监督算法之前,我试图找到一种执行特征去除的方法。
学习者

您以前看过此scikit学习 备忘单吗?它可能会帮助您入门...
Steve S

为什么不使用无监督的方法来自动进行特征选择,就像无监督模式下的随机森林一样?
耶基瓦

1
我不确定,我的意思是随机森林是完全非参数的,因此不必担心假设。我不确定这是否会达到您的目的。我可以说的是,有一个随机森林版本仅用于“异常检测”,称为隔离森林:cs.nju.edu.cn/zhouzh/zhouzh.files/publication/…在R中有一个实现,但我不确定目前是否已启动并运行。
吉基瓦(Jequihua)2014年

Answers:


7

它已经一岁了,但是我仍然觉得这很重要,所以我只想分享我在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 '18 -10-1

@ user35581好点。但是,他们要做的是(1)从原始数据生成协方差矩阵,然后(2)使用SVD方法计算协方差矩阵的特征向量和特征值。这两个步骤合在一起就是PCA。主成分是原始数据协方差矩阵的特征向量。
Ulf Aslak '18年

@Ulf Aslak您能详细说明为什么您认为它不是无监督特征选择的最可靠方法吗?
hipoglucido

1
老实说,@ hipoglucido,我无法解释我的想法。三年前。再次查看该代码,我被认为与使用KMeans(这是不确定的)有关。另外,我想看看这与仅对未经过PCA转换的功能进行聚类比较。
Ulf Aslak




0

中有许多选项R。一个不错的地方就是该caret软件包,它为许多其他软件包和选项提供了一个不错的界面。您可以在这里查看网站。有很多选择,但我将举例说明。

这是一个使用内置于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
这并不是OP要求的无监督学习,因为您将模型mpg用作结果。有没有办法在无人监督的模型中使用此类方法?
Max Ghenis

0

nsprcomp[R包提供了稀疏主成分分析,这可能满足您的需求的方法。

例如,如果您认为要素通常是线性相关的,并且想要选择前五个要素,则可以运行最多五个要素的稀疏PCA,并限制在第一个主成分上:

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

或者,如果要捕获功能的正交性质,则可以从前五台PC的每一个中选择最高功能,将每台PC限制为一个功能:

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

这些合奏也可能有用。也就是说,在不同方法中始终位于顶部的要素可能会解释要素空间中的大量差异。经过nsprcomp一些尝试,似乎前两种方法将相同功能的〜1/2提升到了顶部。也就是说,优化此过程可能是一项经验性的工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.