.. _winesknnrst: ==================== Plus proches voisins ==================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`PDF `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/lectures/wines_knn.ipynb|*` On cherche à prédire la note d’un vin avec un modèle des plus proches voisins. .. code:: ipython3 %matplotlib inline .. code:: ipython3 from papierstat.datasets import load_wines_dataset df = load_wines_dataset() df.head() .. raw:: html
fixed_acidity volatile_acidity citric_acid residual_sugar chlorides free_sulfur_dioxide total_sulfur_dioxide density pH sulphates alcohol quality color
0 7.4 0.70 0.00 1.9 0.076 11.0 34.0 0.9978 3.51 0.56 9.4 5 red
1 7.8 0.88 0.00 2.6 0.098 25.0 67.0 0.9968 3.20 0.68 9.8 5 red
2 7.8 0.76 0.04 2.3 0.092 15.0 54.0 0.9970 3.26 0.65 9.8 5 red
3 11.2 0.28 0.56 1.9 0.075 17.0 60.0 0.9980 3.16 0.58 9.8 6 red
4 7.4 0.70 0.00 1.9 0.076 11.0 34.0 0.9978 3.51 0.56 9.4 5 red
Les premières colonnes contiennent les composants du vins ou plutôt les résultats de mesures chimiques. Cela exclut la qualité et la couleur qui n’est pas une information numérique. On les appelle les **variables** ou **features**. C’est ce qui est connu au moment de faire une prédiction. .. code:: ipython3 X = df.drop(['quality', 'color'], axis=1) La colonne *qualité* est ce qu’on cherche à prédire. .. code:: ipython3 y = df['quality'] On cale un modèle des plus proches voisins. Celui mémorise simplement tous les exemples. Le paramètre *n_neighbors* précise le nombre de voisins qui prennent pas à la prédiction. Dans notre cas, c’est juste 1. .. code:: ipython3 from sklearn.neighbors import KNeighborsRegressor knn = KNeighborsRegressor(n_neighbors=1) knn.fit(X, y) .. parsed-literal:: KNeighborsRegressor(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=1, p=2, weights='uniform') On regarde la prédiction pour un vin quelconque tiré de la base. .. code:: ipython3 import random i = random.randint(0, df.shape[0]-1) vin = X.iloc[i:i+1,:] knn.predict(vin) .. parsed-literal:: array([5.]) On la compare à la note enregistrée dans la base. .. code:: ipython3 y[i] .. parsed-literal:: 5 Tout se passe bien.