Boostez les performances d’apprentissage automatique de 30% avec la normalisation et la normalisation
Ici, nous allons résoudre un problème de classification sans aucune mise à l’échelle.
Téléchargez l’ensemble de données sur le vin à partir de Kaggle. Il s’agit d’un simple ensemble de données dans lequel nous prédisons la variété de vin (ex: cab sauv, merlot, riesling).
import pandas as pdimport numpy as np
import pandas as pddf = pd.read_csv('Wine.csv', names=[
'Class', 'Alcohol', 'Malic acid',
'Ash', 'Alcalinity of ash', 'Magnesium',
'Total phenols', 'Flavanoids',
'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue',
'OD280/OD315 of diluted wines', 'Proline'])df.iloc[np.r_[0:2, -2:0]]
Vérifiez rapidement la forme des données.
df.describe()
df.hist(figsize=(25, 15))
Observez que les fonctionnalités sont à des échelles complètement différentes. De l’alcool qui va de 11.03
à 14.83
, tandis que Phénols non flavanoïdes plage de 0.13
à 0.66
.
Cela devrait vous donner l’équivalent en science des données de odeur de code. Des échelles variables confondent les modèles.
Mais jetons tout de même une régression logistique.
# helper functionsimport numpy as np
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.neighbors import KNeighborsClassifierdef dataframe_to_X_and_y(df):
X = np.asarray(
df[['Alcohol','Malic acid','Ash',
'Alcalinity of ash','Magnesium',
'Total phenols','Flavanoids',
'Nonflavanoid phenols',
'Proanthocyanins','Color intensity',
'Hue','OD280/OD315 of diluted wines',
'Proline']])y = np.asarray(df[['Class']])
return X, y
def split_data(X, y):
splitter = StratifiedShuffleSplit(n_splits=1, test_size=0.3, random_state=0)for train_index, test_index in splitter.split(X, y):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]return X_train, X_test, y_train, y_testdef fit_and_predict(X_train, y_train, X_test):
classifier = KNeighborsClassifier()
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)return y_pred
Classez les données et évaluez.
X, y = dataframe_to_X_and_y(df)
X_train, X_test, y_train, y_test = split_data(X, y)
y_pred = fit_and_predict(X_train, y_train, X_test)from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
Il en résulte une précision de 72%. Pas terrible mais je parie que nous pouvons faire mieux avec le scaling.