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 officielle
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
def normaliser_features(df):
scaler = StandardScaler()
scaled = scaler.fit_transform(df)
df_normalise = pd.DataFrame(scaled, columns=df.columns)
moyennes = {col: float(m) for col, m in zip(df.columns, scaler.mean_)}
ecarts_types = {col: float(s) for col, s in zip(df.columns, scaler.scale_)}
return {'df_normalise': df_normalise, 'moyennes': moyennes, 'ecarts_types': ecarts_types}