我看到StringIndexer
在看不见的标签方面存在问题(请参阅here)。
我的问题是:
CountVectorizer
是否有相同的限制?它如何处理不在词汇表中的字符串?
此外,词汇量是受输入数据影响还是根据词汇量大小参数确定?
最后,从ML的角度来看,假设一个简单的分类器,如Logistic回归,不应该将一个看不见的类别编码为一行零,以便被视为“未知”,以便获得某种类型的默认预测?
答案 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,[],[])|
// +--------+---------------------------+