我已经看到 StringIndexer 有不可见标签的问题(参见 here )。

我的问题是:

  • CountVectorizer 有同样的限制吗?它如何处理不在词汇表中的字符串?
  • 另外,词汇量大小是受输入数据影响还是根据词汇量大小参数固定?
  • 最后,从 ML 的角度来看,假设一个简单的分类器,如逻辑回归,不应该将一个看不见的类别编码为一行零,以便将其视为“未知”以获得某种默认预测?
  • 最佳答案



    它不关心看不见的值。



    向量的大小不能超过词汇量,并进一步受到不同值数量的限制。



    这正是发生的事情。不过问题稍微复杂一些。 StringIndexer 通常与 OneHotEncoder 配对,默认情况下,ojit_code 将基本类别编码为零向量以避免虚拟变量陷阱。因此,对索引使用相同的方法将是模棱两可的。

    为了说明所有要点,请考虑以下示例:

    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,[],[])|
    // +--------+---------------------------+
    

    关于apache-spark - 处理看不见的分类字符串 Spark CountVectorizer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39546671/

    10-16 12:59