根据文档,可以为 指定不同的损失函数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)
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。
根据文档,
\n\n\n\n\n\xe2\x80\x98log\xe2\x80\x99 损失给出逻辑回归,一个概率分类器。
\n
一般来说,损失函数的形式为Loss( prediction, target ),其中prediction是模型的输出,target是真实值。在逻辑回归的情况下,prediction是一个值(0,1)(即“软标签”),target而是0或1 (i.e., a "hard label").
因此,在回答您的问题时,这取决于您是否指的是prediction或target。一般来说,标签的形式(“硬”或“软”)由 为 所选的算法prediction和 的现有数据给出target。
如果您的数据具有“硬”标签,并且您希望模型输出“软”标签(可以对其进行阈值设置以给出“硬”标签),那么逻辑回归就属于此类。
\n\n如果您的数据具有“软”标签,那么在使用典型的分类方法(即逻辑回归)之前,您必须选择一个阈值将其转换为“硬”标签。否则,您可以使用模型适合的回归方法来预测“软”目标。在后一种方法中,您的模型可以给出超出范围的值(0,1),并且必须对此进行处理。
| 归档时间: |
|
| 查看次数: |
4673 次 |
| 最近记录: |