特征工程预处理

前言

        之前在网上东看看西瞧瞧之后记的内容,有点杂乱也忘了是在哪些文章看到的了。


1、缺失值处理——2004-2016年流感

        缺失值的处理一般分为填充/删除。该案例中,对于缺失值使用的是用fillna()函数进行填充,函数中的参数就是将缺失值的填充值,参数也可以是函数,例如使用同一列的均值等进行填充。

        并且该函数中使用到了删除函数drop(),删除制定的行/列。

 

2、特征缩放——iris数据集

        先创建一个StandardScaler()对象,然后对该对象使用fit_transform()方法进行训练,参数是训练的对象。

        标准化的作用是将特征值调整到均值为0、标准差为1的范围。这样可以确保每个特征对模型训练的贡献均衡,不会因为尺度不同而影响模型的学习效果。在Python中,使用scikit-learn库的StandardScaler类可以方便地实现标准化。

        归一化的作用是将特征值缩放到固定的范围,通常是 [0, 1] 或 [-1, 1]。这在处理距离度量(如欧氏距离)的算法中尤为重要,避免某些特征因取值范围过大而主导距离计算。在Python中,使用scikit-learn库的MinMaxScaler类可以方便地实现归一化。 

3、正则化——波士顿房价数据集

        Elastic Net正则化结合了L1和L2正则化的优点。它在损失函数中同时包含L1和L2正则化项。Elastic Net适用于高维数据集,尤其是当特征数量大于样本数量时。它在处理多重共线性和特征选择方面都有较好的表现。

        正则化的作用:①防止过拟合:通过限制模型的复杂度,正则化可以防止模型过拟合训练数据,从而提高模型在新数据上的泛化能力。②特征选择:L1正则化(Lasso)可以自动选择重要的特征,忽略不重要的特征,这对于高维数据特别有用。③处理多重共线性:L2正则化(Ridge)可以处理特征之间的多重共线性问题,稳定模型的预测能力。

        创建一个对象:Lasso()/Ridge()/Elastic Net(),函数中的参数为正则化系数。

 

4、特征编码

4.1序号编码(Ordinal Encoding)

        序号编码通常用于处理类别间具有内在大小顺序关系的数据.

        对于一个具有m个类别的特征,我们将其对应地映射到 [0,m-1] 的整数。例如对于”学历”这样的类别,“学士”、“硕士”、“博士” 可以很自然地编码成 [0,2],因为它们内在就含有这样的逻辑顺序。但如果对于“颜色”这样的类别,“蓝色”、“绿色”、“红色”分别编码成[0,2]是不合理的,因为我们并没有理由认为“蓝色”和“绿色”的差距比“蓝色”和“红色”的差距对于特征的影响是不同的。

        sklearn.preprocessing中的OrdinalEncoder进行处理,可以通过两种方式进行编码:

        ①先将数据categorical_df载入encoder中,再将载入的数据进行OrdinalEncoder编码 直接载入encoder并编码

4.2独热编码(One-hot Encoding)

        独热编码:通常用于处理类别间不具有大小关系的特征。

        可以通过导入sklearn.preprocessing中的OneHotEncoder,创建变量进行处理。

         对name进行onehot编码后,第一列表示allen: [1,0,0,0],第二列表示bob: [0,1,0,0],以此类推。输出:

        同理也可以自定义编码顺序: 

        输出: 

         自定义的编码顺序是['dory', 'bob', 'chartten', 'allen'],dory=[1,0,0,0],bob=[0,1,0,0],chartten=[0,0,1,0],allen=[0,0,0,1], 在输出结果的第一列中表示allen,即为[0,0,0,1],第二列表示bob,即为[0,1,0,0],以此类推。

 4.3标签编码 (Label Encoding)

        Label Encoding是给某一列数据编码,而Ordinal Encoding是给所有的特征编码。因此Label Encoding常用于给标签(label)编码,而Ordinal Encoding常用于给数据集中的特征编码。

        Ordinal Encoding用于有序特征的数据编码,OneHot Encoding用于无序特征的数据编码。LabelEncoder与OneHotEncoder又存在什么样的区别?

(1)特征数据类型

        ①对于定类类型的数据,建议使用one-hot encoding。定类类型就是纯分类,不排序,没有逻辑关系。比如性别分男和女,男女不存在任何逻辑关系,我们不能说男就比女好,或者相反。再者,中国各省市分类也可以用独热编码,同样各省不存在逻辑关系,这时候使用one-hot encoding会合适些。但注意,一般会舍去一个变量,比如男的对立面肯定是女,那么女就是重复信息,所以保留其中一个变量即可。

        ②对于定序类型的数据,建议使用label encoding。定序类型也是分类,但有排序逻辑关系,等级上高于定类。比如,学历分小学,初中,高中,本科,研究生,各个类别之间存在一定的逻辑,显然研究生学历是最高的,小学最低。这时候使用Label encoding会显得更合适,因为自定义的数字顺序可以不破坏原有逻辑,并与这个逻辑相对应。

