学习不同的异常检测技术

学习不同的异常检测技术

源节点: 1867449

我们使用 Standard Scaler 使我们的数据正常化并绘制散点图。

现在我们将导入 DBSCAN 来给集群打分。 如果失败,它将显示-1。

现在我们有了结果,但是我们如何检查哪个值是最小值、最大值以及我们是否有 -1 值? 我们将使用 arg min 值来检查集群中的最小值。

我们可以从结果中看到六个值为 -1 的值。

现在让我们绘制一个散点图。

我们应用的上述方法是针对单变量异常值的。

对于多变量异常值检测,我们需要了解多变量异常值。

例如,我们读取汽车读数。 我们见过两个读数表,一个是里程表,它记录或测量车辆行驶的速度,第二个是转速读数,它记录车轮每分钟转动的圈数。

假设里程表显示在 0-60 mph 范围内,rpm 在 0-750 范围内。 我们假设所有出现的值都应该相互关联。 如果里程表显示速度为 50 而转速显示进气量为 0,则读数不正确。 如果里程表显示的值大于零,则意味着汽车在移动,因此 rpm 应该具有更高的值,但在我们的例子中,它显示为 0 值。 即,多变量离群值。

C. 马氏距离法

在 DBSCAN 中,我们使用欧式距离度量,但在本例中,我们谈论的是马氏距离方法。 我们还可以将马氏距离与 DBSCAN 一起使用。

DBSCAN(eps=0.5, min_samples=3, metric='mahalanobis', metric_params={'V':np.cov(X)}, algorithm='brute', leaf_size=30, n_jobs=-1)

为什么欧几里得不适用于相互关联的实体? 欧几里德距离无法找到或将给出关于两点有多近的不正确数据。

Mahalanobis 方法使用点之间的距离和干净数据的分布。 欧几里德距离往往在两点之间,它的z-score是通过x减去均值再除以标准差来计算的。 在 Mahalanobis 中,z 分数是 x 减去均值除以协方差矩阵。

因此,除以协方差矩阵有什么影响? 如果数据集中的变量高度相关,则协方差值会很高。

类似地,如果协方差值较低,并且数据不相关,则距离不会显着减小。 它做得很好,解决了变量问题的规模和相关性。

代码

数据集可以取自 Anomaly-/caret.csv 位于 main · aster28/Anomaly- (github.com)

df = pd.read_csv('caret.csv').iloc[:, [0,4,6]] df.head()

我们将函数距离定义为 x= None、data= None 和 Covariance = None。 在函数内部,我们取数据的均值并使用那里的值的协方差值。 否则,我们将计算协方差矩阵。 T代表转置。

例如,如果数组大小为 XNUMX 或 XNUMX,并且您希望它在两个变量中,那么我们需要转置矩阵。

np.random.multivariate_normal(mean, cov, size = 5)
array([[ 0.0509196, 0.536808 ], [ 0.1081547, 0.9308906], [ 0.4545248, 1.4000731], [ 0.9803848, 0.9660610], [ 0.8079491 , 0.9687909]])
np.random.multivariate_normal(mean, cov, size = 5).T
array([[ 0.0586423, 0.8538419, 0.2910855, 5.3047358, 0.5449706], [ 0.6819089, 0.8020285, 0.7109037, 0.9969768, -0.7155739]])

我们使用了 sp.linalg,它是线性代数,具有要在线性代数上执行的不同功能。 它具有用于矩阵求逆的 inv 函数。 NumPy 点作为矩阵乘法的手段。

