使用sklearn對資料進行標準化 正則化

2021-09-22 20:19:04 字數 4470 閱讀 4933

也叫離差標準化,是對原始資料的線性變換,使結果落到[0,1]區間,轉換函式如下:

x ∗=

x−mi

nmax

−min

x^*= \frac

x∗=max

−min

x−mi

n​其中max為樣本資料的最大值,min為樣本資料的最小值。這種方法有乙個缺陷就是當有新資料加入時,可能導致max和min的變化,需要重新定義。

sklearn實現:preprocessing.minmaxscaler()

preprocessing.minmaxscaler類將屬性縮放到乙個指定的最大和最小值(通常是1-0)之間

把特徵的樣本均值變成0,標準差變成1。

from sklearn import preprocessing

import numpy as np

x = np.array([[ 1., -1., 2.],

[ 2., 0., 0.],

[ 0., 1., -1.]])

scaler = preprocessing.minmaxscaler()

print(scaler.fit_transform(x))

[[ 0.5 0. 1. ]

[ 1. 0.5 0.33333333]

[ 0. 1. 0. ]]

print(scaler.scale_) # # 檢視縮放因子(沒太明白)

[ 0.5 0.5 0.33333333]

print(scaler.min_)

[ 0. 0.5 0.33333333]

使用這種方法的目的包括:

1、對於方差非常小的屬性可以增強其穩定性。

2、維持稀疏矩陣中為0的條目。

也叫標準差標準化,經過處理的資料符合標準正態分佈,即均值為0,標準差為1,其轉化函式為:

x ∗=

x−μσ

x^* = \frac

x∗=σx−

μ​其中μ為所有樣本資料的均值,σ為所有樣本資料的標準差。

sklearn實現1:preprocessing.scale()

直接將給定資料進行z-score 標準化。

>>> x_scaled = preprocessing.scale(x)

>>> x_scaled

array([[ 0. ..., -1.22..., 1.33...],

[ 1.22..., 0. ..., -0.26...],

[-1.22..., 1.22..., -1.06...]])

>>>#處理後資料的均值和方差

>>> x_scaled.mean(axis=0)

array([ 0., 0., 0.])

>>> x_scaled.std(axis=0)

array([ 1., 1., 1.])

sklearn實現2:preprocessing.standardscaler()

轉換函式同上,使用該類的好處在於可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料。

>>> scaler = preprocessing.standardscaler().fit(x)

>>> scaler

standardscaler(copy=true, with_mean=true, with_std=true)

>>> scaler.mean_ # 原始資料中每列特徵的平均值

array([ 1. ..., 0. ..., 0.33...])

>>> scaler.std_ # 原始資料每列特徵的方差(在python3中std_變為scaler_)

array([ 0.81..., 0.81..., 1.24...])

>>> scaler.transform(x)

array([[ 0. ..., -1.22..., 1.33...],

[ 1.22..., 0. ..., -0.26...],

[-1.22..., 1.22..., -1.06...]])

>>>#可以直接使用訓練集對測試集資料進行轉換

>>> scaler.transform([[-1., 1., 0.]])

array([[-2.44..., 1.22..., -0.26...]])

去均值和方差歸一化。且是針對每乙個特徵維度來做的,而不是針對樣本。

實測mlp 神經網路等分類演算法使用 minmaxscaler 沒有 standardscaler效果好。

正則化的過程是將每個樣本縮放到單位範數(每個樣本的範數為1),如果後面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。

normalization主要思想是對每個樣本計算其p-範數,然後對該樣本中每個元素除以該範數,這樣處理的結果是使得每個處理後樣本的p-範數(l1-norm,l2-norm,…)等於1。

1-範數:向量各分量絕對值之和

2-範數:向量長度

最大範數:向量各分量絕對值的最大值

p-範數:∣∣x

∣∣p=

(∑i=

1n∣x

i∣p)

1/p=

(∣x1

∣p+∣

x2∣p

+...

+∣xn

∣p)1

/p

||x||_p=(\sum^n_|x_i|^p)^=(|x_1|^p+|x_2|^p+...+|x_n|^p)^

∣∣x∣∣p

​=(i

=1∑n

​∣xi

​∣p)

1/p=

(∣x1

​∣p+

∣x2​

∣p+.

..+∣

xn​∣

p)1/

p該方法主要應用於文字分類和聚類中。例如,對於兩個tf-idf向量的l2-norm進行點積,就可以得到這兩個向量的余弦相似性。

sklearn實現1:preprocessing.normalize()

可以使用preprocessing.normalize()函式對指定資料進行轉換:

>>> x = [[ 1., -1.,  2.],

... [ 2., 0., 0.],

... [ 0., 1., -1.]]

>>> x_normalized = preprocessing.normalize(x, norm='l2')

>>> x_normalized

array([[ 0.40..., -0.40..., 0.81...],

[ 1. ..., 0. ..., 0. ...],

[ 0. ..., 0.70..., -0.70...]])

sklearn實現2:processing.normalizer()

可以使用processing.normalizer()類實現對訓練集和測試集的擬合和轉換:

>>> normalizer = preprocessing.normalizer().fit(x)  # fit does nothing

>>> normalizer

normalizer(copy=true, norm='l2')

>>> normalizer.transform(x)

array([[ 0.40..., -0.40..., 0.81...],

[ 1. ..., 0. ..., 0. ...],

[ 0. ..., 0.70..., -0.70...]])

>>> normalizer.transform([[-1., 1., 0.]])

array([[-0.70..., 0.70..., 0. ...]])

參考**:

sklearn-preprocessing.scale/standardscaler/minmaxscaler

關於sklearn.preprocessing中scale和standardscaler的使用

scale(標準化)和normalization(正則化) 區別

sklearn包中的分析演算法對 資料進行處理

import xlrd import json import re 開啟excel檔案 excel xlrd.open workbook c data.xlsx 獲取第二個sheet sheet excel.sheets 3 arr r 0,0,0,0,0,0 arr all 0,0,0,0,0,0...

使用sklearn進行mnist資料集分類

深度之眼 西瓜書課後 import time import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import fetch openml from sklearn.linear model import l...

使用sklearn進行增量學習

sklearn.bayes.bernoullinb sklearn.linear model.perceptron sklearn.linear model.sgdclassifier sklearn.linear model.passiveaggressiveclassifier regressi...