R / Python中有哪些可用的方法/实现来丢弃/选择数据中不重要/重要的功能?我的数据没有标签(无监督)。
数据具有约100种混合类型的要素。一些是数字的,而另一些是二进制的(0/1)。
R / Python中有哪些可用的方法/实现来丢弃/选择数据中不重要/重要的功能?我的数据没有标签(无监督)。
数据具有约100种混合类型的要素。一些是数字的,而另一些是二进制的(0/1)。
Answers:
它已经一岁了,但是我仍然觉得这很重要,所以我只想分享我在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
软件包,它为许多其他软件包和选项提供了一个不错的界面。您可以在这里查看网站。有很多选择,但我将举例说明。
这是一个使用内置于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
用作结果。有没有办法在无人监督的模型中使用此类方法?
在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提升到了顶部。也就是说,优化此过程可能是一项经验性的工作。