处理看不见的分类字符串Spark CountVectorizer

时间:2016-09-17 12:14:09

标签: apache-spark pyspark categorical-data

我看到StringIndexer在看不见的标签方面存在问题(请参阅here)。

我的问题是:

  1. CountVectorizer是否有相同的限制?它如何处理不在词汇表中的字符串?

  2. 此外,词汇量是受输入数据影响还是根据词汇量大小参数确定?

  3. 最后,从ML的角度来看,假设一个简单的分类器,如Logistic回归,不应该将一个看不见的类别编码为一行零,以便被视为“未知”,以便获得某种类型的默认预测?

1 个答案:

答案 0 :(得分: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,[],[])|
// +--------+---------------------------+