[PYTHON] Ein Beispiel, um Faktorisierungsmaschinen schnell mit fastFM auszuprobieren

――Dies ist ein einführender Artikel, in dem Sie mithilfe einer Bibliothek schnell den Algorithmus für Faktorisierungsmaschinen ausprobieren können, der in den letzten Jahren in der Empfehlungstechnologie Aufmerksamkeit erregt hat. ――Es ist keine theoretische Erklärung, sondern ein Artikel zum Bewegen. ―― Befolgen Sie grundsätzlich das Tutorial + Ergänzung.

Verschiedene Referenzmaterialien

Diesmal habe ich eine Bibliothek namens fastFM verwendet. Darüber hinaus werden die Erläuterungen und die Leistung dieser Bibliothek auf arXiv veröffentlicht.

Für diejenigen, die die Umrisse und Trends von Faktorisierungsmaschinen kennenlernen möchten, gibt es Referenzartikel innerhalb und außerhalb von Qiita, daher werde ich einige davon veröffentlichen. Die folgenden Bücher sind auch für fastFM verfügbar. Grob gesagt handelt es sich um einen Algorithmus, der "die Matrixzerlegung verwendet, um eine Regression, Klassifizierung und Rangfolge durchzuführen, die gegenüber spärlichen Daten stark ist".

Hauptgeschichte

Einführung

Es gibt Notizen. In meiner eigenen Umgebung war es wie folgt.

Für Python 3.6.10.

Für Python 3.7.6

Installieren Sie für neue Umgebungen von der Quelle aus, erstellen Sie eine Umgebung, in der mehrere Pythons wie pyenv ausgeführt und 3.6-Serien eingeführt werden können, oder erstellen Sie eine 3.6-Umgebung mit Docker usw. Ich denke, es wird.

Beispieldaten

Wenn es um FM-Stichproben (Factorization Machines) geht, werden meiner Meinung nach häufig Stichproben vom Typ Wörterbuch für Beispieldaten verwendet.

[
{user:A, item:X, ...},
{user:B, item:Y, ...}, ...
]

Mögen. Es scheint, dass solche Daten oft für spärliche Daten eingegeben werden, aber dieses Mal möchte ich sie unter der Annahme einer einfachen CSV behandeln.

Beispiel-Dummy-Daten


Kategorie,rating,is_A,is_B,is_C,is_X,is_Y,is_Z
A,5,0,0,1,0,1,0
A,1,1,0,0,0,0,1
B,2,0,1,0,0,0,0
B,5,0,0,0,0,1,0
C,1,1,0,0,0,0,1
C,4,0,0,0,0,1,0
...

Ich werde alle Versionen unten setzen. Der Wert ist ein Dummy, der entsprechend erstellt wurde.

Wird angenommen.

Verarbeitungsflussbestätigung mit Regressionsanalyse

Die Nutzung der Bibliothek selbst ist einfach und denjenigen bekannt, die Scicit-Learn usw. verwendet haben. Lassen Sie uns zunächst einen Verarbeitungsablauf mit einer einfachen Regressionsanalyselogik erstellen. Die Details sind fehlerhaft, aber die allgemeine Modellerstellung scheint wie folgt zu sein.

  1. Daten lesen
  2. Vorverarbeitung (Daten in ein Format konvertieren, das zum Modell passt)
  3. Unterteilt in "Trainingsdaten" (, "Validierungsdaten") und "Testdaten"
  4. Erstellen Sie ein Modell mit Trainingsdaten
  5. Modell auf Testdaten anwenden
  6. Definieren und bewerten Sie Leistungsbewertungsindikatoren

Dieses Mal werde ich ein Regressionsmodell mit dem Thema ** Bewertung ** erstellen. (Aus Gründen der Übersichtlichkeit importiere ich jedes Mal, aber Sie können alles oben importieren.)

Daten gelesen

import numpy as np
import pandas as pd

#CSV-Daten lesen
raw = pd.read_csv('fm_sample.csv')

#Separate Zielspalten und andere Informationen
target_label = "rating"

data_y = raw[target_label]
data_X = raw.drop(target_label, axis=1)

Datenaufteilung vor der Verarbeitung

#Vorverarbeitung
##Praktische Datenverarbeitungsbibliothek für Kategorien, Scikit-Nutzen Sie die praktischen Funktionen des Lernens
import category_encoders as ce

##Eine für die angegebene Spalte-Hot-Codierung
enc = ce.OneHotEncoder(cols=['Kategorie'])

X = enc.fit_transform(data_X)
y = data_y

#Datenaufteilung
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=810)

Modellierungsbewertung

Die Bewertung ist MAE (durchschnittlicher absoluter Fehler), aber MSE usw. können schnell berechnet werden.

from sklearn import linear_model
from sklearn.metrics import mean_squared_error, mean_absolute_error

#Modellieren
reg = linear_model.LinearRegression()
reg.fit(X_train, y_train)

