2

このようなものを使用する場合

clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X,y)
predictions = clf.predict_proba(X_test)

予測を1つのクラスのみに制限する方法は? これは、パフォーマンス上の理由から必要です。たとえば、何千ものクラスがあり、特定の 1 つのクラスの確率が高いかどうかだけに関心がある場合などです。

4

1 に答える 1

1

Sklearn はそれを実装していません。たとえば、ある種のラッパーを作成する必要があります。たとえばextendKNeighborsClassifierクラスを作成して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_変数を上書きして、考慮されるクラスのシングルトンにし、完了したら元に戻すことです。

于 2013-08-21T18:01:37.817 に答える