關於推薦算法的一些思考html
最近作了一個交叉銷售的項目,梳理了一些關鍵點,分享以下,但願對你們有所啓發算法
核心目標:在有限資源下,儘量的提供高轉化率的用戶羣,輔助業務增加dom
初步效果:商家ROI值爲50以上,用戶日轉化率提高10倍以上,用戶日最低轉化效果5pp以上函數
如下爲正文:spa
數據準備:rest
1.商品相關性code
存在商品A,B,C...,商品之間用戶會存在行爲信息的關聯度,這邊能夠參考協調過濾算法中的Item-based,這邊拓展爲用戶在不一樣商品之間的操做行爲的差別性。
能夠造成以下的特徵矩陣:
orm
這邊相關的常見度量方式有如下幾種:htm
a.距離衡量生命週期
包括瀏覽、點擊、搜索等等各類行爲的歐式、馬氏、閔式、切比雪夫距離、漢明距離計算
b.類似度衡量
包括餘弦類似度、傑卡德類似度衡量
c.複雜衡量
包括相關性衡量,熵值衡量,互信息量衡量,相關距離衡量
2.商品行爲信息
探求商品及其對應行爲信息的笛卡爾積的映射關係,獲得一個商品 用戶的行爲魔方
商品集合:{商品A、商品B、...}
商品屬性集合:{價格、是否打折、相比其餘電商平臺的比價、是否缺貨...}
用戶行爲集合:{瀏覽次數、瀏覽時長、末次瀏覽間隔、搜索次數、末次搜索間隔...}
經過商品集合*商品屬性集合*用戶行爲集合,造成高維的商品信息魔方,再經過探查算法,篩選優秀表現的特徵,這裏推薦的有pca,randomforest的importance,lasso變量壓縮,相關性壓縮,逐步迴歸壓縮等方法,根據數據的屬性特色可適當選取方法
最後,咱們會獲得以下一個待選特徵組:
3.商品購買週期
針對每一件商品,都是有它自身的生命週期的,好比,在三個月內買過冰箱的用戶,95%以上的用戶是不會選擇二次購買的;而在1個月的節點上,會有20%的用戶會選擇二次購買生活用紙。因此咱們須要作的一件事情就是不斷更新,平臺上面每一個類目下面的商品的自身生命週期。除此以外,考慮在過渡時間點,用戶的需求變化狀況,是否能夠提早觸發需求;這邊利用,艾賓浩斯遺忘曲線和因子衰減規律擬合:
肯定lamda和b,計算每一個用戶對應的每一個類目,當前時間下的剩餘價值:f(最高價值)*lamda*b
4.商品挖掘特徵,用戶挖掘特徵
業務運營過程當中,經過數據常規能夠獲得1.基礎結論,2.挖掘結論。基礎結論就是統計結論,好比昨日訂單量,昨日銷售量 ,昨日用戶量;挖掘結論就是深層結論,好比昨日活躍用戶數,每日預估銷售量,用戶生命週期等
存在以下的探索形式,這是一個漫長而又很是有價值的過程:
模型整合
再肯定以上四大類的數據特徵以後,咱們經過組合模型的方法,判斷用戶的交叉銷售結果
1.cart regression
確保非線性密度均勻數據擬合效果,針對存在非線性關係且數據可被網格切分的產業用戶有高的預測能力
2.ridge regression
確保可線性擬合及特徵繁多數據的效果,針對存在線性關係的產業用戶有高的預測能力
3.Svm-liner
確保線性且存在不可忽視的異常點的數據擬合效果,針對存在異經常使用戶較多的部分產業用戶有高的預測能力
4.xgboost
確保數據複雜高維且無明顯關係的數據擬合效果,針對存在維度高、數據雜亂、無模型規律的部分產業用戶有高的預測能力
以上的組合模型並不是固定,也並不是必定所有使用,在肯定自身產業的特色後,擇優選擇,而後採起投票、加權、分組等組合方式產出結果便可。
附上推薦Rcode簡述,
cart regression:
library(rpart)
fit <- rpart(y~x, data=database, method="class",control=ct, parms = list(prior = c(0.7,0.3), split = "information"));
## xval是n折交叉驗證
## minsplit是最小分支節點數,設置後達不到最小分支節點的話會繼續分劃下去
## minbucket:葉子節點最小樣本數
## maxdepth:樹的深度
## cp全稱爲complexity parameter,指某個點的複雜度,對每一步拆分,模型的擬合優度必須提升的程度
## kyphosis是rpart這個包自帶的數據集
## na.action:缺失數據的處理辦法,默認爲刪除因變量缺失的觀測而保留自變量缺失的觀測。
## method:樹的末端數據類型選擇相應的變量分割方法:
## 連續性method=「anova」,離散型method=「class」,計數型method=「poisson」,生存分析型method=「exp」
## parms用來設置三個參數:先驗機率、損失矩陣、分類純度的度量方法(gini和information)
## cost我以爲是損失矩陣,在剪枝的時候,葉子節點的加權偏差與父節點的偏差進行比較,考慮損失矩陣的時候,從將「減小-偏差」調整爲「減小-損失」
ridge regression:
library(glmnet)
glmmod<-glmnet(x,y,family = 'guassian',alpha = 0)
最小懲罰:
glmmod.min<-glmnet(x,y,family = 'gaussian',alpha = 0,lambda = glmmod.cv$lambda.min)
1個標準差下的最小懲罰:
glmmod.1se<-glmnet(x,y,family = 'gaussian',alpha = 0,lambda = glmmod.cv$lambda.1se)
Svm-liner :
library(e1071)
svm(x, y, scale = TRUE, type = NULL, kernel = "",degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x),coef0 = 0, cost = 1, nu = 0.5, subset, na.action = na.omit)
##type用於指定創建模型的類別:C-classification、nu-classification、one-classification、eps-regression和nu-regression
##kernel是指在模型創建過程當中使用的核函數
##degree參數是指核函數多項式內積函數中的參數,其默認值爲3
##gamma參數給出了核函數中除線性內積函數之外的全部函數的參數,默認值爲l
##coef0參數是指核函數中多項式內積函數與sigmoid內積函數中的參數,默認值爲0
##參數cost就是軟間隔模型中的離羣點權重
##參數nu是用於nu-regression、nu-classification和one-classification類型中的參數
xgboost:
library(xgboost)
xgb <- xgboost(data = data.matrix(x[,-1]), label = y, eta = 0.1,max_depth = 15, nround=25, subsample = 0.5,colsample_bytree = 0.5,seed = 1,eval_metric = "merror",objective = "multi:softprob",num_class = 12, nthread = 3)
##eta:默認值設置爲0.3。步長,控制速度及擬合程度
##gamma:默認值設置爲0。子樹葉節點個數
##max_depth:默認值設置爲6。樹的最大深度
##min_child_weight:默認值設置爲1。控制子樹的權重和
##max_delta_step:默認值設置爲0。控制每棵樹的權重
##subsample: 默認值設置爲1。抽樣訓練佔比
##lambda and alpha:正則化