Task03 异常检测之线性模型

1、概述

异常检测真实数据集中不同维度的数据通常具有高度的相关性,这是因为不同的属性往往是由相同的基础过程以密切相关的方式产生的。在古典统计学中,这被称为——回归建模,一种参数化的相关性分析。

1.1 线性回归

相关性分析:试图通过其他变量预测单独的属性值,一般依据正常值训练出一个模型,然后测试集利用这个模型的值来训练区分哪些为异常数据。
线性回归的定义是:目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。
优点:结果易于理解,计算不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值型和标称型

1.1.1 基于自变量与因变量的线性回归

1) 最小二乘法
  为了简单起见,这里我们一元线性回归为例: Y = ∑ i = 1 d a i ⋅ X i + a d + 1 Y=\sum_{i=1}^{d} a_{i} \cdot X_{i}+a_{d+1} Y=i=1daiXi+ad+1
变量Y为因变量,也就是我们要预测的值; X 1 . . . X d X_{1}...X_{d} X1...Xd为一系列因变量,也就是输入值。系数 a 1 . . . a d + 1 a_{1}...a_{d+1} a1...ad+1为要学习的参数。假设数据共包含 N N N个样本,第 j j j个样本包含的数据为 x j 1 . . . x j d x_{j1}...x_{jd} xj1...xjd y j y_{j} yj,带入式(1)如下式所示:

y j = ∑ i = 1 d a i ⋅ x j i + a d + 1 + ϵ j y_{j}=\sum_{i=1}^{d} a_{i} \cdot x_{j i}+a_{d+1}+\epsilon_{j} yj=i=1daixji+ad+1+ϵj

这里 ϵ j \epsilon_{j} ϵj为第 j j j个样本的误差。以 Y Y Y 代表 N × 1 N \times 1 N×1 的因变量矩阵 ( y 1 . . . y N ) T {(y_{1}...y_{N})}^{T} (y1...yN)T,即样本中的真实值;以 U U U代表 N × ( d + 1 ) N \times (d+1) N×(d+1)的自变量矩阵,其中第 j j j行为 ( x j 1 . . . x j d , 1 ) (x_{j1}...x_{jd}, 1) (xj1...xjd,1);以 A A A 代表 ( d + 1 ) × 1 (d+1) \times 1 (d+1)×1 的系数矩阵 ( a 1 . . . a d + 1 ) T (a_{1}...a_{d+1})^{T} (a1...ad+1)T。则模型可表示为: f ( U , A ) = U ⋅ A f(U, A) = U \cdot A f(U,A)=UA

定义目标函数为:

L ( A ) = 1 2 ∣ Y − U ⋅ A ∣ 2 L(A) = \frac{1}{2}{\left| {Y - U \cdot A} \right|^2} L(A)=21YUA2

目标函数是关于 A A A的凸函数,其对 A A A求偏导为:

∂ L ( A ) ∂ A = 1 2 ∂ ∣ Y − U ⋅ A ∣ 2 ∂ A = − U T ( Y − U ⋅ A ) \frac{{\partial L(A)}}{{\partial A}} = \frac{1}{2}\frac{{\partial {{\left| {Y - U \cdot A} \right|}^2}}}{{\partial A}} = - {U^T}(Y - U \cdot A) AL(A)=21AYUA2=UT(YUA)

∂ L ( A ) ∂ A = 0 \frac{{\partial L(A)}}{{\partial A}}=0 AL(A)=0,得到最优参数为:

A = ( U T ⋅ U ) − 1 ⋅ ( U T ⋅ Y ) A=\left(U^{T} \cdot U\right)^{-1} \cdot\left(U^{T} \cdot Y\right) A=(UTU)1(UTY)

这种求解线性回归参数的方法也叫最小二乘法。

最小二乘法要求矩阵 U T ⋅ U U^{T} \cdot U UTU 可逆,即 U T ⋅ U U^{T} \cdot U UTU是满秩的。当 U T ⋅ U U^{T} \cdot U UTU不可逆时可以通过两种方法进行参数估计,一种先使用主成分分析等方法来预处理数据,消除不同特征之间的相关性,然后再使用最小二乘法。第二种方法是使用梯度下降法。

