在异常值检测中,在适合算法之后或之前训练测试拆分

时间:2019-07-08 19:52:42

标签: python machine-learning scikit-learn outliers

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

我训练算法时出现了3种情况:

在适合异常值检测算法之前,我应该先分割数据吗?

我只适合坐火车吗?

我应该分开然后分开训练并进行测试吗?

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

在缩放的情况下,这里也进行了类似的讨论:

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. 以上三个选项中哪个是正确的,为什么?

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

2 个答案:

答案 0 :(得分:1)

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

07-09 00:44:00.797 18172-18172/com.hadi.android.dm I/MYAPP: G started
07-09 00:44:00.886 18172-18172/com.hadi.android.dm I/MYAPP: G ended
07-09 00:44:00.888 18172-18172/com.hadi.android.dm I/MYAPP: receiver started
07-09 00:44:00.890 18172-18172/com.hadi.android.dm I/MYAPP: service started

因此使用它没有任何问题。但是,在第二条语句中,您将“拟合并预测”,这意味着您将使用测试数据再次构建模型,并使用通过测试集构建的模型进行预测。因此,没有使用火车。

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

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

您可以阅读wiki page,以更好地了解如何将数据划分为训练测试验证集。

答案 1 :(得分:0)

  1. 去除异常值
  2. 将数据拆分为训练数据和测试数据。
  3. 训练数据拟合,然后测试数据。

Jupyter notebook snapshot

相关问题