特征工程系列:数据清洗(异常值检测、清洗,缺失值填充)

特征工程系列:数据清洗

  • 1.什么是特征工程
  • 2. 数据预处理
  • 3. 数据清洗拓扑图
  • 4. 格式内容清洗
  • 5. 逻辑错误清洗
  • 6. 异常值清洗
    • 6.1 异常值检查方法(3σ原则、箱线图分析)
      • 6.1.1 基于统计分析
      • 6.1.2 3σ原则
      • 6.1.3 箱线图分析
    • 6.2 数据光滑处理(分箱、回归)
    • 6.3 异常处理方法
  • 7. 缺失值清洗(删除、填充、不处理)
    • 7.1 数据填充方法(统计量统计、模型预测、插值法填充)
      • 7.1.2统计量统计
      • 7.1.3 模型预测填充
      • 7.1.4 插值法填充
    • 7.2 缺失总结

1.什么是特征工程

  • 特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程

  • 数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限

  • 特征工程有相当重要的地位,是机器学习成果的关键

  • 特征工程包括:

    • 数据预处理 Data PreProcessing
    • 特征提取 Feature Extraction
    • 特征选择 Feature Selection
    • 特征构造 Feature construction

2. 数据预处理

数据预处理是特征工程的最重要的起始步骤,而数据清洗是数据预处理的重要组成部分,会直接影响机器学习的效果。

3. 数据清洗拓扑图

对数据进行重新审查和校验的过程,目的在于删除重复信息纠正存在的错误并提供数据一致性

特征工程系列:数据清洗(异常值检测、清洗,缺失值填充)_第1张图片

4. 格式内容清洗

  • 格式内容问题产生的原因

    • 数据由人工手机或者用户填写而来
    • 不同版本的程序产生的内容或格式不一致
    • 不同数据源采集来的的数据内容和格式不一致
  • 时间、日期格式不一致清洗

    • 日期格式不一致:’2019-07-20’、’20190720’、’2019/07/20’、’20/07/2019’
    • 时间戳单位不一致
  • 数值格式不一致清洗

    • 小数、科学计数、中午数字
  • 全半角等显示格式不一致清洗

  • 内容中有不该存在的字符清洗

    • 如:身份证号中出现汉字
  • 内容与该字段应有内容不符清洗

    • 如:电话和身份证写错
  • 数据类型不符清洗

    • 如:金额特征是字符串类型,实际上应转为int/float

5. 逻辑错误清洗

  • 数据重复清洗

    • 存在各个特征值完全相同的两条/多条数据,此时直接删除并只保留其中一条数据。

      df.drop_duplicates()
      
    • 数据不完全相同,但从业务角度看待数据是同一个数据, 如页面埋点时,进入页面和退出页面都会上报一次数据,只有时间不一样,其他字段相同,在统计pv/uv时应该进行去重。

      # 根据某个/多个特征值唯一区分每个样本,则可使用该特征/多个特征进行去重。
      df.drop_duplicates(subset=['ID'], keep='last')
      
  • 不合理值清洗

    • 根据业务常识,也可使用箱型图发现数据中不合理的特征值
  • 矛盾内容修正

    • 身份证号中的数据 和年龄不符

6. 异常值清洗

  • 异常值是数据分布的常态,处于特定分布区域范围之外的数据通常被定义为异常或噪声

    • 伪异常” 由于特定的业务运营动作产生,是正常反应业务的状态,而不是数据本身的异常
    • 真异常” 不是由于特定的业务运营动作产生,而是数据本身分布异常,即离群点。

6.1 异常值检查方法(3σ原则、箱线图分析)

  • 6.1.1 基于统计分析

    • 通过数据变异指标来发现数据中的异常点数据。常用的数据变异指标有极差、四分位数间距、均差、标准差、变异系数等等,变异指标的值大表示变异大、散布广;值小表示离差小,较密集。
  • 6.1.2 3σ原则

    • 若数据存在正态分布,在3σ原则下,异常值为一组测定值中与平均值的偏差超过3倍标准差的值。如果数据服从正态分布,距离平均值3σ之外的值出现的概率为P(|x - μ| > 3σ) <= 0.003,属于极个别的小概率事件。(pandas.mod)
    • 如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
      特征工程系列:数据清洗(异常值检测、清洗,缺失值填充)_第2张图片
  • 6.1.3 箱线图分析

    • 箱线图提供了识别异常值的一个标准:如果一个值小于QL-1.5IQR或大于OU+1.5IQR的值,则被称为异常值
      • QL为下四分位数,表示全部观察值中有四分之一的数据取值比它小;
      • QU为上四分位数,表示全部观察值中有四分之一的数据取值比它大;
      • IQR为四分位数间距,是上四分位数QU与下四分位数QL的差值,包含了全部观察值的一半。
    • 箱型图判断异常值的方法以四分位数四分位距为基础,四分位数具有鲁棒性:25%的数据可以变得任意远并且不会干扰四分位数,所以异常值不能对这个标准施加影响。因此箱型图识别异常值比较客观,在识别异常值时有一定的优越性。
      特征工程系列:数据清洗(异常值检测、清洗,缺失值填充)_第3张图片
  • 基于模型检测

    • 首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;
    • 如果模型是簇的集合,则异常是不显著属于任何簇的对象;
    • 在使用回归模型时,异常是相对远离预测值的对象。
    • 优点:有坚实的统计学理论基础
    • 缺点:高维数据,检测性差
  • 基于距离

    • 若一个数据对象和大多数点距离都很远,那这个对象就是异常
    • 距离度量方法:绝对距离(曼哈顿距离)欧式距离和马氏距离
    • 优点:比基于统计类方法简单
    • 缺点:时间复杂度比较高,对参数选择敏感,不能处理具有不同密度区域的数据集
  • 基于密度

    • 考察当前点周围密度,可以发现局部异常点,离群点的局部密度显著低于大部分近邻点,适用于非均匀的数据集
    • 优点:能处理具有不同密度区域的数据集
    • 缺点:时间复杂度比较高,对参数选择敏感

