[数据挖掘]天池二手车交易价格预测-特征工程-datawhale学习笔记

特征工程是用一些手段,整合现有数据的特征变成对数据能够进行更好表达的特征,以便给模型输入的时候能够用数据集的特征对数据进行更好的表达。所以特征工程这一步尤为重要,是决定最终预测精确性的关键。
常用的方法:
1.数据清洗:处理掉数据中异常值、缺失值,以便数据变得规整。
2.特征构造:把现有数据进行整合(一些变换),组合成与目标属性相关性更强的特征。
3.特征筛选:筛选出输入的特征中对结果有意义的特征。
ps.以下根据datawhale学习资料整理,也有些自己的理解。
对数据的理解:
数据的几个层面:数据层-》描述层-》解读层-》结论层
我们在整合特征这里需要做的就是把基础的数据一步步整合成对数据的描述-解读等。
这部分来自学习资料。我们所得到的数据中的属性大概可以分为以下三类:
(1)定性数据,描述性质
a)定类,按照名称分类-血型、城市、性别
b)定序,有序分类-成绩(A,B,C)
(2)定量数据,描述数量
a)定距,可以加减-温度、日期。
b)定比,可以乘除-价格,重量。
下面是这几个步骤中大概需要做的事情,我的理解是有一些处理是每一次进行预测都要做的,比如缺失值、异常值等,而有一些需要根据自己的情况去做,比如log转换,one-hot编码等。
具体日后有更加深刻的了解了之后会回来进行补充。

1.基本概念及理解

1.数据清洗

(1)特征变换
模型无法处理或者不适合处理的。
a)定性定量编码,Label Encoder,One-hot,Distribution Encoding
b)标准化(z分数)和归一化(min-max归一化)
(2)缺失值处理
a)不处理(xgboost树模型自动填充)
b)删除
c)插值补全,包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全
d)分箱,缺失值一个箱
(3)异常值处理
a)简单用统计的方法来查看(如describe)、散点图等
b)3阿尔法法则(正太分布)/箱形图截断(下面有代码)
c)利用模型进行离群点检测、聚类。如k近邻,One Class,Isolation Forcast
4.其他

2.特征构造

构造统计量特征,报告计数、求和、比例、标准差等;
时间特征,包括相对时间和绝对时间,节假日,双休日等;
地理信息,包括分箱,分布编码等方法;
非线性变换,包括 log/ 平方/ 根号等;
特征组合,特征交叉;
仁者见仁,智者见智。

3.特征选择

(1)过滤式;先进行特征选择然后训练学习器,特征选择的过程与学习器无关
主要方法:卡方检验;信息增益;相关系数
(2)包裹式;
(3)嵌入式:将特征选择嵌入模型训练中,特征选择完成后,还能给予特征选择完成的特征和模型训练出的超参数,再次训练优化。
主要思想:挑选出那些对模型的训练有意义的特征

2.代码复现

下面代码主要复现了阿泽的代码,链接如下:https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12281978.0.0.680237c9PII0OG&postId=95501
下面自己的感悟:

1.箱形图删除异常值

def outliers_proc(data, col_name, scale=3):
    """
    用于清洗异常值,默认用 box_plot(scale=3)进行清洗
    :param data: 接收 pandas 数据格式
    :param col_name: pandas 列名
    :param scale: 尺度
    :return:
    """

    def box_plot_outliers(data_ser, box_scale):
        """
        利用箱线图去除异常值
        :param data_ser: 接收 pandas.Series 数据格式
        :param box_scale: 箱线图尺度,
        :return:
        """
        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)
    index = np.arange(data_series.shape[0])[rule[0] | rule[1]]
    print("Delete number is: {}".format(len(index)))
    data_n = data_n.drop(index)
    data_n.reset_index(drop=True, inplace=True)
    print("Now column number is: {}".format(data_n.shape[0]))
    index_low = np.arange(data_series.shape[0])[rule[0]]
    outliers = data_series.iloc[index_low]
    print("Description of data less than the lower bound is:")
    print(pd.Series(outliers).describe())
    index_up = np.arange(data_series.shape[0])[rule[1]]
    outliers = data_series.iloc[index_up]
    print("Description of data larger than the upper bound is:")
    print(pd.Series(outliers).describe())
    
    fig, ax = plt.subplots(1, 2, figsize=(10, 7))
    sns.boxplot(y=data[col_name], data=data, palette="Set1", ax=ax[0])
    sns.boxplot(y=data_n[col_name], data=data_n, palette="Set1", ax=ax[1])
    return data_n

在这里高亮这条代码

 index = np.arange(data_series.shape[0])[rule[0] | rule[1]]

box_plot_outliers方法最后返回的rule_low,rule_up是两列的dateframe,一列是power的index,一列是bool值。
val_low,val_up是上下分界点。
进行清洗前的的power
[数据挖掘]天池二手车交易价格预测-特征工程-datawhale学习笔记_第1张图片进行清洗后的power
[数据挖掘]天池二手车交易价格预测-特征工程-datawhale学习笔记_第2张图片[数据挖掘]天池二手车交易价格预测-特征工程-datawhale学习笔记_第3张图片
2.基本的特征构造
阿泽在这里主要对regionCode-city变换,增加先验知识
对同品牌的销售情况进行统计:
[数据挖掘]天池二手车交易价格预测-特征工程-datawhale学习笔记_第4张图片给power等数值性属性做了归一化等变换。当然每个模型由于对数据的需求不同,比如反复强调的树模型可以自己填充缺失值,LR模型需要对特征进行归一化等,自己要做的还很多。

你可能感兴趣的:(学习笔记)