推荐系统的排序算法-线性模型

推荐系统的排序算法,就是根据用户和物品的所有标签特征,通过排序模型计算,得到用户对候选物品集的评分。其中,在排序模块中使用的特征比召回模块中的复杂,目的是计算用户精确的预测值。工业界最常使用的方法是逻辑回归和FM。

1. 逻辑回归

逻辑回归(Logistics Regression,LR)是一种解决二分类问题的机器学习方法,用于获得某种事物的估计值。

1.1 逻辑回归算法

  • 二元逻辑回归模型
    逻辑回归其实仅在线性回归的基础上套用了一个逻辑函数。函数形式如下:
    f ( z ) = 1 1 + e − z z = w 0 + w 1 x 1 + w 2 x 2 + ⋅ ⋅ ⋅ + w n x n f(z) = {1\over 1+e^{-z}}\\ z = w_0+w_1x_1+w_2x_2+···+w_nx_n f(z)=1+ez1z=w0+w1x1+w2x2++wnxn
    二元逻辑回归的条件概率为:

p ( y = 1 ∣ x ) = 1 1 + e − w x = e w x 1 + e w x p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) = 1 1 + e w x p(y=1|x) = {1\over 1+e^{-wx}} = {e^wx\over 1+e^wx}\\ p(y=0|x) = 1-p(y=1|x)={1\over 1+e^{wx}} p(y=1x)=1+ewx1=1+ewxewxp(y=0x)=1p(y=1x)=1+ewx1
在统计学和概率论中,一个事件的发生比(odds)是该事件发生和不发生的比率。
o d d s ( p ) = p 1 − p odds(p) = {p\over 1-p} odds(p)=1pp

  • 模型参数估计
    整个样本集是m个独立样本出现的似然函数(因为每个样本都是独立的,所以m个样本出现的概率就是它们各自出现的概率相乘)如下:
    L ( θ ) = ∏ i = 1 m f ( x ; θ ) = ∏ i = 1 m ( π ( x ) ) y i ( 1 − π ( x ) ) 1 − y i L(\theta)=\prod_{i=1}^mf(x;\theta)=\prod_{i=1}^m(\pi(x))^{y_i}(1-\pi(x))^{1-y_i} L(θ)=i=1mf(x;θ)=i=1m(π(x))yi(1π(x))1yi
    目标是求出使这一似然函数的值最大的参数估计,极大似然估计就是求出参数 θ 0 , θ 1 , ⋅ ⋅ ⋅ , θ n \theta_0,\theta_1,···,\theta_n θ0,θ1,,θn,使得 L ( θ ) L(\theta) L(θ)取得最大值,对函数 L ( θ ) L(\theta) L(θ)取对数得:

L ( θ ) = l o g ( ∏ p ( y i = 1 ∣ x i ) y i × ( 1 − p ( y i = 1 ∣ x i ) ) 1 − y i ) = ∑ i = 1 m y i l o g p ( y i = 1 ∣ x i ) + ( 1 − y i ) l o g ( 1 − p ( y i = 1 ∣ x i ) ) = ∑ i = 1 m y i l o g p ( y i = 1 ∣ x i ) 1 − p ( y i = 1 ∣ x i ) + ∑ i = 1 m l o g ( 1 − p ( y i = 1 ∣ x i ) ) = ∑ i = 1 m y i ( θ 0 + θ 1 x 1 + ⋅ ⋅ ⋅ + θ m x m ) + ∑ i = 1 m l o g ( 1 − p ( y i = 1 ∣ x i ) ) = ∑ i = 1 m y i ( θ T x i ) − ∑ i = 1 m l o g ( 1 + e θ T x i ) \begin{aligned} L(\theta) & = log(\prod p(y_i=1|x_i)^{y_i} \times (1-p(y_i=1|x_i))^{1-y_i}) \\ & = \sum_{i=1}^m y_ilogp(y_i=1|x_i)+(1-y_i)log(1-p(y_i=1|x_i)) \\ & = \sum_{i=1}^m y_ilog{p(y_i=1|x_i) \over 1-p(y_i=1|x_i)}+\sum_{i=1}^m log(1-p(y_i=1|x_i)) \\ & = \sum_{i=1}^m y_i(\theta_0+ \theta_1x_1+···+\theta_mx_m)+\sum_{i=1}^m log(1-p(y_i=1|x_i)) \\ & = \sum_{i=1}^m y_i(\theta^Tx_i)-\sum_{i=1}^m log(1+e^{\theta^Tx_i}) \end{aligned} L(θ)=log(p(yi=1xi)yi×(1p(yi=1xi))1yi)=i=1myilogp(yi=1xi)+(1yi)log(1p(yi=1xi))=i=1myilog1p(yi=1xi)p(yi=1xi)+i=1mlog(1p(yi=1xi))=i=1myi(θ0+θ1x1++θmxm)+i=1mlog(1p(yi=1xi))=i=1myi(θTxi)i=1mlog(1+eθTxi)

