es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Realice una validación cruzada con un modelo de regresión GLM en Python.

¿Cómo realizo la validación cruzada con un modelo de regresión GLM?

He creado un modelo glm <code>sm.GLM(endog, exog, family=sm.families.Gamma(link=sm.families.links.log())).fit()</code> y necesitaría validar el resultado, sin embargo, no puedo encontrar una forma de hacerlo con el modelo sm.GLM. He encontrado varios ejemplos en los que se utiliza <code>model = LogisticRegression()</code>, pero esto no se aplica a mis datos.

Aquí está el código:

import pandas as pd
import statsmodels.api as sm
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.model_selection import KFold

Test = pd.read_csv(r'D:\myfile.csv')

endog = Test['Y']
exog = Test[['log_X1', 'log_A', 'log_B']]

glm_model = sm.GLM(endog, exog, family=sm.families.Gaussian(link=sm.families.links.log())).fit()
y_pred = glm_model.predict()

scoring = "neg_root_mean_squared_error"
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.30, random_state=1)
crossvalidation = KFold(n_splits=10)
scores = cross_val_score(glm_model, X_train, y_train, scoring="neg mean_squared_error", cv=crossvalidation)

Con la línea en particular, obtengo un error. ¿Quizás hay otras formas de hacer esto?

scores = cross_val_score(glm_model, X_train, y_train, scoring="neg mean_squared_error", cv=crossvalidation)
TypeError: el estimador debe ser un estimador que implemente el método 'fit', se pasó <statsmodels.genmod.generalized_linear_model.glmresultswrapper object="" at="" 0x000002972a2181f0="">

</statsmodels.genmod.generalized_linear_model.glmresultswrapper>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, parece que la función cross_val_score de scikit-learn no funciona con modelos sm.GLM. Sin embargo, una forma de realizar validación cruzada con modelos de regresión GLM es utilizando la función sm.stats.anova_lm de statsmodels.api para realizar manualmente la validación cruzada.

    Aquí tienes un ejemplo de código sobre cómo realizar una validación cruzada de 10 pliegues con un modelo sm.GLM:

    import numpy as np
    import pandas as pd
    import statsmodels.api as sm
    from sklearn.model_selection import KFold
    
    # cargar los datos
    data = pd.read_csv('data.csv')
    y = data['y']
    X = data[['x1', 'x2', 'x3']]
    
    # crear el modelo GLM
    glm_model = sm.GLM(y, X, family=sm.families.Gaussian()).fit()
    
    # realizar la validación cruzada de 10 pliegues
    n_splits = 10
    kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
    
    mse_cv = []
    for train_idx, val_idx in kf.split(X):
        X_train, y_train = X.iloc[train_idx], y.iloc[train_idx]
        X_val, y_val = X.iloc[val_idx], y.iloc[val_idx]
    
        glm_model_fold = sm.GLM(y_train, X_train, family=sm.families.Gaussian()).fit()
        y_val_pred = glm_model_fold.predict(X_val)
        mse_fold = np.mean((y_val - y_val_pred)**2)
        mse_cv.append(mse_fold)
    
    print('MSE promedio: {}'.format(np.mean(mse_cv)))
    

    En el código anterior, kf.split(X) divide los datos en 10 pliegues y el bucle for itera a través de cada pliegue. Dentro del bucle, los datos de entrenamiento de cada pliegue se utilizan para ajustar un nuevo modelo sm.GLM (glm_model_fold), y los datos de validación se utilizan para evaluar el error cuadrático medio (MSE) de las predicciones del modelo. Después de iterar a través de todos los pliegues, se imprime el MSE promedio como métrica de validación cruzada.

Comments are closed.