17

나는 입력으로 문서 집합을 취하는 Spark의 MLLib로 NaiveBayes 분류자를 만들려고합니다.apache spark MLLib : 문자열 기능에 대해 레이블이 지정된 점을 만드는 방법은 무엇입니까?

나는 기능과 같은 몇 가지 (즉 저자, 명시 적 태그, 암시 적 키워드, 카테고리)을 넣고 싶지만 the documentation보고가하는 LabeledPoint이 두 배로 만 포함 즉 그것은 LabeledPoint[Double, List[Pair[Double,Double]]처럼 보이는 것 같다

.

대신 나머지 코드에서 출력되는 내용은 LabeledPoint[Double, List[Pair[String,Double]]입니다.

나는 내 자신 만의 전환을 만들 수 있지만 이상하게 보입니다. MLLib를 사용하여 어떻게 처리해야합니까?

대답은 HashingTF 클래스 (즉 해싱 기능)에 있다고 생각하지만 어떻게 작동하는지 이해할 수는 없지만 일종의 용량 값이 필요하지만 키워드 및 주제 목록은 효과적으로 무제한입니다 (또는 더 나은, 처음에 알려지지 않은).

답변

10

HashingTFhashing trick을 사용하여 제한되지 않은 수의 기능을 제한된 크기의 벡터에 매핑합니다. 기능 충돌 ​​가능성이 있지만 생성자에서 더 많은 수의 기능을 선택하면이 기능을 축소 할 수 있습니다.

기능의 콘텐츠뿐만 아니라 일부 메타 데이터 (예 : 'cats'라는 단어를 'cats'라고 사용하는 것과 대조적으로)를 기반으로 기능을 만들려면 HashingTF 클래스를 제공 할 수 있습니다 단어가있는 태그가 단어와 다른 슬롯에 해시되도록 '태그 : 고양이'와 같은 것입니다.

당신이 HashingTF를 사용하여 기능 카운트 벡터를 만든 경우 당신은 또한 지금처럼 IDF 클래스를 사용하여 TF-IDF 벡터를 만들 수 있습니다 1. 제로 위의 임의의 수를 설정하여 단어 기능의 가방을 만들 수 있습니다 :

val tfIdf = new IDF().fit(featureCounts).transform(featureCounts) 

귀하의 경우 이미 문서 당 단어 개수를 계산 한 것 같습니다. HashingTF 클래스는 카운트 작업을 위해 설계 되었기 때문에이 기능을 사용할 수 없습니다.

This paper에는 언어 충돌 문제가 언어 응용 프로그램에서별로 문제가되지 않는 이유에 대한 몇 가지 주장이 있습니다. 필수적인 이유는 대부분의 단어가 드문 경우이며 (언어 특성으로 인해) 충돌이 단어 빈도와 관련이 없으므로 (해싱 속성으로 인해) 한 모델의 도움을받을 수있는 공통 단어가 같은 슬롯.

+0

감사합니다. 올바르게 이해한다면,'HashingTF'의'numFeatures'는 기본적으로 피쳐의 수를 주어진 최대 값에 묶는 데 사용되는'mod' 값으로 사용됩니까? 그렇다면 'Double.MAX_VALUE'가되어서는 안됩니까? 또는 다른 기능을 주어진 범위로 제한하고 교차 충돌을 제한 할 수 있도록 사용하는 것이 좋습니다. (즉, 1..N의 어떤 종류의 기능과 N..2N의 어떤 기능을 넣으면 같은 종류의 충돌은 있지만 종류는 다르다) – riffraff

+0

예, 계산은'features [hash (feature) % numFeatures] + = 1'입니다. 생성 된 벡터는 대개 어떤 모델의 입력으로 사용되므로'Double.MAX_VALUE'를 사용하면 거대한 모델을 의미합니다. 해싱 트릭의 주된 동기 중 하나는 메모리 감소입니다. 당신은 분명히 당신이 제안하는 방식으로 기능을 만들 수는 있지만 그러한 접근 방식의 이점을 평가하는 방법을 잘 모르겠습니다. – mrmcgreg

+0

아 물론 물론, 나는 희소 벡터를 생각하고 있었기 때문에 배열 크기를 고려하지 않았습니다. 당신의 도움을 주셔서 감사합니다! – riffraff

관련 문제