#Auswertung
##Anwendbarkeit auf Trainingsdaten
mean_absolute_error(y_train, reg.predict(X_train))
##Testdatenfehler
mean_absolute_error(y_test, reg.predict(X_test))

Ich denke es wird so sein. Natürlich würde ich im Bewertungsteil mehr tun, z. B. die berechnete Regressionslinie zeichnen und sehen, wie der Fehler abweicht, aber diesmal, bis ich ihn verschiebe.

Rückgabe per FM

Wenn der obige Ablauf ausgeführt werden kann, ist der Rest abgeschlossen, wenn der Berechnungsteil in die diesmal zu verwendende fastFM-Spezifikation aufgenommen wird. Ein zu beachtender Punkt ist, dass ** DataFrame nicht so behandelt werden kann, wie es ist, daher wird csr_matrix verwendet **.

Modellierungsbewertung

from fastFM import als
from scipy.sparse import csr_matrix

#Modellieren
fm = als.FMRegression(n_iter=1000, init_stdev=0.1, rank=8, l2_reg_w=0.5, l2_reg_V=0.5, random_state=810)
fm.fit(csr_matrix(X_train), y_train)

#Auswertung
##Anwendbarkeit auf Trainingsdaten
mean_absolute_error(y_train, fm.predict(csr_matrix(X_train)))
##Testdatenfehler
mean_absolute_error(y_test, fm.predict(csr_matrix(X_test)))

Sparse Matrix, csr_matrix

Hier kommt die csr_matrix. Es handelt sich um spärliche Daten. Das Bild ist einfach und wenn DataFrame oder eine normale Matrix zweidimensionale Daten wie folgt verarbeitet:

matrix


array([
  [0, 0, 1],
  [0, 0, 0],
  [0, 3, 0]
])

Es wird nur der Teil behandelt, der die Daten enthält

Umgang mit spärlichen Daten


Größe: 3 x 3
Wo es Daten gibt:
([0,2]1 am Punkt)
([2,1]3 am Punkt)

Es ist ein Bild wie. Es gibt verschiedene Arten der Handhabung, wie z. B. csr_matrix, coo_matrix, csc_matrix, lil_matrix, und es scheint, dass die Handhabungs- und Verarbeitungsgeschwindigkeit unterschiedlich sind. Wenn Sie also interessiert sind, suchen Sie bitte mit "scipy sparse matrix" usw. note.nkmk.me und so weiter.

Woran man sich diesmal erinnern sollte

Ich frage mich, ob.

Klassifizierung nach FM

Eine binäre Klassifizierung ist ebenfalls möglich, daher werde ich es versuchen. Dieses Mal werde ich die Aufgabe übernehmen, 2 Klassen mit einer Bewertung von 4 oder mehr oder weniger zu erraten. Nach dem Teil der Datenverarbeitung vor der Verarbeitung wird das Modell erstellt und ausgewertet, nachdem die Antwortdaten erstellt wurden, um festzustellen, ob die Bewertung 4 oder höher ist. Beachten Sie auch, dass die fastFM-Klassifizierung "-1 oder 1" anstelle von "0 oder 1" verwendet.

from fastFM import sgd
from sklearn.metrics import roc_auc_score

#Die Vorverarbeitung wurde fortgesetzt
##1 wenn 4 oder mehr sonst-Auf 1 setzen
y_ = np.array([1 if r > 3 else -1 for r in y])

##Erstellung von Trainingsdaten / Testdaten
X_train, X_test, y_train, y_test = train_test_split(X, y_, random_state=810)

#Modellieren
fm = sgd.FMClassification(n_iter=5000, init_stdev=0.1, l2_reg_w=0,
                          l2_reg_V=0, rank=2, step_size=0.1)
fm.fit(csr_matrix(X_train), y_train)

##Es scheint, dass Sie zwei Arten von vorhergesagten Werten erhalten können.
y_pred = fm.predict(csr_matrix(X_test))
y_pred_proba = fm.predict_proba(csr_matrix(X_test))

#Auswertung
##Beispiel für die Bewertung des AUC-Werts
roc_auc_score(y_test, y_pred_proba)

Zeichnen Sie die ROC-Kurve

Ich werde die ROC-Kurve unter Bezugnahme auf die Seite von note.nkmk.me schreiben. ..

fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred_proba, drop_intermediate=False)

auc = metrics.auc(fpr, tpr)

