在Python中将概率向量转换为目标向量?

7
我正在对sklearn中的鸢尾花数据集进行逻辑回归,我知道数学原理并尝试实现它。在最后一步,我得到了一个预测向量,这个向量代表着数据点属于类1或类2(二分类)的概率。
现在我想将这个预测向量转化为目标向量。如果概率大于50%,则相应的数据点将属于类1,否则属于类2。使用0表示类1,用1表示类2。
我知道有一个for循环版本,只需循环遍历整个向量即可。但是当大小变大时,for循环非常昂贵,所以我想更有效地执行它,例如numpy的矩阵运算,它比在for循环中执行矩阵操作更快。
有关更快方法的任何建议?

vec=prob>0.5... - user2717954
5个回答

16
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)

5
一个适用于多个向量和多个类别的二维数组的通用解决方案:
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.]]    

它确实有帮助 - Ananda G

4

选项1:如果您进行二元分类并具有1D预测向量,则解决方案为numpy.round

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

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

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

2

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

最初的回答:

a = clf.predict_proba(X_test)[:,1]
a = np.where(a>0.5, 1, 0)
<最初的回答>中的[:,1]是指第二类(在我的情况下是1),而第一类在我的情况下是0。

0

对于多类问题,或者更一般化的解决方案,请使用

np.argmax(y_hat, axis=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接