【问题标题】:Plotting decision boundary for High Dimension Data绘制高维数据的决策边界
【发布时间】:2016-10-09 15:46:18
【问题描述】:

我正在为二进制分类问题构建一个模型,其中我的每个数据点都是 300 维(我正在使用 300 个特征)。我正在使用 sklearnPassiveAggressiveClassifier。该模型的性能非常好。

我希望绘制模型的决策边界。我该怎么做?

为了了解数据,我使用 TSNE 将其绘制为 2D。我分两步减少了数据的维度——从 300 到 50,然后从 50 到 2(这是一个常见的建议)。下面是相同的代码sn-p:

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

我得到了一个不错的图表。

有没有办法可以在这个图中添加一个决策边界,代表我的模型在 300 暗空间中的实际决策边界?

【问题讨论】:

  • 您使用哪一个进行降维——截断 SVD 或 TSNE?如果您对分类和归约都使用线性方法,那么这很简单。
  • @Chester 我不认为 op 创建 tSNE 只是为了忽略它 ;-)

标签: python plot machine-learning scikit-learn data-science


【解决方案1】:

一种方法是在您的 2D 图上施加 Voronoi 细分,即根据与 2D 数据点的接近程度对其进行着色(每个预测的类标签的颜色不同)。请参阅Migut et al., 2015 最近的论文。

这比使用网格网格和 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

【讨论】:

  • 为了避免错误AttributeError: 'str' object has no attribute 'decode',您可以使用model = LogisticRegression(solver='liblinear')
猜你喜欢
  • 2014-02-26
  • 2013-10-03
  • 2021-07-30
  • 2013-02-02
  • 2013-11-03
  • 2016-06-13
  • 2014-08-07
  • 2012-12-12
相关资源
最近更新 更多