2016-06-09 16 views
7

Tôi đang tạo mô hình cho vấn đề phân loại nhị phân trong đó mỗi điểm dữ liệu của tôi là 300 kích thước (Tôi đang sử dụng 300 tính năng). Tôi đang sử dụng PassiveAggressiveClassifier từ sklearn. Mô hình đang hoạt động thực sự tốt.Vẽ ranh giới quyết định cho Dữ liệu thứ nguyên cao

Tôi muốn vẽ ranh giới quyết định của mô hình. Làm thế nào tôi có thể làm như vậy?

Để hiểu được dữ liệu, tôi vẽ đồ thị 2D bằng TSNE. Tôi đã giảm kích thước của dữ liệu theo 2 bước - từ 300 xuống 50, sau đó từ 50 xuống 2 (đây là một gợi ý chung). Dưới đây là đoạn mã cho cùng:

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

tôi nhận được một đồ thị khá.

Có cách nào để tôi có thể thêm ranh giới quyết định vào ô này biểu thị ranh giới quyết định thực tế của mô hình của tôi trong không gian tối thiểu 300 không?

+1

Bạn đang sử dụng cái nào để giảm kích thước - SVD cắt ngắn hoặc TSNE? Nếu bạn sử dụng một phương pháp tuyến tính cho cả phân loại và giảm, thì điều này là khá thẳng về phía trước để làm. –

+0

@Chester Tôi không nghĩ rằng op tạo ra tSNE chỉ để bỏ qua nó ;-) – lejlot

Trả lời

5

Một cách là áp đặt một tàu Voronoi trên lô 2D của bạn, tức là tô màu dựa trên sự gần gũi với các điểm dữ liệu 2D (các màu khác nhau cho mỗi nhãn lớp dự đoán). Xem bài báo gần đây theo số Migut et al., 2015.

Đây là dễ dàng hơn nhiều so với âm thanh bằng cách sử dụng meshgrid và KNeighborsClassifier scikit của (đây là dấu chấm hết cho kết thúc ví dụ với các tập dữ liệu Iris; thay thế vài dòng đầu tiên với mô hình của bạn/code):

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

Lưu ý rằng thay vì vẽ chính xác ranh giới quyết định của bạn, điều này sẽ chỉ cung cấp cho bạn ước tính gần đúng về ranh giới của ranh giới (đặc biệt là ở các vùng có ít điểm dữ liệu, ranh giới thực có thể đi chệch khỏi điều này). Nó sẽ vẽ một đường thẳng giữa hai điểm dữ liệu thuộc các lớp khác nhau, nhưng sẽ đặt nó ở giữa (thực sự được đảm bảo là ranh giới quyết định giữa các điểm trong trường hợp này, nhưng nó không nhất thiết phải ở giữa) .

Ngoài ra còn có một số phương pháp thử nghiệm để gần đúng hơn ranh giới quyết định thực sự, ví dụ: this one on github

Các vấn đề liên quan