2016-09-17 2 views
1

Я видел StringIndexer имеет проблемы с невидимыми ярлыками (см. here).Ручка невидимая категориальная строка Spark CountVectorizer

Мой вопрос являются:

  1. ли CountVectorizer такое же ограничение? Как он обрабатывает строку не в словаре?

  2. Кроме того, является ли размер словаря затронутым входными данными или он фиксируется в соответствии с параметром размера словаря?

  3. Последнее, с точки зрения ML, при условии, что простой классификатор, такой как логистическая регрессия, не следует кодировать невидимую категорию как строку нулей, поэтому ее следует рассматривать как «неизвестную», поэтому для получения какого-либо значения по умолчанию прогноз?

ответ

0

ли CountVectorizer имеют те же ограничения? Как он обрабатывает строку не в словаре?

Он не заботится о невидимых значениях.

- это размер словаря, на который влияют входные данные, или фиксируется в соответствии с параметром размера словаря?

Размер вектора не может превышать размер словарного запаса и дополнительно ограничен числом различных значений.

не невидимая категория кодируются как ряд нулей так, чтобы рассматриваться как «неизвестный» так, чтобы получить

Это именно то, что происходит. Проблема немного сложнее. StringIndexer обычно сопряжен с OneHotEncoder, который по умолчанию кодирует базовую категорию как вектор нулей, чтобы избежать ложной ловушки переменной. Поэтому использование такого же подхода с индексированием было бы неоднозначным.

Чтобы проиллюстрировать все точки рассмотреть следующий пример:

import org.apache.spark.ml.feature.CountVectorizer 

val train = Seq(Seq("foo"), Seq("bar")).toDF("text") 
val test = Seq(Seq("foo"), Seq("foobar")).toDF("text") 

// 
val vectorizer = new CountVectorizer().setInputCol("text") 

vectorizer.setVocabSize(1000).fit(train).vocabulary 
// Array[String] = Array(foo, bar) 

/* Vocabulary size is truncated to the value 
provided by VocabSize Param */ 

vectorizer.setVocabSize(1).fit(train).vocabulary 
// Array[String] = Array(bar) 

/* Unseen values are ignored and if there are no known values 
we get vector of zeros ((2,[],[])) */ 

vectorizer.setVocabSize(1000).fit(train).transform(test).show 
// +--------+---------------------------+ 
// | text|cntVec_0a49b1315206__output| 
// +--------+---------------------------+ 
// | [foo]|    (2,[1],[1.0])| 
// |[foobar]|     (2,[],[])| 
// +--------+---------------------------+ 
+1

Спасибо @ zero323, вы всегда ответить на мои вопросы :-) Один комментарий: словарь не фиксированного размера в соответствии с 'параметра vocabSize', это 'min (различные (значения), vocabSize)'. –

Смежные вопросы