根据文档,可以为SGDClassifier
指定不同的损失函数。据我所知log loss
是一个交叉熵损失函数,它在理论上可以处理软标签,即以某些概率[0,1]给出的标签。
问题是:是否可以使用带有SGDClassifier
功能的log loss
框来解决软标签的分类问题?如果不是 - 如何使用scikit-learn来解决这个任务(软标签上的线性分类)?
更新
标记target
的方式以及问题的性质,硬标签不会给出好的结果。但它仍然是一个分类问题(不是回归),我不想保持对prediction
的概率解释,所以回归也不是开箱即用的。交叉熵损失函数可以自然地处理target
中的软标签。似乎scikit-learn中线性分类器的所有损失函数只能处理硬标签。
所以问题可能是:
例如,如何为SGDClassifier
指定我自己的损失函数。似乎scikit-learn并不坚持这里的模块化方法,需要在其内部的某个地方进行更改
答案 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)
'log'损失给出逻辑回归,即概率分类器。
通常,损失函数的格式为Loss( prediction, target )
,其中prediction
是模型的输出,target
是地面实况值。在逻辑回归的情况下,prediction
是(0,1)
上的值(即"软标签"),而target
是0
或{ {1}}(即"硬标签")。
因此,在回答您的问题时,这取决于您是指1
还是prediction
。一般来说,标签的形式("硬"或"软")由为target
选择的算法和{{1}的现有数据给出}。
如果您的数据有"硬"标签,你想要一个" soft"您的模型输出的标签(可以设置阈值以提供"硬"标签),然后是,逻辑回归属于此类别。
如果您的数据有"软"标签,然后你必须选择一个阈值,将它们转换为" hard"使用典型分类方法之前的标签(即逻辑回归)。否则,您可以使用回归方法,其中模型适合预测" soft"目标。在后一种方法中,您的模型可以给出prediction
以外的值,并且必须对此进行处理。