
本人开启人工智能学习之路,该系列文章意在记录逐步学习过程中的点点滴滴,将自己的学习之路分享给大家,希望与大家共同进步,有不足之处或改进建议,欢迎大家批评指正。
数据预处理
机器学习中数据预处理是非常重要的步骤,有好的数据作为基础才可以训练出精确度很高的机器学习模型,但在真实的世界,数据是不完美的,现实中的数据集往往存在各种各样的问题,所以才需要通过数据预处理,尽可能把原始数据转化为更合理的数据来训练机器学习模型。
环境准备
本章学习内容主要用到以下软件包:
- NumPy:通用的数组处理库,设计用于高效处理任意记录的大型多维数组而不牺牲小型多维数组的速度
- sklearn.preprocessing:常用的实用函数和变换器类,用于将原始特征向量转换为适合机器学习算法的表示形式
软件包安装:
# 安装numpy pip install numpy # 安装sklearn pip install scikit-learn |
使用的库安装完成后开始学习数据预处理技术。
本章节使用的类说明
类 |
功能 |
说明 |
Binarizer |
二值化 |
基于给定阈值,将定量特征按阈值划分 |
StandardScaler |
标准化(无量纲化) |
标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布 |
MinMaxScaler |
区间缩放(无量纲化) |
区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上 |
Normalizer |
归一化 |
基于特征矩阵的行,将样本向量转换为单位向量 |
特征二值化
先导入包并定义样本数据:
import numpy as np from sklearn import preprocessing input_data = np.array([[2.1, -1.9, 5.5], [-1.5, 2.4, 3.5], [0.5, -7.9, 5.6], [5.9, 2.3, -5.8]]) |
我们将上面的样本数据二值化,比如说用0.5作为阈值,所有高于0.5(阈值)的值将被转换为1,并且所有低于0.5的值将被转换为0。
可以通过sklearn.preprocessing的Binarizer类或者binarize方法实现:
# 通过Binarizer类实现,实例化之后调用transform方法 binarizer = preprocessing.Binarizer(threshold=0.5) print("Binarized data:\n", data_binarized) # 直接调用binarize方法 data_binarized2 = preprocessing.binarize(input_data, threshold=0.5) |
输出结果为:
Binarized data: [[1. 0. 1.] [0. 1. 1.] [0. 0. 1.] [1. 1. 0.]] binarize data: [[1. 0. 1.] [0. 1. 1.] [0. 0. 1.] [1. 1. 0.]] |
标准化
标准化是将样本的属性缩放到某个指定的范围。在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。
方差和标准差是测算离散趋势最重要、最常用的指标。方差是各变量值与其均值离差平方的平均数,它是测算数值型数据离散程度的最重要的方法。标准差为方差的算术平方根。
方差:

标准差:

标准化公式一般为:

