Menu
CoddyTech

异常分数

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 37 课,共 51 课。

score_samples会为每一行数据打分:分数越低,越奇怪。以下是某家药店的处方数据:

forest = IsolationForest(random_state=0).fit(X)
rx["score"] = forest.score_samples(X)
print(rx.sort_values("score").head(3))

这会打印出最异常的 3 条记录:

     pills  refills  price     score
17     300        0  120.0 -0.881478
88      28       11   11.5 -0.708524
120     30        1   64.0 -0.700620

150 份处方的异常分数直方图:大多数分数在 -0.55 到 -0.35 之间,少数向左延伸至 -0.88,红色虚线阈值为 -0.6,有 4 条待检查

切分位置由你决定:一个人能检查多少行?排序以确定排名,再与阈值比较并标记。

challenge icon

挑战

中等

审计员只有时间审核少数几笔费用申报。起始代码会拟合一个 Isolation Forest,程序会读取 n 和一个阈值。

  1. 将每笔申报的评分写入新列 score。
  2. 按从最异常到较不异常的顺序,打印最异常的 n 笔申报,如下所示。
  3. 打印评分低于阈值的申报数量。

对于另一家公司,使用 2 和 -0.6:

Most unusual claims:
  C003: 1960 EUR, score -0.763
  C040: 80 EUR, score -0.757
Below -0.6: 6 claims

亲手试试

import pandas as pd
from sklearn.ensemble import IsolationForest

# 每笔报销申请占一行:金额、收据、提交时间(小时)和出行结束后经过的天数
claims = pd.read_csv("claims.csv")
X = claims[["amount_eur", "items", "hour", "days_late"]]
n = int(input())
threshold = float(input())

# 来自 Isolation Forest:用所有报销申请拟合的森林模型
forest = IsolationForest(random_state=0).fit(X)

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器