2016-06-09 5 views
7

Я создаю модель для задачи двоичной классификации, где каждая из моих точек данных имеет 300 измерений (Я пользуюсь 300 функциями). Я использую PassiveAggressiveClassifier от sklearn. Модель работает очень хорошо.Граница принятия решения для данных высокого измерения

Я хочу построить границу решения модели. Как я могу это сделать?

Чтобы получить представление о данных, я планирую его в 2D с помощью TSNE. Я уменьшил размеры данных в 2 этапа - от 300 до 50, затем от 50 до 2 (это общая рекомендация). Ниже приведен фрагмент кода для того же:

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

Я получаю приличный график.

Есть ли способ добавить границу решения к этому графику, который представляет собой фактическую границу решения моей модели в 300-кратном пространстве?

+1

Какой из них вы используете для уменьшения размерности - усеченного SVD или TSNE? Если вы используете линейный метод для классификации и сокращения, то это довольно прямолинейно. –

+0

@Chester Я не думаю, что op создает tSNE только для того, чтобы его игнорировать ;-) – lejlot

ответ

5

Один из способов заключается в том, чтобы нанести 2D-графику на основе двумерной диаграммы Voronoi, т. Е. Нанести ее на близость к точкам 2D-данных (разные цвета для каждой предсказанной метки класса). См. Недавнюю статью от Migut et al., 2015.

Это намного проще, чем это звучит, используя meshgrid и scikit в KNeighborsClassifier (это встык пример с набором данных Iris замените первые несколько строк с вашей модели/код):

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() 

Обратите внимание, что вместо того, чтобы точно строить границы вашего решения, это просто даст вам приблизительную оценку границы, где граница должна лежать (особенно в регионах с небольшим количеством точек данных, истинные границы могут отклоняться от этого). Он будет нарисовать линию между двумя точками данных, принадлежащими разным классам, но поместит ее в середину (в этом случае гарантированно будет граница принятия решений между этими точками, но это необязательно должно быть посередине) ,

Существуют также некоторые экспериментальные подходы к лучшему приближению истинной границы решения, например. this one on github

 Смежные вопросы

  • Нет связанных вопросов^_^