2016-06-09 4 views
7

Ich bin ein Modell für binäre Klassifizierung Problem, wo jeder meiner Datenpunkte von 300 Dimensionen (ich verwende 300 Funktionen). Ich bin mit einem PassiveAggressiveClassifier von sklearn. Das Modell funktioniert sehr gut.Plotten Entscheidungsgrenze für hohe Dimension Daten

Ich möchte die Entscheidungsgrenze des Modells darzustellen. Wie kann ich das tun?

Um ein Gefühl für die Daten zu bekommen, ich habe es in 2D bin Plotten TSNE verwenden. Ich habe die Dimensionen der Daten in 2 Schritten reduziert - von 300 auf 50, dann von 50 auf 2 (dies ist eine allgemeine Empfehlung). Unten ist der Code-Snippet für das gleiche:

from sklearn.manifold import TSNE 
from sklearn.decomposition import TruncatedSVD 

X_Train_reduced = TruncatedSVD(n_components=50, random_state=0).fit_transform(X_train) 
X_Train_embedded = TSNE(n_components=2, perplexity=40, verbose=2).fit_transform(X_Train_reduced) 

#some convert lists of lists to 2 dataframes (df_train_neg, df_train_pos) depending on the label - 

#plot the negative points and positive points 
scatter(df_train_neg.val1, df_train_neg.val2, marker='o', c='red') 
scatter(df_train_pos.val1, df_train_pos.val2, marker='x', c='green') 

Data Plot

ich ein anständiges Diagramm erhalten.

Gibt es einen Weg, dass ich eine Entscheidungsgrenze zu dieser Handlung hinzufügen kann, die die tatsächliche Entscheidungsgrenze meines Modells im 300-dim-Raum darstellt?

+1

Welches sind Sie für Dimensionsreduktion mit - abgeschnitten SVD oder TSNE? Wenn Sie eine lineare Methode sowohl für die Klassifizierung als auch für die Reduktion verwenden, ist dies ziemlich einfach zu tun. –

+0

@Chester Ich glaube nicht, dass Op tSNE erstellt, nur um es zu ignorieren ;-) – lejlot

Antwort

5

Eine Möglichkeit besteht darin, dem 2D-Plot eine Voronoi-Tesselation aufzuerlegen, d. H. Es basierend auf der Nähe zu den 2D-Datenpunkten zu färben (unterschiedliche Farben für jede vorhergesagte Klassenbezeichnung). Siehe kürzlich erschienenes Papier von Migut et al., 2015.

Das ist viel einfacher, als es ein meshgrid und scikit des KNeighborsClassifier Sounds verwenden (dies ist ein Ende Beispiel mit dem Iris-Datensatz zu beenden, die ersten paar Zeilen mit Ihrem Modell/Code ersetzen):

import numpy as np, matplotlib.pyplot as plt 
from sklearn.neighbors.classification import KNeighborsClassifier 
from sklearn.datasets.base import load_iris 
from sklearn.manifold.t_sne import TSNE 
from sklearn.linear_model.logistic import LogisticRegression 

# replace the below by your data and model 
iris = load_iris() 
X,y = iris.data, iris.target 
X_Train_embedded = TSNE(n_components=2).fit_transform(X) 
print X_Train_embedded.shape 
model = LogisticRegression().fit(X,y) 
y_predicted = model.predict(X) 
# replace the above by your data and model 

# create meshgrid 
resolution = 100 # 100x100 background pixels 
X2d_xmin, X2d_xmax = np.min(X_Train_embedded[:,0]), np.max(X_Train_embedded[:,0]) 
X2d_ymin, X2d_ymax = np.min(X_Train_embedded[:,1]), np.max(X_Train_embedded[:,1]) 
xx, yy = np.meshgrid(np.linspace(X2d_xmin, X2d_xmax, resolution), np.linspace(X2d_ymin, X2d_ymax, resolution)) 

# approximate Voronoi tesselation on resolution x resolution grid using 1-NN 
background_model = KNeighborsClassifier(n_neighbors=1).fit(X_Train_embedded, y_predicted) 
voronoiBackground = background_model.predict(np.c_[xx.ravel(), yy.ravel()]) 
voronoiBackground = voronoiBackground.reshape((resolution, resolution)) 

#plot 
plt.contourf(xx, yy, voronoiBackground) 
plt.scatter(X_Train_embedded[:,0], X_Train_embedded[:,1], c=y) 
plt.show() 

Beachten Sie, dass Sie, anstatt Ihre Entscheidungsgrenze genau aufzutragen, nur eine grobe Schätzung geben, wo die Grenze liegen sollte (besonders in Regionen mit wenigen Datenpunkten kann die wahre Grenze davon abweichen). Es wird eine Linie zwischen zwei Datenpunkten ziehen zu verschiedenen Klassen gehört, aber wird es in der Mitte platzieren (es tatsächlich eine Entscheidungsgrenze zwischen diesen Punkten in diesem Fall sein, garantiert ist, aber es muss nicht unbedingt in der Mitte sein) .

Es gibt auch einige experimentelle Ansätze besser die wahre Entscheidungsgrenze zu nähern, z.B. this one on github