如何在 Pandas DataFrame 中操作来自 Google AutoML 的预测响应?

How to manipulate prediction response from Google AutoML in a Pandas DataFrame?

我已经成功地训练了一个 Google AutoML 自然语言模型来使用自定义标签对文本进行多标签分类。

我还能够使用由训练数据集生成的 python 函数来生成对 Jupyter Notebook 中 Pandas DataFrame 中包含的文本的预测。

但是我不确定如何使用结果,尤其是操作它以便它对我有用。

这是我的代码目前的样子:

r = #api call to get text
df = pd.read_csv(StringIO(r.text), usecols=['text_to_predict'])
df['Category_Predicted'] = df.apply(lambda row: get_prediction(row.review, 'xxx', 'xxxx')

df['Category_Predicted'].head() 的输出是

0    payload {\n  classification {\n    score: 0.61...
Name: Category_Predicted, dtype: object

以及一个预测的简单(更具可读性)打印 returns

payload {
  classification {
    score: 0.6122230887413025
  }
  display_name: "Shopping"
}
payload {
  classification {
    score: 0.608892023563385
  }
  display_name: "Search"
}
payload {
  classification {
    score: 0.38840705156326294
  }
  display_name: "Usability"
}
payload {
  classification {
    score: 0.2736874222755432
  }
  display_name: "Stability"
}
payload {
  classification {
    score: 0.011237740516662598
  }
  display_name: "Profile"
}
#......................(continues on for all categories)

现在,我的主要 objective 将 df['Category_Predicted'] 作为一个字段,其中最顶层(最相关)的类别在一个简单的列表中以逗号分隔。上面的例子是

Shopping, Search, Usability

(取决于你希望根据分数保留标签的程度)

所以我手上有几个:

谢谢!

编辑

根据评论中的要求,下面的一些示例表示我的数据框中的 2 条记录 具有(不完整)有效负载,位于所需位置结果我过滤了分数> 0.3 的结果。由于文本字段很大,我不得不使用... "custom" 解决方案而不是 ascii 表

第 1 行 - 要预测的文本

迄今为止非常棒的应用程序。遗憾的是,您无法在旧应用程序中查看您购物时仍然拥有的商品或您最喜欢的商品。这个事实根本就没有了。另外,您现在必须在新的中输入所有内容!!!

第 1 行 - 预测输出

payload {
  classification {
    score: 0.6122230887413025
  }
  display_name: "Shopping"
}
payload {
  classification {
    score: 0.608892023563385
  }
  display_name: "Search"
}
payload {
  classification {
    score: 0.38840705156326294
  }
  display_name: "Usability"
}
payload {
  classification {
    score: 0.2736874222755432
  }
  display_name: "Stability"
}

第 1 行 - 所需输出

购物、搜索、可用性

第 2 行 - 要预测的文本

你第二次拿一个新应用开玩笑,比第一次还糟糕。多久才能用这个提升等级?一点都不直观,不太清楚...总之没有上一个的水平

第 2 行 - 预测输出

payload {
  classification {
    score: 0.9011210203170776
  }
  display_name: "Usability"
}
payload {
  classification {
    score: 0.8007309436798096
  }
  display_name: "Shopping"
}
payload {
  classification {
    score: 0.5114057660102844
  }
  display_name: "Stability"
}
payload {
  classification {
    score: 0.226901113986969
  }
  display_name: "Search"
}

第 2 行 - 所需输出

可用性、购物、稳定性

我从你的问题中了解到,你想要根据预测得分获得最相关的类别。我将你的预测字符串输出放在一个文本文件中,例如 out.txt

import pandas as pd
df = pd.read_csv('out.txt',
             header=None,
             delim_whitespace=True,
             names=['data'])
score = df.loc['score:']['data'].values
category = df.loc['display_name:']['data'].values
score_category = zip(score,category)
for category in sorted(list(score_category), key=lambda x:x[0], reverse=True):
    print(category[1], end=", ")

对于上面分享的预测结果,得到的结果:-

Shopping, Search, Usability, Stability, Profile,

我知道回答我自己的问题不好,但我想如果有人寻找同样的问题,他们可能会找到解决方案。

正如google.cloud.automl_v1beta1 定义的那样,方法get_prediction 的return 值是PredictResponse ( https://cloud.google.com/natural-language/automl/docs/reference/rpc/google.cloud.automl.v1beta1#predictresponse )[=12 类型的对象=]

使用此类对象的文档和可用结构,我发现这段代码可以解决问题

for index, row in df.iterrows():
    pred = get_prediction(row['review'], GCP_PROJ, AUTOML_DS)
    filteredCategories = filter(filterPrediction, pred.payload)
    df.at[index,'Predicted_Categories'] = ",".join([str(categ.display_name) for categ in filteredCategories])