【机器学习】sklearn实现---归类为5大类
sklearn實現(xiàn)---歸類為5大類
- sklearn.preprocessing.scale()(最常用,易受異常值影響)
- sklearn.preprocessing.StandardScaler()
- sklearn.preprocessing.minmax_scale()(一般縮放到[0,1]之間,若新數(shù)據(jù)集最大最小值范圍有變,需重新minmax_scale)
- sklearn.preprocessing.MinMaxScaler()
- sklearn.preprocessing.maxabs_scale()(為稀疏數(shù)據(jù)而生)
- sklearn.preprocessing.MaxAbsScaler()
- sklearn.preprocessing.robust_scale()(為異常值而生)
- sklearn.preprocessing.RobustScaler()
- sklearn.preprocessing.normalize()(文本分類or聚類時常用,默認(rèn)對樣本正則化,上述4種默認(rèn)對列,即特征來規(guī)范化)
- sklearn.preprocessing.preprocessing.Normalizer()
借用iris數(shù)據(jù)集
import pandas as pd import numpy as np from sklearn import datasets iris = datasets.load_iris() x, y = iris.data, iris.target print(x[:10]) [[ 5.1 3.5 1.4 0.2][ 4.9 3. 1.4 0.2][ 4.7 3.2 1.3 0.2][ 4.6 3.1 1.5 0.2][ 5. 3.6 1.4 0.2][ 5.4 3.9 1.7 0.4][ 4.6 3.4 1.4 0.3][ 5. 3.4 1.5 0.2][ 4.4 2.9 1.4 0.2][ 4.9 3.1 1.5 0.1]] print(x.shape,x.max(),x.min()) (150, 4) 7.9 0.1官網(wǎng)對不同方法的比較文檔:
https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py
一.z-score 標(biāo)準(zhǔn)化(zero-mean normalization)
也叫標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化。先減去均值,后除以均方根。提高了數(shù)據(jù)可比性,同時削弱了數(shù)據(jù)解釋性,是用的最多的數(shù)據(jù)的標(biāo)準(zhǔn)化方法。輸出:每個屬性值均值為0,方差為1,呈正態(tài)分布。
公式如下:
x* = (x-μ)/σ
( 其中μ為所有樣本數(shù)據(jù)的均值,σ為所有樣本數(shù)據(jù)的標(biāo)準(zhǔn)差。)
使用原因:
部分機(jī)器學(xué)習(xí)算法求解目標(biāo)函數(shù)時,要求特征的均值為0,方差為1.(如:SVM的RFB內(nèi)核、線性模型的L1和L2正則化)此時,如果某個特征的方差比其他特征的方差大幾個數(shù)量級別,如:3000:2等,會造成方差大的特征在算法中占據(jù)主導(dǎo)地位,使得機(jī)器學(xué)習(xí)效果不佳。
缺點:
- 當(dāng)特征明顯不遵從高斯正態(tài)分布時,標(biāo)準(zhǔn)化出來的效果較差。
- 還要注意,均值和標(biāo)準(zhǔn)差受離群點的影響很大,所以如果有很多異常值,使用RobustScaler或robust_scaler 的效果更好。
- scale和 StandardScaler都能接受 scipy.sparse 作為輸入,但參數(shù)必須設(shè)置: with_mean=False。Or會報錯: ValueError ,因為默認(rèn)的中心化會破壞稀疏性,并且此時內(nèi)存一般會炸,然后崩潰------>dead。
- 實際應(yīng)用中,經(jīng)常忽略特征數(shù)據(jù)的分布形狀,移除每個特征均值,劃分離散特征的標(biāo)準(zhǔn)差,從而等級化,進(jìn)而實現(xiàn)數(shù)據(jù)中心化。
實現(xiàn):
- sklearn.preprocessing.scale
- sklearn.preprocessing.StandardScaler(兩個基本一樣,但一般用這個就ok了,比較高級、方法比較齊全)
1.1 sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)
參數(shù)說明:
axis=0,默認(rèn)。計算列。axis=1,則會按行進(jìn)行標(biāo)準(zhǔn)化。
with_mean、with_std,默認(rèn)為True,設(shè)置將數(shù)據(jù)轉(zhuǎn)化成0均值、方差為1的標(biāo)準(zhǔn)正態(tài)分布,基本不用管。
1.2 class sklearn.preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)
from sklearn.preprocessing import StandardScaler Stan_scaler = StandardScaler() Stan_scaler.fit(x) x_test = np.array([[6,4,6,2],[4.999,3,5,2.3]]) #假設(shè)新的數(shù)據(jù)集,可當(dāng)作我們平時用到的測試集 Stan_scaler.transform(x_test) array([[ 0.18982966, 2.18907205, 1.27454998, 1.05353673],[-1.02306072, -0.1249576 , 0.70589294, 1.44795564]])transform時,用到的是原先x中的均值與標(biāo)準(zhǔn)差,相當(dāng)于我們平時的訓(xùn)練集例的均值與標(biāo)準(zhǔn)差,然后用這兩個值去標(biāo)準(zhǔn)化測試集的數(shù)據(jù)。
二.最小最大值標(biāo)準(zhǔn)化(將數(shù)據(jù)縮放到一定范圍內(nèi))
公式如下:
x* = (x-min)/(max-min) (當(dāng)使用默認(rèn)[0,1]范圍時)
( 其中min為特征的最小值,max為特征的最大值。)
使用原因:
- 對于方差非常小的屬性可以增強(qiáng)其穩(wěn)定性。有時數(shù)據(jù)集的標(biāo)準(zhǔn)差非常非常小,有時數(shù)據(jù)中有很多很多零(稀疏數(shù)據(jù))需要保存住0元素。
- 維持稀疏矩陣中為0的條目。
缺點:
當(dāng)數(shù)據(jù)出現(xiàn)新的最大最小值時,需要重來一遍。
若數(shù)值集中且某個數(shù)值很大,則規(guī)范化后各值接近于0,并且將會相差不大。(如:100、101、102、108、20001)
實現(xiàn):
- sklearn.preprocessing.minmax_scale
- sklearn.preprocessing.MinMaxScaler(這兩者的關(guān)系跟上面的標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化差不多,這里只講后者)
sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)
官網(wǎng)文檔:
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html#sklearn.preprocessing.MinMaxScaler
參數(shù)說明:
feature_range : tuple (min, max), default=(0, 1)
轉(zhuǎn)化步驟如下:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) #每列最大、最小值
X_scaled = X_std * (max - min) + min
舉一個栗子(反例):當(dāng)transform的數(shù)據(jù)集的最大最小值超出fit數(shù)據(jù)集中的最大最小值
x_test_out = np.array([[9,10,77,88],[33,29,10,3]]) MiMaScaler.transform(x_test_out) array([[ 1.30555556, 3.33333333, 12.88135593, 36.625 ],[ 7.97222222, 11.25 , 1.52542373, 1.20833333]])Obviously,轉(zhuǎn)換出來的數(shù)據(jù)范圍并不在[0,1]內(nèi)。所以應(yīng)用中需引起注意。
另外,說明一下:fit_transform存在的意義
1 MiMaScaler.fit(x)
2 MiMaScaler.transform(x)
3 MinMaxScaler().fit_transform(x)
注意第3句效果跟1、2句聯(lián)合起來一樣,第3句省一步,飛快實現(xiàn)轉(zhuǎn)換~~
三.絕對值標(biāo)準(zhǔn)化(暫時這么叫)(將數(shù)據(jù)縮放到一定范圍內(nèi),專為稀疏數(shù)據(jù)而生)
使用原因:
將每個要素縮放到[-1,1]范圍,它不會移動/居中數(shù)據(jù),因此不會破壞任何稀疏性。
該估計器單獨地縮放每個特征,使得訓(xùn)練集中的每個特征的最大絕對值將是1.0。
該縮放器也可以應(yīng)用于稀疏CSR或CSC矩陣。
實現(xiàn):
- sklearn.preprocessing.maxabs_scale(X, axis=0, copy=True)
- sklearn.preprocessing.MaxAbsScaler(copy=True)(這兩者的關(guān)系同上)
每列值的Max值的絕對值將會是1.
四.魯棒性標(biāo)準(zhǔn)化(暫時這么叫)(將數(shù)據(jù)縮放到一定范圍內(nèi),專為異常值而生)
使用原因:
標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化(第一種,最常用的那種)對數(shù)據(jù)中出現(xiàn)的異常值處理能力不佳,因此誕生了robust_scale,這種不怕異常值擾動的數(shù)據(jù)縮放法。
此Scaler根據(jù)分位數(shù)范圍(默認(rèn)為IQR:Interquartile Range)刪除中位數(shù)并縮放數(shù)據(jù)。 IQR是第1四分位數(shù)(第25個分位數(shù))和第3個四分位數(shù)(第75個分位數(shù))之間的范圍。
實現(xiàn):
- sklearn.preprocessing.robust_scale(X, axis=0, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)
- sklearn.preprocessing.RobustScaler(with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)
五.正則化
使用原因:
每個樣本被單獨縮放,使得其范數(shù)等于1。注意,是對每個樣本,不再像之前的(默認(rèn)對列進(jìn)行規(guī)范化)規(guī)范化。
文本分類或聚類中常用。可用于密集的numpy數(shù)組和scipy.sparse矩陣(如果你想避免復(fù)制/轉(zhuǎn)換的負(fù)擔(dān),請使用CSR格式)
Normalization主要思想是對每個樣本計算其p-范數(shù),然后對該樣本中每個元素除以該范數(shù),這樣處理的結(jié)果是使得每個處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。
p-范數(shù)的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p
實現(xiàn):
- sklearn.preprocessing.normalize(X, norm=’l2’, axis=1, copy=True, return_norm=False)
- sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)
5.1 sklearn.preprocessing.normalize(X, norm=’l2’, axis=1, copy=True, return_norm=False)
官方文檔:
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.normalize.html#sklearn.preprocessing.normalize
5.2 sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)
官方文檔:
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Normalizer.html#sklearn.preprocessing.Normalizer
參數(shù)說明:
norm :‘l1’,‘l2’, or ‘max’, 默認(rèn)l2。
下面驗證一下每個樣本的范數(shù),隨機(jī)挑選第四個樣本、第77個樣本來驗證:
output_3 = [] aa = Normalizer_.transform(x)[3] for i in aa:output_3.append(i*i) print(output_3) print("樣本范數(shù):",sum(output_3)) [0.64004839685420423, 0.29068360556563821, 0.068058076225045352, 0.0012099213551119174] 樣本范數(shù): 1.0 output_76 = [] bb = Normalizer_.transform(x)[76] for i in bb:output_76.append(i*i) print(output_76) print("樣本范數(shù):",sum(output_76)) [0.58472432979261513, 0.099140111279716753, 0.29135053110773901, 0.024785027819929188] 樣本范數(shù): 1.0拓:向量范數(shù)的內(nèi)容:
歡迎指錯。 Thanks!
總結(jié)
以上是生活随笔為你收集整理的【机器学习】sklearn实现---归类为5大类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于肌电信号(sEMG) 的深度学习手势
- 下一篇: Himall商城枚举帮助类EnumHel