Système de recommandation utilisant la décomposition matricielle [Apprentissage non supervisé avec python Chapitre 10]

Que faire dans cet article

** - Présentation d'un système de recommandation utilisant des jeux de données de films

introduction

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.

Données à traiter

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/

Qu'est-ce que la décomposition matricielle?

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. ** **

image.png

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.

Importer la bibliothèque

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")

Lecture et vérification des données

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. image.png

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)

Créer une matrice de notation

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()

Paramètres de base

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?

Prédiction par décomposition matricielle

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

image.png

** 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éé.

À la fin

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.

Article de référence

Factorisation matricielle, recommandations et moi https://qiita.com/michi_wkwk/items/52660778ad6a900965ee

Recommended Posts

Système de recommandation utilisant la décomposition matricielle [Apprentissage non supervisé avec python Chapitre 10]
Créer un système de recommandation avec python
Apprendre Python avec ChemTHEATER 03
"Orienté objet" appris avec python
Apprendre Python avec ChemTHEATER 05-1
Python: apprentissage non supervisé: principes de base
Mise en œuvre de la factorisation matricielle (python)
Apprendre Python avec ChemTHEATER 02
Apprendre Python avec ChemTHEATER 01
Créer un système de recommandation avec python
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
[S3] CRUD avec S3 utilisant Python [Python]
Utilisation de Quaternion avec Python ~ numpy-quaternion ~
[Python] Utilisation d'OpenCV avec Python (basique)
Apprentissage amélioré à partir de Python
Commencer avec l'apprentissage automatique Python
Traitement itératif Python appris avec ChemoInfomatics
Système de support de présentation avec Python3
Utiliser OpenCV avec Python @Mac
Python: apprentissage non supervisé: clustering non hiérarchique
Envoyer en utilisant Python avec Gmail
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 1
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 2
Enquête sur PYNQ - Faisons du Deep Learning avec FPGA en utilisant Python -
Compléter python avec emacs en utilisant company-jedi
Moyenne harmonique par Python (en utilisant SciPy)
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Représentation matricielle avec entrée standard Python
100 traitements de langage avec Python
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Apprentissage automatique par python (1) Classification générale
Entrée / sortie avec Python (mémo d'apprentissage Python ⑤)
100 traitements de langage avec Python (chapitre 3)
Factorisation matricielle non négative (NMF) avec scikit-learn
Expérience d'apprentissage Perceptron apprise avec Python
Notes sur l'utilisation de rstrip avec python.
Python: apprentissage non supervisé: analyse principale
Mémo d'apprentissage "Scraping & Machine Learning avec Python"
Lors de l'utilisation de MeCab avec python dans virtualenv
Précautions lors de l'utilisation de six avec Python 2.5
[Introduction à Python3 Day 21] Chapitre 10 Système (10.1 à 10.5)
Impressions de personnes ayant de l'expérience dans d'autres langues apprenant Python à l'aide de PyQ
Commerce système à partir de Python3: investissement à long terme
[Exemple d'amélioration de Python] Apprentissage de Python avec Codecademy
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Essayez une formule utilisant Σ avec python
[Python] Temps de traitement de la multiplication de la matrice avec NumPy
Amplifiez les images pour l'apprentissage automatique avec Python
Derrière le flyer: utiliser Docker avec Python
Utilisation de Python et MeCab avec Azure Databricks
Apprentissage automatique avec python (2) Analyse de régression simple
"Commerce du système à partir de Python3" lecture du mémo
Communication de socket en utilisant le serveur de socket avec python maintenant
Essayez d'utiliser Python avec Google Cloud Functions
100 traitements de langage avec Python (chapitre 2, partie 2)
Vérifiez les cours des actions avec Slackbot en utilisant Python
Travailler avec OpenStack à l'aide du SDK Python
Livre de fourmis avec python (Chapter3 édition intermédiaire ~)