2016-02-24 16 views
5

Trước tiên, tôi có một số lịch sử sử dụng của ứng dụng của người dùng.Làm cách nào để cải thiện kết quả đề xuất của tôi? Tôi đang sử dụng spark ALS ngầm

Ví dụ:
user1, app1, 3 (thời gian khởi động)
user2, app2, 2 (thời gian khởi động)
User3, app1, 1 (thời gian khởi động)

Tôi có cơ bản hai nhu cầu:

  1. Đề nghị một số ứng dụng cho mỗi người dùng.
  2. Đề xuất ứng dụng tương tự cho mọi ứng dụng.

Vì vậy, tôi sử dụng ALS (ẩn) của MLLib trên tia lửa để triển khai. Lúc đầu, tôi chỉ sử dụng dữ liệu gốc để đào tạo mô hình. Kết quả là khủng khiếp. Tôi nghĩ rằng nó có thể gây ra bởi phạm vi thời gian khởi động. Và khoảng thời gian khởi chạy từ 1 đến hàng nghìn. Vì vậy, tôi xử lý dữ liệu gốc. Tôi nghĩ rằng điểm số có thể phản ánh tình hình thực sự và thường xuyên hơn.

score = lt/uMlt + lt/aMlt

điểm là quá trình kết quả để đào tạo người mẫu.
lt là thời gian khởi chạy trong dữ liệu gốc.
uMlt là thời gian khởi chạy trung bình của người dùng trong dữ liệu gốc. uMlt (tất cả thời gian khởi chạy của người dùng)/(số lượng ứng dụng mà người dùng này đã từng khởi chạy)
aMlt là thời gian khởi chạy trung bình của ứng dụng trong dữ liệu gốc. aMlt (tất cả thời gian khởi chạy của một ứng dụng)/(số người dùng đã từng khởi chạy ứng dụng này)
Dưới đây là một số ví dụ về dữ liệu sau khi xử lý.

Đánh giá (95788,20992,0.14167073369026184)
Đánh giá (98696,20992,5.92363166809082)
Đánh giá (160020,11264,2.261538505554199)
Đánh giá (67904,11264,2.261538505554199)
Đánh giá (268.430, 11264,0.13846154510974884)
Đánh giá (201369,11264,1.7999999523162842)
Đánh giá (180857,11264,2.2720916271209717)
Đánh giá (217692,11264,1.3692307472229004)
Đánh giá (186274,2867 2,2.4250855445861816)
Đánh giá (120820,28672,0.4422124922275543)
Đánh giá (221146,28672,1.0074234008789062)

Sau khi tôi đã làm điều này, và kết hợp các ứng dụng có tên gói khác nhau, kết quả có vẻ tốt hơn . Nhưng vẫn chưa đủ tốt.
Tôi thấy rằng các tính năng của người dùng và sản phẩm quá nhỏ và hầu hết trong số đó là số âm.

Dưới đây là 3 dòng sản phẩm ví dụ về tính năng, kích thước 10 cho mỗi dòng:

((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))

Dưới đây là 3 dòng ví dụ về tính năng sử dụng, 10 kích thước cho mỗi dòng:

(96.768, (- ,0010857731103897095, -0.001926362863741815,0.0013726564357057214,6.345533765852451E-4, -9.048808133229613E-4, -4.1544197301846E-5,0.0014421759406104684, -9.77902309386991E-5,0.0010355513077229261, -,0017878251383081079))
(97.280, (- ,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))

Vì vậy, bạn có thể tưởng tượng như thế nào nhỏ khi tôi nhận được chấm sản phẩm của tính năng vectơ để tính giá trị của ma trận mục người dùng.

Câu hỏi của tôi ở đây là:

  1. Có cách nào khác để cải thiện kết quả giới thiệu?
  2. Tính năng của tôi có đúng hay không có vấn đề gì?
  3. Là cách của tôi để xử lý thời gian khởi chạy ban đầu (chuyển đổi thành điểm số) phải không?

Tôi đặt một số mã ở đây. Và đây hoàn toàn là một câu hỏi của chương trình. Nhưng có thể không thể giải quyết bằng một vài dòng mã.

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:
tôi tìm thấy một cái gì đó mới về dữ liệu của tôi sau khi đọc bài báo ("Lọc cộng tác cho Datasets Phản hồi Implicit"). Dữ liệu của tôi quá thưa thớt so với bộ dữ liệu IPTV được mô tả trong bài báo.

Giấy: 300.000 (người dùng) 17.000 (sản phẩm) 32.000.000 (dữ liệu)
Mine: 300.000 (người dùng) 31.000 (sản phẩm) 700.000 (dữ liệu)

Vì vậy, ma trận sử dụng mục trong tập dữ liệu của giấy đã được lấp đầy bằng 0.00627 = (32.000.000/300.000/17.000). Tỷ lệ của tập dữ liệu của tôi là 0.0000033. Tôi nghĩ điều đó có nghĩa là ma trận người dùng của tôi có độ nhiễu gấp 2000 lần so với giấy.
Điều này có dẫn đến kết quả xấu không? Và cách nào để cải thiện nó?

+0

Bạn có bất kỳ cập nhật nào từ sự cố của mình không? Tôi có một vấn đề tương tự. –

Trả lời

0

Có hai điều bạn nên thử:

  1. Chuẩn dữ liệu của bạn để nó có zero bình và đơn vị sai cho mỗi người dùng vector. Đây là một bước phổ biến trong rất nhiều máy học. Nó giúp giảm hiệu ứng của các ngoại lệ, gây ra các giá trị gần bằng không bạn đang thấy.
  2. Xóa tất cả người dùng chỉ có một ứng dụng. Điều duy nhất bạn sẽ học được từ những người dùng này là giá trị "trung bình" tốt hơn một chút cho điểm số ứng dụng. Họ sẽ không giúp bạn tìm hiểu bất kỳ mối quan hệ có ý nghĩa mặc dù, đó là những gì bạn thực sự muốn.

Sau khi xóa người dùng khỏi mô hình, bạn sẽ mất khả năng nhận đề xuất cho người dùng đó trực tiếp từ mô hình, bằng cách cung cấp ID người dùng. Tuy nhiên, họ chỉ có một xếp hạng ứng dụng duy nhất. Vì vậy, thay vào đó bạn có thể chạy tìm kiếm KNN trên ma trận sản phẩm để tìm các ứng dụng tương tự nhất với người dùng apps = đề xuất.

Các vấn đề liên quan