このようなものを使用する場合
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X,y)
predictions = clf.predict_proba(X_test)
予測を1つのクラスのみに制限する方法は? これは、パフォーマンス上の理由から必要です。たとえば、何千ものクラスがあり、特定の 1 つのクラスの確率が高いかどうかだけに関心がある場合などです。
このようなものを使用する場合
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X,y)
predictions = clf.predict_proba(X_test)
予測を1つのクラスのみに制限する方法は? これは、パフォーマンス上の理由から必要です。たとえば、何千ものクラスがあり、特定の 1 つのクラスの確率が高いかどうかだけに関心がある場合などです。
Sklearn はそれを実装していません。たとえば、ある種のラッパーを作成する必要があります。たとえばextend
、KNeighborsClassifier
クラスを作成してpredict_proba
メソッドをオーバーロードできます。
ソースコードによると
def predict_proba(self, X):
"""Return probability estimates for the test data X.
Parameters
----------
X : array, shape = (n_samples, n_features)
A 2-D array representing the test points.
Returns
-------
p : array of shape = [n_samples, n_classes], or a list of n_outputs
of such arrays if n_outputs > 1.
The class probabilities of the input samples. Classes are ordered
by lexicographic order.
"""
X = atleast2d_or_csr(X)
neigh_dist, neigh_ind = self.kneighbors(X)
classes_ = self.classes_
_y = self._y
if not self.outputs_2d_:
_y = self._y.reshape((-1, 1))
classes_ = [self.classes_]
n_samples = X.shape[0]
weights = _get_weights(neigh_dist, self.weights)
if weights is None:
weights = np.ones_like(neigh_ind)
all_rows = np.arange(X.shape[0])
probabilities = []
for k, classes_k in enumerate(classes_):
pred_labels = _y[:, k][neigh_ind]
proba_k = np.zeros((n_samples, classes_k.size))
# a simple ':' index doesn't work right
for i, idx in enumerate(pred_labels.T): # loop is O(n_neighbors)
proba_k[all_rows, idx] += weights[:, i]
# normalize 'votes' into real [0,1] probabilities
normalizer = proba_k.sum(axis=1)[:, np.newaxis]
normalizer[normalizer == 0.0] = 1.0
proba_k /= normalizer
probabilities.append(proba_k)
if not self.outputs_2d_:
probabilities = probabilities[0]
return probabilities
コードを変更するだけfor k, classes_k in enumerate(classes_):
で、必要な特定のクラスの claculation にループが変更されます。
人為的な方法の 1 つは、classes_
変数を上書きして、考慮されるクラスのシングルトンにし、完了したら元に戻すことです。