推荐系统常用数据集

本文介绍了MovieLens数据集的构成,包括ratings.dat中用户对电影的评分记录,movies.dat中的电影信息,以及user.dat中的用户年龄数据。通过读取和分析数据,展示了评分分布、电影类型统计和用户年龄分布的图表,为电影推荐系统的研究提供了基础数据洞察。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MovieLens数据集


下载地址:https://grouplens.org/datasets/movielens

(ml-lm为例):

下载并解压ml-lm.zip,其中包含四个文件:README、ratings.dat、movies.dat、user.dat

  1. README

该文件是对数据集的整体介绍。该文件内容表明,该数据集包含了6040个用户对3900部电影的1000209条评分记录。关于每个文件的内容和格式可以参考或阅读下面的内容。

     2. ratings.dat

# 该文件的内容使用户对电影的评分记录,包含了1000209条数据,数据格式如下
1::1193::5::978300760 

该条记录对应指代的是:UserID::MovieID::Rating::Timestamp,传达的内容为:ID为1的用户在时间戳为978300760时对ID为1193的这部电影打了5分。

UserID:1~6040、MovieID:1~3952、ratings:1~5、时间戳以秒为单位 

"""
    评分记录数据查看
"""

import pandas as pd
import matplotlib.pyplot as plt

# 用来正常显示中文标签
plt.rcParams["font.sans-serif"]=["SimHei"]
# 用来正常显示负号
plt.rcParams["axes.unicode_minus"]=False

def getRatings(file_path):
    rates = pd.read_table(
        file_path,
        header=None,
        sep="::",
        names=["userID","movieID","rate","timestamp"]
    )
    print("userID的范围为:<{},{}>"
          .format(min(rates["userID"]),max(rates["userID"])))
    print("movieID的范围为:<{},{}>"
          .format(min(rates["movieID"]),max(rates["movieID"])))
    print("评分值的范围为:<{},{}>"
          .format(min(rates["rate"]),max(rates["rate"])))
    print("数据总条数为:\n{}".format(rates.count()))
    print("数据前5条记录为:\n{}".format(rates.head(5)))
    df = rates["userID"].groupby(rates["userID"])
    print("用户评分记录最少条数为:{}".format(df.count().min()))

    scores = rates["rate"].groupby(rates["rate"]).count()
    # 图上添加数字
    for x,y in zip(scores.keys(),scores.values):
        plt.text(x,y+2,"%.0f"%y,ha="center",va="bottom",fontsize=12)
    plt.bar(scores.keys(),scores.values,fc="r",tick_label=scores.keys())
    plt.xlabel("评分分数")
    plt.ylabel("对应的人数")
    plt.title("评分分数对应人数统计")
    plt.show()

if __name__ == "__main__":
    getRatings("../data/ml-1m/ratings.dat")
"""
    电影信息数据查看
"""
def getMovies(file_path):
    movies = pd.read_table(
        file_path,
        header=None,
        sep="::",
        names=["movieID","title","genres"]
    )

    print("movieID的范围为:<{},{}>"
          .format(min(movies["movieID"]),max(movies["movieID"])))
    print("数据总条数为:\n{}".format(movies.count()))
    moviesDict = dict()
    for line in movies["genres"].values:
        for one in line.split("|"):
            moviesDict.setdefault(one,0)
            moviesDict[one]+=1

    print("电影类型总数为:{}".format(len(moviesDict)))
    print("电影类型分别为:{}".format(moviesDict.keys()))
    print(moviesDict)

    newMD = sorted(moviesDict.items(),key=lambda x:x[1],reverse=True)
    # 设置标签
    labels=[newMD[i][0] for i in range (len(newMD))]
    values=[newMD[i][1] for i in range (len(newMD))]
    # 与labels对应,数值越大离中心区越远
    explode = [x * 0.01 for x in range(len(newMD))]
    # 设置x轴y轴比例
    plt.axes(aspect=1)
    #labeldisstance表示标签离中心距离,pctdistance表示百分百数据离中心区距离
    #autopct表示百分比格式,shadow表示阴影
    plt.pie(
        x=values,
        labels=labels,
        explode=explode,
        autopct="%3.1f %%",
        shadow=False,
        labeldistance=1.1,
        startangle=0,
        pctdistance=0.8,
        center=(-1,0),
    )
    #控制位置:在bbox_to_anchor数组中,前者控制左右移动,后者控制上下移动
    #ncol控制图例所列的列数,默认为1
    plt.legend(loc=7,bbox_to_anchor=(1.3,1.0),ncol=3,fancybox=True,shadow=True,fontsize=6)
    plt.show()
"""
    用户信息年龄数据查看    
"""

def getUsers(file_path):
    users = pd.read_table(
        file_path,
        header=None,
        sep="::",
        names=["userID","gender","age","Occupation","zip-code"],
    )
    print("userID的范围为:<{},{}>".format(min(users["userID"]),
                                      max(users["userID"])))
    print("数据总条数为:\n{}".format(users.count()))

    usersGender = users["gender"].groupby(users["gender"]).count()
    usersAge = users["age"].groupby(users["age"]).count()
    print(usersGender)
    print(usersAge)

    plt.axes(aspect=1)
    plt.pie(x=usersGender.values, labels=usersGender.keys(),
            autopct="%3.1f %%")
    plt.legend(bbox_to_anchor=(1.0,1.0))
    plt.show()

    plt.plot(
        usersAge.keys(),
        usersAge.values,
        label="用户年龄信息展示",
        linewidth=3,
        color="r",
        marker="o",
        markerfacecolor="blue",
        markersize=12,
    )
    # 图上添加数字
    for x,y in zip(usersAge.keys(),usersAge.values):
        plt.text(x,y+10,"%.0f" % y, ha="center", va="bottom",fontsize=12)
    plt.xlabel("用户年龄")
    plt.ylabel("年龄段对应的人数")
    plt.title("用户年龄段人数统计")
    plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值