全文共3819字,預計學習時長18分鐘
圖源:unsplash
你一定曾遇到過這樣一個數據集,它具有多個特征,涵蓋了不同程度的數量級、範圍和單位。這會是一個巨大的阻礙,很少的機器學習算法對這些特征高度敏感。
其實類似的問題并不少見。例如,一個特征的單位是千克,另一個的單位是克,還有一個的單位是升。當它們所呈現的内容差異如此之大時,該如何使用這些特征呢?
該是特征縮放上場的時候了。這是數據預處理階段的關鍵部分,但很多初學者忽視了這一點,這會損害他們的機器學習模型。
特性縮放可以顯著提高某些機器學習算法的性能,而對其他算法則完全不起作用。這種怪事背後的原因可能是什麼?
另外,歸一化和标準化的區别是什麼?這是機器學習中最常用的兩種特征縮放技術,但它們不易理解。什麼時候應該使用哪種技術?
本文将解答你關于特征縮放的疑問,将在Python中實現特性縮放,讓你對它如何适用于不同的機器學習算法有一個實踐上的理解。
為什麼要使用特征縮放?
需要解決的第一個問題是,為什麼需要縮放數據集中的變量。一些機器學習算法對特征縮放敏感,而另一些則幾乎不變。
基于距離的算法
距離算法(例如KNN、K-means和SVM)受特征範圍的影響最大。這是因為在後台,算法使用數據點之間的距離來确定它們的相似性。
例如,假如有一些數據,其中包含高中學生的CGPA分數(從0到5)和他們的未來收入(以千盧比為單位):
由于這兩個特征具有不同的縮放程度,所以有可能給更高量級的特征更高的權重。這将影響機器學習算法的性能,顯然,我們不希望算法偏向于一個特征。
因此,我們在使用基于距離的算法之前對數據進行縮放,這樣所有的特征對結果的影響都是相等的。
當比較學生A和B的數據點之間的歐氏距離、B和C的數據點之間的歐氏距離,縮放前後的效果是明顯的,如下所示:
· 縮放前AB距離 =>
· 縮放前BC距離 =>
· 縮放後AB距離 =>
· 縮放後BC距離 =>
縮放将所有特征都帶入計算,并且現在的距離比縮放之前更具有可比性。
基于梯度下降的算法
使用梯度下降作為優化技術的機器學習算法(例如線性回歸、邏輯回歸、神經網絡等)要求對數據進行縮放。請看下面的梯度下降公式:
公式中特征值X的存在将影響梯度下降的步長。特征範圍的差異将導緻每個特征的步長不同。為确保梯度下降平穩地向最小值移動,并确保所有特征的梯度下降步驟均以相同的速率更新,我們在将數據輸入模型之前先對數據進行縮放。
具有相似縮放程度的特征可以幫助梯度下降更快地收斂到最小值。
基于樹的算法
另一方面,基于樹的算法對特征縮放非常不敏感。考慮一下,決策樹僅基于單個特征拆分節點。決策樹在特征上分割節點,從而增加了節點的同質性。特征上的拆分不受其他特征影響。
圖源:unsplash
因此,其餘特征對拆分幾乎沒有影響。這就是特征縮放不改變算法性能的原因!
什麼是歸一化?
歸一化是一種縮放技術,對值進行移位和重新縮放,以使它們最終在0到1之間變化。這也稱為“最小-最大”縮放。
這是歸一化的公式:
其中,Xmax和Xmin分别為特征的最大值和最小值。
· 當X的值是列中的最小值時,分子為0,因此X '為0
· 相反,當X的值是列中的最大值時,分子等于分母,因此X '的值是1
· 如果X的值在最小值和最大值之間,那麼X '的值在0和1之間
什麼是标準化?
标準化是另一種縮放技術,其中值以具有單位标準偏差的平均值為中心。這意味着特征的均值變為零,結果分布具有單位标準差。
這是标準化的公式:
μ為特征值的均值,σ為特征值的标準差。注意,在這種情況下,值并不局限于特定的範圍。
圖源:unsplash
現在,你腦海中最大的問題一定是什麼時候應該使用歸一化,什麼時候應該使用标準化?下面就來看看!
最大的問題——歸一化還是标準化?
歸一化與标準化是機器學習初學者的一個永恒的問題。
· 如果數據分布不遵循高斯分布,歸一化是很有用的。這在不假設數據分布的算法(如k近鄰和神經網絡)中很有用。
· 相反,如果數據服從高斯分布,标準化是有用的。然而,這并不一定對。另外,與歸一化不同,标準化沒有邊界範圍。因此,即使數據中有異常值,也不會受到标準化的影響。
然而,最終使用歸一化還是标準化将取決于問題和正在使用的機器學習算法。沒有硬性的規則來确定何時将數據歸一化或标準化。可以從将模型拟合為原始的、歸一化的和标準化的數據開始,并比較性能以獲得最佳結果。
好的做法是将縮放器與訓練數據進行拟合,然後利用縮放器對測試數據進行轉換。這将避免模型測試過程中的任何數據洩漏。此外,通常不需要調整目标值。
在Python中實現特征縮放
現在是有趣的部分,将學到的東西付諸實踐。采用DataHack平台的BigMart數據集,可将特征縮放應用于一些機器學習算法。
圖源:unsplash
跳過預處理步驟,因為它們超出了本教程的範圍。但是可以在這篇文章中找到預處理的詳細解釋。這些步驟将使你能夠在黑客馬拉松排行榜上排名前20位,因此值得一試!
因此,首先将數據分為訓練和測試集:
# spliting training and testing data
from sklearn.model_selection import train_test_split
X= df
y= target
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.2,random_state=27)
在轉到特征縮放部分之前,使用pd.describe()方法浏覽有關數據的詳細信息:
可以看到,特征的值範圍存在巨大差異:Item_Visibility,Item_Weight,Item_MRP和Outlet_ Establishmentment_Year。嘗試使用特征縮放來解決該問題!
注意:特征Item_Visibility中有負值,這是因為已采用對數轉換來處理特征中的偏斜度。
使用sklearn進行歸一化
為了歸一化數據,需要從sklearn庫導入MinMaxScalar并将其應用于數據集。所以,下面就開始吧!
# data normalization with sklearn
from sklearn.preprocessing importMinMaxScaler
# fitscaler on training data
norm=MinMaxScaler().fit(X_train)
#transform training data
X_train_norm= norm.transform(X_train)
#transform testing dataabs
X_test_norm= norm.transform(X_test)
請看歸一化如何影響數據集:
現在,所有特征的最小值均為0,最大值為1。完美!
接下來,嘗試對數據進行标準化。
使用sklearn進行标準化
為了對數據進行标準化,需要從sklearn庫中導入StandardScalar并将其應用于數據集。方法如下:
# data standardization with sklearn
from sklearn.preprocessing importStandardScaler
#numerical features
num_cols= ['Item_Weight','Item_Visibility','Item_MRP','Outlet_Establishment_Year']
# applystandardization on numerical features
for i in num_cols:
# fit on trainingdata
scale =StandardScaler().fit(X_train[[i]])
# transform thetraining data
X_train_stand[i] = scale.transform(X_train_stand[[i]])
# transform thetesting data
X_test_stand[i] = scale.transform(X_test_stand[[i]])
可以發現,隻對數字列應用了标準化,而沒有對其他的單一熱編碼(One-HotEncoded)特征應用标準化。标準化單一熱編碼特征意味着将類别特征重新分布。你不會想這麼做的!
但是為什麼在對數據進行歸一化時沒有做同樣的事情呢?因為單一熱編碼的特征已經在0到1之間了。所以,标準化不會影響它們的值。
好的,來看看标準化是如何改變數據的:
現在,特征的值以平均值為中心,具有單位标準偏差分布。太棒了!
比較未縮放、歸一化和标準化的數據
可視化數據以了解當前分布總是很不錯的。可以使用箱線圖來比較未縮放數據和已縮放數據。
你會注意到,特征縮放考慮到了方方面面。這些特征現在更具可比性,并且會對學習模型産生類似的影響。
将縮放應用于機器學習算法
是時候在數據上訓練一些機器學習算法,以比較不同縮放技術對算法性能的影響。特别注意縮放對三種算法的影響:K-近鄰、支持向量回歸和決策樹。
K-近鄰(KNN)
如前所述,KNN是一種基于距離的算法,受特征範圍的影響。來看看縮放前後數據對性能的影響:
# training a KNN model
from sklearn.neighbors importKNeighborsRegressor
# measuring RMSE score
from sklearn.metrics import mean_squared_error
# knn
knn=KNeighborsRegressor(n_neighbors=7)
rmse= []
# raw,normalized and standardized training and testing data
trainX= [X_train, X_train_norm, X_train_stand]
testX= [X_test, X_test_norm, X_test_stand]
# modelfitting and measuring RMSE
for i inrange(len(trainX)):
# fit
knn.fit(trainX[i],y_train)
# predict
pred = knn.predict(testX[i])
# RMSE
rmse.append(np.sqrt(mean_squared_error(y_test,pred)))
#visualizing the result
df_knn= pd.DataFrame({'RMSE':rmse},index=['Original','Normalized','Standardized'])
df_knn
可以看到,特征縮放降低了KNN模型的RMSE分數。具體來說,歸一化數據的性能比标準化數據稍好一些。
注意:之所以測量RMSE,因為這個比賽中評估RMSE。
圖源:unsplash
支持向量回歸(SVR)
SVR是另一種基于距離的算法。所以,來看看它是在歸一還是或标準化的情況下工作得更好:
# training an SVR model
from sklearn.svm importSVR
# measuring RMSE score
from sklearn.metrics import mean_squared_error
# SVR
svr=SVR(kernel='rbf',C=5)
rmse= []
# raw,normalized and standardized training and testing data
trainX= [X_train, X_train_norm, X_train_stand]
testX= [X_test, X_test_norm, X_test_stand]
# modelfitting and measuring RMSE
for i inrange(len(trainX)):
# fit
svr.fit(trainX[i],y_train)
# predict
pred = svr.predict(testX[i])
# RMSE
rmse.append(np.sqrt(mean_squared_error(y_test,pred)))
#visualizing the result
df_svr= pd.DataFrame({'RMSE':rmse},index=['Original','Normalized','Standardized'])
df_svr
可以看到特征縮放确實降低了RMSE的分數。标準化數據的表現優于歸一化數據。為什麼會這樣呢?
sklearn文檔表明,SVR使用RBF核,假設所有特征都以0為中心,方差相同。這是因為一個方差大于其他方差的特征會阻止評估器從這些特征中學習。
決策樹
已知特征縮放對于決策樹沒有影響。此處展示一個實例,展示決策樹是如何操作數據的:
# training a Decision Tree model
from sklearn.tree importDecisionTreeRegressor
# measuring RMSE score
from sklearn.metrics import mean_squared_error
#Decision tree
dt=DecisionTreeRegressor(max_depth=10,random_state=27)
rmse= []
# raw,normalized and standardized training and testing data
trainX= [X_train,X_train_norm,X_train_stand]
testX= [X_test,X_test_norm,X_test_stand]
# modelfitting and measuring RMSE
for i inrange(len(trainX)):
# fit
dt.fit(trainX[i],y_train)
# predict
pred = dt.predict(testX[i])
# RMSE
rmse.append(np.sqrt(mean_squared_error(y_test,pred)))
#visualizing the result
df_dt= pd.DataFrame({'RMSE':rmse},index=['Original','Normalized','Standardized'])
df_dt
可以看到,RMSE分數在特征縮放時并一點也沒變。因此,可以放心在數據上使用基于樹的算法!
圖源:unsplash
要記住的是,何時使用歸一化還是标準化永遠沒有标準答案。這完全取決于數據和使用的算法。接下來輪到你了,試試用其他算法進行特征縮放吧。
留言點贊關注
我們一起分享AI學習與發展的幹貨
如轉載,請後台留言,遵守轉載規範
,