大数据预处理
手动反爬虫,禁止转载: 原博地址 https://blog.csdn.net/lys_828/article/details/119902718(CSDN博主:Be_melting)
知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息
0 前言
在进行数据分析项目案例之前,需要了解数据的情况,有时候拿到的数据并不是想象中的完美数据,那么就需要进行预处理后才能使用。为了系统的缕清预处理的一般的步骤,这里进行详细的梳理,采用sklearn工具包和手写代码验证的方式进行。
1 数据标准化
1.1 标准化定义
标准化的定义:又被称为均值移除(mean removal),对不同样本的同一特征值进行处理,最终均值为0,标准差为1,采用此种方式我们只需要使用如下公式即可。
x
s
c
a
l
e
d
=
x
−
m
e
a
n
s
d
⇒
z
=
X
−
μ
σ
x_{scaled} = \frac{x-mean}{sd} \Rightarrow z = \frac{X-\mu}{\sigma}
xscaled=sdx−mean⇒z=σX−μ
- m e a n : mean: mean:数据均值
- s d : sd: sd:数据标准差
1.2 为什么要进行数据标准化?
在机器学习中,很多的算法和评估模型的好坏的方法都是基于距离(残差)的处理,也就是
(
x
i
−
x
)
2
(x_{i} -x)^2
(xi−x)2或者是
(
y
i
−
y
)
2
(y_{i} -y)^2
(yi−y)2,因此在进行数据随机采样的时候应该避免不同距离对模型影响,故需要进行标准化处理,保准随机取的数据是等距离的。说人话,借用图像举例,就是要把不同的椭圆,最后处理成为正圆,这样在圆上取任意值到原点的距离都相等。
1.3 实例操作
import numpy as np
from sklearn import preprocessing
data = np.array([[3, -1.5, 2, -5.4], [0, 4, -0.3, 2.1], [1, 3.3, -1.9, -4.3]])
data
输出结果为:(数据随机设定的,方便后面进行手动验证)
按照标准化的公式,要先计算均值和方差,那么有个问题就来了:计算的数据是横向(一行数据,axis = 1),还是纵向(一列数据,axis = 0)的呢?每一列(纵向)都代表着一个字段的数据,而每一行却包含了所有字段中的一个数据,而在计算均值和方差时候应该选取的是某个字段进行,也就是需要计算纵向的数据
print('均值: ',data.mean(axis = 0))
print('标准差: ', data.std(axis = 0))
输出结果为:
接下来就可以进行手动验证
import math
math.sqrt(((3-1.33333333)**2+(0-1.33333333)**2+(1-1.33333333)**2)/3)
输出结果为:1.247219128924647(这里只进行第一列的标准差的验证,其余列也是一样的,均值可以口算)
最终标准化后的结果为:(以第一列第一行的数据进行展示)
以上的过程虽然原理很简单,操作起来也不是很难,但是要是每次进行数据处理之前都得一个数据一个数据的挨个处理,就显着很浪费时间,因此就可以使用preprocessing
函数进行处理
核心代码:preprocessing.scale()
data_standarized = preprocessing.scale(data)
print('均值: ',data_standarized.mean(axis = 0))
print('标准差: ', data_standarized.std(axis = 0))
data_standarized
输出的结果为:(一行代码搞定标准化。由于python计算精度的问题,均值这里实际上是为0的,10的负17次方,相当于很微小的数值了)
2 数据缩放化
2.1 0-1缩放
对不同样本的同一特征值,减去其最小值,除以(最大值-最小值), 最终原最大值为1,原最小值为0,这样在数据分析时可以有效的消除不同单位大小对最终结构的权重影响。(例如股票类信息,如果股价是5-7元之间浮动,但是每天成交量在100万上下,在不采用缩放的模式下,成交量的数据权重会比股价高上几万倍,导致最终预测数据出现畸形)
x
s
c
a
l
e
d
=
x
−
x
m
i
n
x
m
a
x
−
x
m
i
n
x_{scaled}=\frac{x-x_{min}}{x_{max}-x_{min}}
xscaled=xmax−xminx−xmin
2.2 实例操作
如果直接使用numpy进行操作,依据计算的公式求解如下
除了手动计算外,也可以直接调用sklearn中的模块,也是在preprocessing
函数中,使用MinMaxScaler
方法
核心代码:preprocessing.MinMaxScaler()
data_scaler = preprocessing.MinMaxScaler(feature_range = (0,2))
data_scaled = data_scaler.fit_transform(data)
data_scaled
输出结果为:(MinMaxScaler
括号里可以进行参数的调整,根据自己的需求进行设置,比如将区间缩放至0-2,得到的结果就是刚刚利用numpy求解的2倍)
3 数据归一化
3.1 数据归一化定义
如果要调整特征向量中的值时,可以使用数据归一化,以便可以使用通用比例尺对其进行测量。机器学习中最常用的规范化形式之一是调整特征向量的值,使其总和为1(方便查找重要特征)。常见的处理方式有如下几种:L1模式, L2模式。
L1模式:理解就是加了绝对值的,也是常见的一种模式,还有其他很多的名字称呼,比如熟悉的曼哈顿距离,最小最对误差等。使用L1模式可以度量两个向量间的差异,如绝对误差和(Sum of Absolute Difference)
L
1
:
z
=
∣
∣
x
∣
∣
1
=
∑
i
n
∣
x
i
∣
L1: \space \space \space \space z = ||x||_{1} = \sum_{i}^{n}|x_{i}|
L1: z=∣∣x∣∣1=i∑n∣xi∣
L2模式:理解就是加了平方的,是最常见最常用的一种模式,也有其他的称呼,比如使用最多的欧氏距离就是L2模式。通常用来做优化目标函数的正则化项,放置模型为了迎合训练集而过于复杂造成的过拟合情况,从而提高模型的泛化能力(可以参考一下逻辑回归进行信用卡欺诈预测案例中,如果惩罚项参数选择L2,结果会如何)
L
2
:
z
=
∣
∣
x
∣
∣
2
=
∑
i
n
x
i
2
L2: \space \space \space \space z =||x||_{2} = \sqrt{\sum_{i}^{n}x_{i}^{2}}
L2: z=∣∣x∣∣2=i∑nxi2
3.2 实例操作
核心代码:preprocessing.normalize()
L1 模式
data_normalized = preprocessing.normalize(data,'l1',axis = 0)
print(data_normalized)
data_norm_abs = np.abs(data_normalized)
print(data_norm_abs.sum(axis=0))
输出的结果为:(可以看出每一列转化后的数据相加都为1)
L2模式
data_normalized = preprocessing.normalize(data,'l2',axis = 0)
print(data_normalized)
#0.31622777*3 = 0.9486833...
(data_normalized*data_normalized).sum(axis = 0)
输出的结果为:(每一列转化后的数据按照公式计算也都为1,比例保持不变)
4 二值化
4.1 二值化定义
当我们要将数字特征向量转换为布尔向量时,可以使用二值化(就是根据自己指定的阈值,如果超过这个阈值就为1,小于这个阈值就为0)。在数字图像处理领域,图像二值化是将彩色或灰度图像转换为二进制图像(即仅具有两种颜色(通常是黑白)的图像)的过程。
此技术用于识别对象,形状,尤其是字符。通过二值化,可以将感兴趣的对象与发现对象的背景区分开,比如常见的人物黑白画像。
4.2 实际操作
核心代码:preprocessing.Binarizer()
data_binarized = preprocessing.Binarizer(threshold = 1.4).transform(data)
print(data_binarized)
print(data)
输出的结果为:(可以设置阈值,大于该值的数据都为1,不大于的都为0,最后的数据有0和1)
5 独热编码
5.1 独热编码定义
在很多的计算模型中都是只能进行数值的处理,但是数据中经常会遇到各种 分类数据 的情况,因此就需要将分类数据进行数值编码。独热编码就是将分类数据转化为0-1编码的,独热编码器可以将一键编码视为一种可以强化特征向量的工具。基于该方案对特征向量中的每个特征进行编码。这有助于我们提高空间效率。编码过程如下
关于独热的理解:经过编码后,一行数据中,只有一个数据是1,其余的都是0,对比红路灯,在一个时刻,该指示灯只能显示一种颜色
5.2 实例操作
核心代码:preprocessing.OneHotEncoder()
给出举例数据
data = np.array([[1, 1, 2], [0, 2, 3], [1, 0, 1], [0, 1, 0]])
print(data)
输出的结果为:(数据共四行三列,假设这三列的名称分别为ABC,可以发现A中共有两个特征0和1,B中有三个特征,C中有四个特征)
那么接下来进行独热编码,根据上面的设定,经过独热编码后的结果应该有9个特征,前两个对应A字段,中间三个对应B字段,最后四个对应C字段
encoder = preprocessing.OneHotEncoder()
encoder.fit(data)
encoder_vector = encoder.transform([[0,0,0]]).toarray()
print(encoder_vector)
encoder_vector = encoder.transform([[1,0,3]]).toarray()
print(encoder_vector)
输出结果为:(这里以[[0,0,0]]举例,A中两个特征,0在前面第一个位置,B中三个特征,0在第一个位置,C中三个特征,0也在第一个位置。对比这种位置关系[[1,0,3]]独热编码后就不难理解了)
如果数字觉得不好理解的话,那这里进行张三李四带入
data = np.array([['张三', '张三', '李四'], ['王五', '李四', '赵六'], ['张三', '王五', '张三'], ['王五','张三', '王五']])
print(data)
encoder = preprocessing.OneHotEncoder()
encoder.fit(data)
encoder_vector = encoder.transform([['张三','张三','张三']]).toarray()
print(encoder_vector)
输出结果为:(这里就和上面是一个原理,只不过采用中文文本数据进行展示,方便理解)
6、标签编码
6.1 标签编码定义
除了进行独热编码外,分类变量可以进行标签编码,就是不光只有0和1,还可以有其它的数值。标签编码常见的称呼就是给数据“贴标签”和找标签对应的数据,也可以手动操作
6.2 实例操作
核心代码:preprocessing.LabelEncoder()
input_classes = ['audi', 'ford', 'audi', 'toyota', 'ford', 'bmw']
label_encoder = preprocessing.LabelEncoder()
label_encoder.fit(input_classes)
for i, item in enumerate(label_encoder.classes_):
print(item, "-->", i)
输出结果为:(回顾基础部分讲解for
循环时讲到的for-enumerate
的配合使用,可以直接输出对应的标签信息和标签值)
经过fit
训练之后的标签信息,就可以对部分数据甚至全部的数据的标签信息甚至逆标签信息查询,比如指定原列表中的部分数据,就可以直接获得对应数据的编码
同时也可以逆标签信息查询,指定经过编码后的数值,输出对应的标签信息
7 缺失值处理
7.1 处理方式
最常见的数据情况就是缺失部分数据,那么怎么处理缺失值?有没有固定的公式呢?处理方式如下:
-
删除:缺失样本量 非常大,删除整个字段;如果缺失量较少,且 难以填充 则删除缺失样本
-
填充:缺失量 小于10%,根据缺失变量的数据分布采取 均值(正态分布) 或 中位数(偏态分布) 进行填充
-
模拟或预测缺失样本:根据样本的数据分布,生成 随机值填充(插值);使用与缺失相比相关性非常高的特征,建立模型,预测缺失值
在第二章已经详细介绍了使用pandas对缺失值进行处理,接下来介绍sklearn中如何对大数据样本进行缺失值处理
7.2 实例操作
采用sklearn模块中的SimpleImputer
函数进行处理,使用的步骤共四步
- (1)从模块中导入函数
- (2)设定填充的对象和填充的方式
- (3)选取数据
- (4)处理数据
读取测试数据,其中Age
和Salary
字段有缺失值
提取对应字段,可以使用列的方式进行提取,也可以使用坐标的方式进行提取
#采用坐标的方式进行提取
X = dataset.iloc[:, :-1].values
Y = dataset.iloc[:, -1].values
输出结果如下:(一般会把所有的特征字段提取后赋值为X
,标签字段提取后赋值为Y
)
严格按照sklearn处理缺失值的步骤进行,代码如下
#导入处理模块
from sklearn.impute import SimpleImputer
#设定要处理的对象和处理规则
imputer=SimpleImputer(missing_values=np.nan,strategy='mean')
#选取数据fit训练
imputer= imputer.fit(X[:,1:3])
#处理数据
X[:,1:3]=imputer.transform(X[:,1:3])
输出结果如下:
最后补充关于可以设定的规则,通过调用说明文档,可以发现能够使用的类型如下:(平均值,中位数,众数和常量)
至此关于大数据预处理的部分就介绍完毕,撒花✿✿ヽ(°▽°)ノ✿