删除异常值
- 箱型图删除异常值(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处是外限,内限和外限之间是温和异常值,外限以外就是极端的异常值。
数据集连接
- 为了方便特征的构造,可以使用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
参考资料
时间处理
- 用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’为秒。 |
表的连接
- 表的连接,类似于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’) ### 右连接
(参考文档)
数据分桶
- 数据分桶
- 好处
- 特征对异常值更具鲁棒性,如 age>30 为 1 否则为 0,对于年龄为 200 的也不会对模型造成很大的干扰
- 模型更稳定,如用户年龄区间,不会因为用户年龄长了一岁就变化等
- 分桶可以用pandas.cut()函数
其中的labels值得注意一下,有三种取值,默认是none,返回的区间,bool值,如果是false,则返回索引,即如果分成30个桶,则返回1,2,3,这样的区间对应的桶的序号,还可以是数组,为每一个区间命名,方便理解,比如给每个分数段的分数命名为A,B,C,D等(参考文档)
独热编码
- 独热编码
独热编码即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 前:
color | class |
---|---|
green | A |
red | B |
blue | A |
get_dummies 后:
color_blue | color_green | color_red | class_A | class_B |
---|---|---|---|---|
0 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
可以对指定列进行get_dummies如task3里面的操作,对类别特征进行OneEncoder
data = pd.get_dummies(data, columns=['model', 'brand', 'bodyType', 'fuelType',
'gearbox', 'notRepairedDamage', 'power_bin'])