Je veux calculer l'AIC pour les modèles linéaires afin de comparer leur complexité. Je l'ai fait comme suit:
regr = linear_model.LinearRegression()
regr.fit(X, y)
aic_intercept_slope = aic(y, regr.coef_[0] * X.as_matrix() + regr.intercept_, k=1)
def aic(y, y_pred, k):
resid = y - y_pred.ravel()
sse = sum(resid ** 2)
AIC = 2*k - 2*np.log(sse)
return AIC
Mais je reçois un divide by zero encountered in log
Erreur.
sklearn
's LinearRegression
est bon pour la prédiction mais assez simple comme vous l'avez découvert. (On dit souvent que sklearn reste à l'écart de tout ce qui concerne l'inférence statistique.)
statsmodels.regression.linear_model.OLS
a un attribut de propriété AIC
et un certain nombre d'autres attributs prédéfinis.
Cependant, notez que vous devrez ajouter manuellement un vecteur unitaire à votre matrice X
pour inclure une interception dans votre modèle.
from statsmodels.regression.linear_model import OLS
from statsmodels.tools import add_constant
regr = OLS(y, add_constant(X)).fit()
print(regr.aic)
La source est ici si vous cherchez une autre façon d'écrire manuellement tout en utilisant sklearn
.