Boostez les performances d’apprentissage automatique de 30% avec la normalisation et la normalisation

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 pd
df = 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 KNeighborsClassifier
def 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.