高效计算异常检测

Efficiently calculate anomaly detection

我有一些问题,希望你能帮助我,谢谢!!!!

我有一个 table 看起来像这样:

Computer Data Count
A 01/01/2021 43
A 02/01/2021 64
A 03/01/2021 333
A 04/01/2021 656
B 01/01/2021 41
B 02/01/2021 436
B 03/01/2021 745
B 04/01/2021 234

我想运行隔离森林算法只对部分table

我不知道像 df[df['Computer'] == A]['Count'] 那样手动为每台计算机做什么 有大约 500 台不同的计算机。 所以我不知道该怎么做:

scaler = StandardScaler()
np_scaled = scaler.fit_transform(df[df['Computer'] == A]['Count'].values.reshape(-1, 1))
data = pd.DataFrame(np_scaled)

# train isolation forest
model =  IsolationForest(contamination=float(.01))
model.fit(data)
df['anomaly'] = model.predict(data) 

500 次(对于 A 和 B 以及 C 和更多) 有办法有效地做到这一点 谢谢!!!

结果应该是这样的但是每次检查异常只分别针对A,B分别等等

Computer Data Count anomaly
A 01/01/2021 43 1
A 02/01/2021 64 1
A 03/01/2021 333 1
A 04/01/2021 656 -1
B 01/01/2021 41 1
B 02/01/2021 436 1
B 03/01/2021 745 1
B 04/01/2021 234 1

您可以按 Computer 分组并使用 transform 对每个组执行您已有的函数,将与原始索引相同的索引返回到 anomaly 列。

def train_isolation_group(group_count):
    scaler = StandardScaler()
    np_scaled = scaler.fit_transform(group_count.values.reshape(-1, 1))
    data = pd.DataFrame(np_scaled)

    # train isolation forest
    model =  IsolationForest(contamination=float(.01))
    model.fit(data)
    return model.predict(data)

df['anomaly'] = df.groupby('Computer')['Count'].transform(train_isolation_group)