推荐系统笔记(二):常用数据集Movielens学习

article/2025/10/12 17:29:36

介绍

        movielens数据集是电影推荐数据集,数据集有多种大小和目的使用的数据集。按照使用目的可以分为两类,一类数据集适用于推进最新研究的数据,一类数据集是用于高校研究和教育科研使用的数据集。本次介绍三个数据集的使用和处理。

数据集下载链接:MovieLens | GroupLens

数据集

        每个数据集都有readme.txt文件介绍,每列数据的用途和含义。

1.  MovieLens Latest Datasets数据集

该数据集包含的文件如下:

        其中的links包含的是不同的url对电影的标签,这在readme.txt文件里有所介绍。movies.csv文件里包含的是电影标签、标题和电影类型,rating则包含的是用户对电影的评分,数据是整数,tags是用户对电影的评价。

2.MovieLens 1M Dataset数据集

该数据集包含的数据文件如下:

         movies.dat文件里包含的是电影标签、标题和电影类型,rating则包含的是用户对电影的评分,数据是整数,还包含的评论的时间戳。user.dat包含的是对用户信息的保存,包括以下内容:

      即包含了ID、年龄、性别、职业等,其中年龄是按照年龄段区分的。 

 3.MovieLens 100k Dataset数据集

        100k数据集有点不同,其用户属性是单独一个文件。另外还有u1到u5五份数据(五折交叉验证,已经给分好了)。该数据集包括了943位用户对1682部电影的评分信息(总共100,000),评分也是1-5的整数

数据集结构如下:

        u.data文件包含了100,000条评分信息,每条记录的形式:user id | item id | rating | timestamp.(分隔符是一个tab),u1.base和u1.test是一组训练集和测试集,u1到u5是把u.data分成了5份(用于五折交叉验证实验)。可以通过运行mku.sh重新生成一组u1到u5(原来的会被覆盖), ua和ub是把u.data分成了两份。每一份又分成了训练集和测试集。同样可以通过mku.sh重新生成一组ua和ub,mku.sh文件, 每运行一次,就会随机生成一组u1--u5、ua、ub的数据集。(所以非必要不要用,不然每次实验的数据都不一样)

处理代码

        对100k数据集的处理代码如下,分别对数据集进行了输出,对年龄段进行分类,对性别进行映射,对工作和职业进行了数字映射。

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = 'QiuZiXian'  http://blog.csdn.net/qqzhuimengren/   1467288927@qq.com
# @time          :2020/9/14  0:07
# @abstract    :import pandas as pd# 粗略查看数据信息
u_data = pd.read_csv('D:/d/python/ml-100k/u.data')
u_genre = pd.read_csv('D:/d/python/ml-100k/u.genre')
u_info = pd.read_csv('D:/d/python/ml-100k/u.info')
#u_item = pd.read_csv('D:/d/python/ml-100k/u.item')
u_occupation = pd.read_csv('D:/d/python/ml-100k/u.occupation')
u_user = pd.read_csv('D:/d/python/ml-100k/u.user')print(u_data.head())
print(u_user.head())# 去掉occupation为none的记录
nones = u_user[u_user['occupation'] == 'none']
u_user = u_user.drop(nones.index)# gender中的m、f映射成0、 1
u_user['gender'] = u_user['gender'].map({'M':1, 'F':0})
print(u_user.head())# 对age进行分段,映射成7组
def age_map(age):if age >= 1 and age <= 7: return 1if age >= 8 and age <=16: return 2if age >=17 and age <= 29: return 3if age >= 30 and age <= 39: return 4if age >= 40 and age <= 49: return 5if age >= 50 and age <= 59: return 6if age >= 60: return 7u_user['age'] = u_user['age'].apply(lambda age : age_map(age))
print(u_user.head())#  occupation字段数值化
def occupations_map(occupation):occupations_dict = {'technician': 1,'other': 0,'writer': 2,'executive': 3,'administrator': 4,'student': 5,'lawyer': 6,'educator': 7,'scientist': 8,'entertainment': 9,'programmer': 10,'librarian': 11,'homemaker': 12,'artist': 13,'engineer': 14,'marketing': 15,'none': 16,'healthcare': 17,'retired': 18,'salesman': 19,'doctor': 20}return occupations_dict[occupation]
u_user['occupation'] = u_user['occupation'].apply(lambda occupation : occupations_map(occupation))
print(u_user.head())
#  zip_code提取前3位
u_user['zip_code'] = u_user['zip_code'].apply(lambda zip_code : str(zip_code)[:3])
# 处理好的数据保存,留待后续直接使用

        对MovieLens Latest Datasets数据集,即最新的小数据集提取出用户的点击关系的代码如下:

import pandas as pd
import numpy as npdf = pd.read_csv('ratings.csv')
users=set(df['userId'].tolist())
movies=set(df['movieId'].tolist())
print("一共有{}条数据 {}个用户 {}部电影".format(len(df),len(users),len(movies)))
print("评分在0~1之间有{}条数据".format(len(df.loc[(df['rating']>=0.0)&(df['rating']<=1.0)])))
print("评分在1~2之间有{}条数据".format(len(df.loc[(df['rating']>1.0)&(df['rating']<=2.0)])))
print("评分在2~3之间有{}条数据".format(len(df.loc[(df['rating']>2.0)&(df['rating']<=3.0)])))
print("评分在3~4之间有{}条数据".format(len(df.loc[(df['rating']>3.0)&(df['rating']<=4.0)])))
print("评分在4~5之间有{}条数据".format(len(df.loc[(df['rating']>4.0)&(df['rating']<=5.0)])))with open("train.txt", "w") as f1:with open("test.txt", "w") as f2:for i in range(0,len(users),1):temp_list=df.loc[df['userId']==i+1]temp_list=temp_list.sample(frac=1,random_state=2022)train_list=pd.concat(np.array_split(temp_list,10)[0:8],axis=0).sort_values(by='rating',ascending=False)test_list=pd.concat(np.array_split(temp_list,10)[8:],axis=0).sort_values(by='rating',ascending=False)train=train_list['movieId'].tolist()test=test_list['movieId'].tolist()f1.write(str(i)+' '+(str(train).replace('[','').replace(']','')).replace("'",'').replace(',','') +'\n')f2.write(str(i)+' '+(str(test).replace('[','').replace(']','')).replace("'",'').replace(',','') +'\n')f2.close()
f1.close()

        数据集中的电影的ID并非连续,如果要转化为连续的电影ID需要经过以下处理:

import pandas as pd
import numpy as npdf = pd.read_csv('ratings.csv')
users=set(df['userId'].tolist())
movies=set(df['movieId'].tolist())
print("一共有{}条数据 {}个用户 {}部电影".format(len(df),len(users),len(movies)))
print("评分在0~1之间有{}条数据".format(len(df.loc[(df['rating']>=0.0)&(df['rating']<=1.0)])))
print("评分在1~2之间有{}条数据".format(len(df.loc[(df['rating']>1.0)&(df['rating']<=2.0)])))
print("评分在2~3之间有{}条数据".format(len(df.loc[(df['rating']>2.0)&(df['rating']<=3.0)])))
print("评分在3~4之间有{}条数据".format(len(df.loc[(df['rating']>3.0)&(df['rating']<=4.0)])))
print("评分在4~5之间有{}条数据".format(len(df.loc[(df['rating']>4.0)&(df['rating']<=5.0)])))df.sort_values("movieId", inplace=True)
pointer=0
movies=sorted(movies)
for i in movies:df.loc[df['movieId'] == i,'movieId']=pointerpointer+=1with open("train.txt", "w") as f1:with open("test.txt", "w") as f2:for i in range(0,len(users),1):temp_list=df.loc[df['userId']==i+1]temp_list=temp_list.sample(frac=1,random_state=2022)train_list=pd.concat(np.array_split(temp_list,10)[0:8],axis=0).sort_values(by='rating',ascending=False)test_list=pd.concat(np.array_split(temp_list,10)[8:],axis=0).sort_values(by='rating',ascending=False)train=train_list['movieId'].tolist()test=test_list['movieId'].tolist()f1.write(str(i)+' '+(str(train).replace('[','').replace(']','')).replace("'",'').replace(',','') +'\n')f2.write(str(i)+' '+(str(test).replace('[','').replace(']','')).replace("'",'').replace(',','') +'\n')f2.close()
f1.close()

 参考链接:movielens数据集介绍及使用python简单处理_PythonJavaC++go的博客-CSDN博客_movielens数据处理