2) 梯度下降法
数据集
  监督学习一般靠数据驱动。我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),通常还应该有一个用于防止过拟合的交叉验证集和一个用于评估模型性能的测试集(test set)。一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。
损失函数
  如果把线性回归看作是一个优化问题,那么我们要优化的目标就是损失函数。损失函数是用来衡量样本误差的函数,我们的优化目标是要求得在误差最小的情况下模型参数的值。这里强调一下损失函数和代价函数的区别:

注意: **Loss Function(损失函数):**the error for single training example; **Cost Function(代价函数):**the average of the loss functions of the entire training set;

线性回归常用的损失函数是均方误差,表达式为:

l ( i ) ( w , b ) = 1 2 ( y ^ ( i ) − y ( i ) ) 2 l^{(i)}(\mathbf{w}, b)=\frac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2} l(i)(w,b)=21(y^(i)y(i))2

L ( w , b ) = 1 n ∑ i = 1 n l ( i ) ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w ⊤ x ( i ) + b − y ( i ) ) 2 L(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} l^{(i)}(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} \frac{1}{2}\left(\mathbf{w}^{\top} \mathbf{x}^{(i)}+b-y^{(i)}\right)^{2} L(w,b)=n1i=1nl(i)(w,b)=n1i=1n21(wx(i)+by(i))2   其中 y ^ \hat{y} y^ 为预测值, y y y 为真实值。 优化算法 - 随机梯度下降

当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失和有关模型参数的导数(梯度),最后用此结果与预先设定的学习率的乘积作为模型参数在本次迭代的减小量。如下式所示:

( w , b ) ← ( w , b ) − η ∣ B ∣ ∑ i ∈ B ∂ ( w , b ) l ( i ) ( w , b ) (\mathbf{w}, b) \leftarrow(\mathbf{w}, b)-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w}, b)} l^{(i)}(\mathbf{w}, b) (w,b)(w,b)BηiB(w,b)l(i)(w,b)

学习率( η \eta η): 代表在每次优化中,能够学习的步长的大小 批量大小( B B B): 是小批量计算中的批量大小batch size

1.1.2 基于异常检测的线性回归

前一节讨论了这样一种情况:即一个特定的变量被认为是特殊的,最优平面是通过最小化该特殊变量的均方误差而确定的。而我们通常所说的异常检测中并不会对任何变量给与特殊对待,异常值的定义是基于基础数据点的整体分布,因此需要采用一种更一般的回归建模:即以相似的方式对待所有变量,通过最小化数据对该平面的投影误差确定最佳回归平面。在这种情况下,假设我们有一组变量 X 1 … X d X_{1}… X_{d} X1Xd, 对应的回归平面如下:

a 1 ⋅ X 1 + … + a d ⋅ X d + a d + 1 = 0 a_{1} \cdot X_{1}+\ldots+a_{d} \cdot X_{d}+a_{d+1}=0 a1X1++adXd+ad+1=0

为了后续计算的方便,对参数进行如下约束: ∑ i = 1 d a i 2 = 1 \sum\limits_{i = 1}^d {a_i^2 = 1} i=1dai2=1   以 L 2 L_{2} L2范数作为目标函数: L = ∣ U ⋅ A ∣ 2 L = {\left| {U \cdot A} \right|_2} L=UA2

这样的一个问题可以通过主成分分析方法得到有效解决,我们会单独用一个部分进行讨论。
  待后续再详细说明

1.2 PCA

PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。
主要思想为降维

2、数据可视化学习

以测试集数据为例:breast-cancer-unsupervised-ad数据集为例做一些简单的数据可视化。

2.1 数据观察:

#coding:utf-8
#import warnings package,Using filter to ignore warning statement。
import warnings
warnings.filterwarnings('ignore')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #Enhancement package of plt
import missingno as msno #Missing value processing package
## 1) read csv data
path = 'dataverse_files/'
f=open(path+'breast-cancer-unsupervised-ad.csv')
Train_data = pd.read_csv(f)
## 2) 简略观察数据(head()+shape)
Train_data.head()
Train_data.tail()
print(Train_data.head()) #Top Five Data
print(Train_data.tail()) #The Last Five Data
Train_data.describe() #get the mathematical index
Train_data.info() #data type

