1.数据处理的重要性
对于机器学习,选择一个好的算法是非常有用的,另外对测试集和训练集的数据进行处理也是非常重要的。通常情况下是为了消除量纲的影响。譬如一个百分制的变量与一个5分值的变量在一起怎么比较?只有通过数据标准化,都把它们标准到同一个标准时才具有可比性,一般标准化采用的是Z标准化,即均值为0,方差为1。当然也有其他标准化,比如0——1标准化等,可根据自己的数据分布情况和模型来选择。
那什么情况下需要对数据进行处理呢?主要看模型是否具有伸缩不变性。不是所有的模型都一定需要标准化,有些模型对量纲不同的数据比较敏感,比如SVM等。当各个维度进行不均匀伸缩后,最优解与原来不等价,这样的模型,除非原始数据的分布范围本来就不叫接近,否则必须进行标准化,以免模型参数被分布范围较大或较小的数据主导。但是如果模型在各个维度进行不均匀伸缩后,最优解与原来等价,例如logistic regression等,对于这样的模型,是否标准化理论上不会改变最优解。但是,由于实际求解往往使用迭代算法,如果目标函数的形状太“扁”,迭代算法可能收敛得很慢甚至不收敛。所以对于具有伸缩不变性的模型,最好也进行数据标准化。
标准化分为:Rescaling、Normalizing和Standardizing,如下表所示:
名称 |
中文名 |
解释 |
Rescaling |
重缩放/归一化 |
通常是指增加或者减少一个常数,然后乘以/除以一个常数,来改变数据的衡量单位。例如:将温度的衡量单位从摄氏度转化为华氏温度。 |
Normalizing |
正则化 |
通常是指除以向量的范数。例如:将一个向量的欧氏长度等价于1。在神经网络中,"正则化"通常是指将向量的范围重缩放至最小化或者一定范围,使所有的元素都在[0,1]范围内。通常用于文本分类或者文本聚类中。 |
Standardizing |
标准化 |
通常是为了消除不同属性或样方间的不齐性,使同一样方内的不同属性间或同一属性在不同样方内的方差减小。例如:如果一个向量包含高斯分布的随机值,你可能会通过除以标准偏差来减少均值,然后获得零均值单位方差的"标准正态"随机变量。 |
一般来说,提供以下方法来做标准化:
- StandardScaler:计算训练集的平均值和标准差,以便测试数据集使用相同的变换。
提供以下方法来做归一化(将数据特征缩放至某一范围(scalingfeatures to a range)):
- MinMaxScaler:将数据缩放至给定的最小值与最大值之间,通常是0与1之间。
- MaxAbsScale:将最大的绝对值缩放至单位大小(数据集的标准差非常非常小,有时数据中有很多很多零(稀疏数据)需要保存住0元素)。
- 中方法实现
from sklearn.datasets import make_blobs # 导入画图工具 import matplotlib.pyplot as plt # 导入数据划分模块、分为训练集和测试集 from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler def my_preprocessing (): # 产生40个新样本,分成2类,随机生成器的种子为8, 标准差为2 X,y =make_blobs(n_samples=40,centers=2, random_state=5,cluster_std=2) #将数据集用散点图方式进行可视化分析 plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.cool) plt.show()
上面未做处理, x区间:(-12,0),y区间:(5,13)。现在我们使用StandardScaler进行处理。
#使用StandardScaler进行处理 x_1 =StandardScaler().fit_transform(X) plt.scatter(x_1[:,0],x_1[:,1],c=y,cmap=plt.cm.cool) plt.title("StandardScaler") plt.show()
处理后x区间:(-3,3),y轴:(-2,3)。StandardScaler原理:将所有数据转换为均值为0,方差为1的状态。
2.2MinMaxScaler
from sklearn.preprocessing import MinMaxScaler x_2 = MinMaxScaler().fit_transform(X) plt.scatter(x_2[:,0],x_2[:,1],c=y,cmap=plt.cm.cool) plt.title("MinMaxScaler") plt.show()
x区间:(0,1),y轴:(0,1),MinMaxScaler原理:将所有数据压缩到长宽都是1的方块中去。
X_std = (X -X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) ;
X_scaler =X_std/ (max - min) + min
2.3RobustScaler
from sklearn.preprocessing import RobustScaler x_3 =RobustScaler().fit_transform(X) plt.scatter(x_3[:,0],x_3[:,1],c=y,cmap=plt.cm.cool) plt.title("RobustScale") plt.show()
x区间:(-3,2),y轴:(-1,2.0)。如果数据有离群点,对数据进行均差和方差的标准化效果并不好。这种情况可以使用RobustScaler 作为替代。它们有对数据中心化和数据的缩放鲁棒性更强的参数。
2.4Normalizer
from sklearn.preprocessing import Normalizer x_4 =Normalizer().fit_transform(X) plt.scatter(x_4[:,0],x_4[:,1],c=y,cmap=plt.cm.cool) plt.title("Normalizer") plt.show()
x区间:(-0.9,-0.1),y轴:(-0.5,1.0)。Normalizer原理:把特征向量变成一个半径为1的圆或球(保留特征向量忽略数值)。
2.5 MaxAbsScaler、QuantileTransformer、Binarizer
from sklearn.preprocessing import MaxAbsScaler from sklearn.preprocessing import QuantileTransformer from sklearn.preprocessing import Binarizer x_5 =MaxAbsScaler().fit_transform(X) plt.scatter(x_5[:,0],x_5[:,1],c=y,cmap=plt.cm.cool) plt.title("MaxAbsScaler") plt.show() x_6 =QuantileTransformer().fit_transform(X) plt.scatter(x_6[:,0],x_6[:,1],c=y,cmap=plt.cm.cool) plt.title("QuantileTransformer") plt.show() x_7 =Binarizer().fit_transform(X) plt.scatter(x_7[:,0],x_7[:,1],c=y,cmap=plt.cm.cool) plt.title("Binarizer") plt.show()
3.数据处理函数介绍
3.1fit()、transform()、fit_transform()与fit_transform(trainData)区别
函数 |
意义 |
fit() |
求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。 |
transform() |
在fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。 |
fit_transform() |
fit_transform是fit和transform的组合,既包括了训练又包含了转换。 |
fit_transform(trainData) |
对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。 |
3.2 sklearn.preprocessing.StandardScaler
含义:标准化缩放
格式:
sklearn.preprocessing.StandardScaler(copy=True,with_mean=True, with_std=True)
参数 |
解释 |
copy |
如果为false,就会用归一化的值替代原来的值;如果被标准化的数据不是np.array或scipy.sparse CSR matrix, 原来的数据还是被copy而不是被替代 |
with_std |
boolean类型,默认为True,表示将数据方差规范到1 |
with_mean |
boolean类型,默认为True,表示将数据均值规范到0 |
这里是用于做标准化,将数据的方差规范到1,均值规范到0,实际上就是标准正态分布的方差和均值。
方差:
均值:平均数
3.3 sklearn.preprocessing.MinMaxScaler
含义:最小最大值标准化
格式:
sklearn.preprocessing.MinMaxScaler(feature_range=(0,1), copy=True)
参数 |
解释 |
feature_range |
为元组类型,范围某认为:[0,1],也可以取其他范围值。 |
copy |
为拷贝属性,默认为True,表示对原数据组拷贝操作,这样变换后元数组不变,False表示变换操作后,原数组也跟随变化,相当于c++中的引用或指针。 |
3.4 sklearn.preprocessing.RobustScaler
含义:使用对异常值鲁棒的统计信息来缩放特征。这个标量去除中值,并根据分位数范围(默认为IQR即四分位数范围)对数据进行缩放。IQR是第1个四分位数(第25分位数)和第3个四分位数(第75分位数)之间的范围。
格式:
sklearn.preprocessing.RobustScaler(with_centering,with_scaling,copy=True)
参数 |
解释 |
with_centering |
boolean类型,默认为True。如果为真,在缩放前将数据居中。这将导致“转换”在尝试处理稀疏矩阵时引发异常,因为围绕它们需要构建一个密集的矩阵,在常见的用例中,这个矩阵可能太大而无法装入内存。 |
with_scaling |
boolean类型,默认为True。如果为真,将数据缩放到四分位范围。quantile_range:元组(q_min, q_max), 0.0 < q_min < q_max < 100.0。默认:(25.0,75.0)=(第1分位数,第3分位数)= IQR。用于计算' ' scale_ ' '的分位数范围。 |
copy |
boolean类型,可选,默认为真。如果为False,则尽量避免复制,而改为就地缩放。这并不能保证总是有效的;例如,如果数据不是一个NumPy数组或scipy。稀疏CSR矩阵,仍可返回副本。 |
属性 |
解释 |
center_ |
浮点数数组。训练集中每个特征的中值。 |
scale_ |
浮点数数组。训练集中每个特征的(缩放的)四分位范围。 |
3.5 sklearn.preprocessing.Normalizer
含义:该函数归一化输入数组使它的范数或者数值范围在一定的范围内。
格式:
sklearn.preprocessing.Normalize(InputArraysrc,OutputArray dst, double alpha=1, doublebeta=0, int norm_type=NORM_L2, intdtype=-1, InputArray mask=noArray() )
参数 |
解释 |
|
src |
输入数组 |
|
dst |
输出数组,支持原地运算 |
|
alpha |
range normalization模式的最小值 |
|
beta |
range normalization模式的最大值,不用于norm normalization(范数归一化)模式。 |
|
normType |
归一化的类型,可以有以下的取值: |
|
NORM_MINMAX |
数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。 |
|
NORM_INF |
此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值) |
|
NORM_L1 |
归一化数组的L1-范数(绝对值的和) |
|
NORM_L2 |
归一化数组的(欧几里德)L2-范数 |
|
dtype |
dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype). |
|
mask |
操作掩码,用于指示函数是否仅仅对指定的元素进行操作。 |
3.6 sklearn.preprocessing.MaxAbsScaler
含义:该函数为绝对值最大标准化
格式:
sklearn.preprocessing.Normalize(feature_range,copy )
参数 |
解释 |
feature_range |
tuple (min, max),默认值=(0,1),所需的转换数据范围。 |
copy |
布尔值,可选,默认为真,设置为False执行插入行规范化并避免复制(如果输入已经是numpy数组)。 |
属性 |
解释 |
min_ |
ndarray, shape (n_features,),每个功能调整为最小。 |
scale_ |
ndarray, shape (n_features,) ,每个特征数据的相对缩放。 |
data_min_ |
ndarray, shape (n_features,) ,每个特征在数据中出现的最小值 |
data_max_ |
ndarray, shape (n_features,) ,每个特征在数据中出现的最大值 |
data_range_ |
ndarray, shape (n_features,) ,在数据中看到的每个特性范围 (data_max_ - data_min_) |
3.7 sklearn.preprocessing.QuantileTransformer
格式:
sklearn.preprocessing.QuantileTransformer(*,n_quantiles=1000, output_distribution='uniform', ignore_implicit_zeros=False,subsample=100000, random_state=None, copy=True)
参数 |
解释 |
n_quantiles |
int,默认值=1000或n_samplesNumber要计算的分位数。它对应于用于离散累积分布函数的地标数。如果n_quantiles数大于样本数,则n_quantiles分位数被设置为样本数,因为较大的分位数不能给出累积分布函数估计的更好近似。 |
output_distribution |
{'uniform', 'normal'}, 默认='uniform'转换数据的边界分布。选项为'uniform'或'normal'。 |
ignore_implicit_zeros |
布尔值, 默认=False,仅适用于稀疏矩阵。如果为True,则丢弃矩阵的稀疏项以计算分位数统计。如果为False,这些条目将被视为零。 |
subsample |
int,默认=1e5,用于估计分位数以提高计算效率的最大样本数。注意,对于值相同的稀疏矩阵和密集矩阵,子采样过程可能不同。 |
random_state |
int, RandomState instance或None,default=None确定子采样和平滑噪波的随机数生成。更多细节请参见子样本。在多个函数调用之间传递int以获得可再现的结果。 |
copy |
布尔值,默认=True,设置为False以执行就地转换并避免复制(如果输入已经是numpy数组)。 |
属性 |
解释 |
n_quantiles_ |
Int 用于离散累积分布函数的实际分位数。 |
quantiles_ |
ndarray of shape (n_quantiles, n_features),与参考分位数相对应的值。 |
references_ |
ndarray of shape (n_quantiles, )参考分位数 |
3.8 sklearn.preprocessing.Binarizer
格式:
sklearn.preprocessing.Binarizer(threshold,copy)
参数 |
解释 |
threshold |
浮点数,可选。小于或等于阈值的值映射到0,否则映射到1。 |
copy |
布尔值,如果设置为False,则会避免复制。默认情况下为True。 |
4. 数据处理的重要性
下面我们来看一下数据处理的重要性。
from sklearn.neural_network import MLPClassifier from sklearn import datasets def sklearn_for_Nerver(): wine =datasets.load_wine() X_train,X_test,y_train,y_test= train_test_split(wine.data,wine.target,random_state=62) mlp =MLPClassifier(hidden_layer_sizes=[100],max_iter=4000,random_state=62) mlp.fit(X_train,y_train) print("改造前训练模型得分{:.2%}".format(mlp.score(X_train,y_train))) print("改造前测试模型得分{:.2%}".format(mlp.score(X_test,y_test))) scaler = MinMaxScaler() scaler.fit(X_train) X_train_pp =scaler.transform(X_train) X_test_pp =scaler.transform(X_test) mlp.fit(X_train_pp,y_train) print("改造后训练模型得分{:.2%}".format(mlp.score(X_train_pp,y_train))) print("改造后测试模型得分{:.2%}".format(mlp.score(X_test_pp,y_test)))
输出
改造前训练模型得分62.41% 改造前测试模型得分48.89% 改造后训练模型得分100.00% 改造后测试模型得分100.00%
大家可以看到改造以后的模型得分得到了显著的上升。
—————————————————————————————————
软件安全测试
https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486
接口自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486
DevOps 和Jenkins之DevOps
https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486
DevOps与Jenkins 2.0之Jenkins
https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486
Selenium自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486
性能测试第1季:性能测试基础知识
https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486
性能测试第2季:LoadRunner12使用
https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486
性能测试第3季:JMeter工具使用
https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486
性能测试第4季:监控与调优
https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486
Django入门
https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486
啄木鸟顾老师漫谈软件测试
https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486