二手车价格预测——Task3(特征工程总结)

删除异常值

  1. 箱型图删除异常值(box_plot)
    首先了解一下中位数,假设n是奇数,则中位数是位于中间的数值,如果n是偶数,则中位数就是中间两个数的平均值。

举个例子:现在有4个人,工资从高到低排列以后,分别是10,11,12,13万,中间的两个数是11和12,所以中位数就是11+12=11.5万,当马云进来一起的时候,5个人中的中间位置是12万,所以中位数是12万,所以即使是马云这样的超级富豪计入数据集里面,中位数还是可以正确的描述这批数据的整体收入水平,不会像平均值那样因为异常的数据产生变化。
四分位数和中位数比较相似,箱型图可以很好的将四分位数的结构可视化出来,下界和上界表示数据集最小值和最大值,下四分位数0.25就是离下界近的第25%个数,其次是中位数,然后是上四分位数0.75,上四分位数减去下四分位数就是四分位距离,四分位距离越小,表示中间的50%的数据越集中,中位数就更能代表整体水平。
计算用四分位距离乘以箱线图尺度,一般将箱线图尺度设置为1.5,有时候也设置为3
公式

  • val_low=Q1-1.5ΔQ
  • val_up=Q3+1.5ΔQ
    Q1表示下四分位,Q3表示上四分位,△Q表示四分位距离(参考资料)1.5处是异常值隔断点,称其为内限,3处是外限,内限和外限之间是温和异常值,外限以外就是极端的异常值。

数据集连接

  1. 为了方便特征的构造,可以使用pandas.concat()将训练集和测试集连接在一起。
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

objs: 需要连接的对象,eg [df1, df2]
axis: axis = 0, 表示在水平方向(row)进行连接 axis = 1, 表示在垂直方向(column)进行连接
join: outer, 表示index全部需要; inner,表示只取index重合的部分
join_axes: 传入需要保留的index
ignore_index: 忽略需要连接的frame本身的index。当原本的index没有特别意义的时候可以使用
keys: 可以给每个需要连接的df一个label
参考资料

时间处理

  1. 用data[‘creatDate’] - data[‘regDate’]计算出车的使用时间时,可以使用pandas.to_datetime()方法,并且设置参数errors=‘coerce’,因为数据里面有时间出错的格式的话,可以将出错的时间格式用nat代替,该值可以存储在 datetime 数组中以指示未知或缺失的 datetime 值。
    (none,null,nan,nat区别参考)
pandas.to_datetime(arg,errors ='raise',utc = None,format = None,unit = None )
参数意义
errors三种取值,‘ignore’, ‘raise’, ‘coerce’,默认为raise。 ‘raise’,则无效的解析将引发异常; ‘coerce’,那么无效解析将被设置为NaT; ‘ignore’,那么无效的解析将返回输入值
utc布尔值,默认为none。返回utc即协调世界时。
format格式化显示时间的格式
unit默认值为‘ns’,则将会精确到微妙,‘s’为秒。

(官方参考文档)

表的连接

  1. 表的连接,类似于sql中的join,可以使用merge()函数
merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
  • 左右连接键名一样
    • pd.merge(df1,df2) ##以df1、df2中相同的列名key进行连接,默认how=‘inner’, pd.merge(df1,df2,on=‘key’,how=‘inner’)
    • pd.merge(df1,df2,how=‘outer’) ## 全连接,取并集
    • pd.merge(df1,df2,how=‘left’) ### 左连接,左边取全部,右边取部分,没有值则用NaN填充
    • pd.merge(df1,df2,how=‘right’) ### 右连接,右边取全部,左边取部分,没有值则用NaN填充
  • 左右连接键名不一样,则用left_on,right_on来进行指定
    • pd.merge(df3,df4,left_on=‘lkey’,right_on=‘rkey’) ### 内连接,默认how=‘inner’
    • pd.merge(df3,df4,left_on=‘lkey’,right_on=‘lkey’,how=‘outer’) ### 全连接
    • pd.merge(df3,df4,left_on=‘lkey’,right_on=‘rkey’,how=‘left’) ### 左连接
    • pd.merge(df3,df4,left_on=‘lkey’,right_on=‘rkey’,how=‘right’) ### 右连接
      (参考文档)

数据分桶

  1. 数据分桶
  • 好处
    • 特征对异常值更具鲁棒性,如 age>30 为 1 否则为 0,对于年龄为 200 的也不会对模型造成很大的干扰
    • 模型更稳定,如用户年龄区间,不会因为用户年龄长了一岁就变化等
  • 分桶可以用pandas.cut()函数
    其中的labels值得注意一下,有三种取值,默认是none,返回的区间,bool值,如果是false,则返回索引,即如果分成30个桶,则返回1,2,3,这样的区间对应的桶的序号,还可以是数组,为每一个区间命名,方便理解,比如给每个分数段的分数命名为A,B,C,D等(参考文档)

独热编码

  1. 独热编码
    独热编码即one_hot编码,方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任何时候,其中只有一位有效。可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。

例子

from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.transform([[0, 1, 3]]).toarray()

输出结果为:

array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])

第一列特征是0,1,0,1,两个数字,所以用两位状态寄存器来表示,所以0就用10表示,第二个特征是0,1,2,所以用三位状态寄存器来表示,所以1就是010,,同理3是0001.
(参考文档)
Pamdas的一个实现one hot encode的方法是pandas.get_dummies

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)[source]

例子

import pandas as pd
df = pd.DataFrame([  
            ['green' , 'A'],   
            ['red'   , 'B'],   
            ['blue'  , 'A']])  

df.columns = ['color',  'class'] 
pd.get_dummies(df) 

get_dummies 前:

colorclass
greenA
redB
blueA

get_dummies 后:

color_bluecolor_greencolor_redclass_Aclass_B
01010
00101
10010

可以对指定列进行get_dummies如task3里面的操作,对类别特征进行OneEncoder

data = pd.get_dummies(data, columns=['model', 'brand', 'bodyType', 'fuelType',
                                     'gearbox', 'notRepairedDamage', 'power_bin'])

(官方文档)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值