学习目标
● 无量纲化:最值归一化、均值方差归一化及sklearn中的Scaler
● 缺失值处理
● 处理分类型特征:编码与哑变量
● 处理连续型特征:二值化与分段
学习资料
首先,参考:《机器学习的敲门砖:归一化与KD树》及《特征工程系列:特征预处理(上)》中相关部分。
其次,其他知识点可参考推荐博文:sklearn中的数据预处理和特征工程 。
20200311
数据归一化
在量纲不同的情况下,对于部分算法不能反映样本中每一个特征的重要程度(但是有些算法对于是否归一化不敏感)。
常用的归一化有以下两种:
● 最值归一化(normalization): 把所有数据映射到0-1之间。最值归一化的使用范围是特征的分布具有明显边界的(分数0~100分、灰度0~255),受outlier的影响比较大。
x
s
c
a
l
e
=
x
−
x
m
i
n
x
m
a
x
−
x
m
i
n
x_{scale}=\frac{x-x_{min}}{x_{max}-x_{min}}
xscale=xmax−xminx−xmin
● 均值方差归一化(standardization): 把所有数据归一到均值为0方差为1的分布中。适用于数据中没有明显的边界,有可能存在极端数据值的情况。
x
s
c
a
l
e
=
x
−
x
m
i
n
S
x_{scale}=\frac{x-x_{min}}{S}
xscale=Sx−xmin
在实际使用归一化时有一个小陷阱,训练数据集进行归一化处理,需要计算出训练数据集的均值mean_train和方差std_train。在对测试数据集进行归一化时,仍然要使用训练数据集的均值train_mean和方差std_train。这是因为测试数据是模拟的真实环境,真实环境中可能无法得到均值和方差,对数据进行归一化。
特征预处理
首先需要明晰,特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。
特征工程主要包含以下几个子问题:
- Data PreProcessing(数据预处理)
- Feature Extraction(特征提取)
- Feature Selection(特征选择)
- Feature construction(特征构造)
其中数据预处理又包括了数据清洗和特征预处理等,这里主要写数据预处理的相关步骤。
下面这张图是出自公众号木东居士,如有不妥可以联系我删掉。
20200312
数值型数据无量纲化
- 标准化
给出代码:
from sklearn.preprocessing import StandardScaler
# 标准化,返回值为标准化后的数据
standardScaler = StandardScaler().fit(X_train)
X_train_std = standardScaler.transform(X_train)
standardScaler.mean_ # 查看均值的属性mean_
standardScaler.var_ # 查看方差的属性var_
X_train_std.mean() # 导出的结果是一个数组,用mean()查看均值
X_train_std.std() # 用std()查看方差
standardScaler.fit_transform(X_train) # 使用fit_transform()一步达成结果
standardScaler.inverse_transform(X_train) # 使用inverse_transform逆转标准化
- 归一化
给出代码:
from sklearn.preprocessing import MinMaxScaler
# 区间缩放,返回值为缩放到[0, 1]区间的数据
minMaxScaler = MinMaxScaler().fit(X_train)
minMaxScaler.transform(X_train)
对异常值比较敏感,并且新数据可能会引起最大最小值的变化。
- 正态分布化
给出代码:
from sklearn.preprocessing import Normalizer
# 归一化,返回值为归一化后的数据
normalizer = Normalizer(norm='l2').fit(X_train)
normalizer.transform(X_train)
- 归一化与标准化的应用场景
在分类、聚类算法中,需要使用距离来度量相似性的时候(如SVM、KNN)、或者使用PCA技术进行降维的时候,标准化(Z-score standardization)表现更好;
在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。
基于树的方法不需要进行特征的归一化,例如随机森林,bagging与boosting等方法。
如果是基于参数的模型或者基于距离的模型,因为需要对参数或者距离进行计算,都需要进行归一化。
缺失值处理
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补
imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
imp_mean[:20]
imp_median[:20]
imp_0[:20]
#在这里我们使用中位数填补Age
data.loc[:,"Age"] = imp_median
data.info()
#使用众数填补Embarked
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent")
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
import pandas as pd
data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 3 Preprocessing\Narrativedata.csv",index_col=0)
data.head()
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
#.fillna 在DataFrame里面直接进行填补
data.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False
其他部分后续继续,会打一个初级的kaggle比赛来完善预处理的操作~