python - 软标签上的 scikit-learn 分类

标签 python machine-learning scikit-learn classification

根据文档,可以为 SGDClassifier 指定不同的损失函数。 .据我了解log losscross-entropy理论上可以处理软标签的损失函数,即以某些概率 [0,1] 给出的标签。

问题是:是否可以使用 SGDClassifierlog 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/

相关文章:

python - 如何制作BeautifulSoup "understand"plus html实体

python - 如何使用pandas计算最大点击间隔?

python - scikit-learn 只允许使用线性 svms 访问 clf.coef_ 是有原因的吗?

python-2.7 - scikit learn 平均感知器分类器

python - Altair 日期色标范围被切断

python - exec 和 os.system() 之间的相似之处

python 字符串 u"%(word)s"

machine-learning - grid.cv_results_ 中的mean_validation_score对应的函数是什么?

python - 图像噪声与图像文本匹配

python - 在 scikit-learn 管道中插入 CalibratedClassifierCV 的正确方法是什么?