【无监督学习】机器学习专项课程学习记录6——异常检测

学习目标

七月的最后一次更新(2/2),坚持!学会无监督学习中的异常检测。

笔记

1 异常检测算法

1.1 密度估计(Density estimation)

判断 x t e s t x_{test} xtest是否异常。作出特征的高斯分布等高线图,可知位于密度小的区域的值更有可能是异常值:在这里插入图片描述

1.2 单个特征的异常检测——高斯分布/正态分布(Gaussian / Normal distribution)

高斯分布的概率公式为:
p ( x ; μ , σ 2 ) = 1 2 π σ 2 exp ⁡ − ( x − μ ) 2 2 σ 2 p(x ; \mu,\sigma ^2) = \frac{1}{\sqrt{2 \pi \sigma ^2}}\exp^{ - \frac{(x - \mu)^2}{2 \sigma ^2} } p(x;μ,σ2)=2πσ2 1exp2σ2(xμ)2
其中,第j个特征的均值和方差为:
μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j = \frac{1}{m} \sum_{i=1}^m x_j^{(i)} μj=m1i=1mxj(i)

σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 \sigma_j^2 = \frac{1}{m} \sum_{i=1}^m (x_j^{(i)} - \mu_j)^2 σj2=m1i=1m(xj(i)μj)2

1.3 异常检测算法

第一步,选择出有助于检测异常情况的n个特征 x j x_j xj
第二步,计算每个特征的均值 μ j \mu_j μj和方差 σ j 2 \sigma_j^2 σj2
第三步,给定新示例x,计算p(x):
p ( x ) = ∏ j = 1 n p ( x j ; μ j , σ j 2 ) = p ( x 1 ; μ 1 , σ 1 2 ) ∗ p ( x 2 ; μ 2 , σ 2 2 ) ∗ . . . ∗ p ( x n ; μ n , σ n 2 ) p(x) = \prod \limits_{j=1}^n p(x_j;\mu_j,\sigma_j^2) = p(x_1;\mu_1,\sigma_1^2) * p(x_2;\mu_2,\sigma_2^2)* ... *p(x_n;\mu_n,\sigma_n^2) p(x)=j=1np(xj;μj,σj2)=p(x1;μ1,σ12)p(x2;μ2,σ22)...p(xn;μn,σn2)
最后,给定阈值 ϵ \epsilon ϵ,如果 p ( x ) < ϵ p(x)<\epsilon p(x)<ϵ,则认为示例x是异常的。

异常检测算法的python实现如下:

# 定义计算特征的均值和方差的函数
def estimate_gaussian(X): 
    m, n = X.shape

    mu =  np.sum(X,axis = 0)/m
    var = np.sum((X-mu)**2,axis = 0)/m
        
    return mu, var  #返回均值和方差

# 定义计算多变量高斯分布概率的函数
def multivariate_gaussian(X, mu, var):   
    k = len(mu)
    
    if var.ndim == 1:
        var = np.diag(var)
        
    X = X - mu
    p = (2* np.pi)**(-k/2) * np.linalg.det(var)**(-0.5) * \
        np.exp(-0.5 * np.sum(np.matmul(X, np.linalg.pinv(var)) * X, axis=1))
    
    return p
    
# 定义一个选择最佳阈值的函数
def select_threshold(y_val, p_val): 
    best_epsilon = 0
    best_F1 = 0
    F1 = 0
    
    step_size = (max(p_val) - min(p_val)) / 1000
    
    for epsilon in np.arange(min(p_val), max(p_val), step_size):# 尝试不同的阈值

        predictions = (p_val < epsilon) 
        tp = sum((predictions == 1)&(y_val == 1))
        fp = sum((predictions == 0)&(y_val == 1))
        fn = sum((predictions == 1)&(y_val == 0))
        prec = tp / (tp + fp)
        rec = tp / (tp + fn)
        F1 = 2 * prec * rec / (prec + rec) # 计算F1分数
        
        if F1 > best_F1:
            best_F1 = F1
            best_epsilon = epsilon
        
    return best_epsilon, best_F1  #最优的阈值对应最好的F1分数


# 在多特征组成的数据集上使用异常检测

# 计算训练集的均值和方差
mu_high, var_high = estimate_gaussian(X_train_high)

# 计算训练集的概率
p_high = multivariate_gaussian(X_train_high, mu_high, var_high)

# 评估验证集的概率
p_val_high = multivariate_gaussian(X_val_high, mu_high, var_high)

# 寻找最优阈值
epsilon_high, F1_high = select_threshold(y_val_high, p_val_high)

# 输出检测结果
print('Best epsilon found using cross-validation: %e'% epsilon_high)
print('Best F1 on Cross Validation Set:  %f'% F1_high)
print('# Anomalies found: %d'% sum(p_high < epsilon_high))

2 异常检测与监督学习对比

监督学习更多用于发现已知的、历史的异常;异常检测更多用于发现未知的、全新的异常。

3 特征选择

仔细选择特征对于异常检测十分重要。

3.1 特征转换

使用plt.hist(x,bins = 50,color = 'r')可以绘制出特征x的分布图。转换x,使得变形后的特征分布更接近高斯分布
注:如果在训练集对数据进行转换,要在交叉验证和测试集中进行同样的转换。

3.2 特征组合

将现有的特征以某种方式组合成新特征,新特征在异常事件中倾向于取特别大或者特别小的值(异常值)。

需要注意的地方

异常检测的应用:

  1. 欺诈行为检测
  2. 产品异常检测
  3. 监测数据中心的计算机
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值