2. Multivariate Analyse in Python 8-3. K Nachbarschaftsmethode [Schnittstellenüberprüfung]

Das vorherige hat den Unterschied zwischen den beiden ** Arten von Gewichtungsfunktionen einheitlich und Abstand ** in der * k-Nachbarschaftsmethode visuell erfasst.

import numpy as np
import pandas as pd

#sklearn-basierte Bibliotheken
from sklearn import datasets #Datensatz
from sklearn.model_selection import train_test_split #Datenaufteilung
from sklearn.neighbors import KNeighborsClassifier #Klassifizierungsmodell
from sklearn.neighbors import KNeighborsRegressor #Regressionsmodell

#Matplotlib-basierte Bibliotheken
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

!pip install japanize-matplotlib #Japanisches Display-kompatibles Modul
import japanize_matplotlib

Rückgabe Modell-Boston Hauspreis-

⑴ Datenerstellung

#Datensatz abrufen
boston = datasets.load_boston()

#Extrahieren Sie erklärende Variablen und objektive Variablen
X = boston.data[:, 5].reshape(len(boston.data), 1)
y = (boston.target).reshape(len(boston.target), 1)

#Datenaufteilung für Training / Test
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

⑵ Gegenüberstellung

#k Parameter
n_neighbors = 14

#Variable, die die Genauigkeitsrate speichert
score = []

for w in ['uniform', 'distance']:
    #Modellgenerierung
    model = KNeighborsRegressor(n_neighbors, weights=w)
    model = model.fit(X_train, y_train)

    #Richtige Antwortrate der Trainingsdaten
    r_train = model.score(X_train, y_train)
    score.append(r_train)

    #Richtige Antwortrate der Testdaten
    r_test = model.score(X_test, y_test)    
    score.append(r_test)

#In einem Datenrahmen dargestellt
score = np.array(score)
pd.DataFrame(score.reshape(2,2), 
             columns = ['train', 'test'],
             index = ['uniform', 'distance'])

image.png

⑶ Visualisierung

#k Parameter
n_neighbors = 14

#Instanzgenerierung
model_u = KNeighborsRegressor(n_neighbors, weights='uniform')
model_d = KNeighborsRegressor(n_neighbors, weights='distance')

#Modellgenerierung
model_u = model_u.fit(X_train, y_train)
model_d = model_d.fit(X_train, y_train)

#Prognose
y_u = model_u.predict(X_test)
y_d = model_d.predict(X_test)
plt.figure(figsize=(14,6))

#Streudiagramm
plt.scatter(X_test, y_u, color='slateblue', lw=1, label='Voraussichtlicher Wert(uniform)')
plt.scatter(X_test, y_d, color='tomato', lw=1, label='Voraussichtlicher Wert(distance)')
plt.scatter(X_test, y_test, color='lightgrey', label='Gemessener Wert(test)')

plt.legend(fontsize=15)
plt.xlim(3, 9.5)
plt.show()

image.png

Klassifizierung Modelllänge und Breite der Irisstücke-

  • Der an sklearn angehängte Datensatz "Iris" wird verwendet. Da wir das Problem jedoch vereinfachen möchten, beschränken wir die Zielvariable "Typ" auf nur zwei (versicolour = 1, virginica = 2) und klassifizieren sie als binär. ..
  • Bei diesen beiden Typen ist es schwierig, die Grenze zwischen den beiden angegebenen Variablen zu teilen, da die Individuen gemischt sind. Wenn Sie das wissen, beobachten Sie den Unterschied zwischen Uniform und Abstand.

⑴ Datenerstellung

#Datensatz abrufen
iris = datasets.load_iris()

#Extrahieren Sie nur erklärende Variablen und objektive Variablen
X = iris.data[:, :2]
y = iris.target
y = y.reshape(-1, 1) #Formkonvertierung

#Stellen Sie jede Variable ein, nachdem Sie nur 2 Werte extrahiert haben
data = np.hstack([X, y]) # X,Kombiniere y
data = data[data[:, 2] != 0] #Extrahieren Sie nur 2 Werte
X = data[:, :2]
y = data[:, -1]

