R은 텍스트 분류 작업으로 얼마나 잘 확장됩니까? [닫은]


30

R로 속도를 높이려고합니다. 결국 텍스트 분류를 위해 R 라이브러리를 사용하고 싶습니다. 텍스트 분류를 할 때 R의 확장 성과 관련하여 사람들의 경험이 무엇인지 궁금합니다.

고차원 데이터 (~ 300k 크기)에 빠질 수 있습니다. 특히 분류 알고리즘으로 SVM과 Random Forest를 사용하고 있습니다.

R 라이브러리가 문제 크기에 맞게 확장됩니까?

감사.

편집 1 : 명확히하기 위해 내 데이터 세트에는 1000-3000 개의 행 (아마도 더 많음)과 10 개의 클래스가있을 수 있습니다.

편집 2 : R을 처음 사용하기 때문에 가능한 한 포스터를 더 구체적으로 요구할 것입니다. 예를 들어, 워크 플로우 / 파이프 라인을 제안하는 경우 가능하면 각 단계와 관련된 R 라이브러리를 언급하십시오. 일부 추가 포인터 (예 : 샘플 코드 등)가 케이크에 씌워 질 수 있습니다.

편집 3 : 먼저 의견에 대해 모두 감사합니다. 둘째, 문제에 대해 더 많은 맥락을 제시했을 것입니다. 나는 R을 처음 사용하지만 텍스트 분류에별로 익숙하지 않습니다. tm 패키지를 사용하여 데이터의 일부에서 사전 처리 (stemming, stopword 제거, tf-idf 변환 등)를 이미 수행 했습니다. tm은 약 200 개의 문서에서도 너무 느려서 확장성에 대해 걱정했습니다. 그런 다음 FSelector로 게임을 시작했는데 실제로 느 렸습니다. 그것이 제가 OP를 만든 시점입니다.

편집 4 : 방금 10 개의 수업과 수업 당 ~ 300 건의 교육 문서가 있으며 실제로 전체 교육 세트에서 termXdoc 행렬을 작성하여 차원이 매우 높습니다. 그러나 모든 1-k 급 분류 문제를 일련의 이진 분류 문제로 줄이는 것은 어떻습니까? 그것은 각 k-1 단계에서 교육 문서의 수를 크게 줄이므로 (따라서 차원 성) 그렇지 않습니까? 이 방법이 좋은가요? 정확성과 관련하여 일반적인 멀티 클래스 구현과 어떻게 비교됩니까?


1
행이 몇 개인 300k 크기? 불행히도 R 객체는 메모리에 있어야합니다 (적어도 크게 조정을 고려하지 않는 한 기본적으로 이러한 알고리즘을 직접 작성해야 함). 즉, 8 기가의 램으로 300k 열로 수백 개 이상의 행을 저장할 수 있다고 생각하지 않습니다.
crayola

@crayola : 행 수는 1000-3000입니다.
Andy

2
R 객체 메모리에있을 필요 는 없습니다 . 메모리 매핑은 매우 쉽습니다. 300k 치수는 문제가되지 않습니다. 또한 거의 모든 텍스트 문제가 발생하기 때문에 데이터가 드문 것으로 가정합니다.
반복자

방금 위의 주석을 보았습니다 : 1000-3000 행 만? 매우 작습니다. 당신의 말뭉치가 무엇인지 설명 할 수 있습니까? 이메일 묶음? CRAN의 패키지에 대한 설명? 스토리지 문제보다 P >> N에 더 많은 통계 문제가있을 수 있습니다.
반복자

1
@Iterator : 분류 할 교육 자료 (용어 논문, 에세이 등)가 있습니다.
Andy

답변:


17