2.2 第一个图表绘制

相关性分析,主要进行各个特征之前相关性查看,确认各个是否有相关性,测试集与作者所使用不一致,需更增加数据标题。

numeric_features = ['f' + str(i) for i in range(30)]

## 1) 相关性分析
numeric = Train_data[numeric_features]
correlation = numeric.corr()

f , ax = plt.subplots(figsize = (14, 14))

sns.heatmap(correlation,square = True)
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
plt.show())

在这里插入图片描述

2.3 每个数字特征得分布可视化

f = pd.melt(Train_data, value_vars=numeric_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=6, sharex=False, sharey=False)
g = g.map(sns.distplot, "value", hist=False, rug=True)

呈现结果图:
在这里插入图片描述

2.4 两两相关性分析

sns.set()
sns.pairplot(Train_data[numeric_features],size = 2 ,kind =‘scatter’,diag_kind=‘kde’)
plt.savefig(‘correlation.png’)
plt.show()
呈现效果图:
在这里插入图片描述

2.5 PCA数据降维

from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', random_state=0)
result = tsne.fit_transform(numeric)
x_min, x_max = np.min(result, 0), np.max(result, 0)
result = (result - x_min) / (x_max - x_min)
label = Train_data['label']
fig = plt.figure(figsize = (7, 7))
#f , ax = plt.subplots()
color = {'o':0, 'n':7}
for i in range(result.shape[0]):
    plt.text(result[i, 0], result[i, 1], str(label[i]),
                color=plt.cm.Set1(color[label[i]] / 10.),
                fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.title('Visualization of data dimension reduction')

呈现效果图:
在这里插入图片描述

3、练习

3.1 使用PyOD库生成toy example并调用PCA

from pyod.models.pca import PCA #Use PCAalgorithm
from pyod.utils.data import evaluate_print #evaluate result
from pyod.utils.example import visualize #draw
from sklearn.model_selection import train_test_split #cut the data
import pandas as pd #pa
if __name__ == "__main__":
    path = 'dataverse_files/'
    f = open(path + 'annthyroid-unsupervised-ad.csv')
    titan = pd.read_csv(f,nrows=300)

    # deal data
    #x = titan[['f0','f20']]
    x = titan[['f' + str(i) for i in range(21)]]
    #print(['f' + str(i) for i in range(21)])
    #print(x)
    y = titan['label'].replace("n",1).replace("o",0)
    #print(y)
    # cut the data
    X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
    #print(X_test.value_counts())
    # print(y_train)
    # print(X_test)c
    # print(y_test)

    # train kNN detector
    clf_name = 'PCA'
    clf = PCA(n_components=2)
    clf.fit(X_train)
    print(clf.explained_variance_ratio_)
    #print(X_train)
    # get the prediction labels and outlier scores of the training data
    y_train_pred = clf.labels_  # binary labels (0: inliers, 1: outliers)
    print(y_train_pred)
    y_train_scores = clf.decision_scores_  # raw outlier scores
    print(y_train_scores)
    # get the prediction on the test data
    y_test_pred = clf.predict(X_test)  # outlier labels (0 or 1)
    y_test_scores = clf.decision_function(X_test)  # outlier scores
    #print(y_test_pred)
    # evaluate and print the results
    print("\nOn Training Data:")
    evaluate_print(clf_name, y_train, y_train_scores)
    print("\nOn Test Data:")
    evaluate_print(clf_name, y_test, y_test_scores)
    #print(X_train)
    X_train = X_train[['f0', 'f20']]
    X_test = X_test[['f0', 'f20']]
    visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
              y_test_pred, show_figure=True, save_figure=True)

运行结果:
在这里插入图片描述

由于原数据集是多维的所有暂时没有对多维数据的异常分析,后续有需要再进行分析,再进行测试实例修改。
以上测试示例为:癌症数据PCA降维后数据预测结果展示,只展示两维数据,待后续学习完成了,再补充多维数据的展示。
其中最主要为:clf = PCA(n_components=2),可以将多维降维到2维,保持与之前两个任务一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值