改进的随机森林算法(随机森林算法通俗易懂)
选自blog.paperspace
作者:迪拉杰K
机器心脏编译
参与人:李诗梦
异常检测似乎是机器学习中的一个难题,但通过使用合适的算法也可以很好地解决这个问题。介绍了隔离森林算法,通过介绍原理和代码,教你找出数据集中的离群点。
从银行欺诈到预防性机器维护,异常检测是机器学习中非常有效和普遍的应用。在这个任务中,孤立森林算法是一个简单有效的选择。
本文包括:
引入异常检测;异常检测用例;什么是孤立的森林;利用孤立森林进行异常检测;用Python实现。异常检测简介
异常值是与给定数据集中的其他数据点显著不同的数据点。
异常检测是发现数据中异常值(与大多数数据点明显不同的数据点)的过程。
现实世界中大型数据集的模式可能非常复杂,很难通过查看数据来找出它们的模式。这就是为什么异常检测的研究是机器学习中极其重要的应用。
本文利用孤立森林实现异常检测。我们有一个简单的工资数据集,其中一些是异常的。目标是找到这些异常值。想象一下,公司里有些员工收入异常丰厚,这可能意味着不道德的行为。
在继续实现之前,让我们讨论一些异常检测的用例。
异常检测案例
异常检测在行业中应用广泛。下面是一个常见的用例:
银行:发现异常高的存款。每个账户持有人通常都有固定的存款模式。如果这种模式存在异常值,那么银行应该检测并分析这种异常(如洗钱)。
金融:发现欺诈性购买的模式。每个人通常都有固定的购买模式。如果该模型存在异常值,银行需要检测这种异常,从而分析其潜在的欺诈行为。
医疗保健:检测欺诈性保险的索赔和支付。
制造:可以监控机器的异常行为,从而控制成本。许多公司持续监控机器的输入和输出参数。众所周知,在故障发生之前,机器的输入或输出参数都会出现异常。从预防性维护的角度来看,有必要持续监控机器。
网络:检测网络入侵。任何开放的网络都面临这样的威胁。监控网络中的异常活动可以及早防止入侵。
然后学习机器学习中的孤立森林算法。
什么是孤立森林?
孤立森林是一种用于异常检测的机器学习算法。这是一种无监督学习算法,通过隔离数据中的异常值来识别异常。
孤立林是一种基于决策树的算法。从给定的特征集中随机选择特征,然后在特征的最大值和最小值之间随机选择一个分割值来隔离异常值。该特征的随机划分会使树中异常数据点生成的路径变短,从而与其他数据分离。
一般来说,异常检测的第一步是构建“正常”内容,然后报告任何不能视为正常的异常内容。但是孤立森林算法不同于这个原理。首先,它没有定义“正常”行为,也没有基于点计算距离。
顾名思义,隔离森林并不显式隔离异常,它隔离数据集中的异常值。
孤立林的原理是离群值小,观测值不同,所以比较容易识别。隔离森林集成了隔离树以隔离给定数据点中的异常值。
孤立森林通过随机选择特征,然后随机选择特征的分割值,递归地生成数据集的分区。与数据集中的“正常”点相比,待隔离的离群点需要较少的随机划分,因此离群点是树中路径较短的点,路径长度是通过根节点的边数。
使用隔离森林不仅可以更快地检测异常,而且需要更少的内存。
通过森林隔离数据点中的异常值,而不是分析正常数据点。与其他正常数据点相比,异常数据点的树路径更短,因此孤立林中的树不需要太多深度,因此可以使用更小的max_depth值来降低内存需求。
该算法也适用于小数据集。
然后,我们对数据做一些探索性的分析,了解给定数据的相关信息。
探索性数据分析
首先导入所需的库。进口numpy,熊猫,海鸟和马特洛特利布。此外,应该从sklearn.ensemble导入IsolationForest
importnumpayasnp
importpandasaspd
进出口许可证
importmatplotlib.pyplotasplt
Fromsklearn。集成信息林导入库后,要将csv数据读入padas数据框,请检查前十行数据。
本文使用的数据是不同职业人群的年薪(美元)。数据中存在一些异常值(如工资过高或过低),目标是检测这些异常值。
df=pd.read_csv('薪资. csv ')
df . head(10)
gc-img-caption">数据集表头。
为了更好地了解数据,将工资数据绘制成小提琴图,如下图所示。小提琴图是一种绘制数值数据的方法。
通常,小提琴图包含箱图中所有数据——中位数的标记和四分位距的框或标记,如果样本数量不太大,图中可能还包括所有样本点。
工资的小提琴图。
为了更好地了解离群值,可能还会查看箱图。箱图一般也称为箱线图。箱图中的箱子显示了数据集的四分位数,线表示剩余的分布。线不表示确定为离群值的点。
我们通过 interquartile range, 的函数检测离群值。在统计数据中,interquartile range,(也称为 midspread 或 middle 50%)是度量统计学分散度的指标,等于第 75% 个数和第 25% 个数的差。
工资的箱图,指示了右侧的两个离群值。
完成数据的探索性分析后,就可以定义并拟合模型了。
定义及拟合模型
我们要创建一个模型变量,并实例化 IsolationForest(孤立森林)类。将这四个参数的值传递到孤立森林方法中,如下所示。
评估器数量:n_estimators 表示集成的基评估器或树的数量,即孤立森林中树的数量。这是一个可调的整数参数,默认值是 100;最大样本:max_samples 是训练每个基评估器的样本的数量。如果 max_samples 比样本量更大,那么会用所用样本训练所有树。max_samples 的默认值是『auto』。如果值为『auto』的话,那么 max_samples=min(256, n_samples);数据污染问题:算法对这个参数非常敏感,它指的是数据集中离群值的期望比例,根据样本得分拟合定义阈值时使用。默认值是『auto』。如果取『auto』值,则根据孤立森林的原始论文定义阈值;最大特征:所有基评估器都不是用数据集中所有特征训练的。这是从所有特征中提出的、用于训练每个基评估器或树的特征数量。该参数的默认值是 1。model=IsolationForest(n_estimators=50, max_samples='auto', contamination=float(0.1),max_features=1.0) model.fit(df[['salary']])孤立森林模型训练输出。
模型定义完后,就要用给定的数据训练模型了,这是用 fit() 方法实现的。这个方法要传入一个参数——使用的数据(在本例中,是数据集中的工资列)。
正确训练模型后,将会输出孤立森林实例(如图所示)。现在可以添加分数和数据集的异常列了。
添加分数和异常列
在定义和拟合完模型后,找到分数和异常列。对训练后的模型调用 decision_function(),并传入工资作为参数,找出分数列的值。
类似的,可以对训练后的模型调用 predict() 函数,并传入工资作为参数,找到异常列的值。
将这两列添加到数据框 df 中。添加完这两列后,查看数据框。如我们所料,数据框现在有三列:工资、分数和异常值。分数列中的负值和异常列中的 -1 表示出现异常。异常列中的 1 表示正常数据。
这个算法给训练集中的每个数据点都分配了异常分数。可以定义阈值,根据异常分数,如果分数高于预定义的阈值,就可以将这个数据点标记为异常。
df['scores']=model.decision_function(df[['salary']]) df['anomaly']=model.predict(df[['salary']]) df.head(20)给数据的每一行中都添加了分数和异常值后,就可以打印预测的异常了。
打印异常
为了打印数据中预测得到的异常,在添加分数列和异常列后要分析数据。如前文所述,预测的异常在预测列中的值为 -1,分数为负数。根据这一信息,将预测的异常(本例中是两个数据点)打印如下。
anomaly=df.loc[df['anomaly']==-1] anomaly_index=list(anomaly.index) print(anomaly)异常输出。
注意,这样不仅能打印异常值,还能打印异常值在数据集中的索引,这对于进一步处理是很有用的。
评估模型
为了评估模型,将阈值设置为工资>99999 的为离群值。用以下代码找出数据中存在的离群值:
outliers_counter = len(df[df['salary'] > 99999]) outliers_counter计算模型找到的离群值数量除以数据中的离群值数量,得到模型的准确率。
print("Accuracy percentage:", 100*list(df['anomaly']).count(-1)/(outliers_counter))准确率:100%
尾注
本教程内容包括:什么是离群值以及如何用孤立森林算法检测离群值。还讨论了针对该问题的不同的探索性数据分析图,比如小提琴图和箱图。
最终我们实现了孤立森林算法,并打印出了数据中真正的离群值。希望你喜欢这篇文章,并希望这篇文章能在未来的项目中帮到你。