孤立森林算法来检测异常纯粹是基于一个事实:异常点是少数的和不同的。该算法在不采用任何距离或密度测量的情况下实现异常点隔离,这与基于聚类的或基于距离的算法有根本的不同。
在应用孤立森林模型时,我们设置contamination = outliers_fraction,即告诉模型数据集中的异常值比例为0.01。 fit和predict(data)对数据执行异常检测,返回1表示正常,-1表示异常。 最后,我们使用时间序列视图可视化异常点。data = df[['price_usd', 'srch_booking_window', 'srch_saturday_night_bool']]
scaler = StandardScaler()
np_scaled = scaler.fit_transform(data)
data = pd.DataFrame(np_scaled)
# train isolation forest
model = IsolationForest(contamination=outliers_fraction)
model.fit(data)
df['anomaly2'] = pd.Series(model.predict(data))
# visualization
fig, ax = plt.subplots(figsize=(10,6))
a = df.loc[df['anomaly2'] == -1, ['date_time_int', 'price_usd']] #anomaly
ax.plot(df['date_time_int'], df['price_usd'], color='blue', label = 'Normal')
ax.scatter(a['date_time_int'],a['price_usd'], color='red', label = 'Anomaly')
plt.legend()
plt.show();
基于支持向量机算法的异常检测
SVM通常与监督学习相关联,但OneClassSVM可将异常检测问题看作无监督学习问题,其学习一个用于异常检测的决策函数:将新数据分类为与训练集相似或不同两类。
OneClassSVM
根据文章《Support Vector Method for Novelty Detection》(http://users.cecs.anu.edu.au/~williams/papers/P126.pdf),我们知道SVM是最大化几何边缘区的方法,而不是构建一个概率分布模型。SVM用于异常检测的思想在于寻找一个函数,使得其在高密度点区域取值为正在低密度点区域取值为负。
在拟合OneClassSVM模型时,我们设置nu = outliers_fraction,它是训练误差分数的上限和支持向量分数的下限,并且必须在0和1之间。基本上这恰好与我们期望的数据集中的异常值比例相符。 指定要在算法中使用的内核类型:rbf,这将使SVM能够使用非线性函数将超空间投影到更高的维度。 gamma是RBF核类型的参数,并控制各个训练样本的影响——这会影响模型的“平滑度”。通过实验,我没有发现任何显著差异。 predict(data) 对数据进行分类,因为我们的模型是单类模型,所以返回+1或-1,其中-1表示异常,1表示正常。data = df[['price_usd', 'srch_booking_window', 'srch_saturday_night_bool']]
scaler = StandardScaler()
np_scaled = scaler.fit_transform(data)
data = pd.DataFrame(np_scaled)