私は機械学習アルゴリズムと Spark を初めて使用します。ここにある Twitter Streaming Language Classifier をフォローしています。
具体的には、このコード:
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 の機能に関する私の理解が間違っているか、トレーニング セットが小さすぎるか、手順が不足しています。
どんな助けでも大歓迎です