在python中将概率向量转换为目标向量?
我在sklearn的iris数据集上做逻辑回归,我知道数学并尝试实现它。在最后一步,我得到一个预测向量,这个预测向量表示该数据点到类1或类2(二进制分类)的概率 现在我想把这个预测向量变成目标向量。假设概率大于50%,则相应的数据点将属于类别1,否则为类别2。使用0表示类1,使用1表示类2 我知道它有一个for-loop版本,只是在整个向量中循环。但是当大小变大时,for循环非常昂贵,所以我想更有效地执行它,就像numpy的矩阵运算一样,它比在for循环中执行矩阵运算更快 对更快的方法有什么建议吗在python中将概率向量转换为目标向量?,python,numpy,machine-learning,Python,Numpy,Machine Learning,我在sklearn的iris数据集上做逻辑回归,我知道数学并尝试实现它。在最后一步,我得到一个预测向量,这个预测向量表示该数据点到类1或类2(二进制分类)的概率 现在我想把这个预测向量变成目标向量。假设概率大于50%,则相应的数据点将属于类别1,否则为类别2。使用0表示类1,使用1表示类2 我知道它有一个for-loop版本,只是在整个向量中循环。但是当大小变大时,for循环非常昂贵,所以我想更有效地执行它,就像numpy的矩阵运算一样,它比在for循环中执行矩阵运算更快 对更快的方法有什么建议
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)
更新:
对于多类或更通用的解决方案,请使用
np.argmax(y_hat,轴=1)
对于具有多个类的多个向量的2D数组,更通用的解决方案是:
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.]]
如果您希望随后使用混淆矩阵等进行处理,并再次在scikit中获取目标变量的原始格式:
array([10…1])
您可以使用:
a = clf.predict_proba(X_test)[:,1]
a = np.where(a>0.5, 1, 0)
[:,1]
引用第二类(在我的例子中:1),在我的例子中,第一类是0选项1:如果您进行二进制分类,并且有1d预测向量,那么您的解决方案是:
选项2:如果您有一个n维单热预测矩阵,但希望有标签,则可以使用。这将返回带标签的1d向量:
prob = model.predict(X_test)
y = np.argmax(prob, axis=1)
vec=prob>0.5…这真的很有帮助
a = clf.predict_proba(X_test)[:,1]
a = np.where(a>0.5, 1, 0)
prob = model.predict(X_test)
Y = np.round(prob)
prob = model.predict(X_test)
y = np.argmax(prob, axis=1)