使用在 https://grouplens.org/datasets/movielens/ 上下载的MovieLens 数据集,并将使用以下文件:ratings.csv:包含用户对电影的评分,movies.csv:包含电影的详细信息 生成一个朴素贝叶斯方法的分类基于电影类型来预测用户可能喜欢的电影,并划分出训练集和测试集,输出f1值,auc值和roc曲线
时间: 2024-01-24 20:20:34 浏览: 147
好的,这是一个比较完整的数据分析任务,我们需要按照以下步骤进行:
1. 数据预处理
2. 特征工程
3. 模型训练与评估
我们先来看一下数据预处理。
# 1. 数据预处理
首先,我们需要将数据集读入,并做一些基本的预处理,例如数据清洗、缺失值处理等。
import pandas as pd
import numpy as np
# 读取数据集
ratings = pd.read_csv('ratings.csv')
movies = pd.read_csv('movies.csv')
# 将电影类型转换为二进制特征
genres = ["Action", "Adventure", "Animation", "Children", "Comedy", "Crime", "Documentary",
"Drama", "Fantasy", "Film-Noir", "Horror", "Musical", "Mystery", "Romance", "Sci-Fi",
"Thriller", "War", "Western"]
for genre in genres:
movies[genre] = movies['genres'].apply(lambda x: int(genre in x.split('|')))
movies = movies.drop('genres', axis=1)
# 将电影ID转换为连续的整数
id2movie = dict(enumerate(list(movies['title'])))
movie2id = {v: k for k, v in id2movie.items()}
ratings['movieId'] = ratings['movieId'].apply(lambda x: movie2id[movies[movies['movieId'] == x]['title'].values[0]])
# 将用户ID转换为连续的整数
user2id = dict(enumerate(list(set(ratings['userId']))))
id2user = {v: k for k, v in user2id.items()}
ratings['userId'] = ratings['userId'].apply(lambda x: user2id[x])
# 划分训练集和测试集
np.random.seed(123)
msk = np.random.rand(len(ratings)) < 0.8
train = ratings[msk].reset_index(drop=True)
test = ratings[~msk].reset_index(drop=True)
# 查看数据集大小
print(train.shape, test.shape)
# 输出示例数据
print(train.head())
print(test.head())
以上代码将电影类型转换为二进制特征,并将电影ID和用户ID转换为连续的整数。然后我们将数据集随机拆分为训练集和测试集,比例为8:2。
接下来是特征工程。
# 2. 特征工程
我们将使用朴素贝叶斯方法来预测用户是否喜欢某个电影,因此需要将电影的类型作为特征。我们还可以使用其他一些特征,例如电影的平均评分和用户的平均评分。
# 计算每个电影的平均评分
movie_mean_rating = train.groupby('movieId').agg({'rating': 'mean'}).rename(columns={'rating': 'movie_mean_rating'})
# 计算每个用户的平均评分
user_mean_rating = train.groupby('userId').agg({'rating': 'mean'}).rename(columns={'rating': 'user_mean_rating'})
# 将平均评分添加到训练集和测试集中
train = pd.merge(train, movie_mean_rating, on='movieId', how='left')
train = pd.merge(train, user_mean_rating, on='userId', how='left')
test = pd.merge(test, movie_mean_rating, on='movieId', how='left')
test = pd.merge(test, user_mean_rating, on='userId', how='left')
# 将电影类型作为特征
X_train = pd.merge(train, movies.drop('title', axis=1), on='movieId', how='left').drop(['rating', 'timestamp'], axis=1)
X_test = pd.merge(test, movies.drop('title', axis=1), on='movieId', how='left').drop(['rating', 'timestamp'], axis=1)
# 将用户是否喜欢电影作为标签
y_train = (train['rating'] >= 4).astype(int)
y_test = (test['rating'] >= 4).astype(int)
以上代码计算了每个电影和每个用户的平均评分,并将其作为特征添加到训练集和测试集中。然后将电影类型作为特征,并将用户是否喜欢电影作为标签。
接下来是模型训练与评估。
# 3. 模型训练与评估
我们将使用朴素贝叶斯方法来预测用户是否喜欢某个电影。
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import f1_score, roc_auc_score, roc_curve
# 训练模型
clf = GaussianNB()
clf.fit(X_train, y_train)
# 预测结果
y_pred = clf.predict(X_test)
# 计算f1值和auc值
f1 = f1_score(y_test, y_pred)
auc = roc_auc_score(y_test, y_pred)
# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred)
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
print('f1 score:', f1)
print('auc:', auc)
以上代码使用GaussianNB模型训练,并预测测试集结果。然后计算f1值和auc值,并绘制ROC曲线。
最后,我们可以输出f1值和auc值,并查看ROC曲线。
完整的代码如下:
阅读全文