如何通过考虑数据中的所有其他变量来确定特定变量的异常?

数据挖掘 机器学习 异常检测 研究 异常
2022-02-17 11:14:57

我有机器学习/异常检测的问题。事实上,我有一个变量 Y 和几个其他变量 X。目的是量化 Y 数据的异常程度,但我必须考虑其他变量的值(Y 和 X 之间的关系)。

通常,异常检测算法会在整个数据(Y + X)上发现异常,但在我的情况下,我想放大 Y,因为它是一个非常重要的变量。如果我想对所有变量(Y + X)的异常进行量化,Y 将在所有变量的中间丢失。

这并不奇怪,因为当你应用线性回归 Y ~ X 时,你可以计算出库克距离,这是一种“异常分数”,它考虑了 Y 和 X 之间的关系。

我希望这很清楚!

1个回答

如果要关注类的异常值,可以执行以下操作:

使用隔离森林

import pandas as pd
import numpy as np

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, FunctionTransformer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import IsolationForest
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline

import plotly.express as px

X, y = load_iris(return_X_y= True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .2, random_state = 42)

out_model = Pipeline([("model", IsolationForest(random_state= 42))]).fit(X_train)

visualizer = Pipeline([("scaler",StandardScaler()),
                ("decomposer",PCA(n_components= 3)),
                ("framer", FunctionTransformer(lambda x: pd.DataFrame(x, columns = ["p1","p2","p3"])))]).fit(X_train)

outliers = out_model.predict(X_train)
X3D = visualizer.transform(X_train)

px.scatter_3d(data_frame=X3D, x = "p1", y = "p2", z = "p3", color = y_train, symbol=outliers )

pd.crosstab(index = y_train, columns= outliers, margins= True, normalize= 0 )

输出:

在此处输入图像描述

在此处输入图像描述

我们可以看到,大约 35% 属于第 2 类的观察值被标记为异常值

这是分析其背后原因的一个很好的起点。

希望能帮助到你