我试图比较两个列表,一个已知值中的一个,另一个来自分类器的一系列预测,并创建一个关于这两个元素是否“足够接近”的新二进制列表。
我将使用RMSE作为适应度的度量,如果预测值和已知值之间的差值小于1,我想在新列表的这个位置放一个1,如果误差大于1 ,在新列表中此时返回0。
例如:
y_known = {23,45,67,83}
y_pred = {23,46,64,78}
应该回来
binary_array = [1,1,0,0]
我需要这个来计算我训练过的系统的精度/召回曲线。我已经看过使用lambda表达式,但显然对于这种类型的问题,它比它的价值更麻烦。任何建议将不胜感激。
UPDATE
这完美无缺,完全符合我的需要。原作者撤回了他的评论,但非常感谢!
def createBinaryArray(x, y, k):
assert(len(x) == len(y))
return([1 if abs(a-b)<=k else 0 for a,b in zip(x, y)])
你可以用
(np.abs(y_known - y_pred) <= 1).astype(int)
使用您的示例输入:
In [265]: y_known = np.array([23, 45, 67, 83])
In [266]: y_pred = np.array([23, 46, 64, 78])
In [267]: (np.abs(y_known - y_pred) <= 1).astype(int)
Out[267]: array([1, 1, 0, 0])
编辑,基于评论:如果您开始使用的是熊猫系列,则相同的方法也是如此:
In [273]: y_known = pd.Series([23, 45, 67, 83])
In [274]: y_pred = pd.Series([23, 46, 64, 78])
In [278]: ((y_known - y_pred).abs() <= 1).astype(int)
Out[278]:
0 1
1 1
2 0
3 0
dtype: int32