【面试相关】面试常问到的特征工程究竟是什么呢?

简介

特征工程其实是将数据属性转换为数据特征的过程,这些特征可以很好的描述这些数据。通过特征工程对数据进行预处理,才能使算法模型减少收到的噪声干扰。

特征工程的子问题之一——特征提取,从通过数据的初步处理,将所含数值特征找寻出来。
特征工程的子问题之二——特征选择,它的目的是从特征集合中挑选一组最具统计意义的特征子集,从而达到降维的效果。
特征提取的子问题之三——特征构建。特征构建指的是从原始数据中人工的构建新的特征,思考问题的潜在形式和数据结构,同时能够更好地应用到预测模型中。

整体步骤:

评估-采集-数据清洗-数据预处理(归一化,数据量纲变换)-多个特征包括降维(PCA,LDA)-特征选择(皮尔逊、斯皮尔曼相关系数、卡方检验等)-带入模型-模型调参-模型评估-模型运用
对于数值型特征,采用特征归一化,将所有特征统一到大致相同的数值区间
对于类别型特征,当类别之间有大小关系,采用序号编码。当类别之间每有大小关系,用one hot 独热编码。

数据预处理

拿到数据可能存在的问题有

不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。(标准化,或者0-1化)
①标准化
在这里插入图片描述
②归一化
最大最小归一化(最常用)
在这里插入图片描述
信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。(二值化可以解决这一问题。)
**存在缺失值:**直接使用含有缺失值的特征:当仅有少量样本缺失该特征的时候可以尝试使用;删除含有缺失值的特征:这个方法一般适用于大多数样本都缺少该特征,且仅包含少量有效值是有效的;
缺失值处理 有些特征可能因为无法采样或者没有观测值而缺失.例如距离特征,用户可能禁止获取地理位置或者获取地理位置失败,此时需要对这些特征做特殊的处理,赋予一个缺失值。我们在进行模型训练时,不可避免的会遇到类似缺失值的情况,下面整理了几种填充空值的方法

  1)缺失值删除(dropna)
   ①删除实例
    ②删除特征 
  2)缺失值填充(fillna)
   ①用固定值填充 对于特征值缺失的一种常见的方法就是可以用固定值来填充,例如0,9999, -9999, 例如下面对灰度分这个特征缺失值全部填充为-99  data['灰度分'] = data['灰度分'].fillna('-99') 1 1 
   ②用均值填充 对于数值型的特征,其缺失值也可以用未缺失数据的均值填充,下面对灰度分这个特征缺失值进行均值填充  data['灰度分'] = data['灰度分'].fillna(data['灰度分'].mean())) 1 1 
   ③用众数填充 与均值类似,可以用未缺失数据的众数来填充缺失值  data['灰度分'] = data['灰度分'].fillna(data['灰度分'].mode()))

插值补全缺失值
最常使用的还是第三种插值补全缺失值的做法
①均值/中位数/众数补全
如果样本属性的距离是可度量的,则使用该属性有效值的平均值来补全;
如果样本属性的距离不可度量,则可以采用众数或者中位数来补全。
②同类均值/中位数/众数补全
对样本进行分类后,根据同类其他样本该属性的均值补全缺失值,当然同第一种方法类似,如果均值不可行,可以尝试众数或者中位数等统计数据来补全。
③固定值补全
利用固定的数值补全缺失的属性值。
存在异常值
第一种是用pandas包的describe()简单看一下
第二种是用箱型图。
可以使用seaborn的可视化方法boxplot来实现:

f,ax=plt.subplots(figsize=(10,8))
sns.boxplot(y='length',data=df,ax=ax)
plt.show()

存在重复值:去重

(one-hot)独热编码

One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
一些属性是类别型而不是数值型,举一个简单的例子,由{红,绿、蓝}组成的颜色属性,最常用的方式是把每个类别属性转换成二元属性,即从{0,1}取一个值。
但由于类别仅用数字替换,机器无法识别,会存在大小有序的概念,因此需要进行onehot 编码

因此基本上增加的属性等于相应数目的类别,并且对于你数据集中的每个实例,只有一个是1(其他的为0),这也就是独热(one-hot)编码方式(类似于转换成哑变量)。

正常来说有两种方法可以对分类值处理
pandas的get_dummies()与sklearn的OneHotEncoder()
二者功能基本相似,
区别在于sklearn.preprocessing 下的 OneHotEncoder 不可以直接处理 string,如果数据集中的某些特征是 string 类型的话,需要首先将其转换为 integers 类型;

pd.get_dummies(data,prefix=["A","B"],prefix_sep="+")
常用参数解释:
    data: DataFrame或Series对象
    prefix: 编码后特征名称的前缀
    prefix_sep: 编码后特征名称的前缀,默认使用“_”进行分隔
    columns: 默认为None,默认对data里面的所有object对象和category对象进行编码,如果指定columns,则只对指定的特征进行编码,但是必须保证columns的长度与prefix的长度一致
    drop_first: 默认为False,表示是否丢弃OneHot编码后的第一列,因为丢弃的一列可以通过其他剩余的k-1列计算得到,也就变成了哑变量编码
from sklearn import preprocessing

enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]])
array=enc.transform([[0,1,3]]).toarray()



优缺点:
优点:将离散数据整数化,能保证特征之间的距离计算容易一些
缺点:
1、如果原本的标签编码是有序的,那one hot编码就不合适了——会丢失顺序信息。
如果特征的特征值数目特别多,特征向量就会非常大,且非常稀疏,容易造成维度灾难

数据降维处理

PCA(主成分分析)
数据降维就是在保留重要信息的同时消除那些“无信息量的信息”。“无信息量”有多种定义方法,PCA 关注的是线性相关性。
我们将数据矩阵的列空间描述为所有特征向量的生成空间。如果列空间的秩小于特征总数,那么多数特征就是几个关键特征的线性组合。线性相关的特征是对空间和计算能力的浪费,因为它们包含的信息可以从更少的几个特征中推导出来。为了避免这种情况, PCA 试图将数据挤压到一个维度大大小于原空间的线性子空间,从而消除这些“臃肿”

1 from sklearn.decomposition import PCA
2 
3 #主成分分析法,返回降维后的数据
4 #参数n_components为主成分数目
5 PCA(n_components=2).fit_transform(iris.data)

PCA 的解法一般分为以下几个步骤:

对样本数据进行中心化处理;
求样本协方差矩阵;
对协方差矩阵进行特征值分解,将特征值从大到小排列;
取特征值前 n 个最大的对应的特征向量 W1, W2, …, Wn ,这样将原来 m 维的样本降低到 n 维。

LDA(Linear Discriminant Analysis,线性判别分析)

LDA 是一种有监督学习算法,相比较 PCA,它考虑到数据的类别信息,而 PCA 没有考虑,只是将数据映射到方差比较大的方向上而已。
因为考虑数据类别信息,所以 LDA 的目的不仅仅是降维,还需要找到一个投影方向,使得投影后的样本尽可能按照原始类别分开,即寻找一个可以最大化类间距离以及最小化类内距离的方向。

LDA(线性判别分析法)

1 from sklearn.lda import LDA
2 
3 #线性判别分析法,返回降维后的数据
4 #参数n_components为降维后的维数
5 LDA(n_components=2).fit_transform(iris.data, iris.target)

PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。

特征选择

特征选择的形式可以将特征选择方法分为3种:

Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

1)方差筛选法

使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。(方差越大的特征,那么我们可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。

from sklearn.feature_selection import VarianceThreshold

(2)相关系数

这个主要用于输出连续值的监督学习算法中。我们分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。即使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr

保持渴求,不要沉寂

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值