python 处理 MovieLens 数据
文章目录
- 一、总述
- 二、处理流程
- 1. 处理 users 数据
- 2. 处理 movies 数据
- 3. 处理 ratings 数据
- 4. 将 users、movies 和 ratings 数据合并
- 5. one-hot 处理
- 6. 完整代码
一、总述
该文记录处理 MovieLens-1m 数据集的步骤,首先分别处理用户、电影和评分数据,接着将这三部分数据进行合并,最后 one-hot 处理。
二、处理流程
1. 处理 users 数据
users 数据描述:
用户文件有以下字段,分别是用户ID、性别、年龄、职业和邮编( UserID::Gender::Age::Occupation::Zip-code )
处理思路:
- 将用户性别 M、F 进行 label encoding 编码
- 将年龄 label encoding 编码
- 邮编取前3位
代码:
# 处理用户
users = pd.read_table('../../dataset/ml-1m/users.dat', sep='::', header=None, engine='python', encoding='utf-8').to_numpy()# 处理用户年龄和邮编
le = LabelEncoder()
users[:, 1] = le.fit_transform(users[:, 1]) # 将性别 label Encodingfor user in users: # 将年龄 Lable Encodingif user[2] == 1:user[2] = 0elif user[2] == 18:user[2] = 1 elif user[2] == 25:user[2] = 2elif user[2] == 35:user[2] = 3elif user[2] == 45:user[2] = 4elif user[2] == 50:user[2] = 5elif user[2] == 56:user[2] = 6user[4] = int(user[4][0:3]) - 1 # 取邮编的前3位user[0] -= 1 // 从 0 开始
users 处理结果:
2. 处理 movies 数据
movies 数据描述:
电影文件包含三个字段,分别是电影ID、电影名、电影类型( MovieID::Title::Genres )
处理思路:
将电影名称删除,电影类型在合并users、movies和ratings之后做 one-hot 处理。
代码:
# 处理电影
movies = pd.read_table('../../dataset/ml-1m/movies.dat', sep='::', header=None, engine='python', encoding='ISO-8859-1').to_numpy()
movies = np.delete(movies, 1, axis=1) # 删除电影名称列
movies[:, 0] -= 1
movies 处理结果:
3. 处理 ratings 数据
ratings 数据描述:
电影评分文件包含用户ID、电影ID、评分和时间戳( UserID::MovieID::Rating::Timestamp )
处理思路:
- 将时间戳字段删除
- 将评分大于3的作为正样本(记为1),评分小于等于3的作为负样本(记为0)
代码:
# 处理用户评分
ratings = pd.read_table('../../dataset/ml-1m/ratings.dat', sep='::', header=None, engine='python', encoding='utf-8').to_numpy()[:, :3]
ratings[:, 0:2] -= 1for i in range(len(ratings)):ratings[i][2] = 1 if ratings[i][2] > 3 else 0
4. 将 users、movies 和 ratings 数据合并
代码:
unames = ['userId', 'gender', 'age', 'occupation', 'zipCode']
mnames = ['movieId', 'genres']
rnames = ['userId', 'movieId', 'rating']users = pd.DataFrame(users, columns=unames)
movies = pd.DataFrame(movies, columns=mnames)
ratings = pd.DataFrame(ratings, columns=rnames)data = pd.merge(movies, ratings, on=['movieId'])
data = pd.merge(users, data, on=['userId'])
数据合并结果:
5. one-hot 处理
处理思路:
- 将电影类型单独手动 one-hot 处理
- 然后将 data 中的电影类型删除,再做 one-hot 处理
代码:
data = data.values // dataframe 转 numpy
y = data[:, 7]
x = np.delete(data, -1, axis=1) # 将评分列删除
typelist = x[:, -1]
x = np.delete(x, -1, axis=1) # 将电影类型列删除# 将电影类型 one-hot 编码
genres = [] # 电影类型 ont-hot 编码
genresDict = {'Action' : 0, 'Adventure' : 1, 'Animation' : 2, "Children's" : 3, 'Comedy' : 4, 'Crime' : 5, 'Documentary' : 6, 'Drama' : 7, 'Fantasy' : 8, 'Film-Noir' : 9, 'Horror' : 10, 'Musical' : 11, 'Mystery' : 12, 'Romance' : 13, 'Sci-Fi' : 14, 'Thriller' : 15, 'War' : 16, 'Western' : 17}
for types in typelist:strs = types.split('|')tmp = np.zeros(18)for str in strs:tmp[genresDict[str]] = 1genres.append(tmp)
genres = np.array(genres)# 将 userId, gender, age, occupation, zipCode, movieId one-hot 编码
encoder = OneHotEncoder(handle_unknown='ignore')
x = encoder.fit_transform(x).toarray()
x = np.concatenate((x, genres),axis=1)
x one-hot 结果:
y one-hot 结果:
6. 完整代码
import numpy as np
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder# 处理用户
users = pd.read_table('../../dataset/ml-1m/users.dat', sep='::', header=None, engine='python', encoding='utf-8').to_numpy()# 处理用户年龄和邮编
le = LabelEncoder()
users[:, 1] = le.fit_transform(users[:, 1]) # 将性别 label Encodingfor user in users: # 将年龄 Lable Encodingif user[2] == 1:user[2] = 0elif user[2] == 18:user[2] = 1 elif user[2] == 25:user[2] = 2elif user[2] == 35:user[2] = 3elif user[2] == 45:user[2] = 4elif user[2] == 50:user[2] = 5elif user[2] == 56:user[2] = 6user[4] = int(user[4][0:3]) - 1 # 取邮编的前3位user[0] -= 1# 处理电影
movies = pd.read_table('../../dataset/ml-1m/movies.dat', sep='::', header=None, engine='python', encoding='ISO-8859-1').to_numpy()
movies = np.delete(movies, 1, axis=1) # 删除电影名称列
movies[:, 0] -= 1# 处理用户评分
ratings = pd.read_table('../../dataset/ml-1m/ratings.dat', sep='::', header=None, engine='python', encoding='utf-8').to_numpy()[:, :3]
ratings[:, 0:2] -= 1for i in range(len(ratings)):ratings[i][2] = 1 if ratings[i][2] > 3 else 0unames = ['userId', 'gender', 'age', 'occupation', 'zipCode']
mnames = ['movieId', 'genres']
rnames = ['userId', 'movieId', 'rating']
users = pd.DataFrame(users, columns=unames)
movies = pd.DataFrame(movies, columns=mnames)
ratings = pd.DataFrame(ratings, columns=rnames)
data = pd.merge(movies, ratings, on=['movieId'])
data = pd.merge(users, data, on=['userId'])data = data.values
y = data[:, 7]
x = np.delete(data, -1, axis=1) # 将评分列删除
typelist = x[:, -1]
x = np.delete(x, -1, axis=1) # 将电影类型列删除# 将电影类型 one-hot 编码
genres = [] # 电影类型 one-hot 编码
genresDict = {'Action' : 0, 'Adventure' : 1, 'Animation' : 2, "Children's" : 3, 'Comedy' : 4, 'Crime' : 5, 'Documentary' : 6, 'Drama' : 7, 'Fantasy' : 8, 'Film-Noir' : 9, 'Horror' : 10, 'Musical' : 11, 'Mystery' : 12, 'Romance' : 13, 'Sci-Fi' : 14, 'Thriller' : 15, 'War' : 16, 'Western' : 17}
for types in typelist:strs = types.split('|')tmp = np.zeros(18)for str in strs:tmp[genresDict[str]] = 1genres.append(tmp)
genres = np.array(genres)# 将 userId, gender, age, occupation, zipCode, movieId one-hot 编码
encoder = OneHotEncoder(handle_unknown='ignore')
x = encoder.fit_transform(x).toarray()
x = np.concatenate((x, genres),axis=1)
python 处理 MovieLens 数据相关推荐
- 用Python计算MovieLens 100k数据集中男性女性用户评分的标准差
这是<用Python玩转数据>4.2的编程练习. 要求: 计算MovieLens 100k数据集中男性女性用户评分的标准差并输出. 数据集下载 其中u.data 表示100k条评分记录,每 ...
- grouplens上的movielens数据集_ItemCF算法的Python实现,数据基于MovieLens
数据从 MovieLens数据下载地址 https://grouplens.org/datasets/movielens/ 下载. 我选的是1MB版本,大约10W+评分,9K+电影,600+用户. 使 ...
- movielens数据集导入mysql_我来做数据--如何对数据进行处理以满足机器学习技术(一):MovieLens数据...
标签(空格分隔): 数据分析 python 数据挖掘 MovieLens 1M数据集 一组从20世纪90年末到21世纪初由MovieLens用户提供的电影评分数据.这些数据中包括电影评分.电影元数据( ...
- 为何python攀上数据科学巅峰?调查显示Python超越R
根据KDnuggets 2017年最新调查,Python生态系统已经超过了R,成为了数据分析.数据科学与机器学习的第一大语言.本文对KDnuggets的此项调查结果做了介绍,并补充了一篇文章讲解为何P ...
- 命名管道 win7未响应_大数据分析Python建立分析数据管道
如果您曾经想通过流数据或快速变化的数据在线学习Python,那么您可能会熟悉数据管道的概念.数据管道允许您通过一系列步骤将数据从一种表示形式转换为另一种表示形式.数据管道是数据工程的关键部分,我们将在 ...
- Python读CSV数据
Python读取CSV数据有两种: 1.按行读取csv(使用CSV库) 2.按列读取csv(使用Pandas库) 下面介绍第一种,逐行读取 1.按行读取csv(使用CSV库) 代码如下: import ...
- Python处理大数据
起因 Python处理一下数据,大概有六七个G,然后再存到另外一个文件中,单线程跑起来发现太慢了,数据总量大概是千万行的级别,然后每秒钟只能处理不到20行--遂想怎么提高一下速度 尝试1-multip ...
- Python之pandas数据加载、存储
Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...
- pythonppt教材_PPT、H5、Python、大数据……浙江中小学新教材9月投入使用!
今年9月的新学期,浙江三到九年级信息技术课将替换新教材.消息一出,引起浙江学生家长的关注. 其中最大的变化是,八年级将新增Python课程内容.新高一信息技术编程语言由VB替换为Python,大数据. ...
- 大学python选择题题库及答案_大学慕课用Python玩转数据题库及答案
大学慕课用Python玩转数据题库及答案 更多相关问题 (19分)电解原理在化学工业中有广泛应用.右图表示一个电解池,装有电解液c :A.B是两块电极板,通过导线与直流 用铂电极电解CuCl2与CuS ...
最新文章
- Aria2打造属于自己的下载神器
- 计算机前端专业术语,学习计算机知识必须懂得50个专业术语
- Android多线程死锁定位,Java---多线程之死锁
- PowerShell CLI 获取VM信息
- hdu3715 二分+2sat+建图
- MySQL 处理海量数据时的一些优化查询速度方法
- windows 弹shell_Windows系统常用免费软件“红黑榜”
- debian9 设置
- 理财经理们都想用AI,但客户们不想用 | 福布斯报告
- 在线添加索引遇到的错误:Table definition has changed, please retry transaction
- XMAPP多端口配置
- 养猫日记之如何获得一只喵
- oracle远程投毒漏洞复现,oracle TNS Listener远程投毒(CVE-2012-1675)漏洞分析、复现...
- js12---闭包,原型,继承
- oracle 分组first,Oracle分析函数:First_Value
- 台式电脑win7旗舰版 怎么调节屏幕亮度 显示器太亮了!
- 2019-10-16 博客热门文章
- Import Package
- fixed:error:0308010C:digital envelope routines::unsupported
- 使用模拟退火算法解决旅行家问题——C
热门文章
- [后端人员耍前端系列]KnockoutJs篇:快速掌握KnockoutJs
- android gps测速代码,【GPS测速仪】GPS测速仪 GPS speedometer 1.6.0下载_安卓(android)软件下载-魅族溜...
- pe擦除服务器硬盘,如何使用老毛桃winpe的分区助手安全擦除移动硬盘或本地硬盘数据?...
- cglib 动态代理原理详解
- GMM R语言程序 gmm包的使用
- 计算机是如何执行代码的?
- 高薪设计师必修课 AE移动UI动效设计从入门到实战
- 字体裁剪,精简字体,字体瘦身:FontSubsetGUI,FontCreator,FontPruner
- 在线去水印网站_一键去水印工具
- 微信小程序上传图片到云储存