[PYTHON] Wenden Sie die Einflussfunktion auf die logistische Regression an

Was ist Einflussfunktion

Die in Grundlegendes zu Black-Box-Vorhersagen über Einflussfunktionen vorgeschlagene Funktion, die das beste Papier von ICML2017 ist, gibt dem maschinellen Lernmodell die vom Trainingsbeispiel angegebenen Störungen. Es ist eine Formulierung.

Die Gliederung und Erläuterung des Dokuments finden Sie unter hier und hier.

In diesem Artikel werden wir einige Experimente durchführen, um das Verhalten der Einflussfunktion zu verstehen.

Logistische Regression und Einflussfunktion

Informationen zur logistischen Regression finden Sie unter Diese Implementierung.

Verwenden Sie den Iris-Datensatz
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

#Iris-Datensatz
iris = load_iris()

#Verwenden Sie nur die Länge und Breite von Setosa und Versicolor
X = iris.data[iris.target != 2][:, :2]
Y = iris.target[iris.target != 2]

#Standardisierung
X = StandardScaler().fit_transform(X)

#Streudiagramm
plt.scatter(X[:,0][Y == 0], X[:,1][Y == 0], label=iris.target_names[0], marker='o') 
plt.scatter(X[:,0][Y == 1], X[:,1][Y == 1], label=iris.target_names[1], marker='x')
plt.legend()
plt.show()
Zunächst implementieren wir normalerweise die logistische Regression, wenden sie auf das Iris-Dataset an und veranschaulichen die Entscheidungsgrenzen.
def sigmoid(x):
    """Sigmaid-Funktion"""
    return 1 / (1 + np.exp(-x))

def logistic_regression(X,Y):
    """Logistische Rückgabe"""
    ETA = 1e-3  #Lernrate
    epochs = 5000  #Anzahl der Updates
    
    #Spalte 0 für die Berechnung des Bias-Terms hinzugefügt
    X = np.hstack([np.ones([X.shape[0],1]),X])

    #Parameterinitialisierung
    theta = np.random.rand(3)

    print('Parameter vor Aktualisierung θ')
    print(theta)

    #Parameteraktualisierung
    for _ in range(epochs):
        theta = theta + ETA * np.dot(Y - sigmoid(np.dot(X, theta)), X)

    print('Aktualisierter Parameter θ')
    print(theta)

    print('Entscheidungsgrenze')
    print('y = {:0.3f} + {:0.3f} * x1 + {:0.3f} * x2'.format(theta[0], theta[1], theta[2]))

    return theta

def decision_boundary(xline, theta):
    """Entscheidungsgrenze"""
    return -(theta[0] + theta[1] * xline) / theta[2]

theta = logistic_regression(X,Y)

#Darstellung der Probendaten
plt.plot(X[Y==0, 0],X[Y==0,1],'o', label=iris.target_names[0])
plt.plot(X[Y==1, 0],X[Y==1,1],'x', label=iris.target_names[1])

xline = np.linspace(np.min(X[:,0]),np.max(X[:,0]),100)

#Entscheidungsgrenzplot
plt.plot(xline, decision_boundary(xline, theta), label='decision boundary')
plt.legend()
plt.show()

influence1.png

Implementieren Sie als Nächstes die Einflussfunktion. (Es tut mir leid, wenn die Implementierung falsch ist!)
#Einflussfunktion ist y in{1,-1}Konvertieren Sie Y auf diese Weise
Y1 = np.copy(Y)
Y1[Y1==0] = -1

#Spalte 0 für die Berechnung des Bias-Terms hinzugefügt
X1 = np.hstack([np.ones([X.shape[0],1]),X])

def get_influence(x,y,theta):
    """Funktion beeinflussen"""
    H = (1/X1.shape[0]) * np.sum(np.array([sigmoid(np.dot(xi, theta)) * sigmoid(-np.dot(xi, theta)) * np.dot(xi.reshape(-1,1), xi.reshape(1,-1)) for xi in X1]), axis=0)
    return - y * sigmoid(- y * np.dot(theta, x)) * np.dot(-Y1 * sigmoid(np.dot(Y1, np.dot(theta, X1.T))), np.dot(x, np.dot(np.linalg.inv(H), X1.T)))

#Liste der Einflusswerte für jede Probe
influence_list = [get_influence(x,y,theta) for x,y in zip(X1,Y1)]

