天池二手车价格预测 -- 特征工程

1. 学习内容
  1. 异常处理

  2. 特征归一化/标准化

  3. 数据分桶

  4. 缺失值处理

  5. 特征构造

  6. 特征筛选

2. 导入相关模块和数据
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
 
train_df = pd.read_csv(r'./data/train.csv', sep = ' ')
test_df = pd.read_csv(r'./data/testA.csv', sep = ' ')
 
print(train_df.shape)
print(test_df.shape)
3. 判别异常值

3.1 什么是异常值
异常值指的是在数据集中存在的不合理的值,也叫离群点。结合实际意义或许能更好地理解,比如人年龄为负数,羽毛的重量为1吨等,这些都属于异常值。

3.2 常见的异常值判别方法
通常我们会结合统计情况或者实际情况对某个特征的取值设置一个合理的范围,超出这个范围的值都可以认为是异常值。而不同的异常值判别方法最主要的区别就是范围的选取方式。常见的异常值判别方法有以下几种[1]:

3.2.1 简单统计分析
对特征进行一个描述性的统计,并查看哪些值是不合理的。比如对年龄这个属性进行规约:年龄的区间在[0:200],如果样本中的年龄值不在该区间内,则表示该样本的年龄属性属于异常值。

3.2.2 3σ原则
这个方法适用于服从正太分布的数据。根据正太分布,,这代表是一个小概率事件。如果有数据满足,则说明该数据是一个异常值。
在这里插入图片描述
3.2.3 箱型图
当数据并不服从正态分布时,可以使用此方法来判别异常值。要理解这个方法的原理,首先需要知道箱型图是如何画出来的。

箱线图的绘制方法是:先找出一组数据的最大值、最小值、中位数和两个四分位数;然后,连接两个四分位数画出箱子;再将最大值和最小值与箱子相连接,中位数在箱子中间[2]。不过,这里需要注意的是,为了判别异常值,我们需要人为设置上限和下限并将本该画在最值处的盒须画在上下限处。这样,盒须之外的数据就是异常值了。(实际上,这是两种箱型图。另外,我还发现了一个关于它们的有趣的介绍[3]。)

我们按照从小到大的次序,记第一个、第二个和第三个四分位数分别为Q1、Q2和Q3。记四分位距IQR=Q3-Q1。这样,下限的值就是Q1-k·IQR,上限的值就是Q3+k·IQR。其中k的取值可根据实际情况进行调整,通常默认取1.5。

3.3 异常值处理方法
常见的方法有以下几种:

  1. 删除含有异常值的数据或特征;

  2. 用平均值或中位数来修正;

  3. 将异常值视为缺失值,交给缺失值处理方法来处理;

  4. 不处理。

3.4 异常值处理实现(箱型图+删除异常值)


# 这里是一个异常值处理的函数
def outliers_proc(data, col_name, scale = 3):
    """
    清晰pandas表格中某一列中的异常值,默认用 box_plot(scale=3)进行清洗
    data: 接收pandas表格
    col_name: pandas表格的列名
    scale: 尺度,用来划定数据的上限与下限的
    返回值是处理好的数据
    """
    
    def box_plot_outliers(data_ser, box_scale):
        """
        利用箱线图去除异常值
        data_ser: pandas序列
        param box_scale: 箱型图划定上下限的尺度
        返回值分两部分,第一部分是异常值的位置(用序列表示),第二部分是上下限的具体值
        """
        
        iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
        
        # 计算有效数据的下限和上限
        val_low = data_ser.quantile(0.25) - iqr
        val_up = data_ser.quantile(0.75) + iqr
        
        rule_low = (data_ser < val_low)
        rule_up = (data_ser > val_up)
        
        return (rule_low, rule_up), (val_low, val_up)
 
    data_n = data.copy()
    data_series = data_n[col_name]
    rule, value = box_plot_outliers(data_series, box_scale = scale)
    # 从原序列汇总提取出所有异常值</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值