Wykonuję nadzorowaną maszynę naukę za pomocą SCIKIT-Dowiedz się. Mam dwa zestawy danych. Pierwszy zestaw danych zawiera dane, które mają funkcje X i etykiety Y. Drugi zestaw danych zawiera tylko X Funkcje, ale nie ma etykiet. Mogę pomyślnie wykonać linearsvc do danych szkoleniowych / testowych i zdobądź etykiety Y do zestawu danych testowych.

Teraz chcę użyć modelu, który wyszkoliłem do pierwszego zestawu danych, aby przewidzieć drugie etykiety zbiorowe. Jak korzystać z wstępnie wyszkolonego modelu z pierwszego zestawu danych do drugiego zestawu danych (niewidoczne etykiety) w SCIKIT-Dowiedz się?

fragment kodu z moich prób: Zaktualizowany kod z komentarzy poniżej:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import pandas as pd
import pickle


# ----------- Dataset 1: for training ----------- #
# Sample data ONLY
some_text = ['Books are amazing',
             'Harry potter book is awesome. It rocks',
             'Nutrition is very important',
             'Welcome to library, you can find as many book as you like',
             'Food like brocolli has many advantages']
y_variable = [1,1,0,1,0]

# books = 1 : y label
# food = 0 : y label

df = pd.DataFrame({'text':some_text,
                   'y_variable': y_variable
                          })

# ------------- TFIDF process -------------#
tfidf = TfidfVectorizer()
features = tfidf.fit_transform(df['text']).toarray()
labels = df.y_variable
features.shape


# ------------- Build Model -------------#
model = LinearSVC()
X_train, X_test, y_train, y_test= train_test_split(features,
                                                 labels,
                                                 train_size=0.5,
                                                 random_state=0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)


# Export model
pickle.dump(model, open('model.pkl', 'wb'))
# Read the Model
model_pre_trained = pickle.load(open('model.pkl','rb'))


# ----------- Dataset 2: UNSEEN DATASET ----------- #

some_text2 = ['Harry potter books are amazing',
             'Gluten free diet is getting popular']

unseen_df = pd.DataFrame({'text':some_text2}) # Notice this doesn't have y_variable. This the is the data set I am trying to predict y_variable labels 1 or 0.


# This is where the ERROR occurs
X_unseen = tfidf.fit_transform(unseen_df['text']).toarray()
y_pred_unseen = model_pre_trained.predict(X_unseen) # error here: 
# ValueError: X has 11 features per sample; expecting 26


print(X_unseen.shape) # prints (2, 11)
print(X_train.shape) # prints (2, 26)


# Looking for an output like this for UNSEEN data
# Looking for results after predicting unseen and no label data. 
text                                   y_variable
Harry potter books are amazing         1
Gluten free diet is getting popular    0

Nie musi być kodem marynowania, jak próbowałem wyżej. Patrzę, czy ktoś ma sugestię lub jeśli istnieje jakaś funkcja przedbudowa, która przewidywania SCOKIT?

2
sharp 15 kwiecień 2021, 22:32

2 odpowiedzi

Najlepsza odpowiedź

Jak widać, twój pierwszy tfidf obraca się wkład w 26 funkcji, podczas gdy druga tfidf obraca je do 11 funkcji. W związku z tym błąd ma zatem błąd, ponieważ X_train jest inny kształt do X_unseen. Monit informuje, że każda obserwacja w X_unseen ma mniej funkcji niż liczba funkcji {X5}} została przeszkolona.

Po załadowaniu model w drugim skrypcie, montażujesz innej wektora do tekstu. To jest, tfidf z pierwszego skryptu i {x2}} z drugiego są różne obiekty. Aby przewidywać z model, musisz przekształcić X_unseen za pomocą oryginału {X5}}. Aby to zrobić, musisz wyeksportować oryginalny wektor, załadować go w nowym skrypcie i przekształcić nowe dane przed przekazaniem go do model.

### Do this in the first program
# Dump model and tfidf
pickle.dump(model, open('model.pkl', 'wb'))
pickle.dump(tfidf, open('tfidf.pkl', 'wb'))

### Do this in the second program
model = pickle.load(open('model.pkl', 'rb'))
tfidf = pickle.load(open('tfidf.pkl', 'rb'))

# Use `transform` instead of `fit_transform`
X_unseen = tfidf.transform(unseen_df['text']).toarray()

# Predict on `X_unseen`
y_pred_unseen = model_pre_trained.predict(X_unseen)
2
Arturo Sbr 16 kwiecień 2021, 15:12

Wyobraź sobie, że przeszkoliłeś AI, aby rozpoznać samolot za pomocą zdjęć silników, kołach, skrzydeł i bowtie pilota. Teraz dzwonisz do tego samego AI i poproś go, aby przewidzieć model samolotu z samą bowtie. Właśnie właśnie mówi Scikit-Dowiedz się: Istnieje znacznie mniej funkcji (= kolumny) w X_unseen niż w X_train lub X_test.

1
Guillaume Ansanay-Alex 15 kwiecień 2021, 19:48