Аз съм много нов в алгоритмите за машинно обучение и Spark. Следвам езиковия класификатор за поточно предаване в Twitter, който се намира тук:
По-конкретно този код:
Освен че се опитвам да го стартирам в пакетен режим на някои туитове, които изтегля от 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
to
models.predict(Utils.featurize(t)) == 0
същото се случва, но всеки туит се отпечатва под всеки клъстер.
Ето какво интуитивно смятам, че се случва (моля, поправете мисленето ми, ако е погрешно): Този код превръща всеки туит във вектор, произволно избира някои клъстери, след което изпълнява kmeans за групиране на туитовете (на наистина високо ниво, клъстерите, i предположим, ще бъдат общи „теми“). По този начин, когато проверява всеки туит, за да види дали models.predict == 1, различни набори от туитове трябва да се показват под всеки клъстер (и тъй като проверява набора за обучение срещу себе си, всеки туит трябва да бъде в клъстер). Защо не прави това? Или моето разбиране за това какво прави kmeans е погрешно, тренировъчният ми набор е твърде малък или пропускам стъпка.
Всяка помощ е много ценена