随着维度的增加,数据空间的?小(体积)会以指数级别增?,使数据变得稀疏,这便是维度诅咒。
例如基于邻近度的?法是在所有维度使?距离函数来定义局部性,但是,在?维空间中,所有点对的距离?乎都是相等的(距离集中),这使得?些基于距离的?法失效。在?维场景下,?个常?的?法是?空间?法。
而集成是?空间思想中常?的?法之?,可以有效提?数据挖掘算法精度。集成?法将多个算法或多个基检测器的输出结合起来。其基本思想是?些算法在某些?集上表现很好,另?些算法在其他?集上表现很好,然后集成起来使得输出更棒。
1 Feature Bagging
通俗来讲,就是挑选多种异常检测算法,对于每一种异常检测算法随机给不同的特征子集,以此来给出每一种算法的结果,最后再综合考虑所有算法的判断结果,给出判断。
前面提到需要一个组合函数将多种检测模型的结果汇总为最后的结果,主要有广度优先
和累计求和
两种方法。
广度优先
每一列代表一种算法,从下到上,是被当前算法认为是异常记录的可能性越大。
?度优先?法?先将所有异常检测向量AStAS_tASt?排序到排序向量SAStSAS_tSASt?中,并返回给出得分向量的排序元素与排序向量的原始元素之间的对应关系的索引IndtInd_tIndt?。在将所有异常值得分向量排序为AStAS_tASt?后,广度优先只需从所有异常值算法中获得异常值最高的数据记录,并将索引插入向量indFINALind_FINALindF?INAL,然后获取异常得分值最高的数据记录,并将索引附加到向量indFINALind_FINALindF?INAL,以此类推。
累计求和
累计求和即把同一个记录在不同算法输出的异常值分数求和作为判断当前记录的分数。
2 Isolation Forests
假设我们??个随机超平?来切割数据空间,切?次可以?成两个?空间。然后我们继续?随机超平?来切割每个?空间并循环,直到每个?空间只有?个数据点为?。直观上来讲,那些具有?密度的簇需要被切很多次才会将其分离,而那些低密度的点很快就被单独分配到?个?空间了。孤?森林认为这些很快被孤?的点就是异常点。
d是最早被孤?出来的,所以d最有可能是异常 |
---|
孤立森林生成树的流程 |
---|
孤?森林检测异常的假设是:异常点?般都是?常稀有的,在树中会很快被划分到叶?节点,因此可以?叶?节点到根节点的路径?度来判断?条记录是否是异常的。和随机森林类似,孤?森林也是采?构造好的所有树的平均结果形成最终结果的。因为异常点的路径?较短,正常点的路径?较?,孤?森林根据路径?度来估计每个样本点的异常程度。
3. 总结
- feature bagging可以降低?差
- 孤?森林的优势在于:
在处理?数据集上有优势。 孤?森林不适?于超?维数据,因为?励森林每次都是随机选取维度,如果维度过?,则会存在过多噪?
4.练习
1.使?PyOD库?成toy example并调?feature bagging
import pandas as pd
from pyod.models.feature_bagging import FeatureBagging
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualizecontamination = 0.1 # percentage of outliers
n_train = 200 # number of training points
n_test = 100 # number of testing points# Generate sample data
X_train, y_train, X_test, y_test = \generate_data(n_train=n_train,n_test=n_test,n_features=2,contamination=contamination,random_state=42)# train Feature Bagging detector
clf_name = 'FeatureBagging'
clf = FeatureBagging(check_estimator=False)
clf.fit(X_train)# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_ # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_ # raw outlier 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# 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)# visualize the results
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,y_test_pred, show_figure=True, save_figure=False)
2.使?PyOD库?成toy example并调?Isolation Forests
from pyod.models.iforest import IForest
from pyod.utils.data import generate_datafrom pyod.utils.data import evaluate_print
from pyod.utils.example import visualizecontamination = 0.1 # percentage of outliers
n_train = 200 # number of training points
n_test = 100 # number of testing points# Generate sample data
X_train, y_train, X_test, y_test = \generate_data(n_train=n_train,n_test=n_test,n_features=2,contamination=contamination,random_state=42)# train IForest detector
clf_name = 'IForest'
clf = IForest()
clf.fit(X_train)# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_ # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_ # raw outlier 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# 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)# visualize the results
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,y_test_pred, show_figure=True, save_figure=False)