在機器學習中,數據預處理過程中尤為重要的是數據的歸一化。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的影響,提高模型的運算速度和穩健性。同時我們也介紹了其他預處理技術的應用,比如標準化或正則化等,如何根據具體情況進行選擇和使用,以便提高模型精度和穩定性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/185549.html