Créer un système de recommandation avec python

Aperçu

J'ai décidé de faire un système de recommandation chez Hackason, alors prenez-en note comme mémorandum.

Créez un système qui recommande des collations qui correspondent à votre saké. Je voulais en faire un modèle d'apprentissage automatique, mais j'ai décidé d'utiliser le filtrage coopératif car je n'avais pas assez de connaissances et de temps.

référence

Créer un système de recommandation avec Python (filtrage coopératif basé sur l'utilisateur) Notes pour la mise en œuvre d'un co-filtrage simple en Python Construction d'un système de recommandation utilisant le filtrage coopératif

Filtrage coopératif

En un mot, co-filtrage (système de recommandation) ** "Recommandé pour vous" "Les personnes qui ont acheté ce produit ont également acheté ce produit" ** C'est tout. Vous connaissez amazon et youtube.

Il est grossièrement divisé en deux méthodes, la base d'utilisateurs et la base d'articles (produits). Estimations du filtrage par emphase basé sur l'utilisateur ** notes d'utilisateurs cibles (inconnues) ** à partir de ** notes connues d'autres utilisateurs **.

Crosstab, distance euclidienne, coefficient de corrélation de Pearson,

Comment calculer la similitude

La similitude est définie comme ** «une évaluation élevée (faible) du même produit présente une similitude élevée» **. Calculer la similitude en utilisant la valeur d'évaluation pour le produit de chaque utilisateur

・ Plus la distance est similaire, plus la valeur de la distance euclidienne est petite. ・ Prenez le nombre inverse pour que les similaires obtiennent des scores plus élevés ・ Si la similitude est maximale, la distance euclidienne est de 0, alors ajoutez 1

score= \frac{1}{(1+Distance euclidienne)}

・ Le score renvoie une valeur de 0 à 1, et plus le score est élevé, plus la similitude est élevée.

Pour une explication détaillée, voir Co-filtrage basé sur l'utilisateur dans Création d'un système de recommandation à l'aide du co-filtrage.

Flux de mise en œuvre

** (1) Extraire les personnes avec une cote d'alcool cible de 5 à partir des données Excel (exemples de données de collation) (2) Obtenir la similitude entre l'évaluation de la collation cible (seulement les parties connues) et les données de l'échantillon de collation. ③ Prédire la valeur d'évaluation de la collation cible inconnue à partir de la similitude **

Préparation des données

Les données utilisées ici sont l'évaluation du saké et l'évaluation des collations de 1 à 5. Puisqu'il est en phase de test, nous n'avons préparé que quatre données. image.png

Les données des utilisateurs inconnus sont définies comme suit. Recherchez la valeur attendue pour les autres valeurs de cet utilisateur.

target_data = [-1, -1, 5.0, -1, 4.0, -1, -1, 1.0, -1, -1, -1] #-1 est AUCUN

La valeur attendue de l'évaluation des collations lorsque saké3 est sélectionné est prédite en utilisant les valeurs d'évaluation des collations 2 et 5.

(1) Extraire les personnes avec une cote d'alcool cible de 5 à partir des données Excel (exemple de données de collation)

def findSameSakeList(sheet, userSakeReputation):
    SameSakeList = [] #Liste bidimensionnelle de données avec une cote d'alcool de 5 dans l'image
    sampleLen = len(sheet.col_values(0))-1
    for i in range(sampleLen):
        row = sheet.row_values(i+1)
        if row[userSakeReputation] == 5:
            SameSakeList.append(row)
        else:
            pass
    return SameSakeList

sake_number = 2
wb = xlrd.open_workbook(r'C:\Users\daisuke\Desktop\voyage\testdata.xlsx')
sheet = wb.sheet_by_index(0)
samePersonList = findSameSakeList(sheet, sake_number) #En vigueur

(2) Obtenir la similitude entre l'évaluation de la collation cible (seulement les parties connues) et les données de l'échantillon de collation.

def get_similarities(samePersonList, target_data):
    similarities = []
    sampleLen = len(samePersonList)

    for j in range(sampleLen):#numéro de ligne de la feuille
        distance_list = []
        for i, value in enumerate(target_data):
            if value == -1:
                pass
            else:
                distance = value - samePersonList[j][i]
                distance_list.append(pow(distance, 2))

        similarities.append([j, 1/(1+np.sqrt(sum(distance_list)))])

    return sorted(similarities, key=lambda s: s[1], reverse=True)

③ Prédire la valeur d'évaluation de la collation cible inconnue à partir de la similitude

Prévision de la valeur d'évaluation

valeur d'évaluation pondérée de la collation correspondante de l'utilisateur de l'échantillon=Similarité × valeur d'évaluation de l'échantillon

Après cela, la valeur d'évaluation totale est prise et normalisée.

Score normalisé= \frac{Note totale pour tous les utilisateurs de la valeur d'évaluation pondérée obtenue ci-dessus}{Similitude totale des évaluateurs}
def predict(samePersonList, similarities):#Calculez la valeur d'évaluation prévue en multipliant la similitude par la valeur d'évaluation pour toutes les mêmes personnes.
    predict_list = []
    for index, value in similarities:
        samePersonList[index] = [round(i*value,5) for i in samePersonList[index]] #Fractions rondes avec rond

    np_samePerson = np.array(samePersonList)
    np_samePerson = list(np.mean(np_samePerson, axis=0))

    for index, value in enumerate(np_samePerson):
        predict_list.append([index, value])
    return sorted(predict_list, key= lambda s: s[1], reverse=True)


samePersonList = findSameSakeList(sheet, sake_number    ) #Liste de valeur de 5 personnes avec une cote d'alcool sélectionnée
similarities = get_similarities(samePersonList, target_data)
ranking = predict(samePersonList, similarities)
pprint.pprint(ranking)

 #Rang et sortie normalisés socre
 #[[2, 1.225635],
 #[5, 1.100635],
 #[3, 0.850635],
 #[1, 0.745125],
 #[4, 0.725635],
 #[8, 0.620125],
 #[9, 0.6103799999999999],
 #[7, 0.605505],
 #[0, 0.48538],
 #[6, 0.125],
 #[10, 0.0]]


Sake donne également une évaluation attendue

Recommended Posts

Créer un système de recommandation avec python
Faites une loterie avec Python
Faisons une interface graphique avec python.
Faisons un graphe avec python! !!
Faisons un jeu de shiritori avec Python
Faisons la voix lentement avec Python
Créez un framework Web avec Python! (1)
Créez une application de bureau avec Python avec Electron
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Créer un bot Twitter Trend avec heroku + Python
Essayez de créer un code de "décryptage" en Python
Remplaçons UWSC par Python (5) Faisons un robot
Essayez de créer un groupe de dièdre avec Python
Créez Puyopuyo AI avec Python
Créer un bookmarklet en Python
Créer un répertoire avec python
Système de support de présentation avec Python3
Faire un feu avec kdeplot
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Faisons un outil de veille de commande avec python
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]
[Jouons avec Python] Créer un livre de comptes de ménage
Essayez de créer un jeu simple avec Python 3 et iPhone
Faire un point d'arrêt sur la couche c avec python
Créer un outil de formatage CSV avec Python Pandas Py Installer
Qu'est-ce que Dieu? Créez un chatbot simple avec python
[Super facile] Faisons un LINE BOT avec Python.
[Pratique] Créez une application Watson avec Python! # 3 [Classification du langage naturel]
Résoudre ABC163 A ~ C avec Python
Faites fonctionner l'imprimante de reçus avec python
Manuel de graphisme Python avec Matplotlib.
Créer Apache Log CSV avec Python
Faites un son avec le notebook Jupyter
Résoudre ABC166 A ~ D avec Python
Associez Python Enum à une fonction pour la rendre appelable
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Faisons une rupture de bloc avec wxPython
Créez un environnement virtuel avec Python!
J'ai fait une loterie avec Python.
Créer un environnement virtuel avec Python 3
python / Créer un dict à partir d'une liste.
Résoudre ABC168 A ~ C avec Python
[Python] Faire de la fonction une fonction lambda
[Python] Générer un mot de passe avec Slackbot
Résoudre ABC162 A ~ C avec Python
Système de recommandation utilisant la décomposition matricielle [Apprentissage non supervisé avec python Chapitre 10]
Créer un filtre avec un modèle django
Résoudre ABC167 A ~ C avec Python
Résoudre ABC158 A ~ C avec Python
Traitement du signal acoustique à partir de Python - Faisons un système acoustique en trois dimensions
Faisons un spacon avec xCAT
Créer un itérateur de modèle avec PySide
Faire un joli graphique avec plotly
[Python] Hériter d'une classe avec des variables de classe
J'ai créé un démon avec Python