의견에서 요청한대로 단계 처리를위한 몇 가지 포인터가 있습니다. 자연어 처리를위한 CRAN 작업보기 에서 여러 도구를 찾을 수 있습니다 . R 에 대한 tm(텍스트 마이닝) 패키지 에서이 문서 를 볼 수도 있습니다 .

  1. 처리하기 전에 단어 토큰의 정규화를 고려하십시오. openNLP(R 패키지가있는) 하나의 경로입니다.
  2. 텍스트 처리의 경우 일반적인 전처리 단계는 tf.idf빈도 * 용어 역 문서 빈도 를 통해 데이터를 정규화하는 것 입니다. 자세한 내용 은 Wikipedia 항목 을 참조하십시오. 더 최근의 정규화가 있지만 이것은 빵과 버터 방법이므로 알아야합니다. R로 쉽게 구현할 수 있습니다. 저장 (docID, wordID, freq1, freq2) 여기서 freq1은 wordID로 색인이 지정된 단어가 지정된 문서에 나타난 횟수이고 freq2는 나타나는 문서 수입니다. 주어진 문서에 나타나지 않는 단어에 대해서는이 벡터를 저장할 필요가 없습니다. 그런 다음 freq1 / freq2를 사용하면 tf.idf 값이 있습니다.
  3. tf.idf 값을 계산 한 후에는 데이터의 전체 차원으로 작업하거나 본질적으로 정보가없는 단어를 필터링 할 수 있습니다. 예를 들어, 하나의 문서에만 나타나는 단어는 많은 통찰력을 제공하지 않습니다. 이렇게하면 치수가 크게 줄어들 수 있습니다. 검사 할 문서 수가 적 으면 1K 크기로 줄이는 것이 적절하다는 것을 알 수 있습니다.
  4. 데이터를 최근에 업데이트하지는 않았지만 (예 : PCA의 경우) Matrix패키지에서 지원하는 희소 행렬을 사용하여 데이터를 용어 행렬 (항목이 이제 tf.idf 값)에 쉽게 저장할 수 있습니다 .

이 시점에서 잘 처리 된 데이터 세트가 있습니다. CRAN 작업보기 또는 텍스트 마이닝 패키지에 인용 된 도구로 진행하는 것이 좋습니다. 예를 들어 처음 4 개 또는 6 개의 주요 구성 요소에 투영하여 데이터를 클러스터링하는 것은 데이터가 그려 질 때 그룹에게 매우 흥미로울 수 있습니다.

또 다른 한 가지 : PCA (*)의 선을 따라 차원 축소가 관련 단어를 본질적으로 집계하므로 다양한 분류 방법을 사용할 때 도움이 될 수 있습니다. 샘플 크기에 따라 처음 10-50 개의 주요 구성 요소가 문서 분류에 필요한 전부일 수 있습니다.

(*) 참고 : PCA는 첫 단계 일뿐입니다. 텍스트 마이닝과 PCA로 시작하는 사람에게는 매우 흥미로울 수 있지만 드문 드문 드문 데이터 세트에는 약간의 방해가 될 수 있습니다. 그러나 첫 번째 단계로, 특히 prcompand princomp기능을 통해 살펴보십시오 .

업데이트 :이 대답에 우선 순위를 명시하지 않았다 - 나는 추천 prcomp보다는 princomp.


+1 좋은 답변; 왜 적은 수의 도크가 더 적은 수의 중요한 변수를 암시한다고 말하는지 궁금합니다.

무슨 말인지 잘 모르겠습니다. 확실히 그것들을 지나치게 적합하게 유지하기 위해서는 합리적인 정규화에서 이러한 변수가 제거 될 것입니다. 또한, 어휘 (P)는 문서 수 또는 샘플 수 (N)와 함께 증가하므로 용어가 처음 나타날 때 그다지 큰 의미가 없습니다. 문서를 계속 추가하면 문서 간 용어의 반복이 유익합니다.
Iterator

@Iterator : 답변 주셔서 감사합니다. 그래서 prcomp및 / 또는 princomp당신이 이해 할수 이러한 종류의 데이터로 확장 할 것인가? 또한 방금 질문을 편집하고 추가 정보를 추가했습니다.
Andy

