涉及内容
- 特征预处理中对特征无量纲化处理
- 特征工程缺失值处理
- 分类特征处理
- 连续特征处理
无量纲化
定义及需求
- 定义: 也称数据的规范化,是指不同特征之间由于存在量纲不同导致其无法比较。
- 数据规范处理时,必然对不同量纲特征使用一些方法(如归一化、标准化)进行处理,消除量纲,更好地进行特征筛选和算法训练
无量纲方法(几何角度)
-
直线型,是指特征原值与无量纲化后的特征值成线性关系,常用的有阈值法,标准发,比重法
-
阈值法:最常见无量纲方法,阈值成临界值,指衡量事务发展变化的一些特殊指标值,如极大值、极小值。而阈值法就是实际值与阈值对比得到的无量纲的特征值的方法。(如所有特征按照阈值法,对特征中小于最小值会置为-1,大于最小值且小于最大值置为 0,大于最大值置为1,得到相同的量纲),相应的方法如下
-
标准化,就是特征值减去该特征的均值,然后比上其标准差。无论特征值原理是多少,最终都将分布在0两侧,与阈值法相比,标准化利用样本更多的信息,且标准化取值范围将不再[0,1],公式如下
-
比重法,将特征实际值转换为它在该特征值总和的比重。
-
-
折线型
折线无量纲化适用被评价事物呈现阶段性变化即特征值在不同阶段变化对事物总体水平影响是不一样的。 折线型无量纲方法比直线型方法更服务实际情况,但要缺点特征值转折点比较难,需要对数据有足够理解和掌握
-
曲线型
- 定义: 事物发展阶段不很明显,而前、中、后阶段的发展情况又各不相同,即特征值变化是循序渐进的,并不是突变的,该种情况下,曲线无量化更合适,常用曲线无量纲方法如下:
- 图示
-
模型无量纲化
综合评价者的评价指标可以分为正向指标(即特征值越大越好)、逆指标(即特征值越小越好)、适度指标(即特征值落在某个区间最好,大了、小了都不好),特征彼此之间“好”与“坏”并没有一个标准,在很大程度上具有一定的模糊性,这时候可以选择此方法对指标进行无量纲化处理
例子
-
数据标准化
-
优缺点
优点: Z-Score最大的优点就是简单(如均值、标准差),容易计算,Z-Score能够应用于数值型的数据,并且不受数据量级的影响,因为它本身的作用就是消除量级给分析带来的不便。 缺点: 估算Z-Score需要总体的平均值与方差,但是该值的真实的分析与挖掘中很难得到,大多数情况下是样本的均值与标准差替代 Z-Score对于数据的分布一定的要求,正态分布是最有利于Z-Score计算 Z-Score消除了数据具有的实际意义,A的Z-Score与B的Z-Score与他们各自的分数不再有关系,因此Z-Score结果只能用于比较数据间的结果,数据的真实意义还需要还原原值 在存在异常值时无法保证平衡的特征尺度
-
实现代码
from sklearn.preprocessing import StandardScaler #标准化,返回值为标准化后的数据 standardScaler = StandardScaler().fit(X_train) standardScaler.transform(X_train)
-
-
归一化
- MinMax归一化
- 定义及公式
区间放缩利用边界值信息,将属性放到[0,1]
- 优缺点
这种方法有一个缺陷就是当有新数据加入时,可能导致max和min变化,需要重新定义 MinMaxScaler对异常值的存在非常敏感
- 代码
from sklearn.preprocessing import MinMaxScaler #区间缩放,返回值为缩放到[0, 1]区间的数据 minMaxScaler = MinMaxScaler().fit(X_train) minMaxScaler.transform(X_train)
-
MaxAbs归一化
- 定义及公式
单独地说法和转换每个特征,使得训练集中的每个特征的最大值为1.0,将特征值放缩到[-1,1]。它不同移动、居中数据,因此不会破坏任何稀疏性。
- 缺点
1.该方法在新数据加入时,可能会导致max和min的变化,需要重新定义 2.益智区放缩其不同,绝对值映射在[0,1]范围内。在仅有正数据时,该放缩器行为和MinMaxScaler类似,因此也存在对大的异常值敏感问题。
- 代码
from sklearn.preprocessing import MaxAbsScaler maxAbsScaler = MaxAbsScaler().fit(X_train) maxAbsScaler.transform(X_train)
- 定义及公式
缺失值处理
处理策略
- 非数值特征
1.指定填充值对空值(对应位置无值)填充 2.指定某值为空(将非空值指定为空值),进行删除或填充 3.删除原生的空值(对应位置无值)
- 数值特征
1.指定某个数值对空值(对应位置无值)填充 2.指定最小值对空值(对应位置无值)填充 3.指定最大值对空值(对应位置无值)填充 4.指定平均值对空值(对应位置无值)填充 5.指定某值为空(将非空值指定为空值),进行删除或使用(指定数值)填充 6.删除原生的空值(对应位置无值)
处理分类特征
编码
-
labelEncode
-
根据特征值出现频率,进行从高到低进行依次以0,1,2,3,…,n-1进行编码,n为特征值去重后的个数
-
例子
from sklearn.preprocessing import LabelEncoder labelencoder = LableEncoder() X[:, 0] = labelencoder.fit_transform(X[:, 0])
-
onehotEncode
- 将数值型特征的单个特征值转换为特征向量,进行编码.它可以实现将分类特征的每个元素转化为一个可以用来计算的值
- 代码
from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder() enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) ans = enc.transform([[0, 1, 3]]).toarray() # 如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定 sparse = False 来达到同样的效果 print(ans) # 输出 [[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]
-
binarizeEncode
- 对特征值进行二值化编码,通过设定阈值,若大于该值为1,小于该值为1,进行编码
- 代码
from sklearn.preprocessing import Binarizer #数据预处理二元化Binarizer模型 def test_Binarizer(): X=[[1,2,3,4,5], [5,4,3,2,1], [3,3,3,3,3,], [1,1,1,1,1]] print("before transform:",X) binarizer=Binarizer(threshold=2.5) print("after transform:",binarizer.transform(X)) test_Binarizer()
哑变量
-
定义
又称为虚拟变量、虚设变量或名义变量,从名称上看就知道,它是人为虚设的变量,通常取值为0或1,来反映某个变量的不同属性。对于有n个分类属性的自变量,通常需要选取1个分类作为参照,因此可以产生n-1个哑变量。 将哑变量引入回归模型,虽然使模型变得较为复杂,但可以更直观地反映出该自变量的不同属性对于因变量的影响,提高了模型的精度和准确度。
-
出现场景
在构建回归模型时,如果自变量X为连续性变量,回归系数β可以解释为:在其他自变量不变的条件下,X每改变一个单位,所引起的因变量Y的平均变化量;如果自变量X为二分类变量,例如是否饮酒(1=是,0=否),则回归系数β可以解释为:其他自变量不变的条件下,X=1(饮酒者)与X=0(不饮酒者)相比,所引起的因变量Y的平均变化量。 但是,当自变量X为多分类变量时,例如职业、学历、血型、疾病严重程度等等,此时仅用一个回归系数来解释多分类变量之间的变化关系,及其对因变量的影响,就显得太不理想。 此时,我们通常会将原始的多分类变量转化为哑变量,每个哑变量只代表某两个级别或若干个级别间的差异,通过构建回归模型,每一个哑变量都能得出一个估计的回归系数,从而使得回归的结果更易于解释,更具有实际意义。
-
使用场景
1.对于无序多分类变量,引入模型时需要转化为哑变量 举一个例子,如血型,一般分为A、B、O、AB四个类型,为无序多分类变量,通常情况下在录入数据的时候,为了使数据量化,我们常会将其赋值为1、2、3、4。 从数字的角度来看,赋值为1、2、3、4后,它们是具有从小到大一定的顺序关系的,而实际上,四种血型之间并没有这种大小关系存在,它们之间应该是相互平等独立的关系。如果按照1、2、3、4赋值并带入到回归模型中是不合理的,此时我们就需要将其转化为哑变量。 2.对于有序多分类变量,引入模型时需要酌情考虑 例如疾病的严重程度,一般分为轻、中、重度,可认为是有序多分类变量,通常情况下我们也常会将其赋值为1、2、3(等距)或1、2、4(等比)等形式,通过由小到大的数字关系,来体现疾病严重程度之间一定的等级关系。 但需要注意的是,一旦赋值为上述等距或等比的数值形式,这在某种程度上是认为疾病的严重程度也呈现类似的等距或等比的关系。而事实上由于疾病在临床上的复杂性,不同的严重程度之间并非是严格的等距或等比关系,因此再赋值为上述形式就显得不太合理,此时可以将其转化为哑变量进行量化。 3.对于连续性变量,进行变量转化时可以考虑设定为哑变量 对于连续性变量,很多人认为可以直接将其带入到回归模型中即可,但有时我们还需要结合实际的临床意义,对连续性变量作适当的转换。例如年龄,以连续性变量带入模型时,其解释为年龄每增加一岁时对于因变量的影响。但往往年龄增加一岁,其效应是很微弱的,并没有太大的实际意义。 此时,我们可以将年龄这个连续性变量进行离散化,按照10岁一个年龄段进行划分,如0-10、11-20、21-30、31-40等等,将每一组赋值为1、2、3、4,此时构建模型的回归系数就可以解释为年龄每增加10岁时对因变量的影响。 以上赋值方式是基于一个前提,即年龄与因变量之间存在着一定的线性关系。但有时候可能会出现以下情况,例如在年龄段较低和较高的人群中,某种疾病的死亡率较高,而在中青年人群中,死亡率却相对较低,年龄和死亡结局之间呈现一个U字型的关系,此时再将年龄段赋值为1、2、3、4就显得不太合理了。 因此,当我们无法确定自变量和因变量之间的变化关系,将连续性自变量离散化时,可以考虑进行哑变量转换。 还有一种情况,例如将BMI按照临床诊断标准分为体重过低、正常体重、超重、肥胖等几种分类时,由于不同分类之间划分的切点是不等距的,此时赋值为1、2、3就不太符合实际情况,也可以考虑将其转化为哑变量。