【特征工程】使用指南

目录

1.1 异常值检测  

1.Info()

2.describe()

3.value_count()

1.2 特征缩放

1.2.1为什么要进行特征缩放

1.3 特征归一化VS 特征标准化

1.3.1 特征扩展 

​​​​1.4 离散特征的处理

1.5 类别不平衡处理

欠采样

过采样

代价敏感学习**

1.6 缺失值处理

1.7 二值化- Binarizer

1.8 区间缩放法- MinMaxScaler

1.9 规范化- Normalizer

1.10 LDA/PCA

1.11 特征工程方法汇总


  • 1.1 异常值检测  ****

1.Info()

是DataFrame才可用的API,快捷查看多种信息:总行数和列数、每列元素类型和non-NaN的个数,总内存。
DataFrame.info(verbose=None, memory_usage=True, null_counts=True)

参数:
verbose:True or False,字面意思是冗长的,也就说如果DataFrame有很多列,是否显示所有列的信息,如果为否,那么会省略一部分;
memory_usage:True or False,默认为True,是否查看DataFrame的内存使用情况;
null_counts:True or False,默认为True,是否统计NaN值的个数。

2.describe()

快速查看每一列的统计信息,默认排除所有NaN元素。
DataFrame.describe( include= [np.number])

参数:
include:'all'或者[np.number 或 np.object]。numberic只对元素属性为数值的列做数值统计,object只对元素属性为object的列做类字符串统计。

3.value_count()

在pandas里面常用用value_counts统计某个字段各种值数据出现的频率
pandas.Series.value_counts
Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)

参数:
normalize : boolean, default False 如果设置为true,则以百分比的形式显示
sort : boolean, default True 是否排序
ascending : boolean, default False 默认降序排序
bins : integer, optional 而不是数值计算,把它们分成半开放的箱子,一个方便的pd.cut,只适用于数字数据
dropna : boolean, default True 默认删除na值

 

  • 1.2 特征缩放

归一化或标准化

  • 1.2.1为什么要进行特征缩放

直接求解缺点:

    1.x1特征对应权重会比x2对应的权重小很多,降低模型 可解释性

    2.梯度下降时,最终解被 数值大的特征所主导,会影响模型精度与收敛速度

    3.正则化时会不平等看待特征的重要程度( 尚未标准化就进行L1/L2正则化是错误的)

 

  • 1.3 特征归一化VS 特征标准化

注意:当对新数据进行特征缩放时,也要使用之前训练集的缩放规则进行缩放

  • 1.3.1 特征扩展 ****

1sklearn.preprocessing.PolynomialFeatures(degree=2, interaction_only=False, include_bias=True) 2 3参数说明: 4degree:多项式次数(就同几元几次方程中的次数一样) 5interaction_only:是否包含单个自变量**n(n>1)特征数据标识 6include_bias:是否包含偏差标识 7 8# 首先生成3x2的原始特征矩阵 9# 即样本数为3,特征数为2 10X = np.arange(6).reshape(3, 2) 11 12print '原始数据:' 13print X 14 15# 特生变换/特征生成 16# 将原始一阶数据升维到二阶数据 17# 升维方式是: [x_1, x_2] 变为 [1, x_1, x_2, x_1^2, x_1 x_2, x_2^2] 18 19polyFeat = PolynomialFeatures(degree=2) 20X_transformed = polyFeat.fit_transform(X) 21 22print '特征变换后的数据:' 23print X_transformed 24 25 26 27原始数据: 28[[0 1] 29 [2 3] 30 [4 5]] 31特征变换后的数据: 32原始数据: 33[[0 1] 34 [2 3] 35 [4 5]] 36特征变换后的数据: 37[[ 1. 0. 1. 0. 0. 1.] 38 [ 1. 2. 3. 4. 6. 9.] 39 [ 1. 4. 5. 16. 20. 25.]] 40

 

  • ​​​​1.4 离散特征的处理

存在“序”关系: 可通过连续化将其转化为连续值  例:强度

不存在“序”关系: 哑编码 / 独热编码  例:身高

如果简单地把 类别型变量当作 数值型变量,将其映射到不同的数字,这种做法是错误的,原因在于算法会试图从一个没有意义的大小顺序中学习

 

  • 1.5 类别不平衡处理

欠采样

去除一些反例(假设反例多),使得正、反例数目接近,然后再学习

优点:速度快

缺点:可能会丢失一些重要信息

过采样

增加一些正例,使得正、反例数目接近,然后再学习

优点:保持数据信息

缺点:可能会过拟合

代价敏感学习**********

给某类样本更高的权重,比如,正例是反例的一半,那么正例的权重就是反例的2倍, 在sklearn中由class_weight指定

优点:速度快、降低过拟合风险

缺点: 需要算法支持带权学习

 

  • 1.6 缺失值处理

方法一:直接删除有缺失的样本

