2017-11-02 3 views
3

문서의 텍스트 분류를하고 있는데, 약 4,000 개의 카테고리와 110 만 개의 데이터 샘플이 있습니다.텍스트 분류를 위해 PCA를 사용한 치수 감소

나는 각 문서에서 단어의 주파수를 포함하는 행렬을 구성하고있다. 들은 모든 행에서 동일한 값을 가지고 있기 때문에 시료의 매트릭스는 상기 매트릭스에서

  X1  X2  X3  X4 
D1   1  1  0  1 
D2   1  1  1  0 
D3   1  1  0  0 
D4   1  1  1  1 
D5   0  0  1  0 
D6   0  0  1  1 

아래로 보이는 X1 및 X2는 이중 기능한다. 내가 110 만 개 데이터에서 매트릭스를 구성 할 때

첫째, 90K 기능과 함께 거대한 행렬을 얻을 것이다.

매트릭스 크기를 줄이기 위해 치수 감소 기술을 사용합니다 PCA 저는 희소 매트릭스를 사용하면서 PCA를 계산하기 위해 TruncatedSVD를 사용했습니다. 내가 Sckit 코드 아래 사용 PCA의 구현을 배우고 사용하고

from sklearn.decomposition import TruncatedSVD 
X = [[1,1,0,1], [1,1,1,0], [1,1,0,0],[1,1,1,1],[0,0,1,0],[0,0,1,1]] 
svd = TruncatedSVD(n_components=3) 
svd.fit(X) 
X_new=svd.fit_transform(X) 

X_new의 출력은

array([[ 1.53489494, -0.49612748, -0.63083679], 
    [ 1.57928583, -0.04762643, 0.70963934], 
    [ 1.13759356, -0.80736818, 0.2324597 ], 
    [ 1.97658721, 0.26361427, -0.15365716], 
    [ 0.44169227, 0.75974175, 0.47717963], 
    [ 0.83899365, 1.07098246, -0.38611686]]) 

내가 있어 감소 차원 내가 나이브 입력으로 X_new을주고있다이다 베이 즈 분류 자. 내가 아래에있어 110 만 샘플에 대한

clf = GaussianNB() 
model=clf.fit(X_new, Y) 

는 출력 : 위의 단계가 올바른지

No_of_components 
(“n_components” parameter)   accuracy 
    1000        6.57% 
    500         7.25% 
    100         5.72% 

나는 매우 낮은 정확성을 얻고,

여부?

추가로 포함해야 할 사항은 무엇입니까? 당신이 차원의 rediction 동안 대부분의 정보가 손실 때문에

+0

데이터의 카테고리 분포를 알고 있습니까? – doctorlove

+0

배포 빈도를 범주로 이해합니다. 그것에 따르면, 4k 카테고리 중 약 400 카테고리는 500 개 이상의 데이터를 가지고 있으며, 약 750 카테고리는 100-400 데이터를 가지고 나머지 카테고리는 10보다 아래의 데이터를 가지고 있습니다. –

+2

분산이 심하게 왜곡되면 위험이 더 자주 발생합니다 풍모. 예를 들면, 데이터에 대한 추가 변환을 고려하십시오. Z 점수. – QHarr

답변

1

정확도는 낮다.

당신은 sum(svd.explained_variance_ratio_)으로 확인할 수 있습니다. R^2과 같은이 숫자는 모델의 정밀도를 측정합니다. 모든 정보가 SVD에 보존되어 있으면 1이고 정보가 보존되지 않으면 0입니다. 귀하의 경우 (90K 기능의 3 차원) 나는 그것이 0.1 %의 주문이 될 것으로 기대합니다.

문제의 경우 두 가지 전략 중 하나를 선택하는 것이 좋습니다.

. 치수를 수학적으로 줄이지 마십시오. 대신 정지 단어를 버리고 나머지 단어를 줄 또는 음표로 바꿔서 k 번보다 작은 단어를 삭제하십시오. 정보의 심각한 손실없이 90K에서 15K와 같은 차원으로 여러분의 차원을 끌어 올릴 것입니다.

이러한 기능을 사용하면 실제 사용되는 기능의 수가 1K와 비슷한 수준까지 떨어지게 할 수있는 스파 스 모델 (예 : SGDClassifier, L1 페널티)을 학습 할 수 있습니다. 선형 분류기에 입력하기 전에 단어 수를 TF-IDF로 변환하는 것이 도움이됩니다.

.word2vec 또는 fastText과 같은 미리 훈련 된 치수 감속기를 사용하여 텍스트에서 피쳐를 추출하십시오. 인터넷에는 사전 훈련 된 word2vec 모델, 여러 언어 및 여러 차원 (예 : 200, 1000 등)이 있습니다.

+0

필자는 항상 'fastText'를 분류 자로 생각했는데, 그것을 차원 감속기로 사용하는 방법을 볼 수있는 소스를 제공하겠습니까? – MaLiN2223

+2

'''fastText'''는 먼저 단어 삽입을 계산 한 다음 분류에 사용합니다. 삽입 만하면됩니다. 단어 삽입 대신 텍스트 삽입에 대한 설명은 https://github.com/facebookresearch/fastText/issues/26을 참조하십시오. –