2

ich eine der Stärken der lightfm erinnern ist, dass das Modell nicht von Kaltstartproblem leidet, sowohl Benutzer und Artikel Kaltstart: lightfm original paperLightfm: Handhabung Benutzer und Artikel Kaltstart

Allerdings habe ich noch don verstehe nicht, wie man lightfm benutzt, um das Kaltstartproblem zu lösen. Ich trainierte mein Modell auf user-item interaction data. Wie ich es verstehe, kann ich nur eine Vorhersage für Profil-IDs treffen, die in meinem Datensatz vorhanden sind.

def predict(self, user_ids, item_ids, item_features=None, 
      user_features=None, num_threads=1): 
    """ 
    Compute the recommendation score for user-item pairs. 

    Arguments 
    --------- 

    user_ids: integer or np.int32 array of shape [n_pairs,] 
     single user id or an array containing the user ids for the 
     user-item pairs for which a prediction is to be computed 
    item_ids: np.int32 array of shape [n_pairs,] 
     an array containing the item ids for the user-item pairs for which 
     a prediction is to be computed. 
    user_features: np.float32 csr_matrix of shape [n_users, n_user_features], optional 
     Each row contains that user's weights over features. 
    item_features: np.float32 csr_matrix of shape [n_items, n_item_features], optional 
     Each row contains that item's weights over features. 
    num_threads: int, optional 
     Number of parallel computation threads to use. Should 
     not be higher than the number of physical cores. 

    Returns 
    ------- 

    np.float32 array of shape [n_pairs,] 
     Numpy array containing the recommendation scores for pairs defined 
     by the inputs. 
    """ 

    self._check_initialized() 

    if not isinstance(user_ids, np.ndarray): 
     user_ids = np.repeat(np.int32(user_ids), len(item_ids)) 

    assert len(user_ids) == len(item_ids) 

    if user_ids.dtype != np.int32: 
     user_ids = user_ids.astype(np.int32) 
    if item_ids.dtype != np.int32: 
     item_ids = item_ids.astype(np.int32) 

    n_users = user_ids.max() + 1 
    n_items = item_ids.max() + 1 

    (user_features, 
    item_features) = self._construct_feature_matrices(n_users, 
                 n_items, 
                 user_features, 
                 item_features) 

    lightfm_data = self._get_lightfm_data() 

    predictions = np.empty(len(user_ids), dtype=np.float64) 

    predict_lightfm(CSRMatrix(item_features), 
        CSRMatrix(user_features), 
        user_ids, 
        item_ids, 
        predictions, 
        lightfm_data, 
        num_threads) 

    return predictions 

alle Vorschläge oder Hinweise, um mein Verständnis zu helfen würde wirklich geschätzt werden. danke

Antwort

2

LightFM kann, wie jeder andere Empfehlungsalgorithmus, keine Vorhersagen über völlig neue Benutzer treffen, wenn ihm keine zusätzlichen Informationen über diese Benutzer gegeben werden. Der Trick beim Versuch, Empfehlungen für neue Benutzer zu geben, besteht darin, sie in Bezug auf die Funktionen zu beschreiben, die der Algorithmus während des Trainings gesehen hat.

Dies ist wahrscheinlich am besten anhand eines Beispiels erklärt. Angenommen, Sie haben Benutzer mit IDs zwischen 0 und 10 in Ihrem Trainingssatz und möchten Vorhersagen für einen neuen Benutzer, ID 11, treffen. Wenn Sie nur die ID des neuen Benutzers hätten, wäre der Algorithmus nicht in der Lage, Vorhersagen zu treffen : Schließlich weiß es nichts darüber, was die Präferenzen von Benutzer 11 sind. Angenommen, Sie haben einige Funktionen, um die Benutzer zu beschreiben: Vielleicht wählt jeder Benutzer während des Anmeldeprozesses eine Reihe von Interessen aus (Horrorfilme oder romantische Komödien zum Beispiel). Wenn diese Merkmale während des Trainings vorhanden sind, kann der Algorithmus erfahren, welche Präferenzen im Durchschnitt diesen Merkmalen zugeordnet sind, und er wird in der Lage sein, Empfehlungen für alle neuen Benutzer zu geben, die mit den gleichen Merkmalen beschrieben werden können. In diesem Beispiel könnten Sie Vorhersagen für Benutzer 11 treffen, wenn Sie die Präferenzen angeben könnten, die sie während des Anmeldevorgangs ausgewählt haben.

In der LightFM-Implementierung werden alle diese Features in den Feature-Matrizen kodiert, wahrscheinlich in Form einer Ein-Hot-Codierung. Wenn Sie Empfehlungen für Benutzer 11 abgeben, würden Sie eine neue Funktionsmatrix für diesen Benutzer erstellen: Solange diese Funktionsmatrix nur die Funktionen enthält, die während des Trainings vorhanden sind, können Sie Vorhersagen treffen.

Beachten Sie, dass es normalerweise nützlich ist, ein Feature zu haben, das nur einem einzelnen Benutzer entspricht - also ein 'Ist Benutzer 0' Feature, ein 'Ist Benutzer 1' Feature und so weiter. Im Falle neuer Benutzer ist eine solche Funktion nutzlos, da es im Training keine Informationen gibt, die das Modell verwenden könnte, um etwas über diese Funktion zu erfahren.

+0

hi @Maciej Kula danke für die Erklärung, jetzt verstehe ich, dass das Kaltstart-Problem für einen Benutzer oder ein Element kann durch die Einbeziehung der Funktionen des Modells gelöst werden. Es ist mir jedoch immer noch unklar, wie ich das machen soll. Also würde ich einem neuen Benutzer eine neue Feature-Matrix für diesen Benutzer erstellen und dann 1) sollte ich eine Funktion erstellen, um ähnliche Benutzer nach dieser Feature-Matrix zu finden? oder 2) Kann ich das von mir trainierte Modell direkt verwenden, um eine Empfehlung für diesen neuen Benutzer zu generieren? Nochmals vielen Dank – bohr

+0

Sie würden eine Feature-Matrix (eine Zeile, wirklich) für den neuen Benutzer erstellen und direkt in den 'model.predict' Methoden verwenden. Ein Teil der Verantwortung des Modells besteht darin, diese Ähnlichkeit automatisch für Sie zu modellieren. –

+0

ah habe es, aber für die 'ids'-Parameter, was soll ich setzen? – bohr

Verwandte Themen