【问题标题】:How to use ordinal classifier?如何使用序数分类器?
【发布时间】:2021-03-05 04:48:10
【问题描述】:

我正在尝试在训练练习中实现序数分类器,但遇到了一些麻烦。我不能使用一个与所有分类器,因为我的类是序数的。序数分类器没有功能,所以我在互联网上找到了下面的代码。 (来源:https://towardsdatascience.com/simple-trick-to-train-an-ordinal-regression-with-any-classifier-6911183d2a3c)。

我对我应该如何使用它感到困惑......我有一个训练和测试数据集......但是我如何整合这些?例如,对于逻辑回归,我知道你会有这样的代码:

model = LogisticRegression()    
model.fit(x_train, y_train)

但是我如何使用此代码?以及如何获得概率?

来自网站的代码:

from sklearn.base import clone
    
class OrdinalClassifier():
        
    def __init__(self, clf):
        self.clf = clf
        self.clfs = {}
    
    def fit(self, X, y):
        self.unique_class = np.sort(np.unique(y))
        if self.unique_class.shape[0] > 2:
            for i in range(self.unique_class.shape[0]-1):
                # for each k - 1 ordinal value we fit a binary classification problem
                binary_y = (y > self.unique_class[i]).astype(np.uint8)
                clf = clone(self.clf)
                clf.fit(X, binary_y)
                self.clfs[i] = clf
    
    def predict_proba(self, X):
        clfs_predict = {k:self.clfs[k].predict_proba(X) for k in self.clfs}
        predicted = []
        for i,y in enumerate(self.unique_class):
            if i == 0:
                # V1 = 1 - Pr(y > V1)
                predicted.append(1 - clfs_predict[y][:,1])
            elif y in clfs_predict:
                # Vi = Pr(y > Vi-1) - Pr(y > Vi)
                 predicted.append(clfs_predict[y-1][:,1] - clfs_predict[y][:,1])
            else:
                # Vk = Pr(y > Vk-1)
                predicted.append(clfs_predict[y-1][:,1])
        return np.vstack(predicted).T
    
    def predict(self, X):
        return np.argmax(self.predict_proba(X), axis=1)

【问题讨论】:

    标签: python machine-learning classification multiclass-classification ordinal-classification


    【解决方案1】:

    运行代码时遇到一些错误,所以我对代码做了一些修改:

    from sklearn.base import clone
    import numpy as np
    # Source:
    # 1. https://stackoverflow.com/questions/66486947/how-to-use-ordinal-classifier
    # 2. https://towardsdatascience.com/simple-trick-to-train-an-ordinal-regression-with-any-classifier-6911183d2a3c
    
    
    class OrdinalClassifier():
    
        def __init__(self, clf):
            self.clf = clf
            self.clfs = {}
    
        def fit(self, X, y):
            self.unique_class = np.sort(np.unique(y))
            if self.unique_class.shape[0] > 2:
                for i in range(self.unique_class.shape[0] - 1):
                    # for each k - 1 ordinal value we fit a binary classification problem
                    binary_y = (y > self.unique_class[i]).astype(np.uint8)
                    clf = clone(self.clf)
                    clf.fit(X, binary_y)
                    self.clfs[i] = clf
    
        def predict_proba(self, X):
            clfs_predict = {k: v.predict_proba(X) for k, v in self.clfs.items()}
            predicted = []
            for i, y in enumerate(self.unique_class):
                if i == 0:
                    # V1 = 1 - Pr(y > V1)
                    predicted.append(1 - clfs_predict[i][:, 1])
                elif y in clfs_predict:
                    # Vi = Pr(y > Vi-1) - Pr(y > Vi)
                    predicted.append(clfs_predict[i - 1][:, 1] - clfs_predict[i][:, 1])
                else:
                    # Vk = Pr(y > Vk-1)
                    predicted.append(clfs_predict[i - 1][:, 1])
            return np.vstack(predicted).T
    
        def predict(self, X):
            return self.unique_class[np.argmax(self.predict_proba(X), axis=1)]
    

    回到你的问题:

    我有一个训练和测试数据集...但是我如何整合这些数据?

    您可以像这样轻松实现代码:

    knn = KNeighborsClassifier()
    oc = OrdinalClassifier(knn)
    oc.fit(X_train, y_train)
    oc.predict(X_test)
    

    输出将是测试集的预测类标签。因此,您可以调用sklearn 的混淆矩阵来检查准确性等。

    我如何获得概率?

    你可以得到每个类的概率如下:

    oc.predict_proba(X_test)
    

    您将获得numpy 的二维数组中每个类的概率,其中 m x n 维度,其中 m 是数字实例数,n 是类数

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 2012-04-02
      • 2020-01-08
      • 2014-01-07
      • 1970-01-01
      • 2016-08-07
      • 2018-05-13
      • 2014-07-31
      相关资源
      最近更新 更多