在离群值检测中,在拟合算法之后或之前训练测试拆分

In outliers detection, train test split after or before fit the algorithm

我正在实施异常值检测管道。

我训练算法时提出的3个场景:

我应该先拆分数据再拟合离群值检测算法吗?

我应该只适合坐火车吗?

我应该拆分然后适合火车和单独测试吗?

出于说明目的,我将使用 iris 数据集

这里在缩放的情况下也有类似的讨论:

Why do we need to re-use training parameters to transform test data?


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
from sklearn.svm import OneClassSVM
from sklearn.model_selection import train_test_split

from warnings import filterwarnings

filterwarnings('ignore')


X,y = load_iris(return_X_y= True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .3, random_state = 123)


# Option 1

Iso_outliers = IsolationForest().fit(X_train)

Iso_outliers_train = Iso_outliers.predict(X_train)

Iso_outliers_test = Iso_outliers.predict(X_test)

# Option 2

Iso_outliers_train = IsolationForest().fit_predict(X_train)

Iso_outliers_test = IsolationForest().fit_predict(X_test)

# Option 3

Iso_outliers_X = IsolationForest().fit_predict(X)

  1. 以上 3 个选项中哪一个是正确的,为什么?

  2. 它是否取决于要使用的算法,或者它是否适用于任何异常值检测算法?

1- 选项 1 是正确的。正确的做法是让你的模型适合你的火车数据。因为那是将数据拆分为训练集和测试集的目的。训练集是用于构建模型的信息,测试集用于测试模型、计算误差和准确性。如果您同时使用测试数据和训练数据训练模型,那么您将没有数据来验证您的模型。这就是选项 3 不正确的原因。 选项 2 中的第一个语句等效于

    Iso_outliers = IsolationForest().fit(X_train)
    Iso_outliers_train = Iso_outliers.predict(X_train)

所以用起来没什么问题。但是,在第二个语句中,you "fit and predict",这意味着您使用测试数据再次构建模型并使用您通过测试集构建的模型进行预测。所以,没有使用train set。

2-在机器学习中构建任何模型的一般做法(它独立于您要实现的算法)是:

  1. 首先,使用训练数据构建模型。
  2. 然后,使用测试数据来验证和评估模型。

您可以阅读 wiki page 以更好地理解将数据划分为 train-test-validation 组。

  1. 移除异常值
  2. 拆分数据为训练数据和测试数据。
  3. train 使用 fit 的数据然后测试数据。