6.2 数据光滑处理(分箱、回归)

  • 分箱

    • 分箱方法通过考察数据的“近邻”(即周围的值)来光滑有序数据的值,有序值分布到一些“桶”或箱中。由于分箱方法考察近邻的值,因此进行局部光滑。

    • 等高方法:每个bin中的个数相等;

    • 等宽方法:每个bin的取值间距相等;

    • 几种分箱光滑技术:

      • 用箱均值光滑:箱中每一个值被箱中的平均值替换;
      • 用箱中位数平滑:箱中的每一个值被箱中的中位数替换;
      • 箱边界平滑:箱中的最大和最小值同样被视为边界。箱中的每一个值被最近的边界值替换。
  • 回归

    • 用一个函数(如回归函数)拟合数据来光滑数据

6.3 异常处理方法

  • 删除含有异常值的记录
  • 将异常值视为缺失值,交给缺失值处理方法来处理
  • 使用均值/中位数/众数来修正
  • 不处理

7. 缺失值清洗(删除、填充、不处理)

  • 删除元组

    • 存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表。

    • 在对象有多个属性缺失值、被删除的含缺失值的对象比例小的情况下非常有效

    • 不足:当缺失数据所占比例较大,特别当遗漏数据非随机分布时,这种方法可能导致数据发生偏离,从而引出错误的结论

  • 数据填充

    • 一定的值去填充空值,从而使信息表完备化,通常基于统计学原理
    • 将未知值补以我们的主观估计值不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。
  • 不处理

    • 不处理,直接在包含空值的数据上进行数据挖掘的方法

7.1 数据填充方法(统计量统计、模型预测、插值法填充)

  • 人工填充

  • 特殊值填充,将空值作为一种特殊的属性来处理

    • df[‘feature’].fillna(‘unkown’,inplace = True)
  • 7.1.2统计量统计

    • 若缺失率较低(小于95%)且重要性较低,则根据数据分布的情况进行填充
    • 平均值:对于数据符合均匀分布,用该变量的均值填补缺失值。
      • df[‘feature1’].fillna(df[‘feature1’].mean(),inplace = True)
    • 中位数:对于数据存在倾斜分布的情况,采用中位数填补缺失值。
      • df[‘feature2’].fillna(df[‘feature2’].median(),inplace = True)
    • 众数:离散特征可使用众数进行填充缺失值。
      • df[‘feature3’].fillna(df[‘feature3’].mode().iloc[0],inplace = True)
  • 7.1.3 模型预测填充

    • 使用待填充字段作为Label,没有缺失的数据作为训练数据,建立分类/回归模型,对待填充的缺失字段进行预测并进行填充

    • 最近距离近邻 KKN

      • from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
        
        def knn_missing_filled(x_train, y_train, test, k = 3, dispersed = True):
            '''
            @param x_train: 没有缺失值的数据集
            @param y_train: 待填充缺失值字段
            @param test: 待填充缺失值数据集
            '''
            if dispersed:
                clf = KNeighborsClassifier(n_neighbors = k, weights = "distance")
            else:
                clf = KNeighborsRegressor(n_neighbors = k, weights = "distance")
        
            clf.fit(x_train, y_train)
            return test.index, clf.predict(test)
        
    • 回归

      • 基于完整的数据集,建立回归方程
      • 将已知属性值代入方程来估计未知属性值,以此估计值来进行填充,常用线性回归
  • 7.1.4 插值法填充

    • 线性插值法

      • df['Feature'] = df['Feature'].interpolate(method='linear',limit_direction='both',axis=0)
        
    • 多重插补

      • 为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合;

      • 每个插补数据集合都用针对完整数据集的统计方法进行统计分析;

      • 对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。

    • 哑变量填充

      • 若变量是离散型,且不同值较少,可转换成哑变量

      • 若某个变量存在十几个不同的值,可根据每个值的频数,将频数较小的值归为一类’other’,降低维度。此做法可最大化保留变量的信息

      • # 原始数据
             SEX
        0    MALE
        1    FEMALE
        2    NaN
        3    FEMALE
        4    FEMALE
        5    NaN
        6    MALE
        
        df.fillna('NA', inplace=True)
        # 拆分维度
        df = pd.get_dummies(df['SEX'],prefix='IS_SEX')
        display(df)
        
        # 填充后
            IS_SEX_FEMALE     IS_SEX_MALE    IS_SEX_NA
        0    0                 1                0
        1    1                 0                0
        2    0                 0                1
        3    1                 0                0
        4    1                 0                0
        5    0                 0                1
        6    0                 1                0
        

7.2 缺失总结

特征工程系列:数据清洗(异常值检测、清洗,缺失值填充)_第4张图片

你可能感兴趣的:(特征工程,数据分析,pandas,数据分析,python,数据挖掘)