根据文档,可以为 SGDClassifier
指定不同的损失函数。 .据我了解log loss
是 cross-entropy
理论上可以处理软标签的损失函数,即以某些概率 [0,1] 给出的标签。
问题是:是否可以使用 SGDClassifier
与 log loss
为软标签的分类问题开箱即用?如果不是 - 如何使用 scikit-learn 解决这个任务(软标签上的线性分类)?
更新:
一路target
被标记并且根据问题的性质,硬标签不会给出好的结果。但这仍然是一个分类问题(不是回归),我不想保留对 prediction
的概率解释。所以回归也不能开箱即用。交叉熵损失函数可以处理target
中的软标签自然。似乎 scikit-learn 中线性分类器的所有损失函数都只能处理硬标签。
所以问题大概是:
如何为 SGDClassifier
指定我自己的损失函数, 例如。看来scikit-learn
这里不坚持模块化方法,需要在其源代码中的某个地方进行更改
最佳答案
我最近遇到了这个问题,并想出了一个似乎可行的好方法。
基本上,使用反 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)
然后进行预测:
def sigmoid(x):
ex = np.exp(x)
return ex / (1 + ex)
preds = sigmoid(lr.predict(X_new))
这似乎有效,至少对于我的用例而言。我的猜测是,无论如何,LogisticRegression 的幕后发生的事情并不遥远。
奖励:这似乎也适用于
sklearn
中的其他回归模型,例如RandomForestRegressor
.
关于python - 软标签上的 scikit-learn 分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42800769/