【问题标题】:Python: Create new binary list based on some condition between two pandas seriesPython:根据两个熊猫系列之间的某些条件创建新的二进制列表
【发布时间】:2019-07-18 02:03:06
【问题描述】:

我正在尝试比较两个列表,一个是一系列已知值,另一个是来自分类器的一系列预测,并创建一个关于这两个元素是否“足够接近”的新二进制列表。

我将使用 RMSE 作为适应度的度量,如果预测值和已知值之间的差异小于 1,我想在新列表的这个位置放置一个 1,如果错误是大于 1,则在新列表中此时返回 0。

例如:

y_known = {23,45,67,83}
y_pred = {23,46,64,78}

应该返回

binary_array = [1,1,0,0]

我需要这个来计算我训练有素的系统的准确率/召回率曲线。我已经研究过使用 lambda 表达式,但显然对于这种类型的问题,它比它的价值更麻烦。任何建议将不胜感激。

更新

这完美无缺,完全符合我的需要。原作者撤回了他的评论,但非常感谢!

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

【问题讨论】:

    标签: python pandas numpy scikit-learn scipy


    【解决方案1】:

    你可以使用

    (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])
    

    编辑,基于 cmets:如果您开始使用的是 pandas 系列,则相同的方法同样有效:

    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
    

    【讨论】:

    • 我使用 pandas Series 对象来包含数据,所以我不希望仅仅为了执行此操作而必须转换为 numpy 对象。用户撤回了他的评论,但我发现这个函数完美地完成了这个技巧。 OP 的变化。
    • 对于pd.Series,同样的方法同样适用;我已经相应地更新了答案。
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2016-08-03
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多