분류 목적으로 데이터를 테스트하기 위해 PCA 적용


10

최근에 훌륭한 PCA에 대해 배웠으며 scikit-learn documentation에 요약 된 예를 수행했습니다 .

분류 목적으로 새 데이터 포인트에 PCA를 적용하는 방법을 알고 싶습니다.

PCA를 2 차원 평면 (x, y 축)으로 시각화 한 후 한 점은 한 분류가되고 다른 한 분류는 분류 할 수 있도록 데이터 점을 구분하기 위해 선을 그릴 수 있습니다. 이 "경계"를 그리고 새로운 데이터 포인트에 어떻게 적용합니까?


3
PCA는 분류자가 아니지만 PCA에 "적합"하는 데 사용 된 것과 동일한 변수가 새로운 지점에서 측정된다고 가정하면 PCA에 새로운 관측치를 배치 할 수 있습니다. 그런 다음 새로운 점수를 변수 점수 (로드)의 가중치 합계 (데이터에서 제공 한 가중치)에 배치합니다. 즉 임의 ... 나에게 분류의 좋은 선택 같은 소리하지 않는 PCA를 통해 선 그리기 말했다
개빈 심슨

답변:


16

PCA는 분류 기가 아닌 치수 축소 도구입니다. Scikit-Learn에서 모든 분류 자와 추정기는 PCA가하지 않는predict 방법을 가지고 있습니다 . PCA 변환 된 데이터에 분류자를 맞춰야합니다. Scikit-Learn에는 많은 분류 기가 있습니다. 다음은 PCA 변환 데이터에서 의사 결정 트리 를 사용하는 예입니다 . 의사 결정 트리 분류기를 선택했습니다. 아이리스 데이터 세트의 경우와 같이 둘 이상의 클래스가있는 데이터에 적합합니다.

from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

# load data
iris = load_iris()

# initiate PCA and classifier
pca = PCA()
classifier = DecisionTreeClassifier()

# transform / fit

X_transformed = pca.fit_transform(iris.data)
classifier.fit(X_transformed, iris.target)

# predict "new" data
# (I'm faking it here by using the original data)

newdata = iris.data

# transform new data using already fitted pca
# (don't re-fit the pca)
newdata_transformed = pca.transform(newdata)

# predict labels using the trained classifier

pred_labels = classifier.predict(newdata_transformed)

SciKit learn에는 Pipeline 이라는 편리한 도구가있어 변압기와 최종 분류기를 함께 연결할 수 있습니다.

# you can make this a lot easier using Pipeline

from sklearn.pipeline import Pipeline

# fits PCA, transforms data and fits the decision tree classifier
# on the transformed data
pipe = Pipeline([('pca', PCA()),
                 ('tree', DecisionTreeClassifier())])

pipe.fit(iris.data, iris.target)

pipe.predict(newdata)

이는 교차 검증을 수행 할 때 테스트 데이터 세트에서 파이프 라인의 모든 단계를 실수로 다시 맞추는 것을 방지하므로 특히 유용합니다.

from sklearn.cross_validation import cross_val_score
print cross_val_score(pipe, iris.data, iris.target)
# [ 0.96078431  0.90196078  1.        ]

그런데 좋은 분류 결과를 얻기 위해 PCA를 사용할 필요조차 없습니다. iris 데이터 세트에는 많은 차원이 없으며 의사 결정 트리는 변환되지 않은 데이터에서 이미 잘 수행됩니다.


6
PCA 차원이 줄어들지 않더라도 유용 할 수 있습니다. 차원 의 데이터 집합을 가질 수 있으며 차별적 인 방향은 최대 분산에 해당하는 방향입니다. 치수를 유지 하지만 기준이 다릅니다. 이러한 새로운 기준에 따라 데이터를 매핑하면 원래보다 클래스를 더 잘 구별하는 데 도움이됩니다.
Vladislavs Dovgalecs

@xeon 나는 그것을 몰랐다.
Austin Richardson

아마도 PCA를 회전으로 생각하는지 확인하는 것이 좋습니다. 데이터 집합에 차이가있는 클래스를 식별 할 수 있도록이 속성이있는 경우이 회전이 필요한 모든 것입니다.
Vladislavs Dovgalecs

2
@ xeon : 모든 차원이 유지되면 PCA가 달성하는 유일한 것은 데이터 세트를 장식하는 것입니다. 실제로 일부 분류 자 에게는 도움이 될 수 있지만 대다수는 신경 쓰지 않습니다.
amoeba

1
@amoeba 나는 완전히 동의합니다, 이것은 작은 세부 사항입니다. 나는 그러한 특정 데이터 세트를 다루어야했고 항상 그 교훈을 기억해야했습니다.
Vladislavs Dovgalecs

0

새 데이터에 PCA를 적용하려면 먼저 일부 훈련 데이터 세트에 모델을 맞아야합니다. 물어볼 모델은 무엇입니까? 이것은 데이터 세트에서 뺀 평균 벡터, 각 데이터 벡터를 "미백"하는 데 사용 된 분산 및 학습 된 매핑 매트릭스입니다. 따라서 훈련 데이터와 동일한 공간에 새 데이터 세트를 매핑하려면 먼저 평균을 빼고 희게 한 다음 매핑 행렬로 매핑하십시오.

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