Zapis i odczyt model ML

Zapis i odczyt model ML
US
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:95
0

Dzien dobry wieczor,

Mam problem z zpisem odczytu modelu ML

Kopiuj
model_file = Path("modelLR.bin")
if model_file.is_file():
    with open(model_file, 'rb') as f:
        LR = joblib.load(f)
else:
    LR = LogisticRegression()
    LR.fit(xv_train, y_train)
    pred_lr = LR.predict(xv_test)
    LR.score(xv_test, y_test)
    print(classification_report(y_test, pred_lr))
    with open(model_file, 'wb') as f:
        joblib.dump(LR, f, compress=9)

Jak zladuje model z pliku zapisanego poprzednim razem, to przy wywolaniu

Kopiuj
pred_LR = LR.predict(new_xv_test)

mam blad:

ValueError: X has 33822 features, but LogisticRegression is expecting 33945 features as input.

Dla testow zrobilem zapis i odczyt w tej samej sesji i dziala:

Kopiuj
LR = LogisticRegression()
LR.fit(xv_train, y_train)
pred_lr = LR.predict(xv_test)
LR.score(xv_test, y_test)
print(classification_report(y_test, pred_lr))
#save model
with open(model_file, 'wb') as f:
        joblib.dump(LR, f, compress=9)
#restore model
with open(model_file, 'rb') as f:
        LR = joblib.load(f)
...
pred_LR = LR.predict(new_xv_test)
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:10 dni
  • Postów:2370
0

Czym się różni new_xv_test od xv_test ?

US
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:95
0

xv_test - uczenie modelu
new_xv_test - to nowy text dla ktorego oczekuje predykcji

Kopiuj
x = df_data["text_"]
y = df_data["label"]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

vectorization = TfidfVectorizer()
xv_train = vectorization.fit_transform(x_train)
xv_test = vectorization.transform(x_test)
Kopiuj
testing_news = {"text": [news]}
new_def_test = pd.DataFrame(testing_news)
new_def_test["text"] = new_def_test["text"].apply(wordopt)
new_x_test = new_def_test["text"]
new_xv_test = vectorization.transform(new_x_test)
pred_LR = LR.predict(new_xv_test)

Jak w jednej sesji ucze i odpytuje siec to dziala dobrze. Jak zapisze model po uczeniu, i w nowej sesji zaladuje z pliku to nie dziala 🙁

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:11 minut
  • Postów:4935
0

Jakiej biblioteki używasz?


US
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:95
0
lion137 napisał(a):

Jakiej biblioteki używasz?

Kopiuj
from sklearn.linear_model import LogisticRegression
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:10 dni
  • Postów:2370
1
Usjwo napisał(a):

xv_test - uczenie modelu
new_xv_test - to nowy text dla ktorego oczekuje predykcji

Rozumiem. Pytanie miało na celu naprowadzić Cię określenie różnicy między strukturą xv_test i new_xv_test. Czy obydwie struktury mają tę samą liczbę cech?
Z czego może wynikać różnica? Ile cech generuje TfidVectorizer jeśli w konstruktorze nie określisz max_features?

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:11 minut
  • Postów:4935
0

@Usjwo
Zapisywanie i ładowanie modelu działa, błąd masz najprawdopodobniej przez podanie innego zbioru danych niż trenowany przed zapisaniem.


US
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:95
0

@lion137 Co masz na mysli 'innego zbioru danych niz trenowany przed zapisem'?

Kopiuj
with open(model_file, 'rb') as f:
        LR = joblib.load(f)
...
pred_LR = LR.predict(new_xv_test)

@yarel
To jest jakis trop. Jezeli uczenie modelu i odpytywanie sa w tej samej sesji, to do uczenia i odpytywania uzywam tego samego TfidfVectorizer.

Kopiuj
vectorization = TfidfVectorizer()
xv_train = vectorization.fit_transform(x_train)
xv_test = vectorization.transform(x_test)

....
new_xv_test = vectorization.transform(new_x_test)
pred_LR = LR.predict(new_xv_test)

W nowej sesji 'vectorization' jest tworzony na nowo (chociaz z tych samych danych), wic moze dlatego nie pasuje. Czy musze zapisac tez TfidfVectorizer i go potem zaladowac?

PS. W kwestii ML jestem noobem, wiec trzeba mi lopatologicznie 😜

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:11 minut
  • Postów:4935
0

Po wczytaniu z pliku, model zadziała zwróci predykcję tylko z tych samych danych na których był trenowany, ewentualnie nowy przypadek w takim samym formacie, kodowaniu, etc...

EDYCJA A jeszcze, vectorization po załadowaniu to to samo co z pierwszej sesji? Albo, czy działa dokładnie tak samo?


edytowany 1x, ostatnio: lion137
US
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:95
0

@lion137 z danymi nie powinno byc problemu. Jak trening i predykcja jest w tej samej sesji to wszystko dziala dobrze