(2)所使用的模型

        ①对数值大小敏感的模型必须使用one-hot encoding。典型的例子就是LR和SVM。二者的损失函数对数值大小是敏感的,并且变量间的数值大小是有比较意义的。而Label encoding的数字编码没有数值大小的含义,只是一种排序,因此对于这些模型都使用one-hot encoding。

        ②对数值大小不敏感的模型(如树模型)不建议使用one-hot encoding。一般这类模型为树模型。如果分类类别特别多,那么one-hot encoding会分裂出很多特征变量。这时候,如果我们限制了树模型的深度而不能向下分裂的话,一些特征变量可能就因为模型无法继续分裂而被舍弃损失掉了。因此,此种情况下可以考虑使用Label encoding

4.4频数编码(Frequency Encoding/Count Encoding)

        将类别特征替换为训练集中的计数(一般是根据训练集来进行计数,属于统计编码的一种,统计编码,就是用类别的统计特征来代替原始类别,比如类别A在训练集中出现了100次则编码为100)。这个方法对离群值很敏感,所以结果可以归一化或者转换一下(例如使用对数变换)。未知类别可以替换为1。

        频数编码使用频次替换类别。有些变量的频次可能是一样的,这将导致碰撞。尽管可能性不是非常大,没法说这是否会导致模型退化,不过原则上我们不希望出现这种情况。

        比如某个分类中’Peking’出现了10次,那么’Peking’就会被替换为10,我们可以用categorical-encodings包中的CountEncoder实现。

4.5特征二元化(Binarization)

        特征二元化是将数值型特征转换为布尔值特征的一种方法。通过设定一个阈值,将特征值大于等于该阈值的样本标记为1,小于该阈值的样本标记为0。

4.6特征离散化(Discretization)

        特征离散化是将连续的数值型特征转换为离散的类别型特征的方法。常见的方法包括等宽分箱和等频分桶。

4.7 BOW

        词袋模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后看这个袋子里装的都是些什么词汇,将其分类。如果文档中猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的。

        例如三个句子如下:

        句子1:小孩喜欢吃零食。

        句子2:小孩喜欢玩游戏,不喜欢运动。

        句子3 :大人不喜欢吃零食,喜欢运动。

        首先根据语料中出现的句子分词,然后构建词袋(每一个出现的词都加进来)。计算机不认识字,只认识数字,那在计算机中怎么表示词袋模型呢?其实很简单,给每个词一个位置索引就可以了。小孩放在第一个位置,喜欢放在第二个位置,以此类推。

        {“小孩”:1,“喜欢”:2,“吃”:3,“零食”:4,“玩”:5,“游戏”:6,“大人”:7,“不”:8,“运动”:9}

        其中key为词,value为词的索引,预料中共有9个单词, 那么每个文本我们就可以使用一个9维的向量来表示。

        如果文本中含有的一个词出现了一次,就让那个词的位置置为1,词出现几次就置为几,那么上述文本可以表示为:

        句子1:[1,1,1,1,0,0,0,0,0]

         句子2:[1,2,0,0,1,1,0,1,1]

        句子3:[0,2,1,1,0,0,1,1,1]

        该向量与原来文本中单词出现的顺序没有关系,仅仅是词典中每个单词在文本中出现的频率。

        ①词袋模型最重要的是构造词库,需要维护一个很大的词库。

        ②词袋模型严重缺乏相似词之间的表达。“我喜欢北京”“我不喜欢北京”其实这两个文本是严重不相似的。但词袋模型会判为高度相似。“我喜欢北京”与“我爱北京”其实表达的意思是非常非常的接近的,但词袋模型不能表示“喜欢”和“爱”之间严重的相似关系。(当然词袋模型也能给这两句话很高的相似度,但是注意我想表达的含义)

        ③向量稀疏
参考文章:机器学习中常见的编码形式_序号编码-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_44551646/article/details/115422314

相关推荐

  1. 掌握XGBoost:特征工程与数据预处理

    2024-07-14 03:44:02       43 阅读
  2. Python数据预处理特征工程

    2024-07-14 03:44:02       17 阅读
  3. Python 机器学习 特征预处理

    2024-07-14 03:44:02       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 03:44:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 03:44:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 03:44:02       58 阅读
  4. Python语言-面向对象

    2024-07-14 03:44:02       69 阅读

热门阅读

  1. 第九十五周周报

    2024-07-14 03:44:02       14 阅读
  2. Python input NameError: name ‘xxx‘ is not defined.

    2024-07-14 03:44:02       17 阅读
  3. 【数据结构】二叉树

    2024-07-14 03:44:02       20 阅读
  4. AWS认证SAA-C03每日一题

    2024-07-14 03:44:02       16 阅读
  5. 高项-信息化发展知识要点

    2024-07-14 03:44:02       17 阅读
  6. 什么是开放最短路径优先(OSPF)

    2024-07-14 03:44:02       17 阅读
  7. 【YashanDB知识库】yasql登录报错:YAS-00413

    2024-07-14 03:44:02       19 阅读
  8. ABB 1786-RPA控制器 处理器 模块

    2024-07-14 03:44:02       18 阅读