4

私は機械学習アルゴリズムと Spark を初めて使用します。ここにある Twitter Streaming Language Classifier をフォローしています。

http://databricks.gitbooks.io/databricks-spark-reference-applications/content/twitter_classifier/README.html

具体的には、このコード:

http://databricks.gitbooks.io/databricks-spark-reference-applications/content/twitter_classifier/scala/src/main/scala/com/databricks/apps/twitter_classifier/ExamineAndTrain.scala

Cassandra から取得した一部のツイート (この場合は合計 200 ツイート) でバッチ モードで実行しようとしている場合を除きます。

例が示すように、一連のツイートを「ベクトル化」するためにこのオブジェクトを使用しています。

object Utils{
  val numFeatures = 1000
  val tf = new HashingTF(numFeatures)

  /**
   * Create feature vectors by turning each tweet into bigrams of
   * characters (an n-gram model) and then hashing those to a
   * length-1000 feature vector that we can pass to MLlib.
   * This is a common way to decrease the number of features in a
   * model while still getting excellent accuracy (otherwise every
   * pair of Unicode characters would potentially be a feature).
   */
  def featurize(s: String): Vector = {
    tf.transform(s.sliding(2).toSeq)
  }
}

ExaminAndTrain.scala から変更された私のコードは次のとおりです。

 val noSets = rawTweets.map(set => set.mkString("\n"))

val vectors = noSets.map(Utils.featurize).cache()
vectors.count()

val numClusters = 5
val numIterations = 30

val model = KMeans.train(vectors, numClusters, numIterations)

  for (i <- 0 until numClusters) {
    println(s"\nCLUSTER $i")
    noSets.foreach {
        t => if (model.predict(Utils.featurize(t)) == 1) {
          println(t)
        }
      }
    }

このコードが実行され、各クラスターは「クラスター 0」「クラスター 1」などを出力し、その下には何も出力されません。ひっくり返せば

models.predict(Utils.featurize(t)) == 1 

models.predict(Utils.featurize(t)) == 0

すべてのつぶやきがすべてのクラスターの下に出力されることを除けば、同じことが起こります。

これが私が直感的に考えていることです (間違っている場合は私の考えを修正してください): このコードは各ツイートをベクトルに変換し、いくつかのクラスターをランダムに選択してから、kmeans を実行してツイートをグループ化します (非常に高いレベルで、クラスター、私は仮定すると、一般的な「トピック」になります)。そのため、各ツイートをチェックして models.predict == 1 かどうかを確認すると、各クラスターの下に異なるツイートのセットが表示されます (トレーニング セットをそれ自体に対してチェックするため、すべてのツイートがクラスター内にある必要があります)。なぜこれをしないのですか?kmeans の機能に関する私の理解が間違っているか、トレーニング セットが小さすぎるか、手順が不足しています。

どんな助けでも大歓迎です

4

1 に答える 1

3

まず、KMeans はクラスタリング アルゴリズムであり、教師なしです。したがって、「それ自体に対するトレーニングセットのチェック」はありません(手動で行うことができます;)。

model.predict(Utils.featurize(t)) が KMeans によって割り当てられた t が属するクラスターを提供するという点を見逃しているだけです。確認したいと思います

models.predict(Utils.featurize(t)) == i

すべてのクラスター ラベルを反復処理するため、コード内で。

また、ちょっとした注意: 特徴ベクトルは、ツイートの文字の 2 グラム モデルで作成されます。この中間ステップは重要です ;)

2-gram (単語) の意味: 「熊が熊に向かって叫ぶ」 => {(A, 熊), (熊, 叫ぶ), (叫び, で), (で, a), (熊)} すなわち「くま」は2回数えます。文字は (A,[スペース])、([スペース]、b)、(b, e) などになります。

于 2015-03-08T18:42:08.623 に答える