#Plot einschließlich Einflusswert
plt.figure(figsize=(12,8))
plt.plot(X[Y==0, 0],X[Y==0,1],'o')
plt.plot(X[Y==1, 0],X[Y==1,1],'x')
plt.plot(xline, decision_boundary(xline, theta), label='decision boundary')
#Einflusswert in Grafik einfügen
for x,influence in zip(X, influence_list):
    plt.annotate(f"{influence:.1f}", xy=(x[0], x[1]), size=10)
plt.legend()
plt.show()

Die folgende Abbildung zeigt die Einflusswerte der einzelnen Proben zusammen aufgetragen.

influence2.png

Es ist ersichtlich, dass der Einflusswert umso höher ist, je näher die Stichprobe an der Entscheidungsgrenze liegt.

Wenn die falsche Bezeichnung absichtlich gemischt wird

Fehlbezeichnungen sind falsche Beschriftungen, die dazu führen können, dass das Modell falsch lernt oder eine ordnungsgemäße Bewertung verhindert.

Hier werden wir untersuchen, wie hoch der Einflusswert sein wird, indem wir absichtliche Fehlbezeichnungen mischen.

Einige Labels werden absichtlich ersetzt. Wenn Sie sich die Abbildung unten ansehen, sehen Sie, dass es ein eindeutig falsches Etikett gibt.
#Ersetzen Sie absichtlich einige Etiketten
Y[76] = 0
Y[22] = 1

#Streudiagramm
plt.scatter(X[:,0][Y == 0], X[:,1][Y == 0], label=iris.target_names[0], marker='o') 
plt.scatter(X[:,0][Y == 1], X[:,1][Y == 1], label=iris.target_names[1], marker='x')
plt.legend()
plt.show()

influence3.png

Wenden Sie für diese Daten die logistische Regression auf die gleiche Weise wie oben an, berechnen Sie den Einflusswert und veranschaulichen Sie ihn wie folgt.
theta = logistic_regression(X,Y)

#Einflussfunktion ist y in{1,-1}Konvertieren Sie Y auf diese Weise
Y1 = np.copy(Y)
Y1[Y1==0] = -1

#Spalte 0 für die Berechnung des Bias-Terms hinzugefügt
X1 = np.hstack([np.ones([X.shape[0],1]),X])

def get_influence(x,y,theta):
    """Funktion beeinflussen"""
    H = (1/X1.shape[0]) * np.sum(np.array([sigmoid(np.dot(xi, theta)) * sigmoid(-np.dot(xi, theta)) * np.dot(xi.reshape(-1,1), xi.reshape(1,-1)) for xi in X1]), axis=0)
    return - y * sigmoid(- y * np.dot(theta, x)) * np.dot(-Y1 * sigmoid(np.dot(Y1, np.dot(theta, X1.T))), np.dot(x, np.dot(np.linalg.inv(H), X1.T)))

#Liste der Einflusswerte für jede Probe
influence_list = [get_influence(x,y,theta) for x,y in zip(X1,Y1)]

#Plot einschließlich Einflusswert
plt.figure(figsize=(12,8))
plt.plot(X[Y==0, 0],X[Y==0,1],'o')
plt.plot(X[Y==1, 0],X[Y==1,1],'x')
plt.plot(xline, decision_boundary(xline, theta), label='decision boundary')
#Einflusswert in Grafik einfügen
for x,influence in zip(X, influence_list):
    plt.annotate(f"{influence:.1f}", xy=(x[0], x[1]), size=10)
plt.legend()
plt.show()

influence4.png

Sie sehen, dass der Einflusswert der falsch beschrifteten Probe sehr hoch ist.

Darüber hinaus befindet sich die Stichprobe unten links außerhalb der Entscheidungsgrenze, und es besteht die Sorge, dass eine falsche Kennzeichnung das Lernen beeinträchtigt.

Zusammenfassung

--Mit der Einflussfunktion können Sie Stichproben finden, die nahe an der Entscheidungsgrenze liegen (nicht sicher) und falsch etikettieren.

Recommended Posts

Wenden Sie die Einflussfunktion auf die logistische Regression an
Logistische Rückgabe
Logistische Rückgabe
Vorsichtsmaßnahmen bei der Durchführung einer logistischen Regression mit Statsmodels
Logistische Regression beim maschinellen Lernen
Datenrahmenaufteilung ⇒ Funktionsanwendung
Covector, um in Funktion zu denken
Was ist eine logistische Regressionsanalyse?
So rufen Sie eine Funktion auf
Versuchen Sie, eine logistische Funktion zu zeichnen
Algorithmus für maschinelles Lernen (logistische Regression)
Implementierung der logistischen Regression mit NumPy
Ich habe versucht, einen einfachen Kredit-Score mit logistischer Regression zu erstellen.