0

Ich mache das Univ. Von Washington Zuweisung, wo ich den Score von sample_test_matrix (letzten paar Zeilen) mit Decision_function() in LogisticRegression vorherzusagen. Aber der Fehler, die ich erhalte istKann Score nicht ausgewertet werden mit Decision_function() in Logistische Regression

ValueError: X has 145 features per sample; expecting 113092 

Hier ist der Code:

import pandas as pd 
    import numpy as np 
    from sklearn.linear_model import LogisticRegression 

    products = pd.read_csv('amazon_baby.csv') 

    def remove_punct (text) : 
     import string 
     text = str(text) 
     for i in string.punctuation: 
      text = text.replace(i,"") 
     return(text) 

    products['review_clean'] = products['review'].apply(remove_punct) 
    products = products[products.rating != 3] 
    products['sentiment'] = products['rating'].apply(lambda x : +1 if x > 3 else -1) 

    train_data_index = pd.read_json('module-2-assignment-train-idx.json') 
    test_data_index = pd.read_json('module-2-assignment-test-idx.json') 

    train_data = products.loc[train_data_index[0], :] 
    test_data = products.loc[test_data_index[0], :] 
    train_data = train_data.dropna() 
    test_data = test_data.dropna() 

    from sklearn.feature_extraction.text import CountVectorizer 

    train_matrix = vectorizer.fit_transform(train_data['review_clean']) 
    test_matrix = vectorizer.fit_transform(test_data['review_clean']) 

    sentiment_model = LogisticRegression() 
    sentiment_model.fit(train_matrix, train_data['sentiment']) 
    print (sentiment_model.coef_) 

    sample_data = test_data[10:13] 
    print (sample_data) 

    sample_test_matrix = vectorizer.transform(sample_data['review_clean']) 
    scores = sentiment_model.decision_function(sample_test_matrix) 
    print (scores) 

Hier ist die Datenprodukte:

  Name               Review          Rating 

    0  Planetwise Flannel Wipes        These flannel wipes are OK, but in my opinion ...  3 


    1  Planetwise Wipe Pouch         it came early and was not disappointed. i love...  5 


    2  Annas Dream Full Quilt with 2 Shams     Very soft and comfortable and warmer than it l...  5 

    3  Stop Pacifier Sucking without tears with Thumb...  This is a product well worth the purchase. I ...  5 

    4  Stop Pacifier Sucking without tears with Thumb...  All of my kids have cried non-stop when I trie...  5 

Antwort

0

Diese Zeile verursacht Fehler in den nachfolgenden Zeilen :

test_matrix = vectorizer.fit_transform(test_data['review_clean']) 

Ändern t er oben dazu:

test_matrix = vectorizer.transform(test_data['review_clean']) 

Erläuterung: Mit fit_transform() den CountVectorizer auf den Testdaten wieder anbringen. So gehen alle Informationen über die Trainingsdaten verloren und das Vokabular wird nur aus Testdaten berechnet.

Dann verwenden Sie das Objekt vectorizer, um die sample_data['review_clean'] zu transformieren. Die Merkmale darin werden nur diejenigen sein, die von test_data gelernt sind.

Aber die sentiment_model ist auf Vokabular von train_data trainiert. Daher sind die Merkmale unterschiedlich.

Verwenden Sie immer transform() auf Testdaten, nie fit_transform().

+0

Großartig, es hat funktioniert. Vielen Dank . Könnten Sie bitte sagen, warum ist es so? – harshi

+0

@harshi Ich habe die Erklärung hinzugefügt. Bitte gehen Sie es durch und fragen Sie, ob Sie immer noch nicht verstehen. Wenn dies Ihnen geholfen hat, die Antwort zu überdenken oder zu akzeptieren. –

+0

Sicher. Vielen Dank ! – harshi