Introduction à elle faite avec Python ~ Projet d'automatisation Tinder ~ Épisode 6

table des matières

Ce que j'ai fait Événements principaux
Épisode 1 Balayage automatique à droite
Épisode 2 Envoi automatique de messages Assorti avec une femme
Épisode 3 Bibliothèque Échangé LINE avec une femme assortie
numéro 3.Épisode 5 Réacquisition du jeton d'accès Vous ne pouviez pas obtenir de jetons avec le code précédent
Épisode 4 Collecte de données Les réponses LINE ne viennent plus
Épisode 5 Texte du profil d'analyse des données Les produits d'information ont été recommandés par des personnes avec lesquelles je suis devenu ami
Épisode 6 Édition d'image d'analyse de données Une vraie fille de connaissance m'appelle récemment tard dans la nuit(?)

Le code peut être visualisé depuis [GitHub] git.

Synopsis jusqu'à la dernière fois

Situation récente

Je n'ai pas dormi récemment. Il semble qu'une autre connaissance l'ait faite. Ce traître est ... Au fait, j'ai eu un GPU l'autre jour, donc j'apprends à l'utiliser à partir de cette époque.

Récit de recherches antérieures

Je ne suis pas le premier à penser à mettre un modèle dans la stratégie de balayage de Tinder. Même si je viens de chercher, les gens qui glissent uniquement ceux qui ont une photo de visage [1], les gens qui laissent DNN apprendre leur photo préférée et balayer [2] [3], sur le visage On a trouvé une personne [4] qui jugeait si elle était traitée ou non.

... Eh bien, que voulions-nous faire?

L'apprentissage automatique est une nuisance et il est amusant de se déplacer.Ainsi, lorsque vous le remarquez, vos objectifs s'écartent de vos objectifs d'origine. Revenant au point de départ, nous avons commencé à écrire du code parce qu'elle le voulait. La plupart des informations qui sortent du monde sont du code pour «ne pas correspondre à des personnes inutiles», mais ce dont nous avons besoin, c'est du code pour «correspondre au plus de personnes possible». Après tout, la situation actuelle est de savoir s'il faut faire correspondre ou non une personne par jour, donc si vous correspondez à une personne que vous n'aimez pas, vous pouvez l'annuler manuellement [^ 1](Un grand nombre de correspondances se produit et vous pouvez annuler manuellement Bien sûr, ce n'est pas le cas pour ceux qui sont en difficulté parce qu'ils ne peuvent pas suivre.) Que faites-vous en réduisant la gamme de rencontres avec vous-même [^ 2].

[5] est utile en termes d'efforts pour la faire. Au lieu de rechercher des personnes susceptibles de correspondre à ce que nous essayons actuellement, nous essayons de répondre à l'approche de «créer un profil qui attirera autant de personnes que possible». Si le service d'appariement utilisé est différent, la stratégie d'évaluation de l'utilisateur peut être différente, elle ne peut donc pas être simplement appliquée, mais je pense que c'est une tentative intéressante. J'aimerais l'essayer un jour avec Tinder, mais dans ce cas, est-ce que je vais préparer plusieurs profils avec différentes phrases d'auto-introduction et effectuer un test A / B [^ 3] et renforcer l'apprentissage basé sur ce score? .. Cette politique a été mise en attente pour moi, car on s'attend à ce que cela prenne beaucoup de temps et un grand nombre de numéros de téléphone pour collecter suffisamment de données, et honnêtement, c'est ennuyeux. Selon [5], si vous incluez des descriptions appropriées sur «éducation», «veulent un enfant», «socialité» et «alcool» dans votre profil, il sera plus facile pour les femmes de glisser à droite [^ 4].

Reconnaissance d'image

J'ai écrit une longue chose supplémentaire ci-dessus, mais le point est

--Dans: photo de profil --Out: s'il correspond

C'est une histoire que je souhaite créer une machine d'apprentissage automatique.

Construction de modèles

En parlant de reconnaissance d'image, nous utilisons CNN pour estimer si une correspondance est faite ou non à partir de l'image de profil. Commencez par charger l'image à partir du dossier de données.

analytics.py


import pandas as pd
import cv2
import numpy as np
from tqdm.notebook import tqdm
import os
import re

filePath = "data/tinder.xlsx"
imagePath = "data/photos"

df = pd.read_excel(filePath)
df.drop_duplicates(inplace=True, subset="id")
df.set_index("id", inplace=True)

X=[]
y=[]
for fileName in tqdm(os.listdir(imagePath)):
    try:
        id_ = re.match("([a-z0-9]*)-\d( \(\d\))?.jpg ",fileName).group(1)
        match = df.loc[id_]["match"]
        filePath = os.path.join(imagePath, fileName)
        img = cv2.imread(filePath)
        img = cv2.resize(img, (120,120))
        X.append(img)
        y.append(match)
    except:
        pass
X=np.asarray(X)
y=np.asarray(y)

La taille de l'image est unifiée à 120 * 120. Divisez l'image chargée par 255 pour l'adapter à la plage 0-1 et divisez-la en train et test.

analytics.py


from sklearn.model_selection import train_test_split

X = X/255
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8888)

Maintenant que les données sont prêtes, construisons le CNN. Cette fois, nous avons préparé un modèle de 2 couches de couche de convolution + 2 couches de couche entièrement connectée.

analytics.py


import keras
from keras.models import Sequential
from keras.layers import Conv2D, Dense, ReLU, Dropout, Flatten, MaxPool2D

def getModel():
    model=Sequential()
    model.add(Conv2D(3,3,input_shape=(120,120,3)))
    model.add(ReLU())
    model.add(MaxPool2D((2,2)))
    model.add(Dropout(0.25))
    model.add(Conv2D(3,3,padding="same"))
    model.add(ReLU())
    model.add(MaxPool2D((2,2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(1024))
    model.add(Dense(2,activation="softmax"))
    return model

Nous allons nous entraîner et faire des prédictions.

analytics.py


model = getModel()
model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=["accuracy"])
model.fit(X_train, to_categorical(y_train), epochs=30, validation_data=(X_test, to_categorical(y_test)))

y_pred = model.predict(X_test)
y_pred = np.exp(y_pred)
y_pred = (y_pred/np.sum(y_pred, axis=1).reshape(-1,1))[:,1]
print(roc_auc_score(y_test, y_pred))
#>>0.5116927510028815

auc0.51 ... Est-ce mieux que aléatoire? Ce n'est pas très utile. Il y a peu de données correspondantes ...

Par conséquent, j'aimerais essayer l'apprentissage par transfert. Dans l'apprentissage par transfert, un modèle qui a été formé à certaines tâches à l'avance est appliqué à d'autres tâches. Dans le modèle de reconnaissance d'image de CNN, il est empiriquement connu que la couche convolutionnelle semble extraire les caractéristiques universelles de l'image, et il existe un modèle qui effectue une autre tâche simplement en recréant correctement la dernière couche entièrement connectée. C'est fait [6].

image.png De CS231n: Convolutional Neural Networks for Visual Recognition Lecture 7

Cette fois, basé sur VGG16, j'ajouterai une couche entièrement connectée et afficherai la probabilité de correspondance.

analytics.py


#La préparation des données est la même qu'avant, X_train, y_train, X_test, y_On suppose que le test a déjà été préparé.
from keras.applications.vgg16 import VGG16

def getModel():
    model = VGG16(weights="imagenet", include_top=False)
    x = model.output
    x = GlobalAveragePooling2D()(x)
    predictions = Dense(1, activation="linear")(x)
    model = Model(inputs=model.input, outputs=predictions)
    for layer in model.layers[:-3]:
        layer.trainable=False
    return model

model = getModel()
model.compile(optimizer=Adam(), loss="mse", metrics=["mse"])
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
y_pred = model.predict(X_test)
print(roc_auc_score(y_test, y_pred))
#>>0.6025131864722308

Auc a dépassé en toute sécurité 0,6. Je pense que nous avons enfin terminé un modèle utilisable. La prochaine fois, nous trouverons enfin une personne correspondante basée sur des phrases, des images et des données de table. Je veux le terminer avant Noël.

Attendre! Ma future copine! !!

Les références

[1]https://note.mu/sarasara201512/n/n20ec9765a387 [2]https://qiita.com/KR_bangkok/items/00b5ed45f5a8c1428960 [3]https://github.com/joelbarmettlerUZH/auto-tinder [4]https://blog.aidemy.net/entry/2018/07/05/172157 [5]https://qiita.com/data_psyence/items/54bab846337fe1ca61e4 [6]https://qiita.com/ANNEX_IBS/items/55c7a8984fe88a756965

[^ 1]: Pour cette raison, nous n'envisageons pas d'éliminer mécaniquement les comptes obstructifs pour la sollicitation commerciale. Même si vous ne vous souciez pas de faire un modèle, vous pouvez le comprendre immédiatement en parlant réellement. [^ 2]: Bien entendu, la présence ou l'absence d'un visage peut être utilisée comme quantité de fonction. [^ 3]: L'autre jour, je me suis lié d'amitié avec une personne de Google, mais il a dit que son collègue était de l'Université de Kyoto et avait fait un test A / B avec ou sans remplir la colonne de formation sur l'auto-introduction. En conséquence, "avec et sans le nom de l'université (Université de Kyoto) correspond à 0 femme, aucune différence significative n'a été observée". La fin était si triste que je n'ai pas pu entendre plus de détails. [^ 4]: Cela fonctionne parce que la question "Voulez-vous un enfant?" Existe par défaut, et je sens que je serais évité si je prenais la peine d'écrire un tel contenu dans Tinder, qui est une description gratuite.

Recommended Posts

Introduction à elle faite avec Python ~ Projet d'automatisation Tinder ~ Épisode 6
Introduction à elle faite avec Python ~ Projet d'automatisation Tinder ~ Épisode 5
Système de notation IPynb réalisé avec TA d'introduction à la programmation (Python)
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
[Introduction à Python] Utilisons foreach avec Python
[Python] Introduction facile à l'apprentissage automatique avec python (SVM)
Introduction à l'intelligence artificielle avec Python 1 «Théorie des algorithmes génétiques»
Markov Chain Artificial Brainless avec Python + Janome (1) Introduction à Janome
Chaîne de Markov artificielle sans cervelle avec Python + Janome (2) Introduction à la chaîne de Markov
Introduction à l'intelligence artificielle avec Python 2 «Pratique de l'algorithme génétique»
Introduction à Tornado (1): Framework Web Python démarré avec Tornado
Introduction au vol en formation avec Tello edu (Python)
Introduction à Python avec Atom (en route)
Introduction au modèle linéaire généralisé (GLM) par Python
[Introduction à l'application Udemy Python3 +] 9. Tout d'abord, imprimez avec print
Introduction au langage Python
Introduction à OpenCV (python) - (2)
[Introduction à Python] Comment itérer avec la fonction range?
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
Introduction au traitement parallèle distribué Python par Ray
Introduction aux mathématiques à partir du mémo d'étude Python Vol.1
Note de lecture: Introduction à l'analyse de données avec Python
J'ai essayé de faire d'Othello pour enseigner Python3 aux enfants (6) Final
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Automatisation] Utilisez GitLab avec Python pour faciliter la gestion des requêtes
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
Connectez-vous à BigQuery avec Python
Introduction à Python Django (2) Win
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai fait un blackjack avec du python!
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
Introduction à RDB avec sqlalchemy Ⅰ
20200329_Introduction à l'analyse de données avec Python 2nd Edition Personal Summary
Introduction à la communication série [Python]
Convertir le projet Scratch en Python
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
Introduction à Python pour les utilisateurs de VBA - Appeler Python depuis Excel avec xlwings -
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python
[Raspi4; Introduction au son] Enregistrement stable de l'entrée sonore avec python ♪
J'ai fait un blackjack avec Python.
Othello fait avec python (comme GUI)
J'ai créé wordcloud avec Python.
Introduction à Python pour, pendant
[Introduction à Python] Comment obtenir des données avec la fonction listdir
[Introduction à Udemy Python3 + Application] 51. Soyez prudent avec les arguments par défaut
Activé pour convertir PNG en JPG avec Pillow of Python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Introduction à l'analyse de données avec Python P32-P43 [ch02 3.US Baby Names 1880-2010]
Introduction à l'analyse de données par Python P17-P26 [ch02 1.usa.gov données de bit.ly]
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 1
Introduction à la modélisation statistique bayésienne avec python ~ Essai de régression linéaire avec MCMC ~