#Datenaufteilung
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify = y, random_state = 0)

⑵ Gegenüberstellung

  • Der Parameter k (Anzahl von k) wird nach dem [vorherigen] auf 15 gesetzt (https://qiita.com/y_itoh/items/004b75add495f1903331).
#k Parameter
n_neighbors = 15

#Variable, die die Genauigkeitsrate speichert
score = []

for i, w in enumerate(['uniform', 'distance']):
    #Modellgenerierung
    model = KNeighborsClassifier(n_neighbors, weights=w)
    model = model.fit(X_train, y_train)

    #Trainingsdaten
    r_train = model.score(X_train, y_train)
    score.append(r_train)

    #Testdaten
    r_test = model.score(X_test, y_test)    
    score.append(r_test)

#In einem Datenrahmen dargestellt
score = np.array(score)
pd.DataFrame(score.reshape(2,2), 
             columns = ['train', 'test'],
             index = ['uniform', 'distance'])

image.png

  • Die Uniform beträgt 74,7% für Trainingsdaten und 60,0% für Testdaten.
  • Andererseits ist die Entfernung eine hohe Rate von 92,0% in den Trainingsdaten, was einer 40% igen Abnahme der Testdaten auf 52,0% entspricht.

⑶ Visualisierung

  • Der an das Modell übergebene Maschenabstand zur Vorhersage der Grenze beträgt ebenfalls 0,02. Dies entspricht Letztes Mal.
#k Parameter
n_neighbors = 15

#Maschenabstand
h = 0.02

#Generieren Sie eine Farbkarte für die Zuordnung
cmap_surface = ListedColormap(['mistyrose', 'lightcyan'])
cmap_dot = ListedColormap(['tomato', 'slateblue'])
  • Übergeben Sie dieselben Testdaten an zwei Modelle, deren Gewichtsfunktionen einheitlich bzw. distanziert sind, generieren Sie eine Grenze und zeichnen Sie dort die gemessenen Testdaten auf.
plt.figure(figsize=(18,6))

for j, w in enumerate(['uniform', 'distance']):
    #Modell generieren
    model = KNeighborsClassifier(n_neighbors, weights = w)
    model = model.fit(X_train, y_train)

    #Testdaten einstellen
    X, y = X_test, y_test

    # x,Ermitteln Sie die Minimal- und Maximalwerte der y-Achse
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

    #Generieren Sie Rasterspalten in festgelegten Netzintervallen
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), 
                         np.arange(y_min, y_max, h))

    #Vorhersage durch Übergabe der Gittersequenz an das Modell
    z = np.c_[xx.ravel(), yy.ravel()] #Auf eine Dimension reduzieren und dann verbinden
    Z = model.predict(z) #Prognose
    Z = Z.reshape(xx.shape) #Formkonvertierung

    #Zeichnung
    plt.subplot(1, 2, j + 1)
    plt.pcolormesh(xx, yy, Z, cmap=cmap_surface) #Farbdiagramm
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_dot, s=30)

    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.xlabel('Die Länge des Stückes', fontsize=12)
    plt.ylabel('Breite des Stückes', fontsize=12)
    plt.title("'%s'" % (w), fontsize=18)

plt.show()

image.png

  • Das Distanzmodell weist aufgrund von Übertraining in den Trainingsdaten komplizierte Grenzen auf, und es gibt überall Flecken, die jedoch nicht zu den Testdaten passen und bedeutungslos sind.
  • Die Idee der Uniform ist, dass die Positionsbeziehung konstant ist (immer konstant) und der Abstand zwischen ihnen als zufällig angesehen wird (es ist zufällig passiert).
  • Die Entfernung, die Eventualitäten wie Informationen erfasst und die Eigenschaften der Daten stark widerspiegelt, scheint für die Generierung von Modellen, die Allgemeinheit erfordert, ungeeignet zu sein.

Recommended Posts