根据文档,可以为SGDClassifier指定不同的损失函数。据我所知,log loss是一个cross-entropy损失函数,理论上可以处理软标签,即给出一些概率0,1的标签。
问题是:是否可以将SGDClassifier与log loss函数一起用于软标签的分类问题?如果不是--这个任务(软标签上的线性分类)如何才能用scikit来解决--学习?
更新:
target被标记的方式以及问题的本质,硬标签并没有给出好的结果。但它仍然是一个分类问题(而不是回归),我不想保留对prediction的概率解释,所以回归也不会开箱即用。交叉熵损失函数可以自然地处理target中的软标签.似乎所有的损失函数线性分类器在科学学习只能处理硬标签。
所以问题很可能是:
例如,如何为SGDClassifier指定自己的损失函数。在这里,scikit-learn似乎没有坚持模块化的方法,需要在它的源代码中的某个地方进行更改
发布于 2017-03-15 11:20:34
根据医生的说法,
对数损失给出了logistic回归,一种概率分类器。
一般来说,损失函数的形式是Loss( prediction, target ),其中prediction是模型的输出,target是地面真值。在logistic回归的情况下,prediction是(0,1)上的值(即“软标签”),而target是0或1 (即“硬标签”)。
因此,在回答你的问题时,这取决于你指的是prediction还是target。一般来说,标签的形式(“硬”或“软”)是由为prediction选择的算法和target的手头数据给出的。
如果您的数据有“硬”标签,并且您希望您的模型输出一个“软”标签(可以通过阈值来给出“硬”标签),那么是的,逻辑回归就属于这个类别。
如果您的数据有“软”标签,那么在使用典型的分类方法(即逻辑回归)之前,您必须选择一个阈值将其转换为“硬”标签。否则,您可以使用回归方法,其中的模型适合预测“软”目标。在后一种方法中,您的模型可以给出(0,1)之外的值,这需要处理。
发布于 2020-04-01 11:34:21
最近我遇到了这个问题,并想出了一个不错的解决方案,似乎很有效。
基本上,使用反乙状结肠函数将你的目标转换成对数比特率空间.然后拟合线性回归。然后,进行推断,从线性回归模型中提取预测的乙状结肠。
因此,假设我们有软目标/标签y ∈ (0, 1) (请确保将目标钳制为[1e-8, 1 - 1e-8],以避免在获取日志时出现不稳定问题)。
我们取逆乙状结肠,然后拟合线性回归(假设预测变量在矩阵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。
发布于 2022-03-17 19:18:05
对于那些感兴趣的人,我已经实现了一个自定义类,它的行为像一个普通的分类器,但是使用宇宙卡车司机中的任何一个回归变量来执行@nlml建议的转换:
from sklearn.base import BaseEstimator, ClassifierMixin
from sklearn.utils.validation import check_array
from scipy.special import softmax
import numpy as np
def _log_odds_ratio_scale(X):
X = np.clip(X, 1e-8, 1 - 1e-8) # numerical stability
X = np.log(X / (1 - X)) # transform to log-odds-ratio space
return X
class FuzzyTargetClassifier(ClassifierMixin, BaseEstimator):
def __init__(self, regressor):
'''
Fits regressor in the log odds ratio space (inverse crossentropy) of target variable.
during transform, rescales back to probability space with softmax function
Parameters
---------
regressor: Sklearn Regressor
base regressor to fit log odds ratio space. Any valid sklearn regressor can be used here.
'''
self.regressor = regressor
return
def fit(self, X, y=None, **kwargs):
#ensure passed y is onehotencoded-like
y = check_array(y, accept_sparse=True, dtype = 'numeric', ensure_min_features=1)
self.regressors_ = [clone(self.regressor) for _ in range(y.shape[1])]
for i in range(y.shape[1]):
self._fit_single_regressor(self.regressors_[i], X, y[:,i], **kwargs)
return self
def _fit_single_regressor(self, regressor, X, ysub, **kwargs):
ysub = _log_odds_ratio_scale(ysub)
regressor.fit(X, ysub, **kwargs)
return regressor
def decision_function(self,X):
all_results = []
for reg in self.regressors_:
results = reg.predict(X)
if results.ndim < 2:
results = results.reshape(-1,1)
all_results.append(results)
results = np.hstack(all_results)
return results
def predict_proba(self, X):
results = self.decision_function(X)
results = softmax(results, axis = 1)
return results
def predict(self, X):
results = self.decision_function(X)
results = results.argmax(1)
return resultshttps://stackoverflow.com/questions/42800769
复制相似问题