将 scipy 导入为 sp def distance(x=None, data=None, cov=None): x_m = x - np.mean(data) 如果不是 cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) left = np.dot(x_m, inv_cov) m_distance = np.dot(left, x_m.T) return m_distance.diagonal() df_g= df[['克拉', '深度', '价格' ].head(50) df_g['m_distance'] = distance(x=df_g, data=df[['carat', 'depth', 'price']]) df_g.head()

B. Tukey 异常值检测方法

Tukey 方法通常也称为 Box and Whisker 或 Box plot 方法。

Tukey 方法利用上限和下限范围。

上限 = 第 75 个百分位 -k*IQR

下限 = 25th Percentile + k* IQR

让我们使用箱形图查看带有年龄变量的泰坦尼克号数据。

sns.boxplot(泰坦尼克号['年龄'].values)

我们可以在图像中看到 Seaborn 创建的盒印迹显示 55 到 80 岁之间的许多点是不在四分位数内的异常值。 我们将通过创建函数 outliers_detect 来检测下限和上限。

def outliers_detect(x, k = 1.5): x = np.array(x).copy().astype(float) first = np.quantile(x, .25) third = np.quantile(x, .75) # IQR计算 iqr = third - first #上限和下限 lower = first - (k * iqr) upper = third + (k * iqr) return lower, upper
outliers_detect(泰坦尼克号['年龄'],k = 1.5)
(2.5,54.5)

D. PyCaret 检测

我们将使用相同的数据集进行 PyCaret 检测。

从 pycaret.anomaly import * setup_anomaly_data = setup(df)

Pycaret 是一种开源机器学习,它使用无监督学习模型来检测异常值。 它有一个 get_data 方法,用于使用 pycaret 本身的数据集,set_up 用于检测前的预处理任务,通常采用数据帧,但也有许多其他功能,如 ignore_features 等。

其他方法 create_model 用于使用算法。 我们将首先使用隔离林。

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = predict_model(ifor, data = df) print(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["Anomaly"] == 1] print(ifor_anomaly.head()) 打印( ifor_anomaly.shape)

Anomaly 1 表示异常值,Anomaly 0 表示没有异常值。

这里的黄色表示异常值。

现在让我们看看另一种算法,K 最近邻 (KNN)

knn = create_model("knn") plot_model(knn) knn_pred = predict_model(knn, data = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["异常"] == 1] knn_anomaly.head() knn_anomaly.shape

现在我们将使用聚类算法。

clus = create_model("cluster") plot_model(clus) clus_pred = predict_model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomaly"] == 1] print(clus_anomaly.head()) clus_anomaly。形状

E. PyOD 异常检测

PyOD 是一个 python 库,用于检测多变量数据中的异常值。 它对监督学习和非监督学习都有好处。

从 pyod.models.iforest 导入 IForest 从 pyod.models.knn 导入 KNN 

我们导入了库和算法。

从 pyod.utils.data 导入 generate_data 从 pyod.utils.data 导入 evaluate_print 从 pyod.utils.example 导入可视化 train=300 test=100 污染 = 0.1 X_train, X_test, y_train, y_test = generate_data(n_train=train, n_test=test , n_features=2,contamination=污染,random_state=42)
cname_alg = 'KNN' #算法的名字是K Nearest Neighbors c = KNN() c.fit(X_train) #拟合算法 y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("Training Data:") evaluate_print(cname_alg, y_train, y_train_scores) print("Test Data:") evaluate_print(cname_alg, y_test, y_test_scores) visualize(cname_alg, X_train, y_train, X_test, y_test, y_trainpred,y_testpred, show_figure=True, save_figure=True)

我们将使用 IForest 算法。

fname_alg = 'IForest' #算法的名字是K Nearest Neighbors f = IForest() f.fit(X_train) #拟合算法 y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_test_pred = c.predict(X_test) y_test_scores = c.decision_function(X_test) print("Training Data:") evaluate_print(fname_alg, y_train_pred, y_train_scores) print("Test Data:") evaluate_print(fname_alg, y_test_pred, y_test_scores) visualize(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=True, save_figure=True)

F. Prophet 异常检测

我们将使用具有时间序列的航空旅客数据集 prophet/example_air_passengers.csv 位于 main · aster28/prophet (github.com)

从先知导入先知 从先知导入预报员 导入先知 m = Prophet()
data = pd.read_csv('air_pass.csv') data.head()
data.columns = ['ds', 'y'] data['y'] = np.where(data['y'] != 0, np.log(data['y']), 0)

y 列的 Log 不启用负值。 我们将数据拆分为训练、测试,并将预测存储在变量 forecast 中。

train, test= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) forecast = m.predict(test) def detect(forecast): 预测=预测[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['anomaly'] =0 forcast.loc[forcast['real'] > forcast['yhat_upper'], 'anomaly']=1 forcast.loc[forcast['real']< forcast['yhat_lower'], 'anomaly']=-1 forcast['imp']=0 in_range = forcast ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['anomaly']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['anomaly']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range 返回预测
检测(预测)

我们将异常值设为 -1。

结论

在给定数据集中查找异常值的过程称为异常检测。 异常值是从数据集中的其余对象值中脱颖而出并且行为不正常的数据对象。

异常检测任务可以使用基于距离和基于密度的聚类方法将异常值识别为一个聚类。

我们在这里讨论异常检测的各种方法,并使用 Titanic、Air passenger 和 Caret 三个数据集上的代码来解释它们

关键点

1. 可以使用 Box-Whisker 方法或 DBSCAN 检测异常值或异常检测。

2.欧几里得距离法用于不相关的项目。

3. Mahalanobis 方法与多变量离群值一起使用。

4.所有的值或点都不是异常值。 有些是本应是垃圾的噪音。 异常值是需要调整的有效数据。

5. 我们使用 PyCaret 通过使用不同的算法进行异常值检测,其中异常值是一个,以黄色显示,没有异常值是 0。

6. 我们使用了 PyOD,它是 Python 异常值检测库。 它有 40 多种算法。 它使用监督和非监督技术。

7. 我们使用了 Prophet 并定义了函数 detect 来勾勒异常值。

本文中显示的媒体不属于 Analytics Vidhya 所有,其使用由作者自行决定。

时间戳记:

更多来自 分析维迪亚