首页 文章

如何进行回归而不是使用逻辑回归和scikit学习进行分类

提问于
浏览
0

我需要预测的目标变量是 probabilities (与标签相对) . 我的训练数据中的相应列也是这种形式 . 我不想通过对目标进行阈值处理来丢失信息,以便从中创建分类问题 .

如果我用二进制标签训练 logistic regression classifier ,sk-learn逻辑回归API允许在预测时获得概率 . 但是,我需要用概率训练它 . 有没有办法在scikits-learn中做到这一点,或者一个合适的Python包可以扩展到1K维的100K数据点 .

3 回答

  • 1

    我希望回归器使用问题的结构 . 一种这样的结构是目标是概率 .

    scikit-learn 中,您不能使用非指标概率进行交叉熵损失;这没有实现,也不支持API . 这是 scikit-learn 的限制 .

    一般来说,根据 scikit-learn 的文档,损失函数的形式为 Loss(prediction, target) ,其中预测是模型的输出,目标是地面实况值 .

    在逻辑回归的情况下,预测是 (0,1) (即,"soft label")上的值,而目标是 01 (即,"hard label") .


    对于逻辑回归,您可以根据其标签的概率对实例进行过采样来将概率近似为目标 . 例如如果给定样本 class_1 具有概率 0.2class_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` .

    显然它是变通方法,并不是非常有效,但它应该正常工作 .

    如果您对上采样方法没问题,可以 pip install eli5 ,并使用_2462000_和 Logistic Regression classifier 来自 scikit-learn .


    替代解决方案是在Tensorflow中实现(或找到实现?) LogisticRegression ,您可以根据需要定义损失函数 .


    在编译此解决方案时,我使用了scikit-learn - multinomial logistic regression with probabilities as a target variablescikit-learn classification on soft labels的答案 . 我建议那些更有见地的人 .

  • -1

    这是一个很好的问题,因为(与人们可能认为的相反),逻辑回归有许多合法用途......回归!

    如果您坚持使用真正的逻辑回归,可以使用三种基本方法,另外两种方法可以提供类似的结果 . 他们都假设您的目标输出介于0和1之间 . 大多数情况下,您必须“手动”生成训练/测试集,除非您有幸使用支持带定制内核和X-的SGD-R的平台 . 验证支持开箱即用 .

    请注意,根据您的特定用例,可能需要“不完全真实的逻辑回归”选项 . 这些方法的缺点是,如果您希望通过删除弱特征来减少特征空间,则需要花费更多的工作来查看每个特征的重量/重要性 .

    使用优化的直接方法

    如果你不介意做一些编码,你可以使用scipy优化功能 . 这很简单:

    • 创建以下类型的函数:y_o = inverse-logit(a_0 a_1x_1 a_2x_2 ...)

    其中inverse-logit(z)= exp ^(z)/(1 exp ^ z)

    • 使用scipy最小化以最小化-1 * [y_t * log(y_o)(1-y_t)* log(1 - y_o)]的总和,在所有数据点上求和 . 要做到这一点,你必须设置一个函数,它将(a_0,a_1,...)作为参数并创建函数,然后计算损失 .

    具有定制损失的随机梯度下降

    如果您碰巧使用具有自定义损失的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

  • 0

相关问题