http://chatgpt.dhexx.cn/article/hWBa1X4G.shtml

相关文章

java读取movielens数据txt

各位好&#xff0c;我是菜鸟小明哥&#xff0c;movielens数据是常见的推荐方面的开源数据集&#xff0c;另一个推荐方面的数据集是新闻MIND&#xff0c;本文将从movielens再次出发&#xff0c;做基础的推荐方法&#xff0c;比如基本的基于标题的相似性&#xff0c;word2vector&…

推荐系统数据集之MovieLens

1.概述 MovieLens其实是一个推荐系统和虚拟社区网站&#xff0c;它由美国 Minnesota 大学计算机科学与工程学院的GroupLens项目组创办&#xff0c;是一个非商业性质的、以研究为目的的实验性站点。GroupLens研究组根据MovieLens网站提供的数据制作了MovieLens数据集合&#xff…

【工具】Movielens数据集详细介绍

MovieLens数据集 MovieLens数据集包含多个用户对多部电影的评级数据&#xff0c;也包括电影元数据信息和用户属性信息。 下载地址 http://files.grouplens.org/datasets/movielens/ 介绍 下面以ml-100k数据集为例进行介绍&#xff1a; 最主要用的是u.data(评分) | u.item…

movielens数据集简述

一、movielens数据集 ratings数据: 文件里面的内容包含了每一个用户对于每一部电影的评分。数据格式如下: userId, movieId, rating, timestamp userId: 每个用户的id movieId: 每部电影的id rating: 用户评分,是5星制,按半颗星的规模递增(0.5 stars - 5 stars) timestam…

Movielens数据集详细介绍

MovieLens数据集包含多个用户对多部电影的评级数据&#xff0c;也包括电影元数据信息和用户属性信息。下载地址为&#xff1a;http://files.grouplens.org/datasets/movielens/ 下面以ml-100k数据集为例进行介绍&#xff1a; 最主要用的是u.data(评分) | u.item(电影信息) …

movielens数据集介绍及使用python简单处理

0 前言 个性化推荐中&#xff0c;电影推荐研究时常使用movielens上的数据集。该网站的数据集主要分两部分&#xff0c; 一是用于推进最新研究进展的数据集。当前最新的是发布于2019年12月份的25M数据集。 二是用于高校、组织科研的数据集。该类数据集按其是否带有标签、时间…

mui用ajax上拉加载更多,mui上拉加载更多下拉刷新数据的封装过程

辗转用mui做了两个项目&#xff0c;空下来把mui上拉加载更多&#xff0c;下拉刷新数据做了一个简单的封装&#xff0c;希望可以帮助到需要的朋友 demo项目的结构 直接贴代码了 index.html mui上拉刷新下拉加载都这里了&#xff0c;两个方法搞定mui上拉刷新下拉加载demo--封装 l…

如何实现上拉加载和下拉刷新

下拉刷新和上拉加载这两种交互⽅式通常出现在移动端中 本质上等同于PC⽹⻚中的分⻚&#xff0c;只是交互形式不同 开源社区也有很多优秀的解决⽅案&#xff0c;如 iscroll 、 better-scroll 、 pulltorefresh.js 库等等 这些第三⽅库使⽤起来⾮常便捷 我们通过原⽣的⽅式实现…

ComposeUI——下拉刷新+上拉加载(一、简单封装)

前言&#xff1a;ComposeUI是将来开发的趋势&#xff0c;本人也在对它进行学习&#xff0c;会把踩过的坑一一记录下来&#xff0c;希望能对大家有帮助。话不多说&#xff0c;直接开干。 目录 下拉刷新 1、引入依赖库 2、使用方法 上拉加载 1、先看用法&#xff08;结合下…

Flutter 下拉刷新、上拉加载