优点:简单      缺点:浪费资源,无法处理有大量缺失值的任务

方法二:用平均值、中值、分位数、众数、随机值等替代

优点:简单      缺点:人为增加了噪声

方法三:(基本不用)用其他变量做预测模型来算出缺失变量。

看似更符合实际,但是如果其他变量和缺失变量无关,则预测的结果无意义

方法四:最精确的做法,把变量映射到高维空间。

比如性别,有男、女、缺失三种情况,则映射成3个变量:是否男、是否女、是否缺失

1import pandas as pd 2import numpy as np 3 4df=pd.DataFrame([["XXL", 8, "black", "class 1", 22], 5["L", np.nan, "gray", "class 2", 20], 6["XL", 10, "blue", "class 2", 19], 7["M", np.nan, "orange", "class 1", 17], 8["M", 11, "green", "class 3", np.nan], 9["M", 7, "red", "class 1", 22]]) 10 11df.columns=["size", "price", "color", "class", "boh"] 12print(df) 13# out: 14''' 15  size  price   color    class   boh 160  XXL    8.0   black  class 1  22.0 171    L    NaN    gray  class 2  20.0 182   XL   10.0    blue  class 2  19.0 193    M    NaN  orange  class 1  17.0 204    M   11.0   green  class 3   NaN 215    M    7.0     red  class 1  22.0 22''' 23from sklearn.preprocessing import Imputer 24# 1. 创建Imputer器 25imp =Imputer(missing_values="NaN", strategy="mean",axis=0 ) 26# 先只将处理price列的数据, 注意使用的是   df[['price']]   这样返回的是一个DataFrame类型的数据!!!! 27# 2. 使用fit_transform()函数即可完成缺失值填充了 28 29# 处理一列 30df["price"]=imp.fit_transform(df[["price"]]) 31# 直接处理price和boh两列 32df[['price', 'boh']] = imp.fit_transform(df[['price', 'boh']]) 33df 34# out: 35''' 36size    price    color    class    boh 370    XXL    8.0    black    class 1    22.0 381    L    9.0    gray    class 2    20.0 392    XL    10.0    blue    class 2    19.0 403    M    9.0    orange    class 1    17.0 414    M    11.0    green    class 3    20.0 425    M    7.0    red    class 1    22.0 43''' 44

 

  • 1.7 二值化**-******** Binarizer******

from sklearn.processing import Binarizer

二值化(Binarizer):对于定量的数据根据给定的阈值,将其进行转换,如果大于阈值,那么赋值为1;否则赋值为0

还有一种简单的, arr=i>5 返回的是array(true false true,…)

1df = DataFrame(np.arange(12).reshape(4,3),columns=['A','B','C']) 2df 3第一列为索引值 4A B C 50 0 1 2 61 3 4 5 72 6 7 8 83 9 10 11 9将小于等于5的数值转为0,大于5的转为1 10 11binarize = Binarizer(threshold=5) 12binarize.fit_transform(df) 13array([[0, 0, 0], 14 [0, 0, 0], 15 [1, 1, 1], 16 [1, 1, 1]]) 17也可以传入df[['A','B']]来对两列进行转换,注意,不可以是df['A']或者df.A,因为df.A是Series不是二维的 18

更多binarizer:https://blog.csdn.net/u013019431/article/details/80009545

 

  • 1.8 区间缩放法- MinMaxScaler

from sklearn.processing import MinMaxScaler

区间缩放法:是指按照数据的方差特性对数据进行缩放操作,将数据缩放到给定区间上,常用的计算方式如下:

 

  • 1.9 规范化- Normalizer

from sklearn.processing import Normalizer

规范化:和标准化不同,归一化是基于矩阵的行进行数据处理,其目的是将矩阵的行均转换为“单位向量”,l2规则转换公式如下:

 

  • 1.10 LDA/PCA

  • LDA: 是一种监督学习的

降维技术,投影后类 内方差最小, 类间方差最大 。

做法****:****

1.将每个类别的中心( 质心)向直线w投影,获取投影点

2.计算直线上,每个类别下样本的方差(图中红蓝条)

3.目标函数:让均值的投影点间的距离/各类别组内方差的和 极大

PCA:** **是一种 无监督学习的降维技术 ;投影后样本越分散,保留的信息越多

左图不好右图好-原因是投影后样本分散方差极大,这样保留的有效信息多一点

做法:

1.将所有的样本点向直线w投影

2.目标函数:让投影后样本的方差极大

 

  • 1.11 特征工程方法汇总

异常值检测  Info()/describe()

特征缩放 规一 标准

特征扩展 多项式

离散特征处理 哑编码 onehotCoder

缺失值处理 

类别不平衡处理

TF-IDF 文本特征

Word2vec  文本特征

 

特征工程相关的文章链接:

https://blog.csdn.net/qq_32241189/article/details/79824264

https://www.cnblogs.com/jasonfreak/p/5448385.html

代码交流 2021