iForest由t个iTree(isolationtree )孤立树构成,各Itree为二叉树结构,其实现步骤如下。
1 .从训练数据中随机选取个点样本点作为subsample,放入树的根节点。
2 .在当前节点数据中随机发生的拆分点p——拆分点指定在当前节点数据中指定的维的最大值和最小值之间发生的随机一维度。
3 .在此剪切点生成超平面,并将当前节点的数据空间分为两个子空间。 将指定维中小于p的数据放置在当前节点的左侧儿童中,将大于或等于p的数据放置在当前节点的右侧儿童中。
4 .递归地在子节点上执行步骤2和3,继续构建新的子节点,直到子节点只有一个数据(不能再剪切)或者子节点达到限制高度。
获得t个iTree后,iForest培训结束,可以使用生成的iForest评估测试数据。 对于一个训练数据x,遍历每个iTree,并计算x最终位于每棵树的哪个楼层(x位于树的高度)。 并且,可以求出x的每棵树的高度的平均值,即theaveragepathlengthovertitrees。 *值得注意的是,如果x落入一个节点,并且包含多个训练数据,则可以使用一个公式修改x的高级计算。 详细公式的推导以原论文为准。
获取每个测试数据的平均路径长度后,可以设置一个阈值(边界值),该阈值是平均路径长度低于此阈值的测试数据的例外。
(异常在这些树中只有很小的平均高度).*值得注意的是,论文将树的高度标准化,得出了越短越接近1的从0到1的数值(),异常的可能性很高)。
iForest算法的默认参数设置如下:
subsample size: 256
树高: 8
Number of trees: 100
一般解释是,建造——个iTree,一个iTree最高8层,一个iTree独立随机选择256个数据样本建造。
与有监督学习相比,有监督学习有最佳拟合曲线,曲线一侧视为正常数据,曲线另一侧视为异常数据。
无教师学习是根据特征对输入的数据进行分类,并根据数据所属的聚类进行预测的分类集合的过程。
实践场景说明:用户分段行为数据的判断,如果不采取规则的形式,是否可以用算法替代或补充。 考虑到使用有监督的样本会带来巨大的制造样本压力,并且样本会极端化,考虑无监督的模型。0x01选择算法
参考资料
3359砖局域网. zhi Hu.com/p/33919957
调查了算法的优劣,得到了一些符合需求的算法,但都存在不能满足的问题。
TSNE聚类算法:
问题1 :只能操作数据,不能生成模型用于其他数据。 放弃。 均值算法
虽然对问题1:孤立点很敏感,但需要确认k值并进行聚类。 无法事先感知同一时间段设定的k值的量。 放弃。 森林算法(趋势) :
问题1 .孤立森林样本多特征不能落入二维图问题2 .异常请求过多容易判断异常请求是正常结果,感兴趣容易判断为孤立森林决策树。 在此与官方网站的例子进行比较,了解其结构:
0x01示例demo
官方链接这里~
3358 sci kit-learn.org/stable/auto _ examples/ensemble/plot _ isolation _ forest.html
IsolationForest demo :
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.ensembleimportisolationforestrng=NP.random.randomstate (100 gg 0 建立RNG.randn (100,2 ) 100*2的训练样本数组,X_train=np.r_[X 2,X -2]#将样本中的所有数据分别转换为2,- 2, 关于nn np.r_ ()和np.c_ ),特别是2 # generatesomeregularnovelobservationsx=0.3 * RNG.randn (20, 2 )可知说明x_test=NP.r ) x-2 ) # generatesomeabnormalnovelobservationsx _ outliers=RNG.uniform (low=-5,) 2 ) ) )生成最多的# fitthemodelclf=isolation forest (behaviour=' new ',max_samples=100,random_state=rng,)
合模型y_pred_train = clf.predict(X_train)#用拟合好的模型去分类训练数据y_pred_test = clf.predict(X_test)#用拟合好的模型去分类测试数据 ,该数据样本与训练数据差不多相同。y_pred_outliers = clf.predict(X_outliers)#用拟合好的模型去分类测试数据,该数据样本与训练数据有些偏差。取的是-5 到5 范围内。for i,tree in enumerate(y_pred_test): print(X_test[i],tree)#tree为-1为异常,1为正常。特别说明1中详述。###后面都是图片展示的功能了,如果无需可视化,可直接注销掉后面所有代码。# plot the line, the samples, and the nearest vectors to the planexx, yy = np.meshgrid(np.linspace(-10, 10, 50), np.linspace(-10, 10, 50))#生成-5到5之间,包含50个数字的等差数列。如np.linspace(0,100,5) 则生成[0 25 50 75 100]#meshgrid生成网格函数,xx,yy说明为二维网格函数Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])#.ravel()为降一维-行序优先# np.c_矩阵相加#decision_function为样本距离超平面的距离。Z = Z.reshape(xx.shape)#reshapce()将某个数组维度调整为和另一数组维度相同plt.title("IsolationForest")plt.contourf(xx, yy,Z, cmap=plt.cm.Blues_r)b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white', s=20, edgecolor='k')b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green', s=20, edgecolor='k')c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red', s=20, edgecolor='k')plt.axis('tight')plt.xlim((-10, 10))plt.ylim((-10, 10))plt.legend([b1, b2, c], ["training observations", "new regular observations", "new abnormal observations"], loc="upper left")plt.show()特别说明1:
for i,tree in enumerate(y_pred_test): print(X_test[i],tree)此段代码可直接对鼓励森林作出结果的展示。
若此时选择展示出y_pred_test的结果,如下。
可见根据训练X_train的数据来说,与他基本相同的数据集仅有一小部分为异常数据。
可视化如下:
(白色数据为训练数据集,绿色为测试数据集)
for i,tree in enumerate(y_pred_outliers): print(X_outliers[i],tree)若这里采用差异较大的X_outliers作为数据集,结果如下。可见除了一个正常的点,其他均为异常点。
[ 3.39970099 -0.45836448] -1[-1.78634161 -4.07280133] -1[-4.39562068 -4.09048833] -1[1.82706456 1.80735767] 1(唯一正常数据)[-2.56825834 1.40461442] -1[-4.30860817 3.72919962] -1[-3.9039305 -3.30944235] -1[-0.32622009 2.75949219] -1[ 3.54444516 -2.89613555] -1[-4.23358131 2.88914797] -1[0.47500001 2.86254863] -1[ 4.20047043 -0.19027234] -1[-0.4044633 0.98979155] -1[0.99318781 0.04373451] -1[-1.9312147 0.4135298] -1[4.24926943 4.70550802] -1[-1.0420539 2.98745273] -1[ 1.35088148 -2.70030835] -1[-4.48792907 -4.71536194] -1[-3.77152248 -2.79787482] -1可视化如下:
(白色数据为训练数据集,绿色为差异小的测试数据集,红色为差异较大的测试数据集)
特别说明2:
np.r_和np.c_的区别:
>>> import numpy as np
>>> a=np.array([1,2,3])
>>> b=np.array([4,5,6])
>>> print(np.r_[a,b])
[1 2 3 4 5 6]
>>> print(np.c_[a,b])
[[1 4]
[2 5]
[3 6]]
>>> c=np.array([a,b])
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>> c=np.c_[a,b]
>>> c
array([[1, 4],
[2, 5],
[3, 6]])
>>> print(np.c_[b,c])
[[4 1 4]
[5 2 5]
[6 3 6]]
0x02孤立森林的决策方法调整
由于这种方法存在两种前面提过的问题,考虑能否将此算法决策部分做调整。适应场景。
待更。
0x03数据集准备
由flink计算每个时间段内关注点的值,传入算法中得出正负结果集。
链接:https://www.jianshu.com/p/04c7c4a86ffd
链接:https://www.jianshu.com/p/5af3c66e0410