随机森林算法伪代码,随机森林异常检测
从银行欺诈到预防性机器维护,异常检测是机器学习中非常有效和普遍的应用。在这个任务中,孤立森林算法是一个简单有效的选择。喜欢收藏,关注,喜欢这篇文章。
本文的内容包括:
引入异常检测;异常检测的用例;什么是孤立的森林;孤立森林的异常检测;用Python实现。注意:完整的代码、数据和技术交流,可在本文末尾找到。
异常检测的异常值是与给定数据集中的其他数据点显著不同的数据点。异常检测是发现数据中异常值(与大多数数据点明显不同的数据点)的过程。现实世界中大型数据集的模式可能非常复杂,通过查看数据很难发现它们的模式。这就是为什么异常检测在机器学习中是一个极其重要的应用。
本文利用孤立森林实现异常检测。我们有一个简单的工资数据集,有些是不正常的。目标是找到这些异常值。你可以想象,公司的一些员工获得了异常大量的收入,这可能意味着不道德的行为。
异常检测案例异常检测在行业中应用广泛。下面是一个常见的使用案例:
银行:发现异常高存款。每个账户持有人通常都有一个固定的存款模式。如果这个模型中存在异常值,那么银行就应该检测并分析这个异常(比如洗钱)。
财务:发现欺诈性购买的模式。每个人通常都有一个固定的购买模式。如果这个模型存在异常值,银行需要检测这个异常,分析其潜在的欺诈行为。
网络:检测网络入侵。任何对外开放的网络都面临这样的威胁。监控网络中的异常活动可以尽早阻止入侵。
什么是孤立森林?孤立森林是一种用于异常检测的机器学习算法。这是一种无监督的学习算法,通过隔离数据中的异常值来识别异常。
孤立森林是一种基于决策树的算法。从给定的一组特征中随机选择特征,然后在特征的最大值和最小值之间随机选择一个分割值来隔离离群值。这种特征的随机划分会使树中产生的异常数据点的路径变短,从而与其他数据分开。
林隔离数据点中的异常值,而不是分析正常数据点。与其他正常数据点相比,异常数据点的树路径更短,因此孤立森林中的树不需要太多的深度,因此可以使用较小的max_depth值来降低内存需求。
探索性数据分析首先导入所需的库。进口numpy,熊猫,seaborn和matplotlib。此外,IsolationForest应该从sklearn.ensemble导入
将numpy作为np导入
进口熊猫作为pd
将seaborn作为sns导入
将matplotlib.pyplot作为plt导入
在fromsklearn.ensemble导入隔离林导入到库中后,要读取csv数据作为padas数据帧,检查前十行数据。
本文使用的数据是不同职业的人的年薪(美元)。数据中存在一些异常值(如工资过高或过低)。目标是检测这些异常值。
df=pd.read_csv(salary.csv )
df.head(10)
为了更好地理解数据,将工资数据绘制成小提琴图,如下图所示。小提琴图是一种绘制数值数据的方法。
一般来说,小提琴图包含了盒图中所有数据——中中位数的标记和四分位数的盒或标记。如果样本数量不太多,图表也可以包括所有样本点。
为了更好地理解异常值,您还可以检查箱线图。箱形图也就是通常所说的箱形图。图中的方框表示数据集的四分位数,线条表示剩余的分布。线不代表被确定为异常值的点。
我们使用四分位距函数来检测异常值。在统计学数据中,四分位距(也称中间或中间50%)是衡量统计离差的指标,等于第75个和第25个数之差。
薪水的方框图显示了右边的两个异常值。
在完成数据的探索性分析之后,可以定义和拟合模型。
并定义拟合模型。我们希望创建一个模型变量并实例化IsolationForest类。将这四个参数的值传递给隔离林方法,如下所示。
从sklearn.ensemble导入隔离森林
定义隔离_森林_模型(df):
#建立一个模型,n_estimators=50,建立50棵树
model=isolation forest(n _ estimates=50,
max_samples=auto ,
污染=浮动(0.1),
最大功能=1.0)
#培训模式
model.fit(df[[salary]])
# predict decision_function得到异常分数。
df[分数]=model.decision_function(df[[薪金]])
#predict()函数得到模型是否异常的判断,-1为异常,1为正常。
df[异常]=model.predict(df[[薪金]])
返回赋值器的数量:n_estimators表示综合基赋值器或树的数量,即孤立林中的树的数量。这是一个可调的整数参数,默认值为100;最大样本数:max_samples是用于训练每个基本评估者的样本数。如果max_samples大于样本大小,所有树都将使用已用样本进行训练。max_samples的缺省值为“『自动』”。如果值是『auto』,那么max _ samples=min (256,n _ samples);数据污染:算法对这个参数非常敏感,这个参数指的是数据集中异常值的预期比例。根据样本分数拟合定义阈值时使用。默认值为“『自动』”。如果取“『auto』”的值,则根据孤立林原纸定义阈值;最大特征:并非所有基础评估者都经过数据集中所有特征的训练。这是从所有要素中建议的要素数,用于训练每个基础赋值器或树。该参数的默认值为1。model=isolation forest(n _ estimators=50,max_samples=auto ,contaminance=float(0.1),max_features=1.0)
model.fit(df[[salary]])
孤立森林模型的训练输出。
模型定义后,需要用给定的数据对模型进行训练,这是通过fit()方法实现的。该方法将传入参数——使用的数据(在本例中,是数据集中的salary列)。
正确训练模型后,将输出孤立森林示例(如图所示)。您现在可以为分数和数据集添加例外列。
添加分数和例外列定义和拟合模型后,找到分数和例外列。对训练好的模型调用decision_function(),传入salary作为参数,找出score列的值。
同样,可以对训练好的模型调用predict()函数,将salary作为参数传入,找到异常列的值。
将这两列添加到数据框df中。添加这两列后,查看数据框。正如我们所料,数据框现在有三列:薪水、分数和异常值。分数列中的负值和异常列中的-1表示异常。异常栏中的1表示正常数据。
该算法为训练集中的每个数据点分配一个异常分数。可以定义一个阈值。根据异常分数,如果分数高于预定义的阈值,则该数据点可以被标记为异常。
df[分数]=model.decision_function(df[[薪金]])
df[异常]=model.predict(df[[薪金]])
df.head(20)
将分数和异常值添加到每一行数据后,您可以打印预测的异常。
打印异常要打印数据中的预测异常,请在添加分数列和异常列后分析数据。如前所述,预测异常的值为-1,在预测列中为负。根据这些信息,预测的异常(本例中为两个数据点)打印如下。
异常=df.loc[df[异常]==-1]
异常指数=列表(异常指数)
打印(异常)
异常输出。
注意,这不仅可以打印异常值,还可以打印数据集中异常值的指标,这对进一步的处理非常有用。
异常可视化#异常数据可视化功能
导入plotly.graph_objects as go
def plot_anomaly(ts,anomaly_pred=None,fig=go。图()):
图1=开始。散点图(x=ts.index,y=ts,mode=lines ,name=ts.name)
图add_trace(图1)
如果异常_预测不为无:
状态=开始。散布(
x=异常_预测指数,
y=ts . loc[异常_预测指数],
mode=markers ,name=anomaly_pred.name,marker={color:red , size:10, symbol:star , line_width:0})
图add_trace(状态)
#图显示()
返回图
df=隔离_森林_模型
fig=plot _ anonymous(df[ salary ],anonymous _ pred=df[df[ anonymous ]=-1][ anonymous ])评估模型为了评估模型,那些阈值设置为9999的就是异常值。使用以下代码找出数据中存在的异常值:
离群值_计数器=len(df[df[salary] 99999])
Outliers_counter计算模型发现的离群值的个数,除以数据中的离群值个数,得到模型的精度。
打印(准确率:,100 *列表(df [匿名])。计数(-1)/(异常值_计数器))准确度:100%
技术交流欢迎转载,收藏,有所收获,喜欢,支持!数据和代码可以从我这里获得。
目前已开通技术交流群,群友2000多人。最好的添加笔记的方法是:兴趣来源,这样才能找到志同道合的朋友。
1.发送下图至微信,长按识别,后台回复:加群;2、微信搜索微信官方账号:Python学习与数据挖掘,后台回复:加群
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。