机器数据分析平台

  • 机器数据分析平台 > 使用文档 > 应用平台 > Pandora机器学习工具包 >fit的使用方法详述 > 检测连续数据中的异常数据

    检测连续数据中的异常数据

    最近更新时间:2021-06-23 18:37:04

    使用场景:

    连续数据不限于定义的单独值,而是可以占用连续范围内的任何值。在任何两个连续数据值之间,可能有无限多个其他值。比如身高、体重、温度、价格等等。当我们需要在一组连续数据中发现与其他数据有明显区别的数据,我们通常使用异常检测算法(Anomaly Detection)来解决问题。

    异常值检测算法可以根据其使用目的分成两大类:一是新颖点检测(Novelty Detection),二是离群点检测(Outlier Detection)。
    新颖性检测假设训练数据中不包含异常值,即通过学习历史数据,模型可以学习“正常数据”的特征和其分布,并且以此检测新数据是否符合“正常数据”的特征。
    离群点检测假设训练数据中包含异常值,即通过相关算法,找到训练数据的中心模式,并且把训练数据中远离中心模式的数据点定义为异常数据。因此,在离群点检测的场景中,算法不支持模型的保存和重新应用,需要在新数据上重新用fit训练模型。

    通用语法:

    ...|fit <algo_name> [options] <feature_field_1> <feature_field_2> [into model_name]... 
    

    通用参数说明:

    • <algo_name> 必填,用来指定训练模型采用的算法名称。
    • [options]可选,为算法的内置参数,根据提供的算法变化。
    • <feature_field> 必填,可以是一个或者多个字段,用来指定建模使用的特征字段,给定的feature_field值必须存在于数据集中。
    • [into model_name]可选,用来将fit训练出来的模型保存成model_name以便下次调用。在使用LocalOutlierFactor算法并且设参数novelty为False的时候,不支持模型保存。
    • 数据集必须不为空。

    以下算法可以用来检测连续数据中的异常数据:

    局部异常因子 - Local Outlier Factor(LOF)

    LOF算法通过计算给定数据点相对于其邻近点的局部密度偏差来反映一个样本的异常程度。如果该数据点所在位置的密度明显小于其周围样本所在位置的密度,这个点就有可能是异常点。如果需要做离群点检测(Outlier Detection),在没有很明确的偏好算法的情况下,建议可以使用局部异常因子(LOF)来得出初步的异常检测模型。

    语法:

    ...
    | fit LocalOutlierFactor n_neighbors=<int> algorithm=<auto(default)|ball_tree|kd_tree|brute> metric=<str> contamination=<auto|float> novelty=<True|False> <feature1> <feature2> [into model_name]... 
    

    参数说明:

    • n_neighbors用来指定K-neighbors里K(邻居)的数量。若不提供,默认为20。

    • algorithm用来指定用来计算最近邻居的算法

      • algorithm=ball_tree,使用BallTree
      • algorithm=kd_tree,使用KDTree
      • algorithm=brute,使用暴力算法
      • algorithm=auto(默认值),尝试用实际fit的数值决定最适合的算法
    • metric用来指定计算邻居间距离的方法,根据algorithm不同,适用的metric方法也有不同,可以匹配的metric可参考Sci-kit Learn支持的距离衡量方法

      • algorithm=ball_tree的情况下,比较常用的metric有:

        • cityblock,使用曼哈顿距离(~metric=l1, metric=manhattan)
        • euclidean,使用欧式距离(~metric=l2)
        • l2,使用欧式距离(~metric=euclidean)
        • l1,使用曼哈顿距离(~metric=cityblock, metric=manhattan)
        • manhattan,使用曼哈顿距离(~metric=l1, metric=cityblock)
        • chebyshev, 使用切比雪夫距离
        • cosine,使用余弦相似度
        • mahalanobis,使用马氏距离
        • minkowski(默认值),使用闵氏距离,必须同时提供p参数
        • infinity,使用无限距离
      • algorithm=kd_Tree,比较常用的metric有:

        • cityblock,使用曼哈顿距离(~metric=l1, metric=manhattan)
        • euclidean,使用欧式距离(~metric=l2)
        • l2,使用欧式距离(~metric=euclidean)
        • l1,使用曼哈顿距离(~metric=cityblock, metric=manhattan)
        • manhattan,使用曼哈顿距离(~metric=l1, metric=cityblock)
        • chebyshev, 使用切比雪夫距离
        • cosine,使用余弦相似度
        • minkowski(默认值),使用闵氏距离,必须同时提供p参数
        • infinity,使用无限距离
      • algorithm=brute的情况下,比较常用的metric有:

        • cityblock,使用曼哈顿距离(~metric=l1, metric=manhattan)
        • euclidean,使用欧式距离(~metric=l2)
        • l2,使用欧式距离(~metric=euclidean)
        • l1,使用曼哈顿距离(~metric=cityblock, metric=manhattan)
        • manhattan,使用曼哈顿距离(~metric=l1, metric=cityblock)
        • chebyshev, 使用切比雪夫距离
        • cosine,使用余弦相似度
        • mahalanobis,使用马氏距离
        • minkowski(默认值),使用闵氏距离
        • seuclidean,使用平方欧式距离
    • contaminaiton用来指定训练集中异常数据的比例

      • contamination=auto(默认),自动设定异常值比例。
      • contamination是一个float,必须要在[0,0.5]之间。在contamination=0的情况下,Novelty自动设为True,即主动更改成新颖性检测。
    • novelty用来指定是否用来做新颖性检测

      • novelty=False(默认),不用于新颖性检测,不支持模型保存
      • novelty=True,用于新颖性检测,支持模型保存
      • 建议在使用novelty=True的时候,把contamination值设为0或者不提供。但如果想要在假设训练集受污染的特殊情况下使用新颖性检测,也可同时使用contamination和novelty。
    • p用来指定metric=minkowski的情况下的p参数。若不提供,则默认为2。p必须为正整数。

      • p=1,约等于使用曼哈顿距离(l1)
      • p=2(默认值),约等于使用欧式距离(l2)
      • p=其他正整数,即使用L-p的闵氏距离

    一类支持向量机 - One Class SVM

    一类支持向量机是一种特殊的向量机的算法,它的目的是判断一个样本是否属于某单个类别中,因此在异常检测的场景下,一类支持向量机通过寻找一个超平面将样本中的正例圈出来,用这个圈来判断一个新数据是否为正样本。如果在圈内,即为正样本,如果在圈外,即为异常值。*如果需要做新颖性检测(Novelty Detection),在没有很明确的偏好算法的情况下,建议可以使用一类支持向量机(OneClass SVM)来得出初步的异常检测模型。*

    语法:

    ...| fit OneClassSVM kernel=<linear | poly | rbf(default) | sigmoid> degree=<int> gamma=<scale(default) | auto | float> coef0=<float> nu=<float> max_iter=<int> <feature_field_1> <feature_field_2> [into model_name]... 
    

    参数说明:

    • kernel用来指定算法中使用的核心函数。
      • kernel=linear,使用线性核函数
      • kernel=poly,使用多项式核函数
      • kernel=rbf,使用径向基函数核/高斯核函数
      • kernel=sigmoid,使用sigmoid核函数
    • degree用来在kernel=poly的情况下,指定函数的次数。若不提供,默认为3。在kernel设定为其他核函数的情况下,会被忽略。
    • gamma用来在kernel=rbf、poly或者sigmoid的情况下,定义函数的系数。
      • gamma=scale(默认值),使用1/ (n_features * X.var())为gamma值。n_features为提供的特征数量,X.var()为数据集的方差。
      • gamma=auto,使用1/n_features为gamma值。
      • gamma=float,使用输入的float为gamma值。
    • coef0,用来在kernel=poly或者sigmoid的情况下,制定函数的独立项。若不提供,默认为0.0。
    • nu,用来设定训练误差,表示异常点比例,必须是在(0, 1]范围之间的float。若不提供,默认为0.5。
    • max_iter,用来指定算法的最大循环次数。若不提供,默认为-1,即不设限。在数据量或者特征数量特别大的情况下,可以设定该参数。

    孤立森林 - Isolation Forest

    孤立森林是一种基于集成算法的异常检测算法。在孤立森林中,异常值被定义为“容易被孤立的离群点”,即与正常数据相比,其分布相对较远且不规律。基于这样的定义,孤立森林通过递归的随机分割数据集,直到所有的样本都被分隔开,在这个过程中,密度越低的点越容易被孤立,即异常点通常具有较短的路径。

    语法:

    ...| fit IsolationForest n_estimators=<int> max_samples=<auto(default) | int | float> max_features=<int | float> contamination=<auto(default) | float> random_state=<int> <feature_field_1> <feature_field_2> [into model_name]... 
    

    参数说明:

    • n_estimators,用来指定建模中使用的树的数量,必须为正整数。若不设定,默认为100。

    • max_samples,用来指定每一次建树时选取的最大数据量。

      • max_samples=int,代表直接使用max_samples为最大数据量。如果超过了总数据量,则所有数据都会被使用。
      • max_samples=float,代表使用max_samples * 数据总数 为最大数据量。
      • max_samples=auto(默认值),代表使用[256, 数据总量]中较小的一方作为最大数据量。
    • max_features,用来指定每一次建树时选取的最大特征数。如不提供,默认为1.0,即使用所有特征。

      • max_features=int,代表直接使用max_features为最大特征数量,必须在(0,n_features]之间。n_features即为建模时使用的特征字段的数量。
      • max_features=float,代表使用max_features*n_features为最大特征数量。必须使max_features*n_features向下取整的结果在(0,n_features]之间。
    • contaminaiton,用来指定训练集中异常数据的比例

      • contamination=auto(默认),自动设定异常值比例。
      • contamination是一个float,必须要在(0,0.5]之间。
    • random_state为随机数种子,用来控制样本自助抽样的随机性和特征抽样的随机性。如果给定特定值,重新跑模型的时候,可以得出同样的结果。

    基于方差的鲁棒的异常检测值检测 - EllipticEnvelope

    这是一种基于方差的鲁棒的异常检测值方法。该算法假设正常样本都符合高斯分布,并学习一个二维的椭圆分布。它根据数据做一个鲁棒的协方差估计,得到一组适合用来描述当前数据集的均值和方差,然后学习到一个包围中心样本点并且忽略离群点的椭圆,实现区分正常点和离群点的目的。

    语法:

    ...| fit EllipticEnvelope assume_centered=<bool> support_fraction=<float> contamination=<int> random_state=<int> <feature_field_1> <feature_field_2> [into model_name]... 
    

    参数说明:

    • assume_centered,用来假设数据是否已经“居中”,即均值为0。如不提供,默认为False。

    • support_fraction,用来指定用来计算的数据比例,必须要在(0,1)之间。如不提供,默认为[n_sample + n_features+1]/2。

    • contamination,用来指定训练集中异常数据的比例,必须要在(0,0.5]之间。如不提供,默认为0.1。

    • random_state为随机数种子,用来控制样本自助抽样的随机性和特征抽样的随机性。如果给定特定值,重新跑模型的时候,可以得出同样的结果。

    以上内容是否对您有帮助?
  • Qvm free helper
    Close