R / Python에서 데이터에서 중요하지 않은 / 중요한 기능을 삭제 / 선택할 수있는 방법 / 구현 방법은 무엇입니까? 내 데이터에는 라벨이 없습니다 (감독되지 않음).
데이터에는 혼합 유형의 ~ 100 기능이 있습니다. 일부는 숫자이고 다른 일부는 이진수 (0/1)입니다.
R / Python에서 데이터에서 중요하지 않은 / 중요한 기능을 삭제 / 선택할 수있는 방법 / 구현 방법은 무엇입니까? 내 데이터에는 라벨이 없습니다 (감독되지 않음).
데이터에는 혼합 유형의 ~ 100 기능이 있습니다. 일부는 숫자이고 다른 일부는 이진수 (0/1)입니다.
답변:
그것은 1 살이지만 여전히 관련이 있다고 생각합니다. 따라서 Charles가 그의 답변에서 링크 한 논문 에서 제안한대로 PFA (Principal Feature Analysis)의 파이썬 구현 을 공유하고 싶었습니다 .
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 그것은 multicluster 기능 선택이다 방법, 당신은 최근 논문에서 그것에 대한 강력한 기초를 찾을 수 있습니다
에서 사용할 수있는 옵션이 많이 있습니다 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
결과에 대해 선택된 변수 (in )를 플로팅 할 수 있습니다 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를 하나의 기능으로 제한 할 수 있습니다.
m <- nsprcomp(x, scale.=T, k=1, ncomp=5)
m$rotation
이들의 앙상블도 유용 할 수 있습니다. 즉, 서로 다른 방법에서 일관되게 최상위에 도달하는 기능은 기능 공간에서 많은 양의 차이를 설명 할 수 있습니다. 주변에 연주 데 nsprcomp
조금, 그것은 처음 두 방법 인상 가기 동일한 기능의 ~ 이분의 일처럼 보인다. 즉,이 프로세스를 최적화하는 것은 실험적인 노력 일 수 있습니다.