아니요, 300K 열에 도달하면 크기가 조정되지 않을 수 있습니다. :) (그런 점에서 X'X는 스토리지 문제인 90B 항목을 갖게됩니다.) 대신 tf.idf로 먼저 필터링하십시오. 예를 들어 10 개의 개별 클래스 만있는 경우 클래스를 분리하는 데 더 큰 차원에는 10의 작은 배수가 적합해야합니다. 따라서 1000 치수면 충분합니다. 두 PCA 방법 (btw, 좋습니다 prcomp)이 좋습니다 .
반복자

1000 차원 또는 몇 가지 더 많은 (예 : 2K)로 제한하고 PCA를 수행하면 100 차원 (예 : 과도하지만 이로 인한 피해는 거의 없음)으로 예측 한 다음 분류를 수행 할 수 있습니다. 이 시점에서 너무 흥미로운 일은 없습니다.
반복자

5

먼저, 환영합니다! 텍스트 처리는 매우 재미 있으며 R에서하는 것이 항상 쉬워지고 있습니다.

짧은 대답 : 예-R의 도구는 이제 이러한 종류의 데이터를 처리하는 데 매우 좋습니다. 실제로 R, C ++, Groovy, Scala 또는 RAM의 데이터 스토리지와 관련하여 다른 언어에는 특별한 것이 없습니다. 모든 언어는 8 바이트 이중 부동을 저장합니다 ... 기다려요 ... 기다립니다. .. 8 바이트!

알고리즘과 그 구현은 특히 데이터 구조 및 계산 복잡성과 관련하여 잘못 구현 된 경우 중요합니다. 자체 알고리즘을 구현하는 경우주의하십시오. 다른 코드를 사용하는 경우 모든 환경에서와 마찬가지로주의 emptor가 적용됩니다.

R의 경우 다음을 고려해야합니다.

  1. 데이터 표현 (특히 Matrix패키지 에서 희소 행렬 살펴보기 )
  2. 데이터 스토리지 (아마도 bigmemory또는 ff; 또는; Hadoop을 사용하여 분산 된 메모리 )
  3. 데이터 파티셔닝 (RAM에 얼마나 많이 넣을 수 있는지는 RAM 용량에 달려 있음)

마지막 요점은 실제로 당신의 통제하에 있습니다.

이 차원에 관해서는 더 이상 크지 않습니다. 관찰 횟수는 더 큰 영향을 주지만 RAM 사용량에 맞게 데이터를 분할 할 수 있으므로 걱정할 필요가 없습니다.


3

나는 여기에서 행의 수가 중요하다는 크레올라에 동의합니다. RF의 경우 데이터 세트 가중치보다 최소 3 배 더 많은 RAM이 필요하며 시간이 많이 걸릴 수 있습니다 (이러한 속성의 수는 일반적으로 포리스트에 많은 트리가 필요함-R에는 RF의 병렬 구현이 없음에 유의하십시오).

SVM에 대해서는 300k 크기로 싸우는 것이 좋지만 텍스트 설명자와 동등한 커널 함수를 개발할 수 있습니다.

편집 : 3k x 30k (실제) 매트릭스는 7Gb와 같은 것을 차지 하므로이 데이터에서 RF (randomForest 사용)를 수행하면 16GB RAM이있는 컴퓨터, 운이 좋으며 약간의 시간 또는 24GB의 컴퓨터 RAM과 꽤 많은 시간.


글쎄, 확실히 기능 선택 (chi squared, entropy based)을 할 것이지만 다시이 작업에 맞게 확장 할 수있는 R 라이브러리를 찾을 수 없었습니다. 이 모든 것을 고려하면 R이 아닌 솔루션을보아야한다고 말할 수 있습니까?
Andy

1
"R에는 RF의 병렬 구현이 없습니다." foreach패키지가 패키지와 잘 어울리 므로 부분적으로 만 정확 randomForest합니다. 에 대한 비네팅에는 그러한 예가 하나 있다고 생각합니다 foreach. (또는 아마 doMC.)
crayola

@Andy 문제는 저수준 프로그래밍 언어로 알고리즘을 다시 작성하는 것이 부족하기 때문에 어떤 소프트웨어가 이러한 알고리즘을 데이터에 적용 할 수 있는지 잘 모르겠습니다. 내가 당신의 상황에 있다면, 나는 R에 충실하고 randomForest예를 들어 각 반복마다 SQL 데이터베이스에서 무작위로 선택된 열을 쿼리하도록 부분을 ​​다시 작성 한다고 생각합니다 (예 : 전체 300k 차원은 램에 있어야 함). 그러나 아마도 다른 가능한 옵션보다 R에 대해 더 많이 알고 있기 때문일 것입니다.
crayola

확장 가능한 라이브러리를 찾을 수 없다고 주장한다는 것은 정확히 무엇을 의미합니까? 이와 같은 필터는 기본 대수이며 문제없이 작동해야합니다 (RAM이 충분하다면).

@crayola 사실이지만 병합 부분은 끔찍합니다. 더욱이 그것은 공유-병렬 병렬 처리가 아니기 때문에,이 환경에서 아마도 고통 스럽습니다 (불가능하지는 않지만).
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.