机器学习小组第二期第三周:简单的数据预处理和特征工程机器学习小组第二期第三周:简单的数据预处理和特征工程
目录目录1.归一化1.1.最值归一化(normalization)1.2.均值方差归一化(standardization)1.3.Sklearn中的归一化2.缺失值处理2.1.确定缺失值范围2.2.填充缺失内容2.2.1.平均值填充法2.2.2.中
位数填充法2.2.3.条件平均值填充法2.2.4.模型预测填充法2.2.4.1.kNN2.2.4.2.Regression2.2.5.利用sklearn填补缺失值3.处理分类型特征:编码与哑变量4.处理连续型特征:二值化与
分段
1.归一化归一化
问题问题:在量纲不同的情况下,不能反映样本中每一个特征的重要程度。
方案方案:数据归一化,即标准化。把所有的数据都映射到同一个尺度(量纲)。
归一化可以提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。(一个特例是决策树,对决策树不需要归一化,决策树可以把任意数据都处理得很好。)
数据的无量纲化可以是线性的,也可以是非线性的。线性的无量纲化包括中心化中心化处理和缩放缩放处理。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位
置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
归一化之后的数据服从正态分布。
1.1.最值归一化最值归一化(normalization)
把所有数据映射到0-1之间。使用范围:特征的分布具有明显边界(分数0~100),受outlier的影响比较大。
import numpy as np
# 创建100个随机数
x = np.random.randint(0,100,size=100)
# 最值归一化(向量)
# 最值归一化公式,映射到0,1之间
(x - np.min(x)) / (np.max(x) - np.min(x))
# 最值归一化(矩阵)
# 0~100范围内的50*2的矩阵
X = np.random.randint(0,100,(50,2))
# 将矩阵改为浮点型
X = np.array(X, dtype=float)
# 最值归一化公式,对于每一个维度(列方向)进行归一化
# X[:,0]第一列,第一个特征
X[:,0] = (X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))
# X[:,1]第二列,第二个特征
X[:,1] = (X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))
# 如果有n个特征,可以写个循环:
for i in range(0,2):
X[:,i] = (X[:,i]-np.min(X[:,i])) / (np.max(X[:,i] - np.min(X[:,i])))
import matplotlib.pyplot as plt
# 简单绘制样本,看横纵坐标
plt.scatter(X[:,0],X[:,1])
plt.show()
1.2.均值方差归一化均值方差归一化(standardization)
把所有数据归一到均值为0方差为1的分布。适用于数据没有明显的边界,可能存在极端数据值的情况。
X2 = np.array(np.random.randint(0,100,(50,2)),dtype=float)
# 套用公式,对每一列做均值方差归一化
for i in range(0,2):
X2[:,i]=(X2[:,i]-np.mean(X2[:,i])) / np.std(X2[:,i])
plt.scatter(X2[:,0],X2[:,1])
plt.show()
print(np.mean(X2[:,0]))
print(np.std(X2[:,1]))
# 输出:6.217248937900877e-17
# 输出:1.0
1.3.Sklearn中的归一化中的归一化
对测试数据集进行归一化时,仍使用训练数据集仍使用训练数据集的均值train_mean和方差std_train,因此要保存训练数据集中的均值和方差。
原因:测试数据代表模拟的真实环境,而在真实环境中可能无法得到均值和方差。
import numpy as np
import pandas as pd