您的位置:

了解minmaxscaler()函数

在机器学习中,数据预处理过程中尤为重要的是数据的归一化。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的影响,提高模型的运算速度和稳健性。同时我们也介绍了其他预处理技术的应用,比如标准化或正则化等,如何根据具体情况进行选择和使用,以便提高模型精度和稳定性。