数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太 大或太小 数据预处理的目的:让数据适应模型,匹配模型的需。
sklearn模块:preprocessing(几乎包含预处理所有内容 )Impute(填补缺失值用)
一、无量纲化
- 目的:使不同规格的数据转换到同一规格;不同分布的数据转换到某个特定分布
- 应用:
(1)梯度和矩阵为核心的算法(逻辑回归,支持向量机,神经网络):加快求解速度
(2)距离类模型(K近邻,K-Means聚类):提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。
(3)特例:决策树和树的集成算法:决策树可以把任意数据都处理得很好
1、中心化(Zero-centered或Mean subtraction)
- 线性,减法操作,平移操作
2、缩放处理(Scale)
- 非线性,除法操作,缩放操作,如正态标准、对数等
3、既包括中心化,又包括缩放处理的算法
- (1)数据归一化(Normalization,又称Min-Max Scaling)
中心化:最小值
缩放:最大值-最小值
最终分布:[0,1]之间的正态分布
- (2)做数据标准化(Standardization,又称Z-score normalization)
中心化:均值(μ)
缩放:标准差(σ)
最终分布:标准正态分布(均值为0,方差为1)
二、缺失值
1、sklearn中impute.SimpleImputer模块
#使用众数填补Embarked
from sklearn.impute import SimpleImpute
data = pd.read_csv(r"E:\my_data.csv",index_col=0)
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1) #特征矩阵必须是二维
imp_mode=SimpleImputer(strategy="most_frequent")
data.loc[:,"Embarked"] =
imp_mode.fit_transform(Embarked)
2、Pandas和Numpy进行填补和删除
import pandas as pd
data =pd.read_csv(r"E:\my_data.csv",index_col=0)
data.loc[:,"Age"]=data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
data.dropna(axis=0,inplace=True) #删除所有有缺失值的行,原数据集修改
3、随机森林
-
思路:无缺失列和原始标签列(一定非空)作为新的特征,缺失特征列作为label,无缺失的行为train数据,有缺失行为test数据,返回的predict值即为缺失值的预测值。
当有多个特征列有缺失值时,怎么办? 答:当有多个特征列有缺失值时,先从缺失值最少的列开始填补(因为填补缺失少的特征所需要的准确信息少)。填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。
三、特征处理
1、离散(编码,哑变量)
-
目的:文字→数值
-
(1)label专用
目标:标签
模块:LabelEncoder 中的LabelEncoder
说明:要输入的是标签,不是特征矩阵,所以允许一维 -
(2)feature专用(有序变量)
模块:sklearn.preprocessing中的OrdinalEncoder
目标:有序的特征。可以是有序的,也可以是有距的。 -
(3)feature专用(名义变量)——哑变量
模块:sklearn.preprocessing中的OneHotEncoder
目标:名义变量,无序独立的变量说明:对于学历(小学,初中,高中,大学,研究生),成绩等级(优,良,中,差,不及格)这些特征,用(0,1,2,3,4,5)进行特征分类时可以的,因为他们本身有序或者具有距离,可以认为编号5的研究生学历比编号为0的小学学历高,有先后顺序。但是,对颜色这种特征,比如下图(红,绿,蓝),如果用(0,1,2)进行编号,则默认是有序或者有距的,事实上,他们之间是独立的关系,所以,就会用到第二张图的方式进行编码(用二进制进行编码),有多少类就取几位二进制数。
2、连续(二值,分段)
-
(1)二值化
模块:sklearn.preprocessing中的Binarizer
思路:数据值大于阈值的值映射为1,而小于或等于阈值的值映射为0。
注意:类为特征专用,所以不能使用一维数组 -
(2)分段
模块:preprocessing中的KbinsDiscretizer
思路:对数据进行分段
注意:所有的特征一起操作,即所有的特征都被分为K份。