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.
Informationen zur logistischen Regression finden Sie unter Diese Implementierung.
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()
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()
#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.
Es ist ersichtlich, dass der Einflusswert umso höher ist, je näher die Stichprobe an der Entscheidungsgrenze liegt.
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.
#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()
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()
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.
--Mit der Einflussfunktion können Sie Stichproben finden, die nahe an der Entscheidungsgrenze liegen (nicht sicher) und falsch etikettieren.
Recommended Posts