#Zeichnen Sie die ROC-Kurve
plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc)
plt.legend()
plt.title('ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)
plt.show()

image.png

Ich konnte es schaffen.

andere

Fügen Sie unten die Beispieldaten ein. Es ist richtig gemacht, also sind es keine interessanten Daten. Bitte überprüfen Sie den Betrieb.

fm_sample.csv


Kategorie,rating,is_A,is_B,is_C,is_X,is_Y,is_Z
A,5,0,0,1,0,1,0
A,1,1,0,0,0,0,1
A,3,0,0,1,0,1,0
A,2,1,0,0,0,0,1
A,4,0,0,0,0,0,1
A,5,1,0,0,1,1,0
A,1,0,1,0,0,0,1
A,2,0,0,0,0,0,1
B,2,0,1,0,0,0,0
B,5,0,0,0,0,1,0
B,3,1,1,0,0,1,0
B,2,0,0,1,0,0,0
B,1,0,0,0,0,0,1
B,3,0,0,1,0,0,1
B,4,0,1,0,0,0,0
B,1,0,0,0,0,0,1
B,2,0,1,0,0,0,1
C,1,1,0,0,0,0,1
C,4,0,0,0,0,1,0
C,2,1,0,1,0,1,0
C,4,0,0,0,0,0,0
C,5,0,0,1,1,1,0
C,2,0,1,0,0,0,1
C,5,1,0,0,0,1,0
C,3,0,0,1,1,1,0
C,2,0,0,0,0,0,1
C,3,0,0,0,0,1,0
A,2,0,0,0,0,0,1
A,4,1,0,0,0,1,0
A,3,0,0,0,0,0,0
A,1,0,0,0,0,0,1
A,3,1,0,0,0,0,0
A,4,0,0,1,0,1,0
A,5,1,1,0,0,1,0
A,3,1,0,0,1,0,0
B,4,0,0,0,0,1,0
B,1,0,0,0,0,0,1
B,5,0,0,0,0,1,0
B,3,0,0,0,0,0,0
B,1,0,0,0,1,0,1
B,3,0,0,1,0,0,0
B,2,0,1,0,0,0,1
B,5,1,0,0,0,1,0
B,4,0,0,0,1,1,1
C,1,0,0,0,0,0,0
C,2,0,0,0,0,0,1
C,3,0,0,1,0,0,0
C,4,0,1,0,0,1,0
C,1,0,0,1,0,0,1
C,1,0,0,0,0,0,0
C,3,0,0,1,0,0,0
C,3,0,0,1,0,1,0
C,5,0,0,0,1,1,0
C,3,0,0,1,0,1,0

Recommended Posts

Ein Beispiel, um Faktorisierungsmaschinen schnell mit fastFM auszuprobieren
Versuchen Sie schnell, Ihren Datensatz mit Pandas zu visualisieren
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
AWS-Schrittfunktionen zum Lernen anhand eines Beispiels
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Versuchen Sie, mit Tkinter in Python dynamisch einen Checkbutton zu erstellen
Versuchen Sie, den Boden durch Rekursion herauszufordern
Versuchen Sie, mit einer Shell zu programmieren!
Versuchen Sie, eine Sprache auszuwählen
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Versuchen Sie, eine Bezier-Kurve zu zeichnen
Versuchen Sie, Facebook mit Python zu betreiben
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
Rails-Benutzer versuchen, mit Django eine einfache Blog-Engine zu erstellen
Versuchen Sie, sich mit ONNX Runtime zu profilieren
Versuchen Sie, einen Web-Service-ähnlichen Typ mit 3D-Markup-Sprache zu erstellen
Versuchen Sie, Audio mit M5 STACK auszugeben
Versuchen Sie, Ihrer IFC-Datei mit IfcOpenShell Python eine Wand hinzuzufügen
Versuchen Sie, einen Artikel von Qiita mit der REST-API [Umweltvorbereitung] zu erstellen.
Ein Gist-Repository, das Sie verwenden können, wenn Sie es mit ansible ausprobieren möchten
Versuchen Sie, mit Python (2) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Versuchen Sie, sich mit Python bei qiita anzumelden
Machen wir einen Jupyter-Kernel
Versuchen Sie, mit matplotlib eine Normalverteilung zu zeichnen
Ein umfassendes Beispiel für den optischen Fluss von OpenCV
Versuchen Sie, Kirschblüten mit xg Boost vorherzusagen
Versuchen Sie, mit Pandas in ordentliche Daten umzuwandeln
Versuchen Sie HTML-Scraping mit der Python-Bibliothek
Verwendung des CUT-Befehls (mit Beispiel)
Erster Versuch von YDK mit Cisco IOS-XE
Beispielprogramm zum Anzeigen von Videos mit PyQt
Versuchen Sie, eine Karte mit Python + Cartopy 0.18.0 zu zeichnen
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Beispiel für die Wavelet-Konvertierung von Bildern in Python
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.
Versuchen Sie, mit Talking Head Anime aus einem einzigen Bild zu verschönern [Python-Vorbereitung]
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Ausführungsergebnis)
Eine einfache Problemumgehung für Bots, um zu versuchen, Tweets mit demselben Inhalt zu veröffentlichen
Versuchen Sie, mit WebSocket mit Django (Swamp Dragon) eine Todo-Verwaltungssite zu erstellen.
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Erstellen von CSV-Beispieldaten mit Hypothese
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Lesen einer CSV-Datei mit Python 2/3
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
So senden Sie eine Nachricht mit Curl an LINE
Berechnen wir das statistische Problem mit Python
Versuchen Sie, Doujin-Musikdaten mit Pandas zu aggregieren
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
So entwickeln Sie eine Cart-App mit Django
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen