如何解决如何使用序数分类器?
我正在尝试在训练练习中实现序数分类器,但遇到了一些问题。我不能使用一对一分类器,因为我的类是有序的。序数分类器没有函数,所以我在互联网上找到了下面的这段代码。 (来源: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)
解决方法
在运行代码时遇到了一些错误,所以我对代码做了一些修改:
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)
您将获得具有 m x n 维的 numpy
二维数组中每个类的概率,其中 m 是实例的数量,n 是类的数量
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。