我需要预测的目标变量是 probabilities (与标签相对) . 我的训练数据中的相应列也是这种形式 . 我不想通过对目标进行阈值处理来丢失信息,以便从中创建分类问题 .
probabilities
如果我用二进制标签训练 logistic regression classifier ,sk-learn逻辑回归API允许在预测时获得概率 . 但是,我需要用概率训练它 . 有没有办法在scikits-learn中做到这一点,或者一个合适的Python包可以扩展到1K维的100K数据点 .
logistic regression classifier
我希望回归器使用问题的结构 . 一种这样的结构是目标是概率 .
在 scikit-learn 中,您不能使用非指标概率进行交叉熵损失;这没有实现,也不支持API . 这是 scikit-learn 的限制 .
scikit-learn
一般来说,根据 scikit-learn 的文档,损失函数的形式为 Loss(prediction, target) ,其中预测是模型的输出,目标是地面实况值 .
Loss(prediction, target)
在逻辑回归的情况下,预测是 (0,1) (即,"soft label")上的值,而目标是 0 或 1 (即,"hard label") .
(0,1)
0
1
对于逻辑回归,您可以根据其标签的概率对实例进行过采样来将概率近似为目标 . 例如如果给定样本 class_1 具有概率 0.2 和 class_2 has probability 0.8 , then generate 10 training instances (copied sample): 8 with class_2 as "ground truth target label" and 2 with class_1` .
class_1
0.2
class_2 has probability
, then generate 10 training instances (copied sample): 8 with
as "ground truth target label" and 2 with
显然它是变通方法,并不是非常有效,但它应该正常工作 .
如果您对上采样方法没问题,可以 pip install eli5 ,并使用_2462000_和 Logistic Regression classifier 来自 scikit-learn .
pip install eli5
Logistic Regression classifier
替代解决方案是在Tensorflow中实现(或找到实现?) LogisticRegression ,您可以根据需要定义损失函数 .
LogisticRegression
在编译此解决方案时,我使用了scikit-learn - multinomial logistic regression with probabilities as a target variable和scikit-learn classification on soft labels的答案 . 我建议那些更有见地的人 .
这是一个很好的问题,因为(与人们可能认为的相反),逻辑回归有许多合法用途......回归!
如果您坚持使用真正的逻辑回归,可以使用三种基本方法,另外两种方法可以提供类似的结果 . 他们都假设您的目标输出介于0和1之间 . 大多数情况下,您必须“手动”生成训练/测试集,除非您有幸使用支持带定制内核和X-的SGD-R的平台 . 验证支持开箱即用 .
请注意,根据您的特定用例,可能需要“不完全真实的逻辑回归”选项 . 这些方法的缺点是,如果您希望通过删除弱特征来减少特征空间,则需要花费更多的工作来查看每个特征的重量/重要性 .
如果你不介意做一些编码,你可以使用scipy优化功能 . 这很简单:
其中inverse-logit(z)= exp ^(z)/(1 exp ^ z)
如果您碰巧使用具有自定义损失的SGD回归的平台,那么您可以使用它,指定丢失y_t * log(y_o)(1-y_t)* log(1 - y_o)
实现此目的的一种方法是分叉sci-kit学习并向回归SGD求解器添加日志丢失 .
您可以通过过采样将问题转换为分类问题,如@ jo9k所述 . 但请注意,即使在这种情况下,您也不应使用标准X验证,因为数据不再独立 . 您需要手动将数据分解为训练/测试集,并且只有在将它们分开后才能进行过采样 .
(编辑:我做了一些测试,发现在我的测试集上,sigmoid内核表现不佳 . 我认为它们需要一些特殊的预处理才能按预期工作 . 具有sigmoid内核的SVM相当于一个2层tanh神经网络网络,应该适合结构化的回归任务训练数据输出是概率 . 经过进一步审查,我可能会回到这一点 . )
使用带有sigmoid内核的SVM,您应该得到类似的逻辑回归结果 . 您可以使用sci-kit learn的SVR函数并将内核指定为sigmoid . 在1000个功能中,您可能会遇到100,000个数据点的性能问题....这引出了我的最终建议:
这种方法将使结果远离真正的逻辑回归,但它的性能非常高 . 该过程如下:
使用sci-kit-learn的RBFsampler为您的数据集显式构建近似rbf内核 .
通过该内核处理您的数据,然后使用带有铰链丢失的sci-kit-learn的SGDRegressor,在转换后的数据上实现超级高效的SVM .
上面的代码是here
而不是在scikit学习库中使用 predict 使用 predict_proba 函数
predict
predict_proba
请参考:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression.predict_proba
3 回答
在
scikit-learn
中,您不能使用非指标概率进行交叉熵损失;这没有实现,也不支持API . 这是scikit-learn
的限制 .一般来说,根据
scikit-learn
的文档,损失函数的形式为Loss(prediction, target)
,其中预测是模型的输出,目标是地面实况值 .在逻辑回归的情况下,预测是
(0,1)
(即,"soft label")上的值,而目标是0
或1
(即,"hard label") .对于逻辑回归,您可以根据其标签的概率对实例进行过采样来将概率近似为目标 . 例如如果给定样本
class_1
具有概率0.2
和class_2 has probability
0.8, then generate 10 training instances (copied sample): 8 with
class_2as "ground truth target label" and 2 with
class_1` .显然它是变通方法,并不是非常有效,但它应该正常工作 .
如果您对上采样方法没问题,可以
pip install eli5
,并使用_2462000_和Logistic Regression classifier
来自scikit-learn
.替代解决方案是在Tensorflow中实现(或找到实现?)
LogisticRegression
,您可以根据需要定义损失函数 .在编译此解决方案时,我使用了scikit-learn - multinomial logistic regression with probabilities as a target variable和scikit-learn classification on soft labels的答案 . 我建议那些更有见地的人 .
这是一个很好的问题,因为(与人们可能认为的相反),逻辑回归有许多合法用途......回归!
如果您坚持使用真正的逻辑回归,可以使用三种基本方法,另外两种方法可以提供类似的结果 . 他们都假设您的目标输出介于0和1之间 . 大多数情况下,您必须“手动”生成训练/测试集,除非您有幸使用支持带定制内核和X-的SGD-R的平台 . 验证支持开箱即用 .
请注意,根据您的特定用例,可能需要“不完全真实的逻辑回归”选项 . 这些方法的缺点是,如果您希望通过删除弱特征来减少特征空间,则需要花费更多的工作来查看每个特征的重量/重要性 .
使用优化的直接方法
如果你不介意做一些编码,你可以使用scipy优化功能 . 这很简单:
其中inverse-logit(z)= exp ^(z)/(1 exp ^ z)
具有定制损失的随机梯度下降
如果您碰巧使用具有自定义损失的SGD回归的平台,那么您可以使用它,指定丢失y_t * log(y_o)(1-y_t)* log(1 - y_o)
实现此目的的一种方法是分叉sci-kit学习并向回归SGD求解器添加日志丢失 .
转换为分类问题
您可以通过过采样将问题转换为分类问题,如@ jo9k所述 . 但请注意,即使在这种情况下,您也不应使用标准X验证,因为数据不再独立 . 您需要手动将数据分解为训练/测试集,并且只有在将它们分开后才能进行过采样 .
转换为SVM
(编辑:我做了一些测试,发现在我的测试集上,sigmoid内核表现不佳 . 我认为它们需要一些特殊的预处理才能按预期工作 . 具有sigmoid内核的SVM相当于一个2层tanh神经网络网络,应该适合结构化的回归任务训练数据输出是概率 . 经过进一步审查,我可能会回到这一点 . )
使用带有sigmoid内核的SVM,您应该得到类似的逻辑回归结果 . 您可以使用sci-kit learn的SVR函数并将内核指定为sigmoid . 在1000个功能中,您可能会遇到100,000个数据点的性能问题....这引出了我的最终建议:
使用近似内核转换为SVM
这种方法将使结果远离真正的逻辑回归,但它的性能非常高 . 该过程如下:
使用sci-kit-learn的RBFsampler为您的数据集显式构建近似rbf内核 .
通过该内核处理您的数据,然后使用带有铰链丢失的sci-kit-learn的SGDRegressor,在转换后的数据上实现超级高效的SVM .
上面的代码是here
而不是在scikit学习库中使用
predict
使用predict_proba
函数请参考:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression.predict_proba