Exercices Machine Learning StandardScaler : normaliser les features
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

StandardScaler : normaliser les features

Tu as deux features : l'age (entre 18 et 80) et le salaire (entre 20000 et 200000). Sans normalisation, des algorithmes comme KNN ou SVM vont penser que le salaire est plus important juste parce que ses valeurs sont plus grandes. C'est un biais technique qui n'a rien a voir avec l'importance reelle de la feature.

Pour eviter ca, on normalise les features. Le StandardScaler transforme chaque colonne pour qu'elle ait une moyenne de 0 et un ecart-type de 1. La formule : z = (x - moyenne) / ecart_type.

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
scaler.mean_ # les moyennes par colonne
scaler.scale_ # les ecarts-types par colonne

Écris une fonction normaliser_features(df) qui prend un DataFrame numerique, applique le StandardScaler, et renvoie un dictionnaire avec :
'df_normalise' : un DataFrame avec les memes colonnes mais les valeurs normalisees
'moyennes' : un dictionnaire colonne -> moyenne originale
'ecarts_types' : un dictionnaire colonne -> ecart-type original

Exemple :

df = pd.DataFrame({'a': [10, 20, 30]})
result = normaliser_features(df)
# result['df_normalise']['a'] est environ [-1.22, 0.0, 1.22]
# result['moyennes'] == {'a': 20.0}

Tests (4/4)

Moyenne a zero
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [10.0, 20.0, 30.0], 'b': [100.0, 200.0, 300.0]})
result = normaliser_features(df)
assert abs(result['df_normalise']['a'].mean()) < 1e-9
assert abs(result['df_normalise']['b'].mean()) < 1e-9
Ecart-type a un
import pandas as pd
import numpy as np
df = pd.DataFrame({'x': [1.0, 2.0, 3.0, 4.0, 5.0]})
result = normaliser_features(df)
assert abs(result['df_normalise']['x'].std(ddof=0) - 1.0) < 1e-6
Moyennes originales
import pandas as pd
df = pd.DataFrame({'a': [10.0, 20.0, 30.0]})
result = normaliser_features(df)
assert abs(result['moyennes']['a'] - 20.0) < 1e-9
Colonnes preservees
import pandas as pd
df = pd.DataFrame({'age': [25.0, 35.0], 'salaire': [3000.0, 5000.0]})
result = normaliser_features(df)
assert list(result['df_normalise'].columns) == ['age', 'salaire']

Indices (3 disponibles)

solution.py