【问题标题】:Convert probability vector into target vector in python?在python中将概率向量转换为目标向量?
【发布时间】:2017-09-26 02:10:48
【问题描述】:

我正在对来自 sklearn 的 iris 数据集进行逻辑回归,我知道数学并尝试实现它。在最后一步,我得到一个预测向量,这个预测向量表示该数据点属于 1 类或 2 类(二元分类)的概率。

现在我想把这个预测向量变成目标向量。假设概率大于50%,则对应的数据点属于1类,否则属于2类。用0代表1类,1代表2类。

我知道它有一个 for 循环版本,只是循环整个向量。但是当size变大的时候,for循环的开销就很大了,所以我想效率更高一些,比如numpy的矩阵运算,比在for循环中做矩阵运算要快。

对更快的方法有什么建议吗?

【问题讨论】:

  • vec=prob>0.5...

标签: python numpy machine-learning


【解决方案1】:
import numpy as np

a = np.matrix('0.1 0.82')
print(a)

a[a > 0.5] = 1
a[a <= 0.5] = 0
print(a)

输出:

[[ 0.1   0.82]]
[[ 0.  1.]]

更新:

import numpy as np

a = np.matrix('0.1 0.82')
print(a)

a = np.where(a > 0.5, 1, 0)
print(a)

【讨论】:

    【解决方案2】:

    一个二维数组的更通用的解决方案,它有很多向量和很多类:

    import numpy as np
    a = np.array( [ [.5, .3, .2], 
                    [.1, .2, .7], 
                    [ 1,  0,  0] ] )
    
    idx = np.argmax(a, axis=-1)
    a = np.zeros( a.shape )
    a[ np.arange(a.shape[0]), idx] = 1
    
    print(a)
    

    输出:

    [[1. 0. 0.]
     [0. 0. 1.]
     [1. 0. 0.]]    
    

    【讨论】:

    • 真的很有帮助
    【解决方案3】:

    选项 1:如果您进行二元分类并拥有一维预测向量,那么您的解决方案是 numpy.round

    prob = model.predict(X_test)
    Y = np.round(prob)
    

    选项 2:如果您有一个 n 维的 one-hot 预测矩阵,但想要有标签,那么您可以使用 numpy.argmax。这将返回带有标签的一维向量:

    prob = model.predict(X_test)
    y = np.argmax(prob, axis=1)
    

    【讨论】:

      【解决方案4】:

      如果您想在之后处理混淆矩阵等并再次在 scikit 中获取目标变量的原始格式:array([1 0 ... 1])您可以使用:

      a = clf.predict_proba(X_test)[:,1]
      a = np.where(a>0.5, 1, 0)
      

      [:,1] 指的是第二类(在我的情况下为 1),在我的情况下第一类是 0

      【讨论】:

        【解决方案5】:

        对于多类或更通用的解决方案,请使用

        np.argmax(y_hat, axis=1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-29
          • 2013-07-11
          • 2016-07-22
          • 2015-07-27
          • 2012-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多