Flutter 下拉刷新、上拉加载有很多第三方插件&#xff0c;本文使用插件为&#xff1a;pull_to_refresh 目前pull_to_refresh在pub.dev上的使用情况&#xff1a; 刷新header的类型: ClassicHeader const ClassicHeader({Key? key,RefreshStyle refreshStyle: RefreshStyle.…

BaseQuickAdapter上拉加载功能实现

最近使用BaseQuickAdapter进行RecyclerView 的Adapter的数据绑定显示。 实现上拉加载与下拉刷新功能&#xff0c;遇到如下问题&#xff1a; 1、首先是实现下拉刷新、下拉加载的监听&#xff08;xml布局就不贴出来了&#xff09;&#xff1a; 2、现在贴出来错误的处理方式&…

android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多

纵观多数App&#xff0c;下拉刷新和上拉加载更多是很常见的功能&#xff0c;但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新&#xff0c;上拉加载更多还要自己做。 基于RecyclerView简单封装了这两个操作&#xff0c;下拉刷新支持LinearLayoutManager、GridLayoutManager…

uniapp下拉刷新上拉加载

一、需求 留言板主页&#xff0c;显示所有的留言信息&#xff0c;带有分页功能&#xff1b;上拉加载数据&#xff0c;下拉刷新数据二、代码 1、pages.json 2、messageBoard.vue 用了 uniapp 提供的组件&#xff1a; uni-load-more.vue <uni-load-more :status"load…

jquery 实现上拉加载功能

emmmm&#xff0c;看到了以前自己的写的代码&#xff0c;用jquery实现的上拉加载&#xff0c;顺便修复了以前漏下的bug&#xff0c;感觉可以记录一波。 好的先上图&#xff0c; 好的首先关注console控制台&#xff0c;再来就是右图的内容&#xff0c;页面上初始仅有两个div 接…

微信小程序下拉刷新、上拉加载

微信小程序官方没有给出具体的下拉刷新和上拉加载组件&#xff0c;我们可以基于小程序原生组件scroll-view的扩展与封装,实现简单的上拉加载、下拉刷新组件。 1. 封装组件 // components/customPullDown/index.js Component({options: {multipleSlots: true},properties: {ch…

uniapp局部上拉加载数据

一、页面局部实现上拉加载数据 只有评论区可以上拉加载数据&#xff0c;网上找到了 vue-infinite-scroll二、使用 官方示例 1、 npm 加载依赖 npm install vue-infinite-scroll --save2、 单个页面引用 import infiniteScroll from vue-infinite-scrollexport default {dire…

【Compose】亲手封装一个简单灵活的下拉刷新上拉加载 Compose Layout

Compose 的下拉刷新有现成的 Material 库可以直接使用&#xff0c;非常简单方便。 但是上拉加载目前没看到有封装的特别好的库&#xff0c;Paging 有些场景无法满足&#xff0c;而且上拉加载也是个比较简单的功能&#xff0c;没必要再去依赖一个质量未知的库。我们可以基于目前…

如何实现上拉加载,下拉刷新?

如何实现上拉加载下拉刷新&#xff1f; 实现原理上拉加载下拉刷新 实现原理 上拉加载及下拉刷新都依赖于用户交互 最重要的是要理解在什么场景&#xff0c;什么时机下触发交互动作 上拉加载 首先可以看一张图 上拉加载的本质是页面触底&#xff0c;或者快要触底时的动作 判…

【前端知识之JS】如何实现上拉加载和下拉刷新

前言 本系列主要整理前端面试中需要掌握的知识点。本节介绍如何实现上拉加载和下拉刷新。 文章目录 前言一、介绍二、实现原理1、上拉加载2、下拉刷新 一、介绍 下拉刷新和上拉加载这两种交互方式通常出现在移动端中&#xff1b;本质上等同于PC网页中的分页&#xff0c;只是交…

大数据和人工智能到底是什么关系

大数据和人工智能的关系&#xff0c;首先要说什么是大数据。这些年来&#xff0c;大数据先是被神化&#xff0c;继而又被妖魔化&#xff0c;到了今天&#xff0c;其实谁也不知道别人所谓的大数据指的是什么。有时候大数据的定义里既有平台&#xff08;硬件&#xff09;又有分析…