ALS推荐算法—训练并保存—加载并测试


数据集下载地址: https://download.csdn.net/download/wsp_1138886114/10681947

一、读取数据—清洗数据训练并保存
import os
from pyspark import SparkContext,SparkConf
from pyspark.mllib.recommendation import ALS,Rating

def create_spark_context():
    os.environ['JAVA_HOME'] = 'C:/Java/jdk1.8.0_91'
    os.environ['HADOOP_HOME'] = 'C:/Java/hadoop-2.6.0-cdh5.7.6'
    os.environ['SPARK_HOME'] = 'C:/Java/spark-2.2.0-bin-2.6.0-cdh5.7.6'

    spark_conf = SparkConf()\
        .setAppName('Python_Spark_WordCount')\
        .setMaster('local[4]') \
        .set("spark.driver.extraJavaOptions", "-Xss4096k")

    spark_context = SparkContext(conf=spark_conf) # 获取SparkContext实例对象,
    spark_context.setLogLevel('WARN')             # 设置日志级别
    return spark_context

def prepare_data(spark_context):
    # ------------1.读取评分数据并解析 -------------
    raw_user_data = spark_context.textFile("../ml-100k/u.data")
    raw_ratings = raw_user_data.map(lambda line: line.split("\t")[:3])
    ratings_rdd = raw_ratings.map(lambda x: Rating(int(x[0]), int(x[1]), float(x[2])))

    # ------------2.数据初步统计 ----------------
    num_ratings = ratings_rdd.count()
    num_users = ratings_rdd.map(lambda x: x[0]).distinct().count()
    num_movies = ratings_rdd.map(lambda x: x[1]).distinct().count()
    print("总共: ratings: " + str(num_ratings) + ", User: " + str(num_users) + ", Moive: " + str(num_movies))
    return ratings_rdd

def save_mode(spark_context,model):
    try:
        model.save(spark_context, "../datas/als-model")
    except Exception:
        print ("保存模型出错") 
        
if __name__ =="__main__":
    sc = create_spark_context()

    print("==================数据准备阶段===================")
    rating_rdd = prepare_data(sc)
    print("==================模型训练阶段===================")
    #开始使用ALS算法:rank=5",iterations = 5, lambda = 0.1
    als_model = ALS.train(rating_rdd,5,iterations=5,lambda_=0.1)
    print( als_model)
    print("==================模型保存阶段===================")
    save_mode(sc,als_model)
    sc.stop()
二、加载模型—预测
from pyspark import SparkContext, SparkConf
from pyspark.mllib.recommendation import MatrixFactorizationModel
import os
import sys

def create_spark_context():
    os.environ['JAVA_HOME'] = 'C:/Java/jdk1.8.0_91'
    os.environ['HADOOP_HOME'] = 'C:/Java/hadoop-2.6.0-cdh5.7.6'
    os.environ['SPARK_HOME'] = 'C:/Java/spark-2.2.0-bin-2.6.0-cdh5.7.6'
    spark_conf = SparkConf()\
        .setAppName('Python_Spark_WordCount')\
        .setMaster('local[4]') \
        .set("spark.driver.extraJavaOptions", "-Xss4096k")

    spark_context = SparkContext(conf=spark_conf) # 获取SparkContext实例对象,
    spark_context.setLogLevel('WARN')             # 设置日志级别
    return spark_context

def prepare_data(spark_context):
    item_rdd = sc.textFile("../ml-100k/u.item")   # 读取 u.item 电影信息数据
    movie_title = item_rdd \                      # 创建 电影名称 与 电影ID  映射的字典
        .map(lambda line: line.split("|")) \
        .map(lambda a: (float(a[0]), a[1]))

    movie_title_dict = movie_title.collectAsMap() # 将RDD转换字典
    return movie_title_dict

def load_model(spark_context):                    # 加载模型
    try:
        model = MatrixFactorizationModel.load(spark_context, '../datas/als-model')
        print (model)
        return model
    except Exception:
            print ("加载模型出错")

if __name__ =="__main__": 
    # 运行前点击 pycharm 菜单栏 run->Edit configuration->Script parameters 输入: --U 198(随意user_id)
    if len(sys.argv)!=3:
        print("请输入两个参数:--U user_id,--M movie_id")

def recommend_movies(als, movies, user_id):
    rmd_movies = als.recommendProducts(user_id, 10)
    print('推荐的电影为:{}'.format(rmd_movies))
    for rmd in rmd_movies:
        print("为用户{}推荐的电影为:{}".format(rmd[0], movies[rmd[1]]))
    return rmd_movies

def recommend_users(als, movies, movie_id):      # 为每个电影推荐10个用户
    rmd_users = als.recommendUsers(movie_id, 10)
    print('针对电影ID:{0},电影名:{1},推荐是个用户为:'.format(movie_id, movies[movie_id]))
    for rmd in rmd_users:
        print("推荐用户ID:{},推荐评分:{}".format(rmd[0], rmd[2]))


def recommend(als_model, movie_dic):
    if sys.argv[1] == '--U':                     # 推荐电影给用户
        recommend_movies(als_model, movie_dic, int(sys.argv[2]))
    if sys.argv[1] == '--M':                     # 推荐用户给电影
        recommend_users(als_model, movie_dic, int(sys.argv[2]))

if __name__ == "__main__":
    """
    1.数据准备
    2.加载模型
    3.预测推荐
    """
    # 由于推荐的方式有两种,一个是依据用户的推荐,一个是基于商品的推荐
    if len(sys.argv) != 3:
        print("请输入2个参数, 要么是: --U user_id,  要么是: --M movie_id")
        exit(-1)
    sc = create_spark_context()

    # 数据准备,就是加载电影数据信息,转换字典
    print('============= 数据准备 =============')
    movie_title_dic = prepare_data(sc)
    print('============= 加载模型 =============')
    als_load_model = load_model(sc)
    print('============= 预测推荐 =============')
    recommend(als_load_model, movie_title_dic)
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我可以为您提供使用ALS算法对csv文件进行推荐模型训练的代码示例。请注意,这是一个基本的示例,您需要根据自己的数据和需求进行修改和优化。 首先,您需要导入必要的库,包括pyspark和pandas: ```python from pyspark.sql import SparkSession from pyspark.ml.recommendation import ALS from pyspark.ml.evaluation import RegressionEvaluator import pandas as pd ``` 接下来,您需要使用SparkSession创建一个Spark应用程序: ```python spark = SparkSession.builder.appName("MovieRecommendation").getOrCreate() ``` 然后,您需要加载您的csv文件并将其转换为Spark DataFrame: ```python data = spark.read.csv("path/to/your/file.csv", header=True, inferSchema=True) ``` 接下来,您需要将DataFrame拆分为训练集和测试集: ```python (training, test) = data.randomSplit([0.8, 0.2]) ``` 然后,您可以使用ALS算法创建推荐模型: ```python als = ALS(maxIter=5, regParam=0.01, userCol="user_id", itemCol="item_id", ratingCol="rating", coldStartStrategy="drop") model = als.fit(training) ``` 在创建模型后,您可以使用测试集评估模型的性能: ```python predictions = model.transform(test) evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", predictionCol="prediction") rmse = evaluator.evaluate(predictions) print("Root-mean-square error = " + str(rmse)) ``` 最后,您可以使用模型进行预测并获得推荐结果: ```python userRecs = model.recommendForAllUsers(10) userRecs_df = userRecs.toPandas() ``` 这是一个基本的示例,您可以根据自己的数据和需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongpingWang

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值