Я очень новичок в алгоритмах машинного обучения и 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 для группировки твитов (на самом высоком уровне кластеры, т.е. предположим, были бы общие "темы"). Таким образом, когда он проверяет каждый твит, чтобы убедиться, что models.predict == 1, в каждом кластере должны появляться разные наборы твитов (и поскольку он проверяет обучающий набор против самого себя, каждый твит должен быть в кластере). Почему это не делается? Либо я неправильно понимаю, что делает kmeans, либо мой тренировочный набор слишком мал, либо я пропустил шаг.
Любая помощь приветствуется