其中mean是平均值,std是标准差。
可以通过sklearn.preprocessing的StandardScaler类或者scale方法实现:
# 通过StandardScaler类实现,实例化之后调用fit_transform方法 standardScaler = preprocessing.StandardScaler() # 直接调用scale方法 data_scaled = preprocessing.scale(input_data) print("data_scaled =", data_scaled) print("Mean =", data_scaled.mean(axis=0)) print("Std deviation =", data_scaled.std(axis = 0)) |
输出结果为:
data_scaled = [[ 0.12894603 -0.14880162 0.70300338] [-1.19735598 0.8749535 0.27694073] [-0.46052153 -1.57729713 0.72430651] [ 1.52893149 0.85114524 -1.70425062]] Mean = [1.11022302e-16 0.00000000e+00 0.00000000e+00] Std deviation = [1. 1. 1.] data_scaled2 = [[ 0.12894603 -0.14880162 0.70300338] [-1.19735598 0.8749535 0.27694073] [-0.46052153 -1.57729713 0.72430651] [ 1.52893149 0.85114524 -1.70425062]] Mean = [1.11022302e-16 0.00000000e+00 0.00000000e+00] Std deviation = [1. 1. 1.] |
缩放
在面对多维特征问题的时,有时特征数据数据值相差过大,如在运用多变量线性回归预测房价模型中,房屋面积和卧室个数这俩个特征之间数值相差大,而要保证这些特征都具有相近的尺度,就要进行特征缩放,这能帮助梯度下降算法更快地收敛。
直接求解的缺点:
- 当x1 特征对应权重会比x2 对应的权重小很多,降低模型可解释性
- 梯度下降时,最终解被某个特征所主导,会影响模型精度与收敛速度
- 正则化时会不平等看待特征的重要程度(尚未标准化就进行L1/L2正则化是错误的)
特征缩放的好处:
- 提升模型收敛速度
- 提高模型精度
线性缩放:x1=(x-min(x))/(max(x)-min(x))
最小最大缩放代码:
# 通过StandardScaler类实现,实例化之后调用fit_transform方法 minMaxScaler = preprocessing.MinMaxScaler(feature_range=(0, 1)) # 直接调用scale方法 data_scaler_minmax2 = preprocessing.minmax_scale(input_data, feature_range=(0, 1)) |
输出结果为:
Min max scaled data: [[0.48648649 0.58252427 0.99122807] [0. 1. 0.81578947] [0.27027027 0. 1. ] [1. 0.99029126 0. ]] Min max scaled data: [[0.48648649 0.58252427 0.99122807] [0. 1. 0.81578947] [0.27027027 0. 1. ] [1. 0.99029126 0. ]] |
归一化
规范化是指,将单个的样本特征向量变换成具有单位长度(unit norm)的特征向量的过程。当你要使用二次形式(quadratic from)如点积或核变换运算来度量任意一堆样本的相似性的时候,数据的规范化会非常的有用.
假定是基于向量空间模型,经常被用于文本分类和内容的聚类。
L1归一化:最小绝对偏差。绝对偏差为某一测量值与多次测量值的均值之差。这种归一化会修改这些值,使得绝对值的总和在每行中总是最多为 1。
L1归一化代码:
# 通过Normalizer类实现,实例化之后调用fit_transform方法 normalizer_l1 = preprocessing.Normalizer(norm='l1') # 直接调用normalize方法 data_normalized_l1 = preprocessing.normalize(input_data, norm='l1') |
输出结果为:
L1 normalized data: [[ 0.22105263 -0.2 0.57894737] [-0.2027027 0.32432432 0.47297297] [ 0.03571429 -0.56428571 0.4 ] [ 0.42142857 0.16428571 -0.41428571]] L1 Normalizer data: [[ 0.22105263 -0.2 0.57894737] [-0.2027027 0.32432432 0.47297297] [ 0.03571429 -0.56428571 0.4 ] [ 0.42142857 0.16428571 -0.41428571]] |
L2归一化:最小二乘法。这种归正常化修改了这些值,以便每一行中的平方和总是最多为 1。最小二乘法形式如下:
观测值就是我们的多组样本,理论值就是我们的假设拟合函数。目标函数也就是在机器学习中常说的损失函数,我们的目标是得到使目标函数最小化时候的拟合函数的模型。
L2归一化代码:
# 通过Normalizer类实现,实例化之后调用fit_transform方法 normalizer_l2 = preprocessing.Normalizer(norm='l2') # 直接调用normalize方法 data_normalized_l2 = preprocessing.normalize(input_data, norm='l2') |
输出结果为:
L2 Normalizer data: [[ 0.33946114 -0.30713151 0.88906489] [-0.33325106 0.53320169 0.7775858 ] [ 0.05156558 -0.81473612 0.57753446] [ 0.68706914 0.26784051 -0.6754239 ]] L2 normalized data: [[ 0.33946114 -0.30713151 0.88906489] [-0.33325106 0.53320169 0.7775858 ] [ 0.05156558 -0.81473612 0.57753446] [ 0.68706914 0.26784051 -0.6754239 ]] |
情趣用品,延时产品,各种都有,添加 微信:yztt15 备注:情趣!
如若转载,请注明出处:https://www.i1026.com/14735.html