我正在实现异常值的检测管道。
我训练算法时出现了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)
以上三个选项中哪个是正确的,为什么?
它是否取决于要使用的算法,或者将其应用于任何异常值检测算法?
答案 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-在机器学习中构建任何模型(与您要实现的算法无关)的一般做法是:
您可以阅读wiki page,以更好地了解如何将数据划分为训练测试验证集。
答案 1 :(得分:0)