¿Cómo puedo lidiar con el grado polinomial cuando quiero guardar un modelo polinomial, sicne esta información no se está guardando?

import pandas as pd
import numpy as np
import joblib
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

df = pd.DataFrame({
        "a": np.random.uniform(0.0, 1.0, 1000),
        "b": np.random.uniform(10.0, 14.0, 1000),
        "c": np.random.uniform(100.0, 1000.0, 1000)})



def data():
    X_train, X_val, y_train, y_val  = train_test_split(df.iloc[:, :2].values,
                                                       df.iloc[:, 2].values,
                                                       test_size=0.2,
                                                       random_state=1340)
       
    return X_train, X_val, y_train, y_val


X_train, X_val, y_train, y_val = data()


poly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(X_train)

poly_reg_model = LinearRegression().fit(X_poly, y_train)



poly_model = joblib.dump(poly_reg_model, 'themodel')

y_pred = poly_reg_model.predict(poly_reg.fit_transform(X_val))

themodel = joblib.load('themodel')

Ahora, si trato de predecir:

themodel.predict(X_val), estoy recibiendo:

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 6 is different from 2)

Tengo que hacer:

pol_feat = PolynomialFeatures(degree=2) themodel.predict(pol_feat.fit_transform(X_val))

Para que funcione. Entonces, ¿cómo puedo almacenar esta información para poder usar el modelo para la predicción?

0
George 23 jul. 2020 a las 12:07

1 respuesta

La mejor respuesta

Tienes que encurtir PolynomialFeatures entrenado también:

# train and pickle
poly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(X_train)
poly_reg_model = LinearRegression().fit(X_poly, y_train)

joblib.dump(poly_reg_model, 'themodel')
joblib.dump(poly_reg, 'poilynomia_features_model')

# load and predict
poilynomia_features_model = joblib.load('poilynomia_features_model')
themodel = joblib.load('themodel')

X_val_prep = poilynomia_features_model.transform(X_val)
predictions = themodel.predict(X_val_prep)

Pero lo mejor será incluir todos los pasos en la única canalización :

pipeline = Pipeline(steps=[('poilynomia', PolynomialFeatures()), 
                           ('lr', LinearRegression())])

pipeline.fit(X_train, y_train)
pipeline.predict(X_val)
2
Danylo Baibak 23 jul. 2020 a las 09:50