精华内容
下载资源
问答
  • fm因子分解机

    2018-10-24 11:53:09
    fm因子分解机, 挺好的东西。你认为好的话,下载一个,我缺分。
  • FM因子分解机

    2018-10-10 10:32:46
    FM因子分解机

    FM因子分解机

    展开全文
  • 文章目录简介因子分解机FM模型因子分解机FM的优势模型因子分解机求解CodeReference 简介 因子分解机将支持向量机SVM的优势结合分解模型。如SVM,因子分解机是一个通用的预测器,可以用在任意实数值向量上。但是不同...

    简介

    因子分解机将支持向量机SVM的优势结合分解模型。如SVM,因子分解机是一个通用的预测器,可以用在任意实数值向量上。但是不同于SVM,因子分解机能通过分解参数对变量之间的交互关系进行建模;即使在非常稀疏的场景下,如推荐系统,也能对交叉特征进行建模。因子分解机可以通过算式优化,在线性时间内进行应用计算;而且不同于SVM在对偶形式中求解问题,FM在原问题空间进行求解,不需要支持向量等,可以直接对模型参数进行估计。

    因子分解机FM模型

    因子分解机FM的优势

    • 在数据稀疏场景下仍然能进行参数预估;而SVM则不行;
    • FM计算时间复杂度为线性时间,可以直接在原问题中进行优化,而且不依赖如支持向量机的支持向量。
    • FM是一个通用预测器,可以用在任意的实值向量上。

    模型

    对于度为2的因子分解机模型FM:

    公式

    其中参数,表示长度为k的向量之间的內积。

    交叉项

    矩阵V中的第i行向量viv_i表示第i个变量的参数,其向量长度为k。

    度为2的因子分解机能够捕获所有的单个变量和交叉变量:

    • w0是全局偏置
    • wi建模第i个变量的贡献
    • w^i,j\hat w_{i,j}表示第i个、第j个变量之间的交叉项。FM并不是直接用参数wij进行建模,而是通过分解,将其表示成两个向量的內积形式。其原因在于,对于稀疏数据,样本向量x中绝大部分元素均为0,进而导致建模特征i,j的变量wij也为0,通常情况下wij的估计,需要样本中存在xixj,即xi、xj均不为0;FM通过分解,由wiwj的內积来表示wij,所有和xi产生交叉的特征样本都可以用于估计wi,大大增加了模型的泛化性能。

    因子分解机求解

    因子分解机作为一个通用的预测器,可以用于:

    • 分类问题:y^(x)\hat y(x)的正负号当作分类结果。loss函数可以使用logit loss或hinge loss。
    • 回归问题:y^(x)\hat y(x)当作最终结果。loss可以使用均方根误差rmse。
    • 排序问题:把y^(x)\hat y(x)当作x的得分,对x进行排序。使用pair-wise loss。

    因子分解机的公式可以表示成:线性回归+二阶交叉项。其求解过程主要集中在交叉项的计算。这项计算借鉴了完全平方公式:***(a+b)²=a²+2ab+b²***,2ab=(a+b)²-a²-b²

    交叉项计算

    时间复杂度也从O(kn2)O(kn^2)变为了O(kn)O(kn)

    参数的估计使用随机梯度下降法。

    求导

    Code

    github

    Reference

    jupyter版本

    [简单易学的机器学习算法——因子分解机(Factorization Machine)])https://blog.csdn.net/google19890102/article/details/45532745)


    关注公众号,一起学习

    展开全文
  • References: https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf 美团:深入FFM原理与实践
    展开全文
  • 文章目录1.FM模型2.FM公式理解3.应用4.代码时间实战:电影评分数据实战:分类任务5.思考6.参考 1.FM模型 逻辑回归模型及其缺点 做推荐CTR预估时最简单的思路就是将特征做线性组合(逻辑回归LR),传入sigmoid中得到...

    1.FM模型

    1. 逻辑回归模型及其缺点
      做推荐CTR预估时最简单的思路就是将特征做线性组合(逻辑回归LR),传入sigmoid中得到一个概率值,本质上这就是一个线性模型。
      sigmoid是单调增函数不会改变里面的线性模型的CTR预测顺序,因此逻辑回归模型效果会比较差。即LR的缺点:
      • 是线性模型
      • 个特征对最终输出结果独立,需要手动特征交叉(xixjx_i*x_j),比较麻烦
    2. 二阶交叉项的考虑及改进
      考虑所有的二阶交叉项,也就是将目标函数由原来的
      y=w0+i=1nwixi y = w_0+\sum_{i=1}^nw_ix_i
      变为
      y=w0+i=1nwixi+i=1n1i+1nwijxixjy=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{i+1}^nw_{ij}x_ix_j 但这个式子有一个问题,只有当xix_ixjx_j均不为0时这个二阶交叉项才会生效,后面这个特征交叉项本质是和多项式核SVM等价的,为了解决这个问题,FM上场。

    FM模型使用了如下的优化函数:

    y=w0+i=1nwixi+i=1ni+1n<vi,vj>xixj y = w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n}\sum_{i+1}^n\lt v_i,v_j\gt x_ix_j 事实上做的唯一改动就是把wijw_{ij}替换成了<vi,vj>\lt v_i,v_j\gt,大家应该就看出来了,这实际上就有深度学习的意味在里面了,实质上就是给每个xix_i计算一个embedding,然后将两个向量之间的embedding做内积得到之前所谓的wijw_{ij}
    好处就是这个模型泛化能力强 ,即使两个特征之前从未在训练集中同时出现,我们也不至于像之前一样训练不出wijw_{ij},事实上只需要xix_i和其他的xkx_k同时出现过就可以计算出xix_i的embedding!

    2.FM公式理解

    从公式来看,模型前半部分就是普通的LR线性组合,后半部分的交叉项:特征组合。首先,单从模型表达能力上来看,FM是要强于LR的,至少它不会比LR弱,当交叉项参数wijw_{ij}全为0的时候,整个模型就退化为普通的LR模型。对于有nn个特征的模型,特征组合的参数数量共有1+2+3++n1=n(n1)21+2+3+\cdots + n-1=\frac{n(n-1)}{2}个,并且任意两个参数之间是独立的。所以说特征数量比较多的时候,特征组合之后,维度自然而然就高了。

    (线性代数)定理:任意一个实对称矩阵(正定矩阵)WW都存在一个矩阵VV,使得 W=V.VTW=V.V^{T}成立。

    所有二次项参数ωij\omega_{ij}可以组成一个对称阵WW(为了方便说明FM的由来,对角元素可以设置为正实数),那么这个矩阵就可以分解为W=VTVW=V^TVVV 的第jj列(vjv_{j}),即第jj维特征(xjx_{j})的隐向量。
    y^(X)=ω0+i=1nωixi+i=1n1j=i+1n<vi,vj>xixj \hat{y}(X) = \omega_{0}+\sum_{i=1}^{n}{\omega_{i}x_{i}}+\sum_{i=1}^{n-1}{\sum_{j=i+1}^{n} \color{red}{<v_{i},v_{j}>x_{i}x_{j}}}

    需要估计的参数有ω0R\omega_{0}∈ RωiR\omega_{i}∈ RVRV∈ R<,>< \cdot, \cdot>是长度为kk的两个向量的点乘,公式如下:

    <vi,vj>=f=1kvi,fvj,f <v_{i},v_{j}> = \sum_{f=1}^{k}{v_{i,f}\cdot v_{j,f}}

    上面的公式中:

    • ω0\omega_{0}为全局偏置;
    • ωi\omega_{i}是模型第ii个变量的权重;
    • ωij=<vi,vj>\omega_{ij} = < v_{i}, v_{j}>特征iijj的交叉权重;
    • viv_{i}是第ii维特征的隐向量;
    • <,><\cdot, \cdot>代表向量点积;
    • k(k<<n)k(k<<n)为隐向量的长度,包含 kk 个描述特征的因子。

    FM模型中二次项的参数数量减少为 knkn个,远少于多项式模型的参数数量。另外,参数因子化使得 xhxix_{h}x_{i} 的参数和 xixjx_{i}x_{j} 的参数不再是相互独立的,因此我们可以在样本稀疏的情况下相对合理地估计FM的二次项参数。具体来说,xhxix_{h}x_{i}xixjx_{i}x_{j}的系数分别为 <vh,vi>\lt v_{h},v_{i}\gt<vi,vj>\lt v_{i},v_{j}\gt ,它们之间有共同项 viv_{i} 。也就是说,所有包含“ xix_{i} 的非零组合特征”(存在某个 jij \ne i ,使得 xixj0x_{i}x_{j}\neq 0 )的样本都可以用来学习隐向量viv_{i},这很大程度上避免了数据稀疏性造成的影响。而在多项式模型中,whiw_{hi}wijw_{ij} 是相互独立的。

    FM的公式是一个通用的拟合方程,可以采用不同的损失函数用于解决regression、classification等问题,比如可以采用MSE(Mean Square Error)loss function来求解回归问题,也可以采用Hinge/Cross-Entropy loss来求解分类问题。当然,在进行二元分类时,FM的输出需要使用sigmoid函数进行变换,该原理与LR是一样的。直观上看,FM的复杂度是 O(kn2)O(kn^2) 。但是FM的二次项可以化简,其复杂度可以优化到 O(kn)O(kn) 。由此可见,FM可以在线性时间对新样本作出预测。

    证明
    等式证明

    解释

    • vi,fv_{i,f} 是一个具体的值;
    • 第1个等号:对称矩阵 WW 对角线上半部分;
    • 第2个等号:把向量内积 viv_{i},vjv_{j} 展开成累加和的形式;
    • 第3个等号:提出公共部分;
    • 第4个等号: iijj 相当于是一样的,表示成平方过程。

    3.应用

    直接把FM得到的结果放进sigmoid中输出一个概率值,由此做CTR预估,事实上我们也可以做召回。
    FM模型是利用两个特征的Embedding做内积得到二阶特征交叉的权重,那么我们可以将训练好的FM特征取出离线存好,之后用来做KNN向量检索。
    具体步骤:

    • 离线训练好FM模型(学习目标可以是CTR)
    • 将训练好的FM模型Embedding取出
    • 将每个uid对应的Embedding做avg pooling(平均)形成该用户最终的Embedding,item也做同样的操作
    • 将所有的Embedding向量放入Faiss等
    • 线上uid发出请求,取出对应的user embedding,进行检索召回

    4.代码时间

    1.调包实现
    Github官方仓库:https://github.com/coreylynch/pyFM

    安装及使用:
    安装
    方法一:pip install

    pip install git+https://github.com/coreylynch/pyFM

    方法二:手动安装

    • 在官方仓库下载这个包
    • 解压包
    • cd到当前文件夹下python setup.py install安装
    • 若报错,去掉setup.py文件里面的libraries=[“m”]一行,再回到第3步重新安装

    安装失败。需要提前安装好Cython,但是我按网上的教程都未成功。后续有待实现

    测试

    1. 导包
    from pyfm import pylibfm
    from sklearn.feature_extraction import DictVectorizer
    import numpy as np
    
    1. 创建训练集并转换为one-hot编码的特征形式
    train = [
        {"user": "1", "item": "5", "age": 19},
        {"user": "2", "item": "43", "age": 33},
        {"user": "3", "item": "20", "age": 55},
        {"user": "4", "item": "10", "age": 20},
    ]
    v = DictVectorizer()
    X = v.fit_transform(train)
    print(X.toarray())
    

    查看结果

    [[19. 0. 0. 0. 1. 1. 0. 0. 0.]
    [33. 0. 0. 1. 0. 0. 1. 0. 0.]
    [55. 0. 1. 0. 0. 0. 0. 1. 0.]
    [20. 1. 0. 0. 0. 0. 0. 0. 1.]]

    1. 创建标签
      简单创建了一个全1的标签:
    y = np.repeat(1.0,X.shape[0])
    y
    

    array([1., 1., 1., 1.])

    1. 训练并预测
      和调用sklearn的包是一样的用法:
    fm = pylibfm.FM()
    fm.fit(X,y)
    fm.predict(v.transform({"user": "1", "item": "10", "age": 24}))
    

    实战:电影评分数据

    数据集在这里下载:http://www.grouplens.org/system/files/ml-100k.zip

    导包,并定义一个导入指定格式数据集的函数

    import numpy as np
    from sklearn.feature_extraction import DictVectorizer
    from pyfm import pylibfm
    
    # Read in data
    def loadData(filename,path="ml-100k/"):
        data = []
        y = []
        users=set()
        items=set()
        with open(path+filename) as f:
            for line in f:
                (user,movieid,rating,ts)=line.split('\t')
                data.append({ "user_id": str(user), "movie_id": str(movieid)})
                y.append(float(rating))
                users.add(user)
                items.add(movieid)
    
        return (data, np.array(y), users, items)
    

    导入训练集和测试集,并转换格式

    (train_data, y_train, train_users, train_items) = loadData("ua.base")
    (test_data, y_test, test_users, test_items) = loadData("ua.test")
    v = DictVectorizer()
    X_train = v.fit_transform(train_data)
    X_test = v.transform(test_data)
    

    训练模型并测试

    # Build and train a Factorization Machine
    fm = pylibfm.FM(num_factors=10, num_iter=100, verbose=True, task="regression", initial_learning_rate=0.001, learning_rate_schedule="optimal")
    fm.fit(X_train,y_train)
    

    预测结果打印误差

    preds = fm.predict(X_test)
    from sklearn.metrics import mean_squared_error
    print("FM MSE: %.4f" % mean_squared_error(y_test,preds))
    

    FM MSE: 0.8873

    实战:分类任务

    处理数据

    import numpy as np
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.cross_validation import train_test_split
    from pyfm import pylibfm
    
    from sklearn.datasets import make_classification
    
    X, y = make_classification(n_samples=1000,n_features=100, n_clusters_per_class=1)
    data = [ {v: k for k, v in dict(zip(i, range(len(i)))).items()}  for i in X]
    
    X_train, X_test, y_train, y_test = train_test_split(data, y, test_size=0.1, random_state=42)
    
    v = DictVectorizer()
    X_train = v.fit_transform(X_train)
    X_test = v.transform(X_test)
    

    建模型
    注意:这里的参数num_factors和tasks改变了

    fm = pylibfm.FM(num_factors=50, num_iter=10, verbose=True, task="classification", initial_learning_rate=0.0001, learning_rate_schedule="optimal")
    fm.fit(X_train,y_train)
    
    

    这是处理分类任务,误差函数也和之前的不同

    from sklearn.metrics import log_loss
    print("Validation log loss: %.4f" % log_loss(y_test,fm.predict(X_test)))
    
    

    Validation log loss: 1.3678

    1. 从零实现
      数据集介绍
      criteo:非常经典的点击率预估数据集,其中连续特征有13个,类别型特征有26个,没有提供特征的具体名称,特征分别如下:

    dense_feats:‘I1’, ‘I2’, ‘I3’, ‘I4’, ‘I5’, ‘I6’, ‘I7’, ‘I8’, ‘I9’, ‘I10’,‘I11’, ‘I12’, ‘I13’
    sparse_feats: ‘C1’, ‘C2’, ‘C3’, ‘C4’, ‘C5’, ‘C6’, ‘C7’, ‘C8’, ‘C9’, ‘C10’, ‘C11’, ‘C12’, ‘C13’, ‘C14’, ‘C15’, ‘C16’, ‘C17’, ‘C18’, ‘C19’, ‘C20’, ‘C21’, ‘C22’, ‘C23’, ‘C24’, ‘C25’, ‘C26’

    5.思考

    FM存在的问题,以及哪可以改进

    6.参考

    展开全文
  • FM(factorization machines)表示因子分解机,是由Steffen Rendle提出的一种基于矩阵分解的机器学习算法。目前,被广泛的应用于广告预估模型中,相比LR而言,效果更好。主要目标是:解决数据稀疏的情况下,特征怎样...
  • FM因子分解机 一、FM模型基础 1. FM模型提出 2. 共轭转置矩阵 3. 正定矩阵 4. Cholesky分解 5. 线性回归模型 6. 多项式回归模型 二、FM模型原理 1.FM模型原理 2.FM模型计算 3.FM模型训练 4.FM模型特征工程 三、FM...
  • 一些问题: xdeepfm介绍,与fm/ffm的区别,ffm的field的意思 ... DeepFM 相比 FM 是学到了一些高阶的特征组合,那用LR能不能实现相似的提升? fm,ffm模型原理 fm和ffm谁的参数多,域的划分 ...
  • 推荐系统召回四模型之:全能的FM模型 - 张俊林的文章 - 知乎 推荐系统遇上深度学习(一)--FM模型理论和实践 第一个问题:我们知道在个性化推荐系统里,第一个环节一般是召回阶段,而召回阶段工业界目前常规的做法是...
  • FM(Factorization Machine) FM的结构比较简单,考虑到线性模型中加入了特征组合。在世纪的点击率预测项目中,往往有很多类别型特征,而这些特征需要进行one-hot处理,但是经过one-hot处理后的数据特征空间会...
  • 因子分解机 FM

    2021-03-29 23:54:04
    目录背景FM因子分解机FM模型的核心作用可以概括为三个与其他模型对比FFM(场感知分解机,Field-aware Factorization Machine)背景DeepFMFM/FFM与其它模型对比 背景 在人工方式的特征工程,通常有两个问题: 1、特征...
  • 特征组合之因子分解机(FM)

    千次阅读 2018-11-20 21:32:12
    特征组合之因子分解机(FM) 1. 为什么需要因子分解机? 在上一篇博客特征组合中提到,暴力交叉会导致特征组合的特征稀疏的问题,所以...2.什么是FM因子分解机? FM因式分解机是一种基于LR模型的高效的学习特征间相互...
  • 因子分解机FM

    2020-07-18 11:57:16
    因子分解机FM 阅读完博文https://blog.csdn.net/ddydavie/article/details/82667890 https://www.cnblogs.com/makefile/p/ffm.html之后关于因子分解机的感悟 问题背景:人工方式的特征工程尝尝会面临一个问题就是...
  • 逻辑回归无法学习到特征间的组合关系,因此有了 因子分解机FM 和 场感知因子分解机FFM。 接下来,介绍下场感知因子分解机的主要应用。FFM模型可以自动做特征组合和处理高维稀疏特征,因而它在处理大量离散特征问题...
  • FM(因子分解机)理解

    2020-04-10 14:23:17
    因子分解机 FM的优势 (1)FM可以在非常稀疏的数据下进行参数评估。 (2)FM的复杂度为线性复杂度,利于优化。 (3)其他的分解模型输入数据是有限制的,但是FM可以可以用在一些real valued特征向量上。 ...
  • FM因子分解机系列)

    千次阅读 2017-07-12 13:39:31
    因子分解机,FFM,线性回归

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 258
精华内容 103
关键字:

fm因子分解机