软标签上的 scikit-learn 分类

Ale*_*tko 8 scikit-learn

根据文档,可以为 指定不同的损失函数SGDClassifier。据我所知,这log loss是一个cross-entropy理论上可以处理软标签的损失函数,即以某些概率 [0,1] 给出的标签。

问题是:是否可以使用开箱即SGDClassifier用的log loss功能来解决软标签的分类问题?如果不是 - 如何使用 scikit-learn 解决这个任务(软标签上的线性分类)?

更新:

方法target是标记的,根据问题的性质,硬标签不会给出好的结果。但这仍然是一个分类问题(不是回归),我不想保留对prediction回归的概率解释,所以回归也不能开箱即用。交叉熵损失函数可以target自然地处理软标签。scikit-learn 中线性分类器的所有损失函数似乎都只能处理硬标签。

所以问题大概是:

例如,如何为 指定我自己的损失函数SGDClassifier。它似乎scikit-learn不坚持这里的模块化方法,需要在其源代码中的某处进行更改

nlm*_*lml 9

我最近遇到了这个问题,并提出了一个似乎有效的不错的修复方法。

基本上,使用逆 sigmoid 函数将您的目标转换为对数优势比空间。然后拟合线性回归。然后,为了进行推理,从线性回归模型中获取预测的 sigmoid。

所以说我们有软目标/标签y ? (0, 1)(确保[1e-8, 1 - 1e-8]在我们记录日志时夹住目标以避免不稳定问题)。

我们采用逆 sigmoid,然后我们拟合线性回归(假设预测变量在矩阵中X):

y = np.clip(y, 1e-8, 1 - 1e-8)   # numerical stability
inv_sig_y = np.log(y / (1 - y))  # transform to log-odds-ratio space

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X, inv_sig_y)
Run Code Online (Sandbox Code Playgroud)

然后进行预测:

def sigmoid(x):
    ex = np.exp(x)
    return ex / (1 + ex)

preds = sigmoid(lr.predict(X_new))
Run Code Online (Sandbox Code Playgroud)

这似乎有效,至少对于我的用例。我的猜测是,无论如何,LogisticRegression 的幕后发生的事情已经不远了。

奖励:这似乎也适用于 中的其他回归模型sklearn,例如RandomForestRegressor


Mat*_*ock 3

根据文档,

\n\n
\n

\xe2\x80\x98log\xe2\x80\x99 损失给出逻辑回归,一个概率分类器。

\n
\n\n

一般来说,损失函数的形式为Loss( prediction, target ),其中prediction是模型的输出,target是真实值。在逻辑回归的情况下,prediction是一个值(0,1)(即“软标签”),target而是01 (i.e., a "hard label").

\n\n

因此,在回答您的问题时,这取决于您是否指的是predictiontarget。一般来说,标签的形式(“硬”或“软”)由 为 所选的算法prediction和 的现有数据给出target

\n\n

如果您的数据具有“硬”标签,并且您希望模型输出“软”标签(可以对其进行阈值设置以给出“硬”标签),那么逻辑回归就属于此类。

\n\n

如果您的数据具有“软”标签,那么在使用典型的分类方法(即逻辑回归)之前,您必须选择一个阈值将其转换为“硬”标签。否则,您可以使用模型适合的回归方法来预测“软”目标。在后一种方法中,您的模型可以给出超出范围的值(0,1),并且必须对此进行处理。

\n