将概率向量转换为python中的目标vecor?

时间:2017-04-28 04:37:15

标签: python numpy machine-learning

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

现在我想将此预测向量转换为目标向量。假如概率大于50%,则相应的数据点将属于类1,否则为类2.使用0表示类1,为类2表示。

我知道它有一个for循环版本,只是循环遍历整个向量。但是当尺寸变大时,for循环非常昂贵,所以我想更高效地进行,比如numpy的矩阵运算,它比for循环中的矩阵运算更快。

有关更快方法的任何建议吗?

5 个答案:

答案 0 :(得分:7)

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)

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

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

np.argmax(y_hat,1)

答案 3 :(得分:0)

一个二维数组的更一般的解决方案,它具有许多具有许多类的向量:

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.]]    

答案 4 :(得分:0)

如果您以后要使用混淆矩阵等,然后再次在scikit中获得目标变量的原始格式:array([1 0 ... 1])您可以使用:

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

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