@异常检测怎么做,试试孤立随机森林算法(附代码)( 二 )


这一算法也适用于小数据集 。
接着我们对数据做一些探索性分析 , 以了解给定数据的相关信息 。
探索性数据分析
先导入所需的库 。导入 numpy、pandas、seaborn 和 matplotlib 。此外还要从 sklearn.ensemble 中导入孤立森林(IsolationForest) 。importnumpyasnp importpandasaspd importseabornassns importmatplotlib.pyplotasplt fromsklearn.ensembleimportIsolationForest
导入库后 , 要将 csv 数据读取为 padas 数据框 , 检查前十行数据 。
本文所用数据是不同职业的人的年薪(美元) 。数据中有一些异常值(比如工资太高或太低) , 目标是检测这些异常值 。df=pd.read_csv('salary.csv') df.head(10)
@异常检测怎么做,试试孤立随机森林算法(附代码)
文章图片

文章图片

数据集表头 。
为了更好地了解数据 , 将工资数据绘制成小提琴图 , 如下图所示 。小提琴图是一种绘制数值数据的方法 。
通常 , 小提琴图包含箱图中所有数据——中位数的标记和四分位距的框或标记 , 如果样本数量不太大 , 图中可能还包括所有样本点 。
@异常检测怎么做,试试孤立随机森林算法(附代码)
文章图片

文章图片

工资的小提琴图 。
为了更好地了解离群值 , 可能还会查看箱图 。箱图一般也称为箱线图 。箱图中的箱子显示了数据集的四分位数 , 线表示剩余的分布 。线不表示确定为离群值的点 。
我们通过 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() , 并传入工资作为参数 , 找出分数列的值 。


推荐阅读