可以使用梯度下降法求解,求得的 θ \theta θ就是最佳参数。也可以乘一个负系数 − 1 m - {1\over m} m1,转换成梯度下降法求解。

  • 多元逻辑回归模型(Softmax回归)

  • 逻辑回归的网络结构

  • 梯度下降法
    J ( θ ) J(\theta) J(θ)是目标函数,需要优化 θ \theta θ使得 J ( θ ) J(\theta) J(θ)最小,采用梯度下降法来优化目标函数。
    θ \theta θ更新过程公式如下:

θ j = θ j − α ∂ ∂ θ j J ( θ ) \theta_j = \theta_j-\alpha{\partial \over \partial_{\theta_j}}J(\theta) θj=θjαθjJ(θ)

∂ ∂ θ j J ( θ ) = − 1 m ∑ i = 1 m ( y i x i j − g ( θ T x i ) x i j ) = 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x i j \begin{aligned} {\partial\over \partial_{\theta_j}}J(\theta) & = -{1\over m}\sum_{i=1}^m(y_ix_i^j-g(\theta^Tx_i)x_i^j) \\ & = {1\over m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x_i^j \end{aligned} θjJ(θ)=m1i=1m(yixijg(θTxi)xij)=m1i=1m(hθ(xi)yi)xij
其中 θ \theta θ更新过程可以写成:

θ j = θ j − α 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x i j \theta_j = \theta_j-\alpha{1\over m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x_i^j θj=θjαm1i=1m(hθ(xi)yi)xij

  • 正则化
    保留所有特征,但减小 θ \theta θ。正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项或惩罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化项就越大。

逻辑回归中,由L1、L2进行正则化。在损失函数里加入一个正则化项,正则化项就是权重的L1或者L2范数乘以一个正则化系数,用来控制损失函数和正则化项的比重。直观理解,首先防止过拟合的目的就是防止最后训练出来的模型过分地依赖某一个特征。

1.2 逻辑回归算法实现

  • sklearn
    • 参数说明
Sklearn.linear_model.LogisticRegression
#其中的实现方法:
LogisticsRegression(penalty = '12',dual =False,tol = 0.0001,C = 1.0,fit_intercept = True,intercept_scaling = 1,class_weight = None,random_state = None,solver='liblinear',max_iter = 100,multi_class='ovr',verbose=0,warm_start=False,n_jobs=1)
  • 具体实现
#导入库
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from os import path,listdir
from sklearn.datasets import load_svmlight_files
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib
from sklearn import preprocessing
import numpy as np
import random
import platform
print("Python Version: %s"%(platform.python_version()))

#数据准备
data = pd.read_csv()
#获取样本数据
data = process_data(data_path,feature_size,test_rat,random_seed,train_batch_size,test_batch_size)
X_train = data['X_train']
Y_train = data['Y_train']
X_test = data['X_test']
Y_test = data['Y_test']
#查看样本数据的大小
print("X_train.shape:")
print(X_train.shape)

#LR模型
#建立逻辑回归模型并设定参数
lr_model = LogisticRegression(penalty='l2',C = 1000,solver='lbfgs',max_iter=500)
#训练逻辑回归模型
lr_model.fit(X_train,Y_train.values.ravel())
#采用测试集验证模型离线指标
#训练集AUC
probs_train = lr_model.predict_proba(X_train)
AUC1 = metrics.roc_auc_score(Y_train,probs_train[:,1])
print("Train Auc:%s"%(AUC1))
#测试集AUC
probs_test = lr_model.predict_proba(X_test)
predict_test = lr_model.predict(X_test)
AUC2 = metrics.roc_auc_score(Y_test,probs_test[:,1])
print("Test Auc:%s"%(AUC2))
#准确率
accuracy = metric.accuracy_score(Y_test,predict_test)
print("Test Accuracy:%s"%(accuracy))
#召回率
recall =metrics.recall_score(Y_test,pridect_test)
print("Test Recall:%s"%(accuracy))
#F1值
f1 = metric.f1_score(Y_test,predict_test)
print("Test F1:%s"%(f1))
#打印模型参数
w= lr_model.coef_
print("参数大小:")
print(w.shape)
print("前10个参数:")
print(lr_model.coef_[:,0:10])
print("截距:")
print(lr_model.intercept_)
print("稀疏化特征比率:%.2f%%"%(np.mean(lr_model.coef_.ravel()==0)*100))
print("sigmoid 函数转化的值,即概率p")
print(lr_model.predict_proba(X_test[0:5]))
#模型保存
joblib.dump(lr_model,"logistic_lr.model")
#模型加载
load_lr = joblib.load("logistic_lr.model")
print(load_lr.predict_proba(X_test[0:5]))
  • Spark

    • 参数说明
      Spark中集成了LogisticsREgression方法,位于org.apache.spark.ml.classification.LogisticRegression
  • Tensorflow

2. 因子分解机FM

因子分解机(Factorization Machine,FM)及其变种FFM(Field-aware Factorization Machine)是一种比逻辑回归更高效的方法,是kaggle竞赛中也是工业界的一种常用方法。

2.1 FM算法

FM是一种基于矩阵分解的机器学习算法,传统的逻辑回归等相关变种模型均认为特征是相互独立的,但是实际在很多情况下特征之间的依赖关系却是不可忽视的,因此需要进行特征交叉。在大多数业务场景下,类别特征做完OneHot后变得相当稀疏,尤其是在进行交叉特征后,特征空间变得很大,而FM可用于解决特征交叉下数据稀疏所带来的一系列问题。

2.1.1 FM模型

FM的主要目标是,解决在数据稀疏的情况下,特征怎样进行交叉的问题。

FM模型引入多项式回归模型来加入特征间的关联性的,通常对线性模型增加一个二阶多项式,其多项式模型的公式变为:
y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n w i j x i x j y=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^nw_{ij}x_ix_j y=w0+i=1nwixi+i=1n1j=i+1nwijxixj
为了解决上述特征矩阵稀疏带来的参数估计不准确的问题,FM引入了矩阵分解的思路,对交叉项的系数矩阵进行了如下分解:

w i , j = < v i , v j > w_{i,j}=<v_i,v_j> wi,j=<vi,vj>
那么,FM公式如下:

y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n < v i , v j > x i x j = w 0 + ∑ i = 1 n w i x i + 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i , f x i ) 2 − ∑ i = 1 n v i , f 2 x i 2 ) \begin{aligned} y & =w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n<v_i,v_j>x_ix_j \\ & = w_0+\sum_{i=1}^nw_ix_i+{1\over 2}\sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_i)^2-\sum_{i=1}^nv_{i,f}^2x_i^2) \end{aligned} y=w0+i=1nwixi+i=1n1j=i+1n<vi,vj>xixj=w0+i=1nwixi+21f=1k((i=1nvi,fxi)2i=1nvi,f2xi2)

2.1.2 FFM模型

在FM模型中,每一个特征对应一个隐变量,但在FFM模型中,认为应该将特征分为多个域(Field),每个特征对应每个域分别有一个隐变量。

2.1.3 FM模型的网络结构

通过FM公式,可以看出FM模型属于一个三层网络结构。

2.2 FM实现

  • sklearn
#建立FM模型,并且设定参数
fm_model = als.FMRegression(n_iter=1000,init_stdev=0.1,rank=10,random_state=0,12_reg_w=0.0,12_reg_V=0.0,12_reg=0)
#训练模型
fm_model.fit(X_train,Y_train)

其余类似于逻辑回归实现代码。

  • Tensorflow

猜你喜欢

转载自blog.csdn.net/weixin_44127327/article/details/108612233