SVD模型预测评分,及GridSearchCV调优

本文重点介绍评分和推荐等相关的算法与实现,使用数据是用户对笑话的打分情况,数据可从如下链接:评分预测-模型训练预测数据-机器学习文档类资源-CSDN下载

本文涉及知识点如下:

  • 使用Python的推荐库surprise库做相应的模型预测。
  • 使用SVD(奇异值分析算法)做相关评分预测
  • 使用网格搜索(GridSearchCV)进行进行模型调优
  • 模型的评估方法使用RMSE(root_mean_squared_error),常用与回归模型的评估。

1. 网格搜索(GridSearchCV)

        GridSearchCV是一个模型调参利器,其可拆分两部分,即网格搜索和交叉验证。网格搜索,即在指定的参数范围内,根据特定步长筛选可使模型效果最优的参数。交叉验证,即为降低偶然性,把数据集划分K份,一份做测试集,K-1份做训练集,训练K次最终取均值。

  1. 优点:自动调参,把参数列表输入则返回最优的参数组合,针对给定的参数列表返回的是全局最优组合。
  2. 缺点:该方法适合于小数据集,对于较大数据集和超参很难出结果。一般解决方法是选择较大的步长,确定全局最优的可能位置,然后在逐步缩小步长。

surprise.model_selection.search.GridSearchCV(algo_class, param_grid, measures=[u'rmse', u'mae'], cv=None, refit=False, return_train_measures=False, n_jobs=1, pre_dispatch=u'2*n_jobs', joblib_verbose=0)
algo_class: 分类器,如决策树,SVD等
param_grid: 参数列表,分类器遍历的参数
measures: 模型评估方法,默认['rmse', 'mae']

2. RMSE评估模型效果

RMSE, 均方根误差也即标准差,是均方误差的算术平方根。引入标准差的目的是解决均方误差的结果和实际数据的量纲不同问题,则RMSE的公式如下:

 3. 相关实现

导入相关包:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from surprise import Reader, Dataset, SVD
from surprise.model_selection import GridSearchCV
from surprise.model_selection import train_test_split
from surprise import accuracy

读取训练数据和测试数据

path = ''
train=pd.read_csv(path + "/train.csv")
jokes=pd.read_csv(path + "/jokes.csv")
test=pd.read_csv(path + "/test.csv")

输出数据
print(train.head())
print(jokes.head())
print(test.head())

输出变量的相关性

train.corr()

读取训练数据,划分为训练集和验证集

reader = Reader(rating_scale=(-10, 10))
train_data = Dataset.load_from_df(train[['user_id', 'joke_id', 'Rating']], reader)
train1, test1 = train_test_split(train_data, test_size=0.3)

通过网格搜索算法寻找最优参数

params = {'n_epochs': [10, 25, 50], 'lr_all': [0.001, 0.005, 0.01], 'reg_all': [0.1, 0.4, 0.08]}
gs_svd = GridSearchCV(SVD, params, measures = ['rmse'], cv = 2)
gs_svd.fit(train_data)

print(gs_svd.best_score['rmse']),print(gs_svd.best_params['rmse'])
最优参数:4.08555208717408 {'n_epochs': 25, 'lr_all': 0.001, 'reg_all': 0.1}

训练模型,预测测试集并输出测试集的评估效果。

svd = SVD(n_epochs=25, lr_all=0.001, reg_all=0.1, random_state=123)
svd.fit(train_data)

pred_test = svd.test(test_data)
accuracy.rmse(pred_test)

测试集的RMSE结果:4.07

下面可以使用该模型预测数据,并保存预测结果到目标目录。

data_pred =[(test.iloc[i,0],test.iloc[i,1],test.iloc[i,2],svd.predict(test.iloc[i,1],test.iloc[i,2]).est) for i in range(test.shape[0]) ]

df = pd.DataFrame(data_pred,columns=['id','user_id','joke_id','Rating'])
df.to_csv("data_pred.csv",index=False,header=df.columns)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lihonst

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

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

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

打赏作者

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

抵扣说明:

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

余额充值