비지도 학습에서 기능 선택을 수행하는 R 또는 Python의 메소드 [닫기]


11

R / Python에서 데이터에서 중요하지 않은 / 중요한 기능을 삭제 / 선택할 수있는 방법 / 구현 방법은 무엇입니까? 내 데이터에는 라벨이 없습니다 (감독되지 않음).

데이터에는 혼합 유형의 ~ 100 기능이 있습니다. 일부는 숫자이고 다른 일부는 이진수 (0/1)입니다.


어떤 종류의 비지도 학습 알고리즘을 사용하고 있습니까? 데이터는 어떻게 생겼습니까?
맥스 칸도 키아

@ user1362215, 감독되지 않은 알고리즘을 적용하기 전에 기능 제거를 수행하는 방법을 찾으려고합니다.
학습자

당신이 본 적이 scikit 배우기 쪽지를 하기 전에를? 시작하는 데 도움이 될 수 있습니다 ...
Steve S

감독되지 않은 모드에서 임의 포리스트처럼 기능 선택 자체를 수행하는 감독되지 않은 방법을 사용하지 않는 이유는 무엇입니까?
JEquihua

1
나는 확실하지 않습니다. 임의의 숲은 완전히 비 파라 메트릭이므로 가정에 대해 걱정하지 마십시오. 확실하지 않은 것은 그것이 당신의 목적에 도움이 될 것입니다. 내가 말할 수있는 것은 격리 포리스트라고하는 "이상 감지"에 대한 임의 포리스트 버전이 있다는 것입니다. cs.nju.edu.cn/zhouzh/zhouzh.files/publication/… R에는 구현이 있었지만 저는 현재 작동하고 있는지 확실하지 않습니다.
JEquihua

답변:


7

그것은 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_

이것은 기사에서 설명한 알고리즘을 엄격하게 따릅니다. 나는 그 방법이 약속했다고 생각하지만 솔직히 그것이 감독되지 않은 기능 선택에 대한 가장 강력한 접근법이라고 생각하지 않습니다. 더 좋은 것을 발견하면 업데이트를 게시 할 것입니다.


연결하는 종이에 설명 된 방법에서 1 단계는 공분산 행렬을 계산하는 것이고 2 단계는 1 단계에서 공분산 행렬의 PCA를 계산하는 것입니다. fit함수가 1 단계를 건너 뛰고 원래 데이터 세트에서 PCA를 수행 한다고 생각합니다 .
user35581

@ user35581 좋은 지적입니다. 그러나 그들이하는 일은 (1) 원래 데이터로부터 공분산 행렬을 생성 한 다음 (2) SVD 방법을 사용하여 공분산 행렬의 고유 벡터와 고유 값을 계산하는 것입니다. 이 두 단계를 결합하여 PCA라고합니다. 원리 성분은 원래 데이터의 공분산 행렬의 고유 벡터입니다.
Ulf Aslak

@Ulf Aslak 왜 이것이 감독되지 않은 기능 선택에 대한 가장 강력한 접근법이 아니라고 생각하는지 자세히 설명 할 수 있습니까?
hipoglucido

1
@hipoglucido 솔직히, 나는 그것을 쓸 때 내 생각을 설명 할 수 없다. 3 년 전입니다. 코드를 다시 검토하면 코드가 KMeans (비 결정적)의 사용과 관련이 있다고 생각하게되었습니다. 또한 이것이 PCA가 변환되지 않은 기능을 클러스터링하는 것과 어떻게 비교되는지 알고 싶습니다.
Ulf Aslak



0

내가 도움이 될 수 느릅 나무 링크를 발견했습니다 것들이다 MATLAB 구현, 그들은 당신을 위해 해결 할 수 http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html 그것은 multicluster 기능 선택이다 방법, 당신은 최근 논문에서 그것에 대한 강력한 기초를 찾을 수 있습니다


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결과에 대해 선택된 변수 (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()
}))

이 그래프의 결과 : 산점도


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를 하나의 기능으로 제한 할 수 있습니다.

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

이들의 앙상블도 유용 할 수 있습니다. 즉, 서로 다른 방법에서 일관되게 최상위에 도달하는 기능은 기능 공간에서 많은 양의 차이를 설명 할 수 있습니다. 주변에 연주 데 nsprcomp조금, 그것은 처음 두 방법 인상 가기 동일한 기능의 ~ 이분의 일처럼 보인다. 즉,이 프로세스를 최적화하는 것은 실험적인 노력 일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.