软标签上的scikit-learn分类

时间:2017-03-15 03:49:04

标签: scikit-learn

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

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

更新

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

所以问题可能是:

例如,如何为SGDClassifier指定我自己的损失函数。似乎scikit-learn并不坚持这里的模块化方法,需要在其内部的某个地方进行更改

2 个答案:

答案 0 :(得分:4)

我最近遇到了这个问题,并想出了一个不错的修复程序。

基本上,使用反S形函数将目标转换为对数比空间。然后拟合线性回归。然后,要进行推断,请采用线性回归模型中预测的S形。

因此,假设我们有柔软的目标/标签y ∈ (0, 1)(请确保将目标钳制为[1e-8, 1 - 1e-8],以避免在记录日志时出现不稳定问题)。

我们采用反S形,然后拟合线性回归(假设预测变量位于矩阵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)

然后做出预测:

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

preds = sigmoid(lr.predict(X_new))

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

奖金:这似乎也可以与sklearn中的其他回归模型一起使用,例如RandomForestRegressor

答案 1 :(得分:2)

According to the docs

  

'log'损失给出逻辑回归,即概率分类器。

通常,损失函数的格式为Loss( prediction, target ),其中prediction是模型的输出,target是地面实况值。在逻辑回归的情况下,prediction(0,1)上的值(即"软标签"),而target0或{ {1}}(即"硬标签")。

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

如果您的数据有"硬"标签,你想要一个" soft"您的模型输出的标签(可以设置阈值以提供"硬"标签),然后是,逻辑回归属于此类别。

如果您的数据有"软"标签,然后你必须选择一个阈值,将它们转换为" hard"使用典型分类方法之前的标签(即逻辑回归)。否则,您可以使用回归方法,其中模型适合预测" soft"目标。在后一种方法中,您的模型可以给出prediction以外的值,并且必须对此进行处理。