【问题标题】: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循环中做矩阵运算要快。
对更快的方法有什么建议吗?
【问题讨论】:
标签:
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)