作为自编码器的入门项目,我实现了一个无监督的异常检测系统,传统的异常检测手段有很多,在有监督时可以单纯用多分类问题来判别异常,也可以用高斯聚类来帮助判别异常出现的概率。这里我们依赖深度模型——自编码器来帮助我们做无监督的异常检测。
所谓异常检测,它相比于一般的二分类问题有一些特别的性质,其最主要的特点,不在数据分布上,而在数据的比例上。异常之所以称做异常,就是因为它不容易发生。体现在数据集上,就是我们的正常样本数目远超异常样本,这样在训练二分类器时容易受到严重的样本不平衡的影响。
这里用经典的玻璃分类数据集作为训练资料,我们用其中的第七类玻璃作为异常样本,其他玻璃均为正常。
准备工作
一些要用到的数据处理、可视化工具,以及我们的无敌Pytorch
import seaborn as sns
import torch
import torch.nn as nn
from torch.utils.data import DataLoader,TensorDataset
import numpy as np # linear algebra
import pandas as pd # read and wrangle dataframes
import matplotlib.pyplot as plt # visualization
from sklearn.base import TransformerMixin # To create new classes for transformations
from sklearn.preprocessing import (FunctionTransformer, StandardScaler)
from sklearn.model_selection import train_test_split
from collections import Counter
glass.csv数据集很容易找到,搜索一下就行。这里先导入数据集,并简单观察一下数据分布
df = pd.read_csv('glass.csv')
features = df.columns[:-1].tolist()
print(df.shape)
sns.countplot(df['Type'])
plt.show()
df.head()
训练与测试数据
我们使用10%的正常样本+所有的异常样本组成测试集,90%的正常样本用于无监督训练。
X = df[features].values
y = df['Type'].values
X_nov = X[y==7]
X_nom = X[~(y==7)]
X_train, X_nom_test = train_test