** - Présentation d'un système de recommandation utilisant des jeux de données de films
La dernière fois, j'ai introduit la détection d'anomalies par l'encodeur automatique en utilisant l'apprentissage non supervisé. https://qiita.com/nakanakana12/items/f238b9760af2c62fa0e8
Cependant, ces méthodes n'identifient et ne peuvent pas générer de nouvelles données. Ensuite, je présenterai le modèle qui génère des données.
Ces modèles peuvent vouloir apprendre la distribution de probabilité de l'ensemble de données et faire des inférences par rapport à des données qu'ils n'ont jamais vues.
Livre de référence ["Apprendre sans enseignant par python"](url https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82 % 81% E3% 82% 8B% E6% 95% 99% E5% B8% AB% E3% 81% AA% E3% 81% 97% E5% AD% A6% E7% BF% 92-% E2% 80% 95% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 81% AE% E5% 8F% AF% E8% 83% BD% E6% 80% A7% E3% 82% 92% E5% BA% 83% E3% 81% 92% E3% 82% 8B% E3% 83% A9% E3% 83% 99% E3% 83% AB% E3% 81% AA% E3% 81% 97% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% AE% E5% 88% A9% E7% 94% A8-Ankur-Patel / dp / 4873119103) Le système de recommandation de a été donné à titre d'exemple. Dans cet article, je présenterai d'abord ** "Système de prédiction d'évaluation par décomposition matricielle" **, qui semble être une méthode largement utilisée.
Les données traitées sont un ensemble de données d'évaluation de film. Il s'appelle MovieLens 20M et compte environ 20 millions de cotes. Étant donné que le total des données pèse jusqu'à 200 Mo, nous traiterons ** 1 000 films et données hautement cotés uniquement pour 1 000 utilisateurs échantillonnés au hasard **. À ce moment, le nombre de notes sera de 90 000.
Cliquez ici pour les données traitées https://drive.google.com/file/d/1mXioVp1LiBQt1TJyE9IStCCpjijpb4SX/view?usp=sharing
Vous pouvez télécharger les données originales ici. https://grouplens.org/datasets/movielens/20m/
Dans le système de recommandation, une méthode appelée système de filtrage coopératif est souvent utilisée. Il s'agit d'un système qui formule des recommandations basées sur un comportement similaire des utilisateurs. netflix est célèbre.
Une méthode appelée ** système de co-filtrage ** est souvent utilisée. Il s'agit d'un système qui formule des recommandations basées sur un comportement similaire des utilisateurs. netflix est célèbre. Cependant, lors de l'utilisation d'un système de co-filtrage, il y a des problèmes tels que la nécessité d'une grande quantité de données et l'incapacité de prendre des similitudes entre des éléments de film similaires.
C'est là que la ** réduction de dimension par décomposition matricielle ** est utilisée.
Voici un aperçu très simple. Veuillez vous référer à l'article de référence pour le principe détaillé. Article de référence: Factorisation matricielle, recommandations et moi https://qiita.com/michi_wkwk/items/52660778ad6a900965ee
La décomposition matricielle extrait d'abord les facteurs latents de chaque utilisateur et de chaque film. Ce facteur latent signifie vectoriser les caractéristiques de chaque utilisateur.
Par exemple, si un utilisateur a évalué 1 000 films, cet utilisateur est représenté par une matrice de 1 000.
** Compressez bien cette matrice pour réduire les dimensions. Cela ressemble à ceci sur la figure. Dans la figure, il est compressé en k colonnes. ** **
En prédisant l'évaluation de chaque élément utilisateur à partir de ces données compressées, il est possible de faire des prédictions avec moins de données.
C'est toujours un ouvrage de référence.
python
'''Main'''
import numpy as np
import pandas as pd
import os, time, re
import pickle, gzip, datetime
from datetime import datetime
'''Data Viz'''
import matplotlib.pyplot as plt
import seaborn as sns
color = sns.color_palette()
import matplotlib as mpl
%matplotlib inline
'''Data Prep and Model Evaluation'''
from sklearn import preprocessing as pp
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import log_loss
from sklearn.metrics import precision_recall_curve, average_precision_score
from sklearn.metrics import roc_curve, auc, roc_auc_score, mean_squared_error
'''Algos'''
import lightgbm as lgb
'''TensorFlow and Keras'''
# import tensorflow as tf
# import tensorflow as tf
import keras
from keras import backend as K
from keras.models import Sequential, Model
from keras.layers import Activation, Dense, Dropout
from keras.layers import BatchNormalization, Input, Lambda
from keras.layers import Embedding, Flatten, dot
from keras import regularizers
from keras.losses import mse, binary_crossentropy
sns.set("talk")
python
ratingDFX3 = pd.read_pickle(DATA_DIR + "data/datasets/movielens_data/ratingReducedPickle.pkl")
#Vérifiez le contenu
n_users = ratingDFX3.userId.unique().shape[0]
n_movies = ratingDFX3.movieId.unique().shape[0]
n_ratings = len(ratingDFX3)
avg_ratings_per_user = n_ratings/n_users
print('Number of unique users: ', n_users)
print('Number of unique movies: ', n_movies)
print('Number of total ratings: ', n_ratings)
print('Average number of ratings per user: ', avg_ratings_per_user)
"""
Number of unique users: 1000
Number of unique movies: 1000
Number of total ratings: 90213
Average number of ratings per user: 90.213
"""
ratingDFX3.head()
Lorsque vous vérifiez le contenu, il sera affiché comme ceci. rating est la note, et newMovieID et newUserID sont les ID utilisés pour l'évaluation.
python
#Séparation des données d'entraînement et des données d'entraînement
X_train, X_test = train_test_split(ratingDFX3, test_size=0.10, \
shuffle=True, random_state=2018)
X_validation, X_test = train_test_split(X_test, test_size=0.50, \
shuffle=True, random_state=2018)
Tout d'abord, créez une matrice de movieID * userID. Étant donné que chaque utilisateur n'évalue qu'un petit nombre de films, la plupart d'entre eux ne contiennent aucune file d'attente. De plus, les données de vérification sont aplaties sur une seule ligne. Nous allons l'utiliser comme matrice pour l'évaluation.
python
#Créer une matrice de notation, généralement zéro matrice creuse
ratings_train = np.zeros((n_users,n_movies))
for row in X_train.itertuples():
ratings_train[row[6]-1,row[5]-1] = row[3]
ratings_train.shape
#(1000,1000)
#Matrice de notation des données de validation
ratings_validation = np.zeros((n_users, n_movies))
for row in X_validation.itertuples():
ratings_validation[row[6]-1, row[5]-1] = row[3]
#Aplatir les données de validation
actual_validation = ratings_validation[ratings_validation.nonzero()].flatten()
L'évaluation utilise l'erreur quadratique de la cote prévue et de la cote réelle. Comme base d'évaluation
** "Quelle est l'erreur lors de la prédiction de tout à 3,5?" **
Je pense que.
python
#Valeur prédite 3.Erreur quadratique lorsqu'elle est définie sur 5(MSE)Calculer par rapport à l'ensemble de validation
#Utilisez ceci comme base de référence
pred_validation = np.zeros((len(X_validation),1))
pred_validation[pred_validation==0] = 3.5
print("3.5 MSE:",mean_squared_error(pred_validation,actual_validation))
#3.5 MSE: 1.055420084238528
** Il est devenu 1.055. C'est la ligne de base une fois. ** **
Le système de recommandation par décomposition matricielle peut-il dépasser cela?
python
#Décomposition matricielle
#Réduire les dimensions des utilisateurs et des articles et compresser
n_latent_factors = 3 #Facteur latent, dans quelle dimension intégrer
#Créer une colonne utilisateur compressée par keras
user_input = Input(shape=[1], name="user")
user_embedding = Embedding(input_dim=n_users+1, output_dim=n_latent_factors,name="user_embedding")(user_input)
user_vec = Flatten(name="flatten_users")(user_embedding)
#Création d'une séquence de films compressée au keras
movie_input = Input(shape=[1], name='movie')
movie_embedding = Embedding(input_dim=n_movies + 1, \
output_dim=n_latent_factors,
name='movie_embedding')(movie_input)
movie_vec = Flatten(name='flatten_movies')(movie_embedding)
product = dot([movie_vec, user_vec], axes=1)
model = Model(inputs=[user_input, movie_input], outputs=product)
model.compile('adam', 'mean_squared_error')
history = model.fit(x=[X_train.newUserId, X_train.newMovieId], \
y=X_train.rating, epochs=30, \
validation_data=([X_validation.newUserId, \
X_validation.newMovieId], X_validation.rating), \
verbose=1)
Vérifiez le résultat calculé.
python
pd.Series(history.history['val_loss'][10:]).plot(logy=False)
plt.xlabel("Epoch")
plt.ylabel("Validation Error")
print('Minimum MSE: ', min(history.history['val_loss']))
#Minimum MSE: 0.7946764826774597
** Lors de l'utilisation de la décomposition matricielle, il est de 0,794, ce qui est plus petit que la ligne de base de 1,055. ** ** À partir de là, on peut voir que le système de prédiction d'évaluation par décomposition matricielle fonctionne bien.
En fait, si vous utilisez cela pour proposer un film que les utilisateurs d'évaluation n'ont pas encore évalué mais qui semble être très évalué, il semble qu'un système de recommandation puisse être créé.
Cette fois, j'ai introduit un système de prédiction d'évaluation par décomposition matricielle lorsque le thème est un système de recommandation de films.
Mais le vrai pouvoir de l'apprentissage non supervisé est
** "Modèle de génération non supervisé" **
C'est dedans. J'aimerais continuer à apprendre et me réunir jusqu'à ce point.
Factorisation matricielle, recommandations et moi https://qiita.com/michi_wkwk/items/52660778ad6a900965ee
Recommended Posts