ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ALS召回、LR、GBDT排序的实战,A/B Test【转载的哦】

2020-04-15 20:55:56  阅读:443  来源: 互联网

标签:ShopSortModel return getScore list GBDT LR Test shopSortModel public


【转】https://blog.csdn.net/haozi_rou/article/details/104888594

在生成ALS和LR模型以后,接下来就可以用在代码中了。

首先ALS,其实在数据已经存在数据库中了,只要从中取出来,去掉个逗号之类的就好

@Service
public class RecommendService {
    @Autowired
    private RecommendDOMapper recommendDOMapper;
    //找回数据,根据userid召回shopidList
    public List<Integer> recall(Integer userId){
        RecommendDO recommendDO = recommendDOMapper.selectByPrimaryKey(userId);
        if (recommendDO == null){
            recommendDO = recommendDOMapper.selectByPrimaryKey(99999);
        }
        String[] shopIdArr = recommendDO.getRecommend().split(",");
        List<Integer> shopIdList = new ArrayList<>();
        for (int i = 0 ; i < shopIdArr.length ; i ++){
            shopIdList.add(Integer.valueOf(shopIdArr[i]));
        }
        return shopIdList;
    }
}

  


对于LR:

@Service
public class RecommendSortService {
    private SparkSession spark;
    private LogisticRegressionModel lrModel;
    @PostConstruct
    public void init(){
        //初始化spark运行环境
        spark = SparkSession.builder()
                .master("local")
                .appName("DianpingApp")
                .getOrCreate();
        lrModel = LogisticRegressionModel.load("file:///F:/mouseSpace/project/background/lr/lrmodel");
    }
    public List<Integer> sort(List<Integer> shopIdList , Integer userId){
        //需要根据lrmodel所需要的11维的x生成特征,然后调用预测方法
        List<ShopSortModel> list = new ArrayList<>();
        for (Integer shopId : shopIdList){
            //造的假数据
            Vector v = Vectors.dense(1,0,0,0,0,1,0.6,0,0,1,0);
            Vector result = lrModel.predictProbability(v);
            double[] arr = result.toArray();
            double score = arr[1];
//            lrModel.predict(v);       如果用这个,就是返回1或者0
            ShopSortModel shopSortModel = new ShopSortModel();
            shopSortModel.setShopId(shopId);
            shopSortModel.setScore(score);
            list.add(shopSortModel);
        }
        list.sort(new Comparator<ShopSortModel>() {
            @Override
            public int compare(ShopSortModel o1, ShopSortModel o2) {
                if (o1.getScore() < o2.getScore()){
                    return -1;
                }else if (o1.getScore() > o2.getScore()){
                    return 1;
                }else {
                    return 0;
                }
            }
        });
        return list.stream().map(shopSortModel -> shopSortModel.getShopId()).collect(Collectors.toList());
    }
}

 


代码中自己造了一个数据,所以结果会有些偏差。

对于GBDT

跟lr算法非常像

public class GBDTRecommendSortService {
    private SparkSession spark;
    private GBTClassificationModel gbtClassificationModel;
    @PostConstruct
    public void init(){
        //初始化spark运行环境
        spark = SparkSession.builder()
                .master("local")
                .appName("DianpingApp")
                .getOrCreate();
        gbtClassificationModel = GBTClassificationModel.load("file:///F:/mouseSpace/project/background/lr/gbdtmodel");
    }
    public List<Integer> sort(List<Integer> shopIdList , Integer userId){
        //需要根据lrmodel所需要的11维的x生成特征,然后调用预测方法
        List<ShopSortModel> list = new ArrayList<>();
        for (Integer shopId : shopIdList){
            //造的假数据
            Vector v = Vectors.dense(1,0,0,0,0,1,0.6,0,0,1,0);
            Vector result = gbtClassificationModel.predictProbability(v);
            double[] arr = result.toArray();
            double score = arr[1];
//            lrModel.predict(v);       如果用这个,就是返回1或者0
            ShopSortModel shopSortModel = new ShopSortModel();
            shopSortModel.setShopId(shopId);
            shopSortModel.setScore(score);
            list.add(shopSortModel);
        }
        list.sort(new Comparator<ShopSortModel>() {
            @Override
            public int compare(ShopSortModel o1, ShopSortModel o2) {
                if (o1.getScore() < o2.getScore()){
                    return -1;
                }else if (o1.getScore() > o2.getScore()){
                    return 1;
                }else {
                    return 0;
                }
            }
        });
        return list.stream().map(shopSortModel -> shopSortModel.getShopId()).collect(Collectors.toList());
    }
}

  


A/B Test
它可以帮助我们决策算法的好坏,提供更多的真实依据的手段。

在真实场景中,假如现有的是LR算法,那么我现在马上在线上换成GBDT,当然是有很大风险的,那么AB TEST就出现了,假如有10条数据,我可以分5条用lr算法,5条用GBDT算法,然后将两个依次穿插,形成一个结果集发给前端,然后通过记录点击率来验证哪种算法更好。

标签:ShopSortModel,return,getScore,list,GBDT,LR,Test,shopSortModel,public
来源: https://www.cnblogs.com/linkmust/p/12708314.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有