精华内容
下载资源
问答
  • 2019-09-30 14:12:37

    我在上文中介绍了百度的在线AI模型创建平台aistudio(博客地址:https://blog.csdn.net/BEYONDMA/article/details/101762116),我们知道深度学习的入门一个最大的门槛就是搭建编程环境,今天我们就来用aistio我们就来训练第一个人工智能模型。

    波士顿房价预测

    其实波士顿房价本来非常具有代表意义,他是《Deep learning with keras》中的第一个例程,堪称深度学习界的hello world学习明白了这个也就是基本入门了人工智能,而本文就来介绍一下如何这个模型是如何训练又是如何被预测的。

    一、我们有哪些数据我们可以看到训练数据包含404个点,每个数据点包含13个特征。
    这些特征包括:

    1.人均犯罪率

    2.在25000平方英尺上住房的比例

    3.每个镇上平均的非零售企业比例

    4.是否为查尔斯河景房(= 1代表就在河边; 0则代表非河景))

    5.一氧化氮的浓度,单位是千万分之一

    6.每个住所的平均房间数

    7.1940年以前自己修的建筑比例

    8.到波士顿五个就业中心的加权距离

    9.到公路适应性指标

    10.每10000的税率的完全价值

    11.镇上的学生-老师比例

    12.黑人人口的比例(这一域在sklearn的数据集中已经删除了,不过依旧保留在了某它框架中)

    12低地位人口比例

    我们接下来要做的就是从这些点学习到相应的模型来预测波士顿其它地方的房价,这里首先我们先对于一些基本概念进行说明。

    假设函数:本项目只是一个机器学习的入门,所以我倍用线性模型进行回归预测,也就是我们的假设函数为 Y’= wX+b ,其中,Y’表示模型的预测结果(预测房价),用来和真实的Y区分。模型要学习的参数即:w,b。

    损失函数:假如函数预测的结果Y’与真实值Y之间的误差。这个差距越小预测越准确,而人工智能模型,本质上就是一个不断修正参数w,b,使预测值Y’尽可能地接近真实值Y。这个实值通常用来反映模型误差的大小。对于线性模型来讲,最常用的损失函数就是均方误差。

    优化算法:模型训练其实等价于调整参数使得损失函数值不断变小的过程所以,优化算法就是微调变量w和b的算法,一般我们采用的优化算法有随机梯度下降法(SGD)、Adam算法等等

    接下来我们就进入代码的环节了:

    1.载入相应包,读入数据,代码及注释如下:

    import paddle.fluid as fluid
    import paddle
    import numpy as np
    import os
    import matplotlib.pyplot as plt
    
    BUF_SIZE=500
    BATCH_SIZE=20
    
    #用于训练的数据提供器,每次从缓存中随机读取批次大小的数据
    train_reader = paddle.batch(
        paddle.reader.shuffle(paddle.dataset.uci_housing.train(), 
                              buf_size=BUF_SIZE),                    
        batch_size=BATCH_SIZE)   
    #用于测试的数据提供器,每次从缓存中随机读取批次大小的数据
    test_reader = paddle.batch(
        paddle.reader.shuffle(paddle.dataset.uci_housing.test(),
                              buf_size=BUF_SIZE),
        batch_size=BATCH_SIZE)  

    2.训练前的准备,其代码及注释如下:

    train_data=paddle.dataset.uci_housing.train();
    sampledata=next(train_data())
    print(sampledata)
    
    #定义张量变量x,表示13维的特征值
    x = fluid.layers.data(name='x', shape=[13], dtype='float32')
    #定义张量y,表示目标值
    y = fluid.layers.data(name='y', shape=[1], dtype='float32')
    #定义一个简单的线性网络,连接输入和输出的全连接层
    #input:输入tensor;
    #size:该层输出单元的数目
    #act:激活函数
    y_predict=fluid.layers.fc(input=x,size=1,act=None)
    cost = fluid.layers.square_error_cost(input=y_predict, label=y) #求一个batch的损失值
    avg_cost = fluid.layers.mean(cost)                              #对损失值求平均值
    optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.1)
    opts = optimizer.minimize(avg_cost)
    
    place = fluid.CPUPlace()                 #定义运算场所为cpu
    exe = fluid.Executor(place)              #创建一个Executor实例exe
    exe.run(fluid.default_startup_program()) #Executor的run()方法执行startup_program(),进行参数初始化
    
    # 定义输入数据维度
    feeder = fluid.DataFeeder(place=place, feed_list=[x, y])#feed_list:向模型输入的变量表或变量表名
    
    
    iter=0;
    iters=[]
    train_costs=[]
    #绘制训练进程函数
    def draw_train_process(iters,train_costs):
        title="training cost"
        plt.title(title, fontsize=24)
        plt.xlabel("iter", fontsize=14)
        plt.ylabel("cost", fontsize=14)
        plt.plot(iters, train_costs,color='red',label='training cost') 
        plt.grid()
        plt.show()

    3.训练模型

    EPOCH_NUM=10
    model_save_dir = "/home/aistudio/data/fit_a_line.inference.model"
    
    for pass_id in range(EPOCH_NUM):                                  #训练EPOCH_NUM轮
        # 开始训练并输出最后一个batch的损失值
        train_cost = 0
        for batch_id, data in enumerate(train_reader()):              #遍历train_reader迭代器
            train_cost = exe.run(program=fluid.default_main_program(),#运行主程序
                                 feed=feeder.feed(data),              #喂入一个batch的训练数据,根据feed_list和data提供的信息,将输入数据转成一种特殊的数据结构
                                 fetch_list=[avg_cost])     
            print("Pass:%d, Cost:%0.5f" % (pass_id, train_cost[0][0]))    #打印最后一个batch的损失值
            iter=iter+BATCH_SIZE
            iters.append(iter)
            train_costs.append(train_cost[0][0])
           
       
        # 开始测试并输出最后一个batch的损失值
        test_cost = 0
        for batch_id, data in enumerate(test_reader()):               #遍历test_reader迭代器
            test_cost = exe.run(program=fluid.default_main_program(), #运行测试cheng
                                feed=feeder.feed(data),               #喂入一个batch的测试数据
                                fetch_list=[avg_cost])                #fetch均方误差
        print('Test:%d, Cost:%0.5f' % (pass_id, test_cost[0][0]))     #打印最后一个batch的损失值
        
        #保存模型
        # 如果保存路径不存在就创建
        if not os.path.exists(model_save_dir):
            os.makedirs(model_save_dir)
        print ('save models to %s' % (model_save_dir))
        #保存训练参数到指定路径中,构建一个专门用预测的program
        fluid.io.save_inference_model(model_save_dir,   #保存推理model的路径
                                      ['x'],            #推理(inference)需要 feed 的数据
                                      [y_predict],      #保存推理(inference)结果的 Variables
                                      exe)              #exe 保存 inference model
    draw_train_process(iters,train_costs)
    
    infer_exe = fluid.Executor(place)    #创建推测用的executor
    inference_scope = fluid.core.Scope() #Scope指定作用域
    
    infer_results=[]
    groud_truths=[]
    
    #绘制真实值和预测值对比图
    def draw_infer_result(groud_truths,infer_results):
        title='Boston'
        plt.title(title, fontsize=24)
        x = np.arange(1,20) 
        y = x
        plt.plot(x, y)
        plt.xlabel('ground truth', fontsize=14)
        plt.ylabel('infer result', fontsize=14)
        plt.scatter(groud_truths, infer_results,color='green',label='training cost') 
        plt.grid()
        plt.show()

    4.预测模型

    
    
    model_save_dir = "/home/aistudio/data/fit_a_line.inference.model"
    with fluid.scope_guard(inference_scope):#修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。
        #从指定目录中加载 推理model(inference model)
        [inference_program,feed_target_names,fetch_targets] = fluid.io.load_inference_model(#fetch_targets: 推断结果
                                        model_save_dir, #model_save_dir:模型训练路径 
                                        infer_exe)      #infer_exe: 预测用executor
        #获取预测数据
        infer_reader = paddle.batch(paddle.dataset.uci_housing.test(),  #获取uci_housing的测试数据
                              batch_size=200)                           #从测试数据中读取一个大小为10的batch数据
        #从test_reader中分割x
        test_data = next(infer_reader())
        test_x = np.array([data[0] for data in test_data]).astype("float32")
        test_y= np.array([data[1] for data in test_data]).astype("float32")
        results = infer_exe.run(inference_program,                              #预测模型
                                feed={feed_target_names[0]: np.array(test_x)},  #喂入要预测的x值
                                fetch_list=fetch_targets)                       #得到推测结果 
                                
        print("infer results: (House Price)")
        for idx, val in enumerate(results[0]):
            print("%d: %.2f" % (idx, val))
            infer_results.append(val)
        print("ground truth:")
        for idx, val in enumerate(test_y):
            print("%d: %.2f" % (idx, val))
            groud_truths.append(val)
        draw_infer_result(groud_truths,infer_results)
    
    from openpyxl import load_workbook
    wb = load_workbook(filename = 'work/Top250.xlsx')
    sheet_ranges = wb['Top250']
    
    #将第一列的前几行打印出来
    for i in range (1,8):
        print(sheet_ranges['A'+i.__str__()].value)
        
    
    #如果没有问题, 就将该工作表转为dataframe格式
    
    df = DataFrame(sheet_ranges.values)

    将上述代码合并在一起执行即可,我们可以看到训练的过程

    并得到最终的预测结果和实际的比对

     用aistudio最大的方便之处在于不需要自己搭建任何python及深度学习的开发环境,全部都是准备好的,而且现在也还免费,所以大家完全可以趁十一,赶快用过来。

    更多相关内容
  • 关于隐语义模型,其中之一就是本专栏第(2)节讲过的 -- SVD矩阵分解及其正则化 。LFM 模型通过如下公式计算用户 u 对物品 i 的兴趣: 其中P 和 Q 的解释同第(2)节,不再累述。但可以解释一下隐类 K: 假如...

    关于隐语义模型,其中之一就是本专栏第(2)节讲过的 -- SVD矩阵分解及其正则化 。LFM 模型通过如下公式计算用户 u 对物品 i 的兴趣:

    其中P 和 Q 的解释同第(2)节,不再累述。但可以解释一下隐类 K:

    假如用户喜欢看电影,但是兴趣比较广泛。如果采用协同过滤的算法,那么很难满足用户广泛的兴趣及其比重。假如用户80%的时间喜欢看科幻电影,20% 的时间喜欢看动画片。那么协同过滤无法考虑到这种兴趣的比重并合理推荐。我们就将 K 设定为2,定义两个隐类,将用户与隐类的联系设成矩阵 P;同理,将隐类与物品的联系设成矩阵 Q,形成了隐语义模型 LFM。

    如何通过隐反馈数据获得 SVD 的 UI 矩阵?

    在 SVD 中,UI 矩阵的行代表用户U,列代表物品I,其中的数字代表用户 U 对 I 的评分。但是在隐反馈数据中,只有正样本,没有负样本,要得到 UI 矩阵,必须要有负样本。因此要进行负样本采样,采样原则如下:

    (1)对每个用户,从他没有行为的物品中采样一些物品作为负样本。
    (2)要保证正负样本的数量相当。

    (3)对每个用户采样负样本时,选择那些很热门,用户却没有行为的物品比冷门用户没有行为的物品更佳。

    负样本采样代码如下:

    def RandomSelectNegativeSample(items):
        ret = dict()
        for i in items.keys():
            ret[i] = 1 #已有的物品为 1 代表正样本
        n = 0 
        for i in xrange(len(items) * 3):
            #items_pool 维护了一个候选物品表,在这个列表中
            #物品 i 出现的次数和物品 i 的流行度成正比
            item = items_pool[random.randint(0,len(items_pool) - 1)]
            if item in ret:continue
            ret[item] = 0 #负样本
            n += 1
            if n > len(items):break #保证正负平衡
        return ret
    

    梯度下降求解 SVD 

    直接引入第(2)节的结果,加入了正则化的 SVD 矩阵的梯度下降公式为:

    将其中的2 设成 alpha ,称之为学习率,则如下:

    下面的代码实现了这一梯度下降过程:

    def LatenFactorModel(user_items, K, N, alpha, lambda):
        [P,Q] = InitModel(user_items,K) #生成 K 个隐类的 P,Q 矩阵
        for step in range(0,N):
            for user,items in user_items.items():
                samples = RandomSelectNegativeSample(items)
                for item,rui in samples.items():
                    eui = rui - Predict(user,item) #Predict 根据 P,Q 矩阵计算 ^rui
                    for k in range(0,K):
                        P[user][k] += alpha * (eui * Q[k][item] - lambda * P[user][k])
                        Q[k][item] += alpha * (eui * P[user][k] - lambda * Q[k][item])
            
            alpha *= 0.9 #学习率衰减

    得到 P, Q 矩阵后生成推荐

    通过梯度下降算法获得 P, Q 矩阵后,我们就可以根据矩阵生成推荐,代码如下:

    def Recommend(user, P, Q):
        rank = dict()
        for u,puk in P[user].items():
            for i,qki in Q[u].items():
                if i not in rank:
                    rank[i] = puk * qki #矩阵乘法
        return rank
    

     

    展开全文
  • 概要: 随着电子商务的高速发展...个性化推荐算法是推荐系统中最核心的技术,在很大程度上决定了电子商务推荐系统性能的优劣,决定着是否能够推荐用户真正感兴趣的信息,而面对用户的不断提升的需求,推荐系统不仅需

    原文链接:http://blog.csdn.net/qq1010885678/article/details/46675501

    概要:

    随着电子商务的高速发展和普及应用,个性化推荐的推荐系统已成为一个重要研究领域。 
    个性化推荐算法是推荐系统中最核心的技术,在很大程度上决定了电子商务推荐系统性能的优劣,决定着是否能够推荐用户真正感兴趣的信息,而面对用户的不断提升的需求,推荐系统不仅需要正确的推荐,还要实时地根据用户的行为进行分析并推荐最新的 结果。 
    实时推荐系统的任务就是为每个用户,不断地、精准地推送个性化的服务,甚至到达让用户体会到推荐系统比他们更了解自己的感觉。

    本文主要研究的是基于模型的协同过滤算法—ALS以及实时推荐系统的可行性并详细讲解ALS(交替最小二乘法)的思想 
    然后在Spark Streaming框架上运用ALS算法进行测试,评估实时推荐中算法的可靠性 
    最后,在Spark Mllib和Streaming框架上构建了实时推荐引擎,将推荐数据保存在Hbase中,WebApp通过读取Hbase中的推荐数据来向用户展示推荐结果

    关于其他类别的推荐算法就不细说了,网上有很多的资料查看,推荐几篇文章: 
    IBM-探索推荐引擎内部的秘密系列

    以及向亮的《推荐系统实践》 
    下载地址

    下面进入正文

    基于矩阵分解的协同过滤算法–ALS:

    基于模型的协同过滤推荐就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测,计算推荐。

    对于一个users-products-rating的评分数据集,ALS会建立一个user*product的m*n的矩阵(其中,m为users的数量,n为products的数量),如下图:

    这里写图片描述

    这个矩阵的每一行代表一个用户 (u1,u2,…,u9)、每一列代表一个产品 (v1,v2,…,v9)。用户隔天产品的打分在 1-9 之间。 
    但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的 
    ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个product的评分,ALS填充的评分项也称为用户i对产品j的预测得分 
    所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵 
    它是这么做的: 
    假设m*n的评分矩阵R,可以被近似分解成U*(V)T 
    U为m*d的用户特征向量矩阵 
    V为n*d的产品特征向量矩阵((V)T代表V的转置) 
    d为user/product的特征值的数量

    关于d这个值的理解,大概可以是这样的: 
    对于每个产品,可以从d个角度进行评价,以电影为例,可以从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4 
    可以认为,每部电影在这4个角度上都有一个固定的基准评分值 
    例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的 
    d=4,有4个特征值,分别是主演,导演,特效,剧情 
    每个特征值的基准评分值分别为(满分为1.0): 
    主演:0.9 
    导演:0.7 
    特效:0.8 
    剧情:0.6 
    矩阵V由n个product*d个特征值组成

    对于矩阵U,假设对于任意的用户A,该用户对一部电影的综合评分和电影的特征值存在一定的线性关系,即电影的综合评分=(a1*d1+a2*d2+a3*d3+a4*d4) 
    其中a1-4为用户A的特征值,d1-4为之前所说的电影的特征值

    那么对于之前ALS算法的这个假设 
    m*n的评分矩阵R,可以被近似分解成U*(V)T 
    就是成立的,某个用户对某个产品的评分可以通过矩阵U某行和矩阵V(转置)的某列相乘得到

    那么现在的问题是,如何确定用户和产品的特征值?(之前仅仅是举例子,实际中这两个都是未知的变量) 
    采用的是交替的最小二乘法 
    这里写图片描述

    在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分) 
    用真实评分减去预测评分然后求平方,对下一个用户,下一个产品进行相同的计算,将所有结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并没有实际的评分,解决的方法是就只看对已知打分的项)

    但是这里之前问题还是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量

    解决的办法是交替的最小二乘法 
    首先对于上面的公式,以下面的形式显示: 
    这里写图片描述 
    为了防止过度拟合,加上正则化参数 
    这里写图片描述

    这里写图片描述

    首先用一个小于1的随机数初始化V 
    根据公式(4)求U 
    此时就可以得到初始的UV矩阵了,计算上面说过的差平方和 
    根据计算得到的U和公式(5),重新计算并覆盖V,计算差平方和 
    反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止 
    取得最新的UV矩阵 
    则原本的稀疏矩阵R就可以用R=U(V)T来表示了

    ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积 
    交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小 
    通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分

    算法原理讲述完毕,接下来进行算法测试

    算法测试:

    算法测试分为两部分: 
    一、测试最佳的参数,如:隐性因子个数,正则式等 
    二、测试在Streaming框架上算法的可用性

    测试数据集来自MovieLens

    测试一: 
    将整个数据集上传至HDFS中 
    在spark程序中读取ratings.dat文件,并随机划出80%作为训练数据集,20%作为测试数据集

    设置隐性因子、正则式参数列表(由于物理机配置不好,集群能够支持的最大迭代次数只有7次,在多就会内存溢出,所以这里直接将迭代次数设置为7)

    对参数列表的全排列分别进行模型训练,并计算MSE、RMSE

    结果如下图: 
    这里写图片描述

    比较得出最佳的参数组合,以后的模型训练参数都使用这个参数组合

    测试二:

    将原本的数据划分为三部分 
    trainingData-10k 
    testData-10k 
    剩下的为streamData,作为流数据实时发送 
    首先将trainingData、testData上传到HDFS/data目录下 
    在spark程序中读取,并转化为RDD[Rating]类型 
    使用Streaming框架接受流数据,并进行在线模型训练 
    每训练一次就计算一次MSE和RMSE 
    对比模型的精准性有没有提高

    使用Scala读取本地的streamData,通过Socket发送到spark程序中

    结果如下图:

    随着数据的不断增加,模型的精准度在不断的提高,所以实时的更新推荐模型是可行的

    推荐系统整合:

    整体流程图:

    这里写图片描述

    首先用程序生成用户和图书数据,并随机模拟用户行为数据,保存在Hbase中

    在Hbase数据库中包含了用户表(4000个用户),图书表(5060本图书)以及评分表(用户对图书的百万条数据) 
    由于对个人来说无法得到真实的商业性数据,故评分数据都是程序 模拟随机生成的,包括实时发送的流数据,所以这可能会对整个系统的推荐结果带来影响

    另外,除了WebUI部分,其余的程序都是运行在Linux的Spark集群上

    原始数据通过一个程序不断地向Hbase的评分表中写入数据 
    模拟用户在网站上的评分行为 
    运行截图:

    这里写图片描述

    其中,前300个用户的行为偏向于前600本图书(计算机相关) 
    实时流数据将通过另外一个程序发送Socket数据,模拟用户当前在网站上的实时评分行为 
    在最后使用用户进行观察测试时,程序将会只模拟这个用户的评分行为以便观察推荐系统的实时性

    首先推荐引擎会读取Hbase中的评分数据 
    并使用算法测试时得到的最佳参数组合来对其进行训练 
    得到初始的模型 
    使用这个模型对Hbase中所有用户进行图书推荐(取 top10) 
    并将推荐结果保存在Hbase中 
    以上阶段为系统初始化阶段 
    运行截图:

    这里写图片描述 
    这里写图片描述

    这里写图片描述

    在系统初始化完成之后,开启实时推荐引擎 
    接收不断生成的用户行为数据,并和Hbase中的原始数据混合,训练出新的模型,产生推荐结果保存 
    不断地进行流数据的读取、训练和保存推荐结果,直至系统关闭或者无流数据产生 
    推荐引擎运行如下图:

    这里写图片描述

    WebUI部分:

    WebUI是由ASP.NET开发的一个简单的B/S应用,通过Thrift和Linux中的Hbase交互 
    选择使用一个用户观察系统的实时推荐性,此时流数据模拟程序只产生这个用户的评分行为 
    不同时刻,在该用户有行为数据产生的情况下,推荐的内容(细节没有仔细处理,比如有的图片找不到路径等。。。): 
    当前记录

    这里写图片描述 
    这里写图片描述

    新的行为数据产生的记录

    这里写图片描述 
    这里写图片描述

    总结:

    前前后后大概花了两个礼拜多一点的时间(毕竟还要顾着上课,基本也就是晚上才有时间) 
    其中遇到了许多坑,上网找过,请人问过,也上过知乎啥的让大牛指导过

    总之一句话,没有真正动手做过是不会知道其中的艰苦,当然我早就变态的把它当乐趣来看了

    原本的设想是使用联合聚类+ALS矩阵分解来做的,但是试了一下,联合聚类貌似不想k-means啥的那么简单,以自己的水平来说暂时无法实现(还是要怪自己基础不好咯~),遂放弃之~

    之后又有一个美好的想法,通过ItemCF、UserCF、关联规则、ALS等算法组合起来,形成一个混合的模型,毕竟这种模式才是比较接近商业化的构架,但是在Spark上面调用Mahout算法的时候又出现了各种各样的问题,有时候甚至编译都不通过。。。

    在推荐算法性能测试的时候,自己实现了召回率,准确率,覆盖率,多样性,新颖度等指标的计算方式,但是实际测试时总是飙出莫名其妙的数据。。。

    另外,使用ALS进行实时训练模型的时候,每次都要重新训练,感觉这是一个优化点,可否修改成接受到新数据之后不重复训练,只计算新来的数据(水平有限,暂时只是想法)

    期末考又临近了,只好先放下这些不成器的东西以后再研究

    最后的最后,无奈之下只能实现了一个最简单的推荐系统

    最后附上所有源代码和简要记录的开发日志

    源代码已打包上传: 
    下载地址 
    (代码有些凌乱,没来得及重构,仅仅做了基本的注释,有需要的童鞋不要介意。。。)

    开发日志:

    6-9:准备book数据到hbase中。上传到hdfs中文乱码(Docker中),读取hdfs数据到hbase中出异常(原因:数据格式不对,内容太多超出一行,仔细看日志;scala输入hbase异常)

    6-10:完成t_users,t_books,t_ratings的数据导入

    6-12:scala操作scan hbase表 
    坑位: 
    1:resultScaner不能直接for循环 
    2:spark上操作hbase 
    第一次简单测试(按照之前的过程) 
    offset (0) + length (4) exceed the capacity of the array: 2 使用String 
    3:Streaming接收socket数据测试 
    4:Streaming执行内容测试

    6-13:实时推荐测试 
    问题记录:不能同时运行两个sparkcontext 
    解决:使用sparkContext来创建StreamingContext 
    Streaming的处理方式 
    socketTextFile无法接受数据—logger缺少换行符 
    foreachRDD理解 
    完成实时更新模型

    6-14:namenode经常莫名挂掉,重新配置虚拟机 
    ubuntu下hostname默认为ubuntu所以一直无法正确启动–修改/etc/hostname 重启

    6-15:SparkStreaming实时读取更新模型老是抛异常 
    解决:allData.cache(没有缓存的话之前的流数据丢失无法找到)

    Unable to reconnect to ZooKeeper service, session 0x14df6b4bcdb0009 has expired, closing socket connection/ 
    Socket connection established to localhost/127.0.0.1:2181, initiating sessio 
    解决:在代码中设置hbase的zk,配置文件中无效

    6-16:解决15鈤的问题 
    allData.repartition(3).cache 
    更新模型时连接到zk异常

    WARN [sparkDriver-akka.actor.default-dispatcher-46] storage.BlockManagerMasterActor (Logging.scala:logWarning(71)) - Removing BlockManager BlockManagerId(4, cloud1, 56133) with no recent heart beats: 125833ms exceeds 120000ms 
    原因:由于网络差或者数据量太大,worker节点在一定的时间内(默认45s)没有给master信号,master以为它挂了。 
    解决办法:修改运行命令或者sprak-env.sh,添加参数 -Dspark.storage.blockManagerHeartBeatMs=6000000(以ms为单位,即6分钟)。 
    修改:在此配置中无效,要在代码中通过SparkConf设置 
    Spark1.4中直接通过spark.network.timeout一个配置全部

    6-17:完成基础推荐引擎搭建和测试;c#连接hbase环境搭建

    6-18:spark批量写hbase性能优化 
    myTable.setAutoFlush(false, false)//关键点1 
    myTable.setWriteBufferSize(3*1024*1024)//关键点2 
    myTable.flushCommits()//关键点3 
    关键点1_:将自动提交关闭,如果不关闭,每写一条数据都会进行提交,是导入数据较慢的做主要因素。 
    关键点2:设置缓存大小,当缓存大于设置值时,hbase会自动提交。此处可自己尝试大小,一般对大数据量,设置为5M即可,本文设置为3M。 
    关键点3:每一个分片结束后都进行flushCommits(),如果不执行,当hbase最后缓存小于上面设定值时,不会进行提交,导致数据丢失。

    注:此外如果想提高Spark写数据如Hbase速度,可以增加Spark可用核数量。

    修改:实际测试中,以上优化并没有起作用,反而会使一下数据丢失,没有继续深入测试

    完成webapp的基本搭建

    6-23:完成算法测试部分,评测指标RMSE,MSE,==》(平均值,取不同的n推荐列表画曲线)召回率,准确率,覆盖率,多样性,新颖度 
    使用spark1.4 的新api来推荐物品提升效率 
    在spark-env和default里面的配置无效,在代码中配置 
    System.setProperty(“spark.akka.frameSize”, “2000”)

    6-24:系统原型完成

    6-25:完善系统原型

    6-26:论文初稿

    参考资料: 
    Spark 下操作 HBase(1.0.0 新 API) 
    【C#】通过Thrift操作HBase系列(1) 
    ALS 在 Spark MLlib 中的实现 
    基于矩阵分解的协同过滤算法

    展开全文
  • Tensorflow 模型 C++部署实战

    千人学习 2020-03-26 12:37:50
    适用人群 人工智能领域从业者 or 深度学习实际产品开发人员或者想了解训练模型后,如何部署的学员。 课程简介    让学员可以从实战角度深度的学习深度学习产品开发过程,并能够自己写代码实现TF模型的...
  • 文章目录1 Uplift Modeling与reponse model模型的差异1.1 增益模型与响应模型的差异1.2 增益模型与响应模型的混淆1.3 业务疑问与需求1.3.1 多维度建模1.3.2 一些使用场景1.3.3 实验室组和对照组 数据不均匀2 uplift ...


    1 Uplift Modeling与reponse model模型的差异

    Uplift Modeling在智能营销中非常重要,一般来说个性化营销人群中存在四类:
    在这里插入图片描述

    • persuadables不发券就不购买、发券才会购买的人群,即优惠券敏感人群
    • sure thing:无论是否发券,都会购买,自然转化
    • lost causes:无论是否发券都不会购买,这类用户实在难以触达到,直接放弃 sleeping
    • dogs:与persuadables相反,对营销活动比较反感,不发券的时候会有购买行为,但发券后不会再购买。

    还有一个比较搞笑的版本:
    在这里插入图片描述

    • 不管是否看广告都会买什么的人(Sure Things)
    • 仅在有广告的情况下才购买的人(Persuadables)
    • 无论如何都不买的人(Lost Causes)
    • 本来买,但是看了广告后不买的人(Sleeping Dogs)

    1.1 增益模型与响应模型的差异

    【智能营销增益模型(Uplift Modeling)的原理与实践】一文中提到:

    购买转化导向(reponse model)的模型,目标人群为是否购买,但是该模型不能告诉我们:这批人是否因为发放优惠券而产生购买。
    也就是无法区分persuadablessure things人群,而且在这个建模过程中其实存在:
    优惠券 -> 购买,需要探讨因果关系的命题。

    这里来看阿里文娱在 【阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践】一文中也提及两者的差异:
    在这里插入图片描述
    按照以往的经验和直觉,可能会向第二类用户群投放广告,因为其转换率 是最高的,但这个结论是对的吗?
    经过进一步分析,除了广告曝光转化率 之外,我们还能知道这两类用户群体在没有广告触达情况下的自然转化率, 从而推算出广告所带来的增量。
    比如第一类用户的广告转化率虽然低,但 在没有广告触达情况下的转化率更低,即广告所带来的增量反而是比第二 个用户更高的,而我们要最大化总体的转化率其实等价于最大化广告的增 量,按照这个逻辑,我们应该向第一个用户投放广告。
    也就是说 Response Model 很有可能会误导我们做出错误的决策,Uplift Model 和 Response Model 之所以有差异,主要在于两个模型的预测目标不一样。

    1.2 增益模型与响应模型的混淆

    当然,现在也有非常多的做法,将两者混淆在一起。
    【智能营销增益模型(Uplift Modeling)的原理与实践】一文中提到 优惠券发放Demo的案例,简单来看看:

    这是一次优惠券发放活动,对用户以短信方式发放5折优惠券,本次活动实验组(treatement,短信方式发送5折优惠券),对照组(不发券)37701名用户,注意到实验组和对照组不满足P ( T ) = P ( C ) = 1 /2 的条件。
    本身实验组和对照组的数据是通过一个XGB模型预测出来的用户,该模型预测用户领取优惠券后是否会下单。根据模型预测结果,筛选一批高于某个阈值的用户,分成实验组和对照组。因此这次AB结果本身可以看出这个预测模型的uplift score。

    这个预测模型的AB实验中,实验组转化率是2.69%,对照组转化率是2.28%,两组的转化率远高于以往运营随机筛选或根据条件筛选用户的转化率。但是,注意到这个预测模型的uplift score只有0.0041(2.69%-2.28%)。说明预测模型筛选出来的用户本身就有下单意愿,并不一定是因为发放优惠券而下单,所以实验组中的用户persuadable的比例应该不是很高。

    在一个预测模型上再做uplift modeling相当于是在下单意愿高的用户中再筛选persuadable用户,其实实践上没有太大必要。

    1.3 业务疑问与需求

    1.3.1 多维度建模

    【智能营销增益模型(Uplift Modeling)的原理与实践】阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践都提及了多维度建模的情况:
    干预策略只有一种,对于发券,相当于一个treatment只有一种折扣,对于广告push,一个treatment也只能有一种内容。而treatment可以用多种维度,如不同渠道发放不同折扣的优惠券,不同场景推送不同内容的push。
    传统的response model以转化为多分类问题解决,但uplift modeling难以简单转化为多分类问题。
    此外,个性化广告推送也依赖长期和短期的用户行为特征构建。不同营销场景下的用户特征可以共用,可以构建统一的线上线下特征平台。
    同时维度的剧增会对样本的量级要求越来越高,样本的稀疏性问题会更加严重,针对这个问题阿里文娱团队有两个可能的解法:

    • ❶ 可以采用多任务学习的方式,联合其他场景一起建模缓解单场景样本的压力,同时也可以通过人为构造无偏样本的方式增加整体的样本量。当然除了技术侧,整个营销上面还有非常多很有意思的研究方向,比如之前更多考虑的是单个营销场景,但其实多个场景下怎么去建模和刻画他们之间的相互影响也是非常有意思的课题;

    • ❷ 我们之前uplift model建模更多考虑的是单次或者短期用户行为的增益,但实际上的营销往往是常态化或持续化的,用户的心智可能会不断发生变化,如何去建模长期的uplift也值得进一步去探讨。

    1.3.2 一些使用场景

    参考:【营销增益模型实战-Uplift Model原理及应用】
    寻找高增益人群,如医学实验场景,寻找药物的有效人群。
    或者广告,红包场景中因广告,红包而转化的人群,去掉不敏感人群以及自转化人群,从而提升活动效益。
    还有:

    • 政治运动:

    提升模型已被用来识别那些政治立场摇摆不定的选民(Stedman 2013)。通过利用提升模型,政治营销可以避免推送给对立方的支持者,而只专注于Persuadables部分。

    • 新的治疗方案:

    Uplift Model不仅能评估整个治疗组和对照组的结果,还可以了解治疗对不同组的不同影响,及影响的具体差异。

    • 交叉销售:

    因为预算有限,有些人可能不需要或想要其他产品。并且假设他们不希望对整个客户群进行交叉销售。这时公司可以使用Uplift 模型精确的筛选用户群,进行更精准的交叉销售广告活动。

    • 留存:

    公司希望与将要流失并保存他们的客户接触,但他们不希望在与的活跃期发送营销内容骚扰客户,只专注于高流失风险的客户群,这时就可以使用Uplift模型

    • 用户体验测试:

    公司想了解网站或应用程序的更改是否导致了预期的结果。

    1.3.3 实验室组和对照组 数据不均匀

    参考文章【广告中增益模型理解】
    实验室组和对照组流量数据不均匀时,分两种情况讨论:

    • 一是如果数据量本身不大,再加上实验室组和对照组数据分布不均,则其中一组数据必然很少,这样再将每组进行十等份,每组的数据就更少,计算比例是会有很强的随机性,使整个评估指标失效。
    • 二是如果数据量本身很大,即使分布不均,两个组的数据量分别还是很大,由于都是计算比例,所以计算结果还是可靠的。

    2 uplift model的模型

    2.0 Uplift 经典模型介绍

    参考:Uplift 经典模型介绍

    2.0.1 元学习:双模型(Two Model, T-Learner)

    • 针对单Treatment而言,双模型的做法具体而言,将实验组和对照组分别建模,最后两个模型预测结果做差即为lift
    • 针对多Treatment而言,对各个实验组和对照组分别建模,然后每个实验组依次和对照组的预测结果做差,得到每个实验组对应的lift

    优缺点:
    双模型优点是简单直观,可以复用常见的机器学习模型(LR、Tree Model、NN)。
    缺点是数据利用不充分,没有很好地拟合两个群体之间的差异(也即lift信号)且对模型误差容易被放大。假设单个模型准确率都是90%,那么最后预测lift的精度只有81%.

    2.0.2 元学习:单模型(Single Model, S-Learner)

    单模型的方式将处理变量T当做输入特征进行训练,预测时将同一样本特征进行多次输入,每次只是改变不同的T值。
    一般而言, 表示对照组, 代表各个实验组。

    单模型相比双模型的方式有以下几个优势:

    • 模型训练时数据利用更充分.
    • 建模更加简单,只需要一个简单的逻辑回归或树模型(随机森林、Xgboost、Lightgbm).
    • 能对处理变量或者其他变量进行强制的单调约束,双模型无法做到这一点.

    2.0.3 元学习: X-Learner模型

    X-Learner是对T-Learner和S-Learner进行了融合

    2.0.4 树模型:

    随机森林的Uplift模型与普通的随机森林的主要的区别就是分裂指标的不同。

    以下是几种常见的分裂指标:

    • 一些特殊的方法
      在这里插入图片描述
    • 求左右节点的差异
      在这里插入图片描述
    • 基于信息论的分裂指标
      在这里插入图片描述
      几种模型:
    • CTS算法,直接建模最大化预期相应
    • 因果森林
    • 广义随机森林(GRF)
    • 正交随机森林(ORF)

    2.1 差分响应模型(Two-Model Approach)

    分别对AB实验的实验组和对照组数据独立建模,预测时分别实验组模型和对照组模型预测用户的分数,两个模型预测分数相减就得到了uplift score。

    实验组是使用干预策略的用户(treatment),对照组是未使用干预策略的用户(control),正样本都是下单用户。

    具体可以参考文章:【智能营销增益模型(Uplift Modeling)的原理与实践】
    笔者画个简图:
    在这里插入图片描述
    uplift模型的核心,每一个用户会得到一个位于-1到1的lift score,用于指导用户人群的选择。

    模型优缺点
    优点:

    • 这种建模方法的优点是比较简单容易理解,同时它可以套用我们常见的机器学习模型,如LR,GBDT,NN等,所以该模型的落地成本是比较低的
    • 不过考虑到实现简单迅速,实践中可以作为baseline使用。

    缺点:

    • 两个独立的模型分开训练容易累积误差(两个独立模型的误差会累加传递到最终的uplift score)。
    • 但是该模型最大的缺点是精度有限,这一方面是因为我们独立的构建了两个模型,这两个模型在打分上面的误差容易产生累积效应
    • 第二是我们建模的目标其实是response而不是uplift,因此对uplift的识别能力比较有限。

    在这里插入图片描述

    2.2 差分响应模型升级版(One-Model Approach)

    差分响应模型的训练数据和模型都是各自独立的,可以分别在训练数据层面上打通以及在模型层面上打通,得到升级版的差分响应模型。

    在实验组和对照组的用户特征中,加入与Treatment有关的特征,实现数据层面的打通,即实验组和对照组合并,使用同一个模型训练。这是阿里文娱提到的一种方法,但我感觉这样无法满足用户特征样与条件策略独立的假设。

    参考文章:阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践
    在这里插入图片描述
    它和上一个模型最大差别点在于,它在模型层面做了打通,同时底层的样本也是共享的,之所以能实现这种模型层面的打通,是因为我们在样本的维度上做了一个扩展,除了user feature之外,还引入了与treatment相关的变量T ( T如果是0,1的取值可以建模single treatment,T也可以扩展为0到N,建模multiple treatment,比如不同红包的面额,或者不同广告的素材 )

    优点

    • 训练样本的共享可以使模型学习的更加充分
    • 同时通过模型的学习也可以有效的避免双模型打分误差累积的问题
    • 从模型的层面可以支持multiple treatment的建模,具有比较强的实用性。
      缺点
    • 同时和Two Model版本类似,它的缺点依然是其在本质上还是在对response建模,因此对uplift的建模还是比较间接,有一定提升的空间。

    2.3 Modeling Uplift Directly

    参考文章:阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践
    在这里插入图片描述

    下面主要介绍它的思想,在传统的决策树构建中,最重要的环节是分裂特征的选择,我们常用的指标是信息增益或者信息增益比,
    其背后的含义还是希望通过特征分裂之后下游节点的正负样本的分布能够更加的悬殊,也就代表类的纯度变得更高。
    类似的,这种思想也可以引入到Uplift Model的建模过程中,虽然我们并没有用户个体的uplift直接的label,但是我们可以通过treatment组和control组转化率的差异来刻画这个uplift,以图中左下角的图为例,我们有T和C两组样本,绿色的样本代表正样本,红色的代表负样本,可以看到在分裂之前T和C两组正负样本的比例比较接近,但是经过一轮特征分裂之后,T和C组内正负样本的比例发生了较大的变化,左子树中T组全是正样本,C组全是负样本,右子树正好相反,C组的正样本居多,意味着左子树的uplift比右子树的uplift更高,即该特征能够很好的把uplift更高和更低的两群人做一个区分。

    如何从数学上度量这种概率分布的差异的方式呢?一些文章提出了可行的方法,比如基于KL散度,欧式距离,卡方距离的等等
    优点:

    • 可以直接对uplift进行建模,因此它的精度理论上是更高的

    缺点:

    • 在应用层面我们需要做大量的改造和优化,除了前面介绍的分裂规则之外,我们还需要改造它的loss函数,后续的剪枝等一系列的过程,所以它的实现成本是比较高的。

    2.4 Class Transformation Method模型

    另外一种更严谨的可以实现实验组对照组数据打通和模型打通的方法叫做class transformation method
    在这里插入图片描述
    而P ( Z = 1 ∣ X ) 可以通过任何分类模型得到,所以这个方法称为Class Transformation Method. 实际上,Z = 1 Z=1Z=1就是实验组中下单的用户和对照组中未下单的用户,因此可以直接将实验组和对照组用户合并,使用一个模型建模,实现了数据层面和模型层面的打通。
    预测时,模型预测的结果就是uplift score,这点与差分响应模型不同。
    在这里插入图片描述
    该方法有两个假设,
    在这里插入图片描述
    第一个假设很好理解,实践中保证用户特征与干预策略无关即可。第二个假设过于严格,难以在实践中每次都满足。
    但是可以通过重采样使得数据满足该假设,即使不满足(经常会有对照组数量远远小于实验组的情况)如果模型结果有意义,并且如果在测试集和线上表现良好,那么也不一定非要满足

    2.5 训练样本收集

    增益模型建模强依赖于AB实验,数据要求很高。建模时要求实验组和对照组样本数量一样(实践中不一定有这个严格要求)。而且实验组和对照组的样本特征分布要一致,例如,训练数据不能是实验组预测后的结果、对照组随机选择的结果这样的组合,因为这样不满足干预策略与用户特征相互独立的假设(P(G∣X)=P(G))。
    故实验组中还需要预留一部分随机选择的用户,与对照组中的用户作为模型迭代的数据,或者实验组与对照组都先经过某个策略或模型的筛选。


    3 模型的评估指标

    uplift评估最大的难点在于我们并没有单个用户uplift的ground truth,响应模型可以通过一个测试数据集来计算precision,recall和AUC,但因为增益模型中不可能同时观察到同一用户在不同干预策略下的响应,因此无法直接计算上述评价指标。
    增益模型通常都是通过划分十分位数(decile)来对齐实验组和对照组数据,间接评估,而不是在一个测试集上直接评估。

    解决的一个思路是通过构造镜像人群的方式来间接拿到uplift的ground truth,比如说经典的AUUC的指标就是这样去计算的,假设现在有两个满足CIA条件假设的样本组,我们可以对两群人分别预估他们的uplift score,之后将人群按照uplift score进行降序排列,通过score分数这一桥梁,可以把两组人群进行镜像人群的对齐,之后分别截取分数最高的比如10%的用户出来,计算这一部分人转化率的差异,这个差异就可以近似地认为是分数最高的这群人真实的uplift,类似地,我们可以计算前20%,40%一直到100%的点上面的值,连线就能得到uplift curve。

    3.1 uplift 柱状图

    测试集上,实验组和对照组的用户分别按照uplift由高到低排序,划分为十等份,即十分位(decile),分别是top 10%用户,top 20%用户……top 100%用户。
    分别对实验组和对照组中每个十分位内的用户求期望,即预测分数的均值,然后相减,作为这个十分位bin内的uplift,绘制柱状图,如下图(这个图是由低到高排序,排序反了):
    在这里插入图片描述
    这种方法只能定性分析,无法计算出一个具体的值来整体评价模型的好坏。

    3.2 Qini曲线(Qini curve)

    可以在uplift bars的基础上绘制曲线,类似AUC来评价模型的表现,这条曲线称为Qini curve,计算每个百分比的Qini系数,最后将这些Qini系数连接起来,得到一条曲线。Qini系数计算如下:
    在这里插入图片描述
    ϕ是按照uplift score由高到低排序的用户数量占实验组或对照组用户数量的比例,如ϕ = 0.1 \phi = 0.1ϕ=0.1,表示实验组或对照组中前10%的用户。

    在这里插入图片描述
    如上图,横轴等于0.2时,对应的纵轴大概是0.0032(uplift score),表示当uplift score等于0.0032时,可以覆盖前20%的用户数量,从图上看,这部分用户就是persuadable用户。

    图中虚线是随机的base曲线,Qini曲线与随机random曲线之间的面积作为评价模型的指标,面积越大越好,面积越大,表示模型结果远超过随机选择的结果,与AUC类似,这个指标称为AUUC(Area Under Uplift Curve)。

    Qini系数分母是实验组和对照组的全体用户数,如果两组用户数量差别比较大,结果容易失真。另一种累积增益曲线可以避免这个问题。

    3.3 Adjusted Qini

    是为了避免实验组和对照组数据不均衡而导致Qini系数失真而设计的。计算方式如下:
    在这里插入图片描述

    3.4 累积增益曲线(Cumulative Gain curve)

    累积增益曲线计算如下:
    在这里插入图片描述
    各符号含义与Qini系数符号含义相同。与Qini系数相比,累积增益的分母是百分比ϕ \phiϕ下的实验组或对照组人数,避免实验组和对照组用户数量不平衡导致的指标失真问题。
    可以将累积增益曲线与random line之间的面积作为评价模型表现的指标。


    4 实践案例

    4.1 优惠券发放Demo

    【智能营销增益模型(Uplift Modeling)的原理与实践】一文案例
    这里有一个优惠券发放的例子 。这是一次优惠券发放活动,对用户以短信方式发放5折优惠券,本次活动实验组(treatement,短信方式发送5折优惠券),对照组(不发券)37701名用户,注意到实验组和对照组不满足P ( T ) = P ( C ) = 1/ 2 的条件。

    差分响应模型
    实验组和对照组分别建模,使用lightGBM模型,分别取80%数据为训练集,20%数据为测试集。两个模型在测试集上的表现如下(未调参):
    在这里插入图片描述
    方便起见,将实验组和对照组20%的测试数据合并作为整个uplift model的测试集,流程如下。使用的数据集是经过了response model预测后的结果,相当于先筛选了一批下单概率高的用户,因为实验组和对照组用户都来自于同一个response model,可以认为两组用户特征分布式相同的。实际应用时,要注意实验组和对照组的用户特征分布是否一致。

    在这里插入图片描述
    对uplift分数排序,得到uplift bar,如下图所示。横轴是测试集中每个用户uplift的十分位数(decile),共10个bin;纵轴是每个bin的uplift均值。由于uplift排序是从低到高,因此这个uplift bar看起来是反的(正常应该是从高到底排)。
    在这里插入图片描述
    Adjusted Qini曲线如下:
    在这里插入图片描述
    累积增益曲线如下:在这里插入图片描述
    在Qini曲线下,差分响应模型的总体效果要好一些。而在累积增益曲线下,Class Transformation模型的总体效果要好一些。实验组和对照组数据不平衡的情况下,Qini系数可能有偏差,但本次对比的实验数据两组用户数量是接近的,这个问题还在研究中。

    4.2 Uplift Model在淘票票智能票补中的应用

    参考:阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践

    在这里插入图片描述
    在该场景下,每个用户最多只能发放一个红包,同时面额有固定几个分档,因此问题就精细化到如何对用户进行个性化的面额发放上,这可以通过经典的背包问题来抽象,
    如图所示,第一个公式是我们的目标,最大化的是红包撬动效率,下面的约束条件一个是ROI约束,一个是预算约束。

    该问题的求解中有两个关键点:

    • 一个是用户红包敏感度的建模,
    • 第二是在敏感度已知的情况下怎么进行全局效用最大化的求解。

    下面重点介绍uplift model模块。Uplift model的目标是预测每个用户在不同的红包金额下的转化率,从而构建出千人千面的敏感度曲线。
    在这里插入图片描述
    我们将建模的任务拆分成三个步骤:

    ❶ 收集训练样本

    训练样本的收集和我们的实验是强相关的,我们采用的是随机化的分桶实验,它有两个好处,一是可以严谨公平地进行效果的评估,二是可以为uplift model的建模提供无偏的样本。

    ❷ 模型的构建和训练

    收集到样本之后可以进行建模,考虑到业务迭代的周期,我们使用的是前面介绍的One Model的差分响应模型,特征层面,除了user维度的基础属性,还有历史的观影行为,以及历史红包的反馈

    ❸ 面向业务层的模型校准和优化

    理论上到模型训练完成,就可以直接把模型放到线上去应用了,但是在离线调研时,我们发现一个问题,我们绘制的用户敏感度曲线和我们的预期不太一样,并不是严格的平滑递增的走势。我们分析有两个可能的原因:

    • 一是与我们整体的样本规模比较有限有关,因为这种无偏样本目前大概只有几百万的量级;
    • 二是由于用户行为的稀疏性,在这种场景下我们比较难收集到用户在不同面额下的历史数据,因此也会加剧这种不平滑性。

    针对该问题,我们做了校准处理,把原始曲线做了一个函数的拟合,一方面可以让结果更加符合我们先验的假设,一方面经过这种函数化之后可以在后续支持更多面额的预测,但这种做法是否是最优的还值得进一步探讨。

    4.3 Uplift-Model在贝壳业务场景中的实践

    参考文章:【Uplift-Model在贝壳业务场景中的实践
    在贝壳新房业务场景下,我们希望当用户进入新房频道首页时,为用户发放带看券或者成交券,在保证ROI大于0的前提下,提升用户带看率和成交率,进而提升平台GMV。

    我们将问题进行抽象,在进入到新房频道首页的用户中,精准识别出那些对于优惠券敏感的人群,进行优惠券发放。也就是我们需要对用户进行优惠券敏感度建模,这正是uplift model做的事情。

    4.3.1 样本构造

    目前新房业务场景下,已经做过很多优惠券相关的活动,但这些活动的运营对象时全部用户,也就是所有用户多会发,需要用户主动进行领取,这显然是不满足uplift model对于训练样本的要求的。

    我们选择新房业务下最近的一个活动“618惠住季”来构建训练样本,为了更好的模拟随机A/B实验,按照是否浏览过活动领券页面将用户分为实验组用户和对照组用户(在这里我们认为用户没有浏览过活动领券页面,就可以认为对其没有发券)。

    在房产交易场景中,用户决策周期很长,如果拿成交和带看来作为转化的目标可能对导致转化样本数过低,因此我们加入了委托,我们认为只要用户在领券后的未来7天内,发生委托或带看或成交任一种重行为的转化,即将其标定成为一条正样本,标定后的正负样本分布如下表:
    在这里插入图片描述
    可以看到实验组和对照组总人数数量之间差异巨大,为了后续可以使用标签转换方式训练模型,我们对对照组进行欠采样,最终实现对照组人数和实验组人数基本一致。

    4.3.2 特征工程

    在特征工程层面我们主要选取了用户行为特征、城市特征、偏好特征、时序特征等。

    表3 样本特征信息表
    在这里插入图片描述
    我们分别将实验组和对照组各80%的数据作为训练集,20%数据为测试集来评估模型表现。为了方便起见,将对照组和实验组的测试集合并用来观测训练过程,在真正预测时在将其分开。

    4.3.3 模型训练与评估
    在模型选择上,我们以XGBoost模型作为基学习器,分别在Two Model差分响应模型、One Model差分响应模型(无标签转化+引入T/C特征)、One Model差分响应模型(引入标签转化)和One Model差分响应模型(引入个人倾向分)上进行了尝试。One Model差分响应模型(无标签转化+引入T/C特征)训练流程如下:
    在这里插入图片描述
    图6 One Model差分响应模型(无标签转化+引入T/C特征)流程图

    在实验组和对照组分别取80%的用户合并成训练样本,然后引入干预策略相关特征进行模型训练,在实验组和对照组各20%的用户样本上将每个用户干预策略特征分别置1和0,预测两次,然后将预测结果相减即为uplift值。

    在全部模型试验中,Two Model差分响应模型表现最差,One Model差分响应模型(无标签转化+引入T/C特征)和引入倾向分后的回归模型表现较好。
    在这里插入图片描述
    图7 two-model差分响应模型(无标签转化+引入T/C特征)Qini曲线

    Two Model模型会导致误差累计,在具体实验中也得到了同样结论;
    标签转化方法在逻辑上推导可行,实验结果显示并不尽如人意,分析其主要原因还是对于样本的要求太高,目前构造的数据虽然保证了实验组和对照组用户数量基本一致,但是完全随机基本无法保证。
    相反,引入个人倾向分后,将其转化为回归问题,在一定程度上解决了这个问题,标签转化虽然逻辑上可以,但是还是需要一定解释成本。

    在实验中表现最好的One Model差分响应模型(无标签转化+引入T/C特征),在结果输出上解释成本也是最低的,在对于每个用户预测时,分别加入T和C干预信号特征,然后预测值相减即得到用户的uplift score。

    4.4 如何选择最佳的Uplift值

    参考文章:用机器学习来提升你的用户增长:第八步,Uplift模型

    使用文章数据:karamanbk/data.csv
    在这里插入图片描述
    在这个例子中,类别的映射如下,多分类模型:

    0 -> Control Non-Responders
    1 -> Control Responders
    2 -> Treatment Non-Responders
    3 -> Treatment Responders
    

    计算uplift分数,uplift分数的公式为:
    在这里插入图片描述
    为了评估我们的模型,我们将创建两个不同的组,并将它们与我们的基准进行比较。这两个组是:

    • 高Uplift分数:客户的uplift分数>3/4分位数
    • 低Uplift分数:客户的uplift分数<1/2分位数

    我们会对比:

    • 转化的uplift
    • 每个目标用户的收入uplift,看看我们的模型是不是让我们的活动更有效了

    5 思考:差分响应模型升级版(One-Model Approach)

    20210714笔记

    因为该方法在贝壳测试文章【Uplift-Model在贝壳业务场景中的实践】中,是效果最好的,而且可行性 + 可解释性比较强,适合多维度因素,来看一下具体实现过程,首先:

    Uplift建模对样本的要求是比较高的,需要服从CIA ( Conditional Independence Assumption ) 条件独立假设,要求X与T是相互独立的。什么样的样本有这样的特征,又如何获取呢?最简单的方式就是随机化实验A/B Test,因为通过A/B Test拆分流量得到的这两组样本在特征的分布上面是一致的,也就是X和T是相互独立的。因此随机化实验是Uplift Model建模过程中非常重要的基础设施,可以为Uplift Model提供无偏的样本。

    在这里插入图片描述
    那么此时的训练集就是:80% treatment组 + 80% control组样本,同时在特征中新增一个T(干预)特征,
    这里一定程度解决【1.3.1 多维度建模】,如果这里的干预只有,发/没发券,那就是0/1;
    如果这里是不同红包面额,那就是0/1/2/3等。

    然后训练一个模型,训练完了之后,需要预测两次,同一个模型,将T(干预)特征变化一下,如果是多个维度,就是多个样本,同个模型,预测多次:
    然后相减得到uplife value
    t=0
    这里很容易混淆的是,增益模型和响应模型,能否在响应模型之上,进行实验?

    文章阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践提到的是:
    之所以没有用有算法干预下的样本是因为用户的发放的面额与用户的特征是强相关的,并不满足CIA条件,因此这一部分样本虽然量较大,但是不能用于训练。

    要么就是各管各的,相互独立,也就是高潜人群也有可能是发/不发 红包的;
    要么分开切流实验,是最省心的。


    6 参考文献:

    1 智能营销增益模型(Uplift Modeling)的原理与实践
    2 阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践
    3 Uplift-Model在贝壳业务场景中的实践
    4 用机器学习来提升你的用户增长:第八步,Uplift模型
    5 【广告中增益模型理解】
    6 【营销增益模型实战-Uplift Model原理及应用】

    展开全文
  • 阅读更多,欢迎关注公众号:论文收割机(paper_reader) ... 序列推荐(sequential recommendation)在推荐系统里是...序列推荐模型,随着整个CS research领域的发展,也是一直在不断变化。从最开始的Markov chain,到
  • 第一周 第二周 第三周 第四周 第五周
  • AI:人工智能的多模态融合模型的简介、发展以及未来趋势 目录 人工智能的多模态融合模型的简介、发展以及未来趋势 多模态融合模型的简介 多模态融合模型的发展趋势 多模态常见应用分类 1、按照模态分类 2...
  • 该项目是中国移动公司举办模型竞赛项目,奖金百万。 赛题信息 随着社会信用体系建设的深入推进, 社会信用标准建设飞速发展,相关的标准相继发布,包括信用服务标准、信用数据釆集和服务标准、信用修复标准、城市...
  • 推荐阅读时长:12min 智能运维领域时间序列预测都有哪些典型应用场景?典型的算法有哪些?这些算法在实际落地应用中有哪些优缺点?让我们一起来看看云智慧对此是怎样理解的。 章节目录 一、运维领域的预测...
  • 什么是智能制造成能力成熟度模型? 为促进中国企业高质量发展,国家工信部组织大批专知名专家制定了国标“GB∕T 39116-2020 智能制造能力成熟度模型”,以指导企业提升企业智能制造水平,增强企业竞争力。 根据“GB...
  • 【人工智能推荐系统算法

    千次阅读 2021-12-07 19:33:04
    推荐系统算法详解 一、常用推荐算法分类 1. 基于人口统计学的推荐算法 ...对于特定标签的用户,又可以根据预设的规则(知识)或者模型推荐出对应的物品 用户信息标签化的过程一般又称为用户画像
  • 智能营销增益模型(Uplift Modeling)的原理与实践

    万次阅读 多人点赞 2020-04-18 09:49:16
    文章目录增益模型因果与推论(Causal Inference)增益模型的表示差分响应模型(Two-Model Approach)模型优缺点差分响应模型升级版(One-Model Approach)Class Transformation MethodClass Transformation的两个...
  • 智能推荐系统

    千次阅读 多人点赞 2019-08-04 08:24:10
    隐语义模型LFM(Latent Factor Model) 交替最小二乘法ALS(Alternating Least Square) 词频-逆文本频率TF-IDF(term frequency–inverse document frequency) ETL是将业务系统的数据经过抽取、清洗转换之后...
  • 作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址: 目录 前言: 第1章 模型评估概述 1.1 什么是模型评估 ...1.2 模型评估的类型 ...第3章 常见的回归模型评估指
  • 人工智能-马尔可夫模型

    万次阅读 多人点赞 2019-01-05 17:29:58
    马尔可夫模型(Markov Model)是一种统计模型,广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理等应用领域。经过长期发展,尤其是在语音识别中的成功应用,使它成为一种通用的统计工具。 -...
  • 智能制造参考模型是一个通用模型,适用于智能制造全价值链所有合作伙伴公司的产品和服务,它将提供智能制造相关技术系统的构建、开发、集成和运行的一个框架,通过建立智能制造参考模型可以将现有标准(如工业通信
  • 中国智能制造系统架构(IMSA模型

    千次阅读 2022-01-16 17:30:50
    2015年12月30日,工信部和国标委联合发布了《国家智能制造标准体系建设指南》(2015年版),同时包含了我国的智能制造系统架构,从生命周期、系统层级和智能功能三个维度构建
  • 人工智能-自动机模型

    千次阅读 多人点赞 2019-01-05 17:25:19
    这是一类智能的算法,没有什么固定的模式,就是一个算法思想,可以给我们一些有价值的指导,当我们想要做一些相关工作的时候,可以扩宽我们的视野,打开我们的脑洞,借鉴其中的原理。我不想多说里面的什么数学和公式...
  • 本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇介绍了Keras-bert库安装及基础用法及文本分类工作。这篇文章将通过keras-bert库构建Bert模型,并实现微博情感分析。这是迁移学习的基础...
  • https://blog.csdn.net/zxm_jimin/article/details/94742224
  • 人工智能AI、机器学习模型理解

    万次阅读 多人点赞 2018-10-22 22:05:00
    人工智能就是机器学习和大数据; 机器学习是什么:就是算法模型; 算法模型是什么: 俗地说,模型就是机器学习采用的算法。“模型文件”一般说的是这个算法用到的各种输入、输出数据的值。 因为机器学习往往需要...
  •  全球知名科技市场研究机构国际数据公司(IDC)日前发布的《2021-2022中国人工智能计算力发展评估报告》指出,人工智能算法模型呈现大规模趋势,巨量模型将是规模化创新的基础,算力成为根本保障。  巨量化的核
  • BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图 目录 SC与传统合约的比较 SC模型部署原理、运行原理 SC与传统合约的比较 1、传统合约VS智能合约 特点...
  • 智能推荐:猜你所想

    千次阅读 2022-03-22 00:00:37
    推荐系统技术,总体而言,与 NLP 和图像领域比,发展速度不算太快。不过最近两年,由于深度学习等一些新技术的引入,有了比较明显的提升。
  • 智能运维AIOps能力成熟度模型

    千次阅读 2021-11-19 20:13:17
    智能运维AIOps能力成熟度模型 2021年7月5日至16日期间,国际电信联盟第十三研究组(简称ITU-T SG13)召开全体会议,由中国信通院主导的智能运维国际标准由参会代表尚梦宸经过多轮小组会议讨论及全体会议审议,最终...
  • 如今,机器学习框架在不断进化。训练一个人工智能模型出来,越来越简单了。还记得我学的第一门机器学习课程,是吴恩达教授的 Cousera 慕课。当时用的工具,是 Octave (开源版本的 M...
  • 总第403篇2020年 第26篇在过去十年,机器学习在学术界取得了众多的突破,在工业界也有很多应用落地。美团很早就开始探索不同的机器学习模型在搜索场景下的应用,从最开始的线性模型、树模型...
  • 从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章结合文本挖掘介绍微博情感分类知识,包括数据预处理、机器学习和深度学习的情感分类。这篇文章将开启新的内容——Bert,首先介绍...
  • 九、基于智能体的模型 原文:Chapter 9 Agent-based models 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 我们迄今为止看到的模型可能具有“基于规则”的特征,因为它们涉及受简单规则支配的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 466,657
精华内容 186,662
关键字:

智能推荐模型