Spark,ALS、LR、GBDT应用

本文介绍了Spark在机器学习中的应用,包括使用ALS算法进行召回预测,详细阐述了模型训练和评估过程;接着讲解了LR算法实现,强调特征预处理的重要性;最后提到了GBDT算法的实现,指出其与LR算法的相似性。
摘要由CSDN通过智能技术生成

之前说了很多机器学习,接下来讲下Spark,Spark是为大规模数据处理而设计的快速通用的计算引擎。他有很多的库,例如Spark core、Spark Sql、Spark on Hive、Spark Streaming等。还有机器学习库例如Spark mllib等。

现在有一个场景,有一个list,里面存的是商品实体,现在需要将这些实体中的id提取到另一个list中,现有阶段就是遍历然后把id提取出来,不管是for还是lambda还是别的方式。但是如果这个list里面的数量非常巨大,那么在jvm内存中做这些事情是不现实的,因此,有了Spark core的Map Reduce,可以将复杂的操作封装成RDD的操作,使我们可以很轻易的进行数据转换。

那么它的原理也很简单,假如有十万条数据,那么spark会拆分成若干条,然后分发给对应的机器,map以后再把所有的数据合并,进行计算如max、min、avg等,然后把结果发给目标机器。

那么对于数据库来说,假如分了三个库,每个库里面都有100w条数据,spark有一个spark sql的库,可以根据很简单的语句例如:select sum(price) from shop来去获取三个库的数据并返回结果。

Spark Streaming是指假如有个数据采集的系统,数据是以流式byte[]的形式发送给spark,定义4个为一个数字,那么spark就可以通过流式处理的方案处理数据运算。


具体步骤可以参考:

https://www.cnblogs.com/xuliangxing/p/7279662.html


ALS算法实现

召回算法

加依赖

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.12</artifactId>
            <version>2.4.4</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>14.0.1</version>
        </dependency>

代码:

public class AlsRecall implements Serializable {
    public static void main(String[] args) throws IOException {
        //初始化spark运行环境
        SparkSession spark = SparkSession.builder()
                .master("local")
                .appName("DianpingApp")
                .getOrCreate();
        JavaRDD<String> csvFile = spark.read().textFile("file:///F:/mouseSpace/project/background/behavior.csv").toJavaRDD();
        JavaRDD<Rating> ratingJavaRDD = csvFile.map(new Function<String, Rating>() {
            @Override
            public Rating call(String s) throws Exception {
                return Rating.parseRating(s);
            }
        });
        Dataset<Row> ratings = spark.createDataFrame(ratingJavaRDD, Rating.class);
        //将所有的rating数据28分,也就是80%数据做训练,20%做测试
        Dataset<Row>[] splits = ratings.randomSplit(new double[]{0.8, 0.2});

        Dataset<Row> trainingData = splits[0];
        Dataset<Row> testData = splits[1];

        ALS als = new ALS()
                .setMaxIter(10)     //最大迭代次数
                .setRank(5)         //分解出5个特征
                //正则化系数,防止过拟合,也就是训练出来的数据过分趋近于真实数据,一旦真实数据有误差,模型预测结果反而不尽如人意
                //如何防止?增大数据规模,减少特征的维度,增大正则化系数
                //欠拟合:增加维度,减少正则化数
                .setRegParam(0.01)
                .setUserCol("userId")
                .setItemCol("shopId")
                .setRatingCol("rating");

        //模型训练
        ALSModel alsModel = als.fit(trainingData);
        alsModel.save("file:///F:/mouseSpace/project/background/als");
    }

    public static class Rating implements Serializable{
        private int userId;
        private int shopId;
        private int rating;

        private static Rating parseRating(String str){
            str = str.replace("\"" , "");
            String[] strArr = str.split(",");
            int userId = Integer.parseInt(strArr[0]);
            int shopId = Integer.parseInt(strArr[1]);
            int rating = Integer.parseInt(strArr[2]);
            re
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值