最接近质心的决策边界

时间:2018-10-01 13:38:40

标签: python python-3.x machine-learning scikit-learn

我试图为包括nearestcentroid在内的不同分类器绘制决策边界,但是当我使用此代码时

if hasattr(clf, "decision_function"):
            Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
        else:
            Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]

我收到一条错误消息,说'NearestCentroid'对象没有属性'predict_proba'。我怎样才能解决这个问题?

3 个答案:

答案 0 :(得分:2)

假设X具有两个特征,则可以生成meshgrid,其中每个轴都与其中一个特征有关。

假设X是具有两个特征的要素数组-形状为(N,2),其中N是样本数-和y是目标数组。:

# first determine the min and max boundaries for generating the meshgrid
feat1_min, feat1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
feat2_min, feat2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

现在生成您的网格并沿着网格进行预测:

xx, yy = np.meshgrid(np.arange(feat1_min, feat1_max , 0.02),
                     np.arange(feat2_min, feat2_max , 0.02))  # 0.02 is step size
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

现在绘制剧情:

Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap="autumn")
plt.scatter(X[:, 0], X[:, 1], c=y, cmap="autumn",
            edgecolor='k', s=10)
plt.show()

答案 1 :(得分:1)

正如BearBrown所指出的,您仅检查“ decison_function”是否为 clf 的属性。您永远不会检查“ predict_proba”是否是 clf

的属性
if hasattr(clf, "decision_function"):
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
elif hasattr(clf, "predict_proba"): # This condition ensures that you'll see that predict_proba is not an attribute of clf`enter code here`
    Z = clf.predict_proba(numpy.c_[xx.ravel(), yy.ravel()])[:, 1]
else: #This will show you your error again
    raise AttributeError("Neither 'decision_function' not 'predict_proba' found in clf")

此后,您应该检查为什么您期望的不是 clf

的属性

答案 2 :(得分:0)

您可以制作自己的predict_proba

from sklearn.utils.extmath import softmax
from sklearn.metrics.pairwise import pairwise_distances

def predict_proba(self, X):
    distances = pairwise_distances(X, self.centroids_, metric=self.metric)
    probs = softmax(distances)
    return probs

clf = NearestCentroid()
clf.predict_proba = predict_proba.__get__(clf)
clf.fit(X_train, y_train)
clf.predict_proba(X_test)