Wyglada na to ze problem jest 'vectorization'. Wprawdzie jest on tworzony w ten sam sposob, ale nie potrafie powiedziec czy jest to dokladnie to samo 😭
Wieczorem bede mogl to sprawdzic (chyba, bo jak pisalem jestem noobem w tym temacie).

Pytanie. Czy jak zapisze 'vectorization' do pliku i potem go odtworze to powinno zadzialac? I czy to ma sens?

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:11 minut
  • Postów:4935
1

Tak, to jak najbardziej ma sens, poczytaj sobie dokumentację tej klasy; takie rzeczy jak encodingi, i inne też się serializuje, żeby odtworzyć pierwotne środowisko modelu.
Musisz z tym być bardzo uważny, tu dostałeś szybki komunikat, error, a w innym przypadku stworzyłbyś bezsensowny model, czsem nawet o tym nie wiedząc ;)


edytowany 2x, ostatnio: lion137
US
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:95
0

Prawde mowiac nie widze w ktorym momencie powinienem zapisac 'vectorization'
Ponizej kod. Jak pliki Tfidf.bin i modelLR.bin istnieja to laduje z nich dane (load_models), jak nie to tworze model (create_models)
Kod dziala jezeli nie ma plikow i model jest tworzony, jak zaladuje z plikow to dostaje error:
sklearn.exceptions.NotFittedError: The TF-IDF vectorizer is not fitted
Czegos tu brakuje bo 'vectorization' jest przypisane tylko raz

Kopiuj
vectorization = TfidfVectorizer()

Kod:

Kopiuj
def create_models(data_file, test_part):
    df_data = pd.read_csv(data_file)
    df_data = df_data.drop(["category", "rating"], axis=1)
    df_data["text_"] = df_data["text_"].apply(wordopt)
    x = df_data["text_"]
    y = df_data["label"]
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=test_part)

    #Vactorization
    xv_train = vectorization.fit_transform(x_train)
    xv_test = vectorization.transform(x_test)

    #Logistic Regression model
    LR.fit(xv_train, y_train)
    pred_lr = LR.predict(xv_test)
    LR.score(xv_test, y_test)
    print(classification_report(y_test, pred_lr))
    with open("modelLR.bin", 'wb') as f:
        joblib.dump(LR, f, compress=9)
    with open("Tfidf.bin", 'wb') as f:
        joblib.dump(vectorization, f, compress=9)
Kopiuj
def load_models():
    with open("Tfidf.bin", 'rb') as f:
        vectorization = joblib.load(f)
    with open("modelLR.bin", 'rb') as f:
        LR = joblib.load(f)
Kopiuj
vectorization = TfidfVectorizer()
LR = LogisticRegression()

if (Path("Tfidf.bin").is_file() and
        Path("modelLR.bin").is_file()):
    load_models()
else:
    create_models("reviews dataset.csv", 0.25)


news = open("test2.txt", "r")
content = news.read()
content = wordopt(content)
testing(content)
news.close()
Kopiuj
def testing(news):
    testing_news = {"text": [news]}
    new_def_test = pd.DataFrame(testing_news)
    new_def_test["text"] = new_def_test["text"].apply(wordopt)
    new_x_test = new_def_test["text"]
    new_xv_test = vectorization.transform(new_x_test)
    pred_LR = LR.predict(new_xv_test)
edytowany 1x, ostatnio: Usjwo
US
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:95
0

Dziala. Problem byl z zasiegiem zmiennych

Kopiuj
if (Path("Tfidf.bin").is_file() and
        Path("modelLR.bin").is_file()):
    pass
else:
    create_models("reviews dataset.csv", 0.25)

with open("Tfidf.bin", 'rb') as f:
    vectorization = joblib.load(f)
with open("modelLR.bin", 'rb') as f:
    LR = joblib.load(f)

news = open("test2.txt", "r")
content = news.read()
content = wordopt(content)
manual_testing(content)
news.close()
Kopiuj
def create_models(data_file, test_part):
    df_data = pd.read_csv(data_file)
     df_data = df_data.drop(["category", "rating"], axis=1)
    df_data["text_"] = df_data["text_"].apply(wordopt)
    x = df_data["text_"]
    y = df_data["label"]
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=test_part)
    #Vactorization
    vectorization = TfidfVectorizer()
    xv_train = vectorization.fit_transform(x_train)
    xv_test = vectorization.transform(x_test)
    with open("Tfidf.bin", 'wb') as f:
        joblib.dump(vectorization, f, compress=9)
    #Logistic Regression model
    LR = LogisticRegression()
    LR.fit(xv_train, y_train)
    pred_lr = LR.predict(xv_test)
    LR.score(xv_test, y_test)
    print(classification_report(y_test, pred_lr))
    with open("modelLR.bin", 'wb') as f:
        joblib.dump(LR, f, compress=9)
edytowany 1x, ostatnio: Usjwo

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.