У меня есть набор данных, на основе которых я хочу создать классификационную модель. Каждый ряд имеет следующий вид:Как кодировать категориальные функции в Apache Spark
user1,class1,product1
user1,class1,product2
user1,class1,product5
user2,class1,product2
user2,class1,product5
user3,class2,product1
Есть около 1M пользователей, 2 класса и 1M продукции. То, что я хотел бы сделать дальше, - создать разреженные векторы (что уже поддерживается MLlib). НО для применения этой функции я должен сначала создать плотные векторы (с 0s). Другими словами, мне приходится бинарировать мои данные. Какой самый простой (или самый элегантный) способ сделать это?
Учитывая, что я новичок в отношении MLlib, могу ли я попросить вас предоставить конкретный пример? Я использую MLlib 1.2.
EDIT
Я закончил с следующим фрагментом кода, но оказываюсь очень медленно ... Любые другие идеи, при условии, что я могу использовать только MLlib 1.2?
val data = test11.map(x=> ((x(0) , x(1)) , x(2))).groupByKey().map(x=> (x._1 , x._2.toArray)).map{x=>
var lt : Array[Double] = new Array[Double](test12.size)
val id = x._1._1
val cl = x._1._2
val dt = x._2
var i = -1
test12.foreach{y => i += 1; lt(i) = if(dt contains y) 1.0 else 0.0}
val vs = Vectors.dense(lt)
(id , cl , vs)
}
Может дать вам пример того, что вы хотите, чтобы плотный векторный вывод выглядел как этот вход? – mattinbits
какую классификацию вы хотите сделать точно? т. е. если 'userX' и' classY', то, скорее всего, это будет 'productZ' или что-то еще? –
нет действительно. Я буду использовать двоичную классификацию, где 'userX' - разреженный вектор значений, а' classY' - соответствующий класс. – user706838