Skip to content

Synthèse : from scratch face à scikit-learn

Après avoir codé un moteur de régression et de classification à la main, une question légitime se pose : arrive-t-on au même résultat que scikit-learn ? Cette leçon compare directement les deux.

Régression : une correspondance quasi parfaite

Section titled “Régression : une correspondance quasi parfaite”
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(charge_cpu_std.reshape(-1, 1), consommation)
print("sklearn - coef:", reg.coef_, "intercept:", reg.intercept_)
print("sklearn - R2:", reg.score(charge_cpu_std.reshape(-1, 1), consommation))
sklearn - coef: [199.23741321] intercept: 519.7067000946721
sklearn - R2: 0.9954489706379677

En comparant à la leçon 3 (theta appris (pente, biais): [199.23741321 519.70670009], R² identique) : les deux approches convergent vers exactement les mêmes paramètres, au dix-millième près. C’est attendu : la régression linéaire avec un coût MSE a une solution optimale unique (la fonction de coût est convexe), et scikit-learn comme notre descente de gradient batch la trouvent tous les deux — l’un par une formule fermée (résolution matricielle directe), l’autre itérativement.

Classification : même direction, magnitude différente

Section titled “Classification : même direction, magnitude différente”
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(X_train[:, :2], y_train.ravel()) # sans la colonne de biais, sklearn la gere seule
print("sklearn - coef:", clf.coef_, "intercept:", clf.intercept_)
print("sklearn - accuracy test:", clf.score(X_test[:, :2], y_test.ravel()))
sklearn - coef: [[-2.01928015 2.60016492]] intercept: [0.05649571]
sklearn - accuracy test: 1.0

Comparé à notre theta from scratch ([-3.38734958, 3.80016512, 0.06211782]) : le signe de chaque coefficient concorde (négatif pour le débit, positif pour la latence — les deux modèles ont appris la même logique), et l’accuracy de test est identique (100 %). En revanche, la magnitude diffère : LogisticRegression de scikit-learn applique par défaut une régularisation L2, qui pénalise les coefficients de grande valeur pour limiter le sur-apprentissage — un mécanisme que notre version from scratch, volontairement minimale, n’implémente pas. Les deux modèles sont corrects ; ils optimisent simplement deux fonctions de coût légèrement différentes (log-loss pur, contre log-loss + pénalité de régularisation).

  • Un modèle de régression ou de classification n’est, sous le capot, qu’une matrice de paramètres optimisée par descente de gradient sur une fonction de coût dérivable.
  • La standardisation des features n’est pas cosmétique : son absence peut faire diverger un entraînement par ailleurs correctement écrit.
  • Les bibliothèques comme scikit-learn n’utilisent pas de « magie » supplémentaire pour les modèles linéaires — elles ajoutent des optimisations numériques (résolution directe, régularisation) et une ergonomie que ce module a volontairement mises de côté pour se concentrer sur les fondations mathématiques.

Cette compréhension du « sous le capot » est directement transférable à des services managés qui exposent ces mêmes algorithmes en boîte noire (par exemple AWS SageMaker Linear Learner) : savoir ce qu’ils optimisent réellement aide à diagnostiquer un entraînement qui se passe mal.

👉 Module 4 : Classification supervisée avec scikit-learn


Junior TSAFACK – 12/09/2026