Реализация учебника Apache Spark с FP-ростом, без результатов на freqItemsets

scala apache-spark data-mining

415 просмотра

1 ответ

34 Репутация автора

Это мой первый вопрос, и я надеюсь, что я делаю это правильно.

Итак, я пытался войти в Apache Spark и его алгоритм FP-роста. Поэтому я попытался применить учебник по FP-росту к банковскому учебнику, который поставляется вместе со Spark.

Я действительно новичок во всех этих вещах по отображению данных и в скалах, так что этот вопрос может показаться вам очень важным, ребята, но я ценю вашу помощь!

case class Bank(age:Integer, job: String, marital: String, education: 
                String, balance: Integer)

val bank = bankTest.map(s=>s.split(";")).filter(s=>s(0)!= "\"age\"").map(
 s=>Bank(s(0).toInt,
         s(1).replaceAll("\"", ""),
         s(2).replaceAll("\"", ""),
         s(3).replaceAll("\"", ""),
         s(5).replaceAll("\"", "").toInt

  )
)

val transactions: RDD[Array[Object]] = bank.map(x => Array(x))

val fpg = new FPGrowth()
  .setMinSupport(0.1)
  .setNumPartitions(10)
val model = fpg.run(transactions)

model.freqItemsets.collect().foreach { itemset =>
  println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}

Это то, что я кодировал, и я думаю, что проблема заключается в отображении моего банковского элемента в переменную транзакций. Код работает правильно, но результатов нет. Я предполагаю, что это происходит потому, что алгоритм FP-роста сравнивает различные объекты банка типов друг с другом, которые содержатся в переменной транзакции. Конечно, нет целого объекта с поддержкой 20%.

Итак, вопрос: как я могу сделать проверку роста FP для столбцов в моих данных, а не для всего объекта?

Например: поддержка «job = manager» должна составлять около 20%, поэтому она должна появляться так часто, как это не происходит в моих результатах.

Заранее спасибо!

Автор: raxous Источник Размещён: 08.07.2016 08:02

Ответы (1)


0 плюса

11 Репутация автора

Простым решением было бы создать метод toList, который просто возвращает список всех членов вашего банка:

case class Bank(age:Integer, job: String, marital: String, education: String, balance: Integer)
{
    def toList():List[String]=
    {
        List(""+age, job, marital, education, ""+balance);
    }
}

Обратите внимание, что я использовал List of String, поскольку FP-рост работает с «классифицированными элементами». Это означает, что если вы введете целые числа или числа с плавающей запятой в качестве оклада или возраста, он будет рассматривать каждую отдельную зарплату как уникальную, если они отличаются на цент (то же самое для возраста):

val bank1 = Bank(35, "engineer", "engaged", "college", 100000)
val bank2 = Bank(35, "engineer", "engaged", "college", 100001)

Хотя зарплата bank1и bank2очень близка, FP-рост будет рассматривать эти два элемента как разные. Таким образом, у вас будут проблемы с классификацией зарплат, поскольку они имеют высокую дивергенцию.

Я бы порекомендовал определить enumдля каждого возрастного класса и класса заработной платы, таких как AGE_BETWEEN_0_18, AGE_BETWEEN_18_25...

Таким образом вы сократите гистограмму и дадите FP-росту работать отлично.

PS: я не уверен, что объект должен быть назван Bank, я бы скорее назвал егоBankCustomer

Автор: GCo Размещён: 28.07.2016 05:01
Вопросы из категории :
32x32