Können wir das ML-Modell (Pickle-Datei) robuster machen, indem wir neue Funktionen akzeptieren (oder ignorieren)?

Nov 19 2020
  • Ich habe ein ML-Modell trainiert und in einer Pickle-Datei gespeichert.
  • In meinem neuen Skript lese ich neue 'reale Daten', für die ich eine Vorhersage machen möchte.

Ich kämpfe jedoch. Ich habe eine Spalte (mit Zeichenfolgenwerten), wie:

Sex       
Male       
Female
# This is just as example, in real it is having much more unique values

Jetzt kommt das Problem. Ich habe einen neuen (eindeutigen) Wert erhalten und kann jetzt keine Vorhersagen mehr treffen (z 'Neutral'. B. wurde hinzugefügt).

Da ich die 'Sex'Spalte in Dummies umwandle, habe ich das Problem, dass mein Modell die Eingabe nicht mehr akzeptiert.

Die Anzahl der Merkmale des Modells muss mit der Eingabe übereinstimmen. Das Modell n_features ist 2 und die Eingabe n_features ist 3

Daher meine Frage: Gibt es eine Möglichkeit, mein Modell robust zu machen und diese Klasse einfach zu ignorieren? Aber machen Sie eine Vorhersage ohne die spezifischen Informationen?

Was ich versucht habe:

df = pd.read_csv('dataset_that_i_want_to_predict.csv')
model = pickle.load(open("model_trained.sav", 'rb'))

# I have an 'example_df' containing just 1 row of training data (this is exactly what the model needs)
example_df = pd.read_csv('reading_one_row_of_trainings_data.csv')

# Checking for missing columns, and adding that to the new dataset 
missing_cols = set(example_df.columns) - set(df.columns)
for column in missing_cols:
    df[column] = 0 #adding the missing columns, with 0 values (Which is ok. since everything is dummy)

# make sure that we have the same order 
df = df[example_df.columns] 

# The prediction will lead to an error!
results = model.predict(df)

# ValueError: Number of features of the model must match the input. Model n_features is X and n_features is Y

Beachten Sie, dass ich gesucht habe, aber keine hilfreiche Lösung gefunden habe (nicht hier , hier oder hier

AKTUALISIEREN

Auch diesen Artikel gefunden. Aber das gleiche Problem hier ... wir können den Testsatz mit den gleichen Spalten wie den Trainingssatz erstellen ... aber was ist mit neuen Daten aus der realen Welt (z. B. dem neuen Wert 'Neutral')?

Antworten

7 Venkatachalam Nov 23 2020 at 07:56

Ja, Sie können nach Abschluss des Schulungsteils keine neue Kategorie oder Funktion in ein Dataset aufnehmen (das Modell aktualisieren). OneHotEncoderMöglicherweise wird das Problem behoben, dass in einigen Funktionen der Testdaten neue Kategorien enthalten sind. Es wird dafür gesorgt, dass die Spalten in Ihren Trainings- und Testdaten in Bezug auf kategoriale Variablen konsistent bleiben.

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd
from sklearn import set_config
set_config(print_changed_only=True)
df = pd.DataFrame({'feature_1': np.random.rand(20),
                   'feature_2': np.random.choice(['male', 'female'], (20,))})
target = pd.Series(np.random.choice(['yes', 'no'], (20,)))

model = Pipeline([('preprocess',
                   ColumnTransformer([('ohe',
                                       OneHotEncoder(handle_unknown='ignore'), [1])],
                                       remainder='passthrough')),
                  ('lr', LogisticRegression())])

model.fit(df, target)

# let us introduce new categories in feature_2 in test data
test_df = pd.DataFrame({'feature_1': np.random.rand(20),
                        'feature_2': np.random.choice(['male', 'female', 'neutral', 'unknown'], (20,))})
model.predict(test_df)
# array(['yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes',
#       'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes',
#       'yes', 'yes'], dtype=object)