3 votes

Diagnostic du tracé résiduel et comment améliorer le modèle de régression

Lors de la création de modèles de régression pour cette données sur les logements nous pouvons tracer les résidus en fonction des valeurs réelles.

from sklearn.linear_model import LinearRegression

X = housing[['lotsize']]
y = housing[['price']]

model = LinearRegression()
model.fit(X, y)

plt.scatter(y,model.predict(X)-y)

enter image description here

Nous pouvons clairement voir que la différence (prédiction - valeur réelle) est principalement positive pour les prix inférieurs, et la différence est négative pour les prix supérieurs.

C'est vrai pour la régression linéaire, car le modèle est optimisé pour la RMSE (le signe du résidu n'est donc pas pris en compte).

Mais quand on fait le KNN

from sklearn.neighbors import KNeighborsRegressor
model = KNeighborsRegressor(n_neighbors = 3)

On peut trouver un tracé similaire.

enter image description here

Dans ce cas, quelle interprétation pouvons-nous donner, et comment pouvons-nous améliorer le modèle.

EDIT : nous pouvons utiliser tous les autres prédicteurs, les résultats sont similaires.

housing = housing.replace(to_replace='yes', value=1, regex=True)
housing = housing.replace(to_replace='no', value=0, regex=True)
X = housing[['lotsize','bedrooms','stories','bathrms','bathrms','driveway','recroom',
        'fullbase','gashw','airco','garagepl','prefarea']]

Le graphique suivant est pour KNN avec 3 voisins. Avec 3 voisins, on pourrait s'attendre à un sur-ajustement, je n'arrive pas à comprendre pourquoi il y a cette tendance.

enter image description here

1voto

StupidWolf Points 34348

Si vous regardez l'ajustement :

plt.scatter(X,y)
plt.plot(X,model.predict(X), '--k')

enter image description here

Vous obtenez des valeurs négatives pour les valeurs élevées de y parce qu'il y a un groupe de données autour de x=8000 avec des valeurs élevées de y qui s'écartent beaucoup de ce que vous attendez.

Maintenant, si vous faites un knn, gardez à l'esprit que votre variable indépendante n'est qu'unidimensionnelle, c'est-à-dire que vous définissez des voisins sur la base de votre taille de lot, et que vous utilisez la moyenne des groupes comme valeur prédictive. Pour ces valeurs aberrantes autour de x=8000, elles seront regroupées avec des valeurs inférieures, ce qui rendra la différence négative.

Si vous mettez tout ça en place :

plt.scatter(X,y)
plt.scatter(X,model.predict(X))

enter image description here

Comment améliorer le modèle ? Avec un seul prédicteur, il n'y a pas grand chose à faire, peut-être catégoriser lotsize mais je doute que cela change grand-chose. Il est plus probable que vous ayez besoin d'autres variables pour voir ce qui cause cette bosse autour de lotsize = 8000, puis vous pourrez mieux modéliser la variable dépendante.

0 votes

Merci stupidwolf pour votre réponse. vous pouvez ajouter les autres prédicteurs. cela change beaucoup les résultats.

0 votes

Désolé, il y avait une erreur de frappe, cela ne change pas beaucoup les résultats.

0 votes

Il y a une tendance claire lorsque l'on trace le résidu en fonction des valeurs réelles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X