In primo luogo, ho un po 'di storia d'uso dell'app utente.Come migliorare il risultato della mia raccomandazione? Sto usando la scintilla ALS implicita
Ad esempio:
user1, app1, 3 (i tempi di lancio)
utente2, app2, 2 (i tempi di lancio)
user3, App1 1 (tempi di lancio)
ho praticamente due richieste:
- Consiglia alcune app per ogni utente.
- Consiglia un'applicazione simile per ogni app.
Quindi uso ALS (implicito) di MLLib su spark per implementarlo. Inizialmente, uso solo i dati originali per addestrare il modello. Il risultato è terribile. Penso che possa essere causato dalla gamma di tempi di lancio. E il tempo di lancio va da 1 a migliaia. Quindi elaboro i dati originali. Penso che il punteggio possa riflettere la vera situazione e più regolarizzazione.
punteggio = lt/uMlt + lt/aMlt
clienti è risultato processo di formare modello.
lt è ora di avvio nei dati originali.
uMlt è il tempo di avvio medio dell'utente nei dati originali. uMlt (tutti i tempi di avvio di un utente)/(numero di app che questo utente ha mai lanciato)
aMlt è il tempo di avvio medio dell'app nei dati originali. aMlt (tutti i tempi di avvio di un'app)/(numero di utenti che hanno mai lanciato questa app)
Ecco alcuni esempi dei dati dopo l'elaborazione.
Valutazione (95788,20992,0.14167073369026184)
Valutazione (98696,20992,5.92363166809082)
Valutazione (160020,11264,2.261538505554199)
Valutazione (67904,11264,2.261538505554199)
Valutazione (268.430, 11264,0.13846154510974884)
Valutazione (201369,11264,1.7999999523162842)
Valutazione (180857,11264,2.2720916271209717)
Valutazione (217692,11264,1.3692307472229004)
Valutazione (186274,2867 2,2.4250855445861816)
Valutazione (120820,28672,0.4422124922275543)
Valutazione (221146,28672,1.0074234008789062)
Dopo ho fatto questo, e aggregare le applicazioni che hanno diverso nome del pacchetto, il risultato sembra meglio . Ma ancora non abbastanza buono.
Trovo che le funzionalità di utenti e prodotti siano così ridotte e la maggior parte di esse sia negativa.
Ecco 3 line lista di caratteristiche di prodotti, 10 dimensioni per ciascuna linea:
((CompactBuffer (com.youlin.xyzs.shoumeng, com.youlin.xyzs.juhe.shoumeng)), (-4.798973236574966E-7, -7.641608021913271E-7,6.040852440492017E-7,2.82689171626771E-7, -4.255948056197667E-7,1.815822798789668E-7,5.000047167413868E-7,2.0220664964654134E-7,6.386763402588258E-7, -4,289261710255232 E-7))
((CompactBuffer (com.dncfcjaobhegbjccdhandkba.huojia)), (- 4.769295992446132E-5, -1.7072002810891718E-4,2.1351299074012786E-4,1.6345139010809362E-4, -1.4456869394052774E-4,2.3657752899453044E -4, -4.508546771830879E-5,2.0895185298286378E-4,2.968782791867852E-4,1.9461760530248284E -4))
((CompactBuffer (com.tern.rest.pron)), (- 1.219763362314552E-5, -2.8371430744300596E-5,2.9869115678593516E-5,2.0747662347275764E-5, -2.0555471564875916E-5,2.632938776514493 E-5,2.934047643066151E-6,2.296348611707799E-5,3.8075613701948896E-5,1.2197584510431625E-5))
Ecco 3 line lista di caratteristiche utenti, 10 dimensioni per ciascuna linea:
(96768, (- ,0010857731103897095, -0.001926362863741815,0.0013726564357057214,6.345533765852451E-4, -9.048808133229613E-4, -4.1544197301846E-5,0.0014421759406104684, -9.77902309386991E-5,0.0010355513077229261, -,0017878251383081079)) 012.380.073.162. (97280, (- ,0022841691970825195, -0.0017134940717369318,0.001027365098707378,9.437055559828877E-4, -0.0011165080359205604,0.0017137592658400536,9.713359759189188E-4,8.947265450842679E-4,0.0014328152174130082, -5.738904583267868E-4))
(97792, (- ,0017802991205826402, -0.003464450128376484,0.002837196458131075,0.0015725698322057724, -0.0018932095263153315,9.185600210912526E-4,0.0018971719546243548,7.250450435094535E-4,0.0027060359716415405, -0,0017731878906488419))
quindi potete immaginare quanto piccolo quando ricevo prodotto scalare della funzione i vettori per calcolare il valore della matrice utente-articolo.
La mia domanda è:
- C'è un altro modo per migliorare il risultato raccomandazione?
- Le mie funzionalità sembrano corrette o c'è qualcosa che non va?
- È il mio modo di elaborare i tempi di avvio originali (convertire in punteggio) giusto?
Ho inserito del codice qui. E questa è assolutamente una domanda del programma. Ma forse non può essere risolto con poche righe di codice.
val model = ALS.trainImplicit(ratings, rank, iterations, lambda, alpha)
print("recommendForAllUser")
val userTopKRdd = recommendForAllUser(model, topN).join(userData.map(x => (x._2._1, x._1))).map {
case (uid, (appArray, mac)) => {
(mac, appArray.map {
case (appId, rating) => {
val packageName = appIdPriorityPackageNameDict.value.getOrElse(appId, Constants.PLACEHOLDER)
(packageName, rating)
}
})
}
}
HbaseWriter.writeRddToHbase(userTopKRdd, "user_top100_recommendation", (x: (String, Array[(String, Double)])) => {
val mac = x._1
val products = x._2.map {
case (packageName, rating) => packageName + "=" + rating
}.mkString(",")
val putMap = Map("apps" -> products)
(new ImmutableBytesWritable(), Utils.getHbasePutByMap(mac, putMap))
})
print("recommendSimilarApp")
println("productFeatures ******")
model.productFeatures.take(1000).map{
case (appId, features) => {
val packageNameList = appIdPackageNameListDict.value.get(appId)
val packageNameListStr = if (packageNameList.isDefined) {
packageNameList.mkString("(", ",", ")")
} else {
"Unknow List"
}
(packageNameListStr, features.mkString("(", ",", ")"))
}
}.foreach(println)
println("productFeatures ******")
model.userFeatures.take(1000).map{
case (userId, features) => {
(userId, features.mkString("(", ",", ")"))
}
}.foreach(println)
val similarAppRdd = recommendSimilarApp(model, topN).flatMap {
case (appId, similarAppArray) => {
val groupedAppList = appIdPackageNameListDict.value.get(appId)
if (groupedAppList.isDefined) {
val similarPackageList = similarAppArray.map {
case (destAppId, rating) => (appIdPriorityPackageNameDict.value.getOrElse(destAppId, Constants.PLACEHOLDER), rating)
}
groupedAppList.get.map(packageName => {
(packageName, similarPackageList)
})
} else {
None
}
}
}
HbaseWriter.writeRddToHbase(similarAppRdd, "similar_app_top100_recommendation", (x: (String, Array[(String, Double)])) => {
val packageName = x._1
val products = x._2.map {
case (packageName, rating) => packageName + "=" + rating
}.mkString(",")
val putMap = Map("apps" -> products)
(new ImmutableBytesWritable(), Utils.getHbasePutByMap(packageName, putMap))
})
UPDATE:
ho trovato qualcosa di nuovo sui miei dati dopo la lettura della carta ("filtraggio collaborativo per il feedback dataset implicito"). I miei dati sono troppo scarsi rispetto al set di dati IPTV descritto nel documento.
carta: 300.000 (utenti) 17.000 (prodotti) 32.000.000 (dati)
miniera: 300.000 (utenti) 31.000 (prodotti) 700.000 (dati)
Quindi la matrice dall'utente elemento della il set di dati della carta è stato riempito con 0.00627 = (32.000.000/300.000/17.000). Il rapporto del mio set di dati è 0.0000033. Penso che significhi che la mia matrice utente-articolo è 2000 volte più spessa di quella del foglio.
Questo dovrebbe portare a un cattivo risultato? E un modo per migliorarlo?
Hai avuto qualche aggiornamento dal tuo problema? Ho un problema simile. –