在机器学习中,数据预处理过程中尤为重要的是数据的归一化。minmaxscaler()是其中一种实现方法,它将数据集中每个特征数据的值都缩放到同一范围内。在本文中,我们将从多个方面详细介绍这个函数。
一、减少特征值偏差的影响
在机器学习模型中,特征值如果存在不同的度量单位,则会造成较大的影响,这主要是因为特征值之间的偏差太大。比如一个模型可能在处理两个维度不同尺度的数据时,两个维度得到的重要度相差很大,而导致模型精度下降。这时就可以使用minmaxscaler()函数将数据集的特征值缩放到同一范围内,消除度量单位带来的影响。
首先看一下原始数据:
import numpy as np raw_data = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
使用minmaxscaler()函数进行数据转换:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() scaled_data = scaler.fit_transform(raw_data) scaled_data 输出:array([[0. , 0. , 0. ], [0.5 , 0.5 , 0.5 ], [1. , 1. , 1. ]])
可以看出,将数据缩放至0和1之间后,每个特征数据的度量单位变得相同了,能够减少特征值偏差的影响。
二、避免outlier对统计分析的影响
在实际生活中,存在很多极端情况,如极度异常的气温数据、收入数据等。这些异常值会对数据分析产生不良的影响,在分类模型中可能会导致误分类。在使用minmaxscaler()函数进行数据归一化时,消除了特征值之间的单位偏差,并将样本点映射到了同一区间,更容易处理或去除outlier,保证数据的稳健性。数据归一化操作能更好的提取信息,改变了部分离群点的数据特征,使很多算法能够更好地训练模型。
下面看一下具有outlier的数据进行归一化后的结果:
raw_data_outlier = np.array([ [1,2,3], [4,5,6], [7,8,9], [10,100,1000] ]) scaler.fit(raw_data_outlier) print("mean of raw data",np.mean(raw_data_outlier,axis=0)) # 原数据的特征均值 print("mean of scaled data",np.mean(scaler.transform(raw_data_outlier),axis=0)) # 归一化后的特征均值 输出:mean of raw data [ 5.5 28.75 252. ]mean of scaled data [0.375 0.29 0.218]
可以看出,在未做归一化前,特征100和1000会对特征1和2产生很大的影响,而进行归一化后,所有特征对目标的影响变得相近了。
三、使用minmaxscaler()实现模型的加速
在一些机器学习模型中,由于特征值之间的尺度存在很大差异,可能会在迭代过程中出现跟慢的现象,这时使用minmaxscaler()函数将数据缩放到同一区间后,在迭代过程中会减少模型的复杂度,进而加快模型的收敛速度。
下面看一下在一个简单的逻辑回归模型中使用PGD对比没有使用归一化前后的运算时间:
from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import time raw_data = load_iris().data X_train,X_test,y_train,y_test = train_test_split(raw_data,load_iris().target,test_size=0.3) model = LogisticRegression(solver='lbfgs') start_time = time.time() model.fit(X_train,y_train) print('Cost Time:',time.time()-start_time) print(accuracy_score(model.predict(X_test),y_test)) scaler = MinMaxScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) model = LogisticRegression(solver='lbfgs') start_time = time.time() model.fit(X_train_scaled,y_train) print('Cost Time:',time.time()-start_time) print(accuracy_score(model.predict(X_test_scaled),y_test))
运行结果如下:
Cost Time: 0.0029273033142089844 0.9777777777777777 Cost Time: 0.001756429672241211 0.9777777777777777
可以看出,使用minmaxscaler()函数将数据归一化之后,逻辑回归模型的运算时间减少了,加快了模型的运算速度。
四、结合其他预处理技术
minmaxscaler()函数并不是数据预处理中唯一的可行方法,我们也可以选择其他预处理技术,比如标准化或正则化。这些方法的选择应该根据数据的分布情况或分类模型的特点而定。
下面看一下在同样是对iris数据集进行预处理时标准化和归一化的结果:
from sklearn.preprocessing import StandardScaler standard_scaler = StandardScaler() scaled_data_standard = standard_scaler.fit_transform(raw_data) print('mean of standardization:',np.mean(scaled_data_standard,axis=0)) print('mean of scaling:',np.mean(scaled_data,axis=0)) print('std of standardization',np.std(scaled_data_standard,axis=0)) print('std of scaling',np.std(scaled_data,axis=0))
运行结果如下:
mean of standardization: [-4.73695157e-16 -7.81597009e-16 -4.26325641e-16 1.96418550e-16] mean of scaling: [0.41666667 0.45 0.52525253] std of standardization [1. 1. 1. 1.] std of scaling [0.30510256 0.31100118 0.17777896]
可以看出,在这组数据上标准化和归一化方法处理后,特征的均值均为0,标准差(std)也较小,而标准化后的数据集std均为1。
五、结论
本文主要介绍了minmaxscaler()函数在机器学习数据预处理中的应用,其主要作用是将数据集中每个特征数据的值都缩放到同一范围内,可以解决度量单位不同的问题,避免outlier的影响,提高模型的运算速度和稳健性。同时我们也介绍了其他预处理技术的应用,比如标准化或正则化等,如何根据具体情况进行选择和使用,以便提高模型精度和稳定性。