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.
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.
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].
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.
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].
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! !!
[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