sklearn——數據數據預處理


一、數據的標准化、歸一化、正則化

 

1、標准化

  將數據轉化為均值為0方差為1的數據,即標准正態分布。標准化可以規范數據,但不適用於稀疏數據,因為會破壞其數據結果。標准化的過程為兩步:去均值的中心化(均值變為0);方差的規模化(方差變為1)。即每一列減去該列的均值再除以該列的方差。

  在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,StandardScaler表現更好。

 

對應函數:

  sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)

  • x:需要標准化標准化的數據。
  • axis:需要標准化的方向,0為列,1為行。
  • with_mean:是否去均值的中心化,默認為True。
  • with_std:是否方差規模化,默認為True。
  • copy:是否要copy數據。

 

代碼示例:  

import numpy as np
from sklearn.preprocessing import scale

a=np.random.normal(4,5,[5,2])  #創造數據
a_s=scale(a)    #標准化
print('a:\n',a)
print('\na_s:\n',a_s)
print('\na_s的均值:',a_s.mean(axis=0))
print('\na_s的方差:',a_s.std(axis=0))

'''
結果:
a:
 [[ 3.89399029  5.72996121]
 [ 7.38088249  9.73803222]
 [ 5.8379103  -5.40880669]
 [ 3.29479806 -7.79727102]
 [-0.68205516 -5.71899267]]

a_s:
 [[-0.01873374  0.91171731]
 [ 1.25922106  1.48078964]
 [ 0.69371785 -0.66978276]
 [-0.23833921 -1.00890074]
 [-1.69586596 -0.71382346]]
 
a_s的均值: [-6.66133815e-17  0.00000000e+00]

a_s的方差: [1. 1.]
'''

 

2、歸一化

  歸一化可以將稀疏的數據進行規范化,而且不會破壞其數據結構。歸一化有兩種,一種是歸一化到[0,1]區間,另一種是歸一化到[-1,1]區間內,這樣是為了對付那些標准差相當小的特征並且保留下稀疏數據中的0值。

  在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用MinMaxScaler。比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍。

 

[0,1]歸一化:

對應的類:

  sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)

  • feature_range:要歸一化的范圍。
  • copy:是否拷貝數據。

 

類的方法:

  • fit_transform(self, X, y=None, **fit_params) 將數據傳入並轉化,一般傳入特征數據X即可,目標數據Y不需要轉化。
  • inverse_transform(self, X) 將數據的歸一化去除,變回原來的數據。

 

計算公式:

  X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

  X_scaled = X_std * (max - min) + min

  其中max、min為sklearn.preprocessing.MinMaxScaler中參數feature的參數范圍,一般默認是0、1。X.min(axis=0)表示列最小值。

 

[-1,1]歸一化 

對應的類:

  sklearn.preprocessing.MaxAbsScaler(copy=True)

 

類的方法:

  • fit_transform(self, X[, y])

 

代碼示例:

import numpy as np
from sklearn.preprocessing import MinMaxScaler

x=np.arange(0,10).reshape(10,1)  #創建10*1數組
scale=MinMaxScaler()    #創建傳化器
x_trans=scale.fit_transform(x)  #傳入數據並轉化
print(x_trans)

'''
結果為:
[[0.        ]
 [0.11111111]
 [0.22222222]
 [0.33333333]
 [0.44444444]
 [0.55555556]
 [0.66666667]
 [0.77777778]
 [0.88888889]
 [1.        ]]
'''

 

3、分位數標准化

  當含有較多的異常值的時候,普通的標准化不能很好的規范數據,所以要可以用分位數標准化,即用范圍在第一分位數,第三分位數之間的數據的均值與方差來標准化數據,而不是所有的數據。

 

對應的類:

  sklearn.preprocessing.RobustScaler(with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)

  • with_centering:是否去中心化。
  • with_scaling:是否方差化。
  • quantile_range:分位數的范圍,值為0-100之間。
  • copy:是否copy數據。

 

類的方法:

  • fit_transform(self, X[, y]) 傳入數據並標准化。

 

代碼示例:

import numpy as np
from sklearn.preprocessing import RobustScaler

x = np.random.normal(0, 1, [10, 1])  # 創建數據
x[0, 0] = 3  # 創建異常值
x_trans = RobustScaler().fit_transform(x)  # 標准化

print('x為:\n', x)
print('x_trans為:\n', x_trans)

'''
結果為:
x為:
 [[ 3.        ]
 [ 0.57042561]
 [ 1.15972829]
 [ 0.26299752]
 [-1.48938259]
 [-2.11549533]
 [ 0.43788961]
 [-1.87936541]
 [ 0.01614399]
 [ 0.44674289]]
x_trans為:
 [[ 1.60335674]
 [ 0.13312028]
 [ 0.48973183]
 [-0.05291724]
 [-1.11335529]
 [-1.49224213]
 [ 0.05291724]
 [-1.3493501 ]
 [-0.20229857]
 [ 0.05827473]]
'''

 

 

關於規范化的選擇:

1、在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,StandardScaler表現更好。

2、在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用MinMaxScaler。比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍。

 

二、連續特征二值化與離散特征編碼(啞變量)

  對變量進行啞變量處理的原因是,有的模型不能夠處理分類變量只能處理連續性變量,例如線性回歸,所吧變量轉化為用01編碼的方式來表示有利於建模。

  one-hot用在GBDT、XGBoost這些模型里面都挺好的,但是用在邏輯回歸里不行。因為邏輯回歸要求變量間相互獨立,如果你只有一個屬性需要做one-hot編碼還好,如果你有多個屬性需要做one-ont編碼,那么當某個樣本的多個one-hot屬性同時為1時,這兩個屬性就完全相關了,必然會導致singular error,也就是非奇異矩陣不能求解唯一解,得不出唯一的模型,但是你又不可能把同一個屬性的某一個one-hot延伸變量刪除。
  如果在邏輯回歸中入模標稱屬性,可以直接替換成數值,然后做woe變換,用每個類別的woe值來代替原來的數值,這樣既能夠避免生成相關性強的變量,又能避開類別間大小無法比較的問題。

1、連續特征二值化

  將數據二值化,當數據小於等於某個值轉化為0,大於某個值轉化為1,可以將數據簡化。

 

對應的類:

   sklearn.preprocessing.Binarizer(threshold=0.0, copy=True)

  • threshold:二值化閾值,<=threshold轉化為0,>threshold轉化為1
  • copy:是否拷貝數據。

 

類的方法:

  • fit_transform(self, X, y=None, **fit_params) 傳入數據並二值化。

 

代碼示例:

  

import numpy as np
from sklearn.preprocessing import Binarizer

x = np.random.normal(0,1,[5,1]) # 創建數據
x_trans = Binarizer().fit_transform(x)  # 二值化

print('x為:\n', x)
print('x_trans為:\n', x_trans)

'''
結果為:
x為:
 [[-1.61958613e+00]
 [-9.19743271e-04]
 [-1.08147857e+00]
 [-1.06551634e+00]
 [ 7.29322079e-01]]
x_trans為:
 [[0.]
 [0.]
 [0.]
 [0.]
 [1.]]
'''


2、離散特征二值化

  這個相當於啞變量編碼。

 

對應的類:

   sklearn.preprocessing.LabelBinarizer(neg_label=0, pos_label=1, sparse_output=False)

  • neg_label:不屬於該類的標簽,默認為0。
  • pos_label:屬於該類的標簽,默認為1。
  • sparse_output:是否用稀疏矩陣格式輸出,即索引加值的形式。

 

 

類的方法:

  • fit_transform(self, X, y=None, **fit_params) 傳入數據並二值化。

 

的屬性: 

  • LabelBinarizer().classes_ 用於查看二值化前離散特征原始值。

 

代碼示例:

  

import numpy as np
from sklearn.preprocessing import Binarizer,LabelBinarizer

x = ['a','b','a','c'] # 創建數據
transor=LabelBinarizer()    #創建轉化器具
x_trans = transor.fit_transform(x)  # 二值化

print('x為:\n', x)
print('轉化的類別為:\n',transor.classes_)
print('x_trans為:\n', x_trans)

'''
結果為:
x為:
 ['a', 'b', 'a', 'c']
轉化的類別為:
 ['a' 'b' 'c']
x_trans為:
 [[1 0 0]
 [0 1 0]
 [1 0 0]
 [0 0 1]]
'''

 

3、啞變量on-hot編碼

  將離散型數據轉化為啞變量。

 

對應的類:

   sklearn.preprocessing.OneHotEncoder(n_values=None, categorical_features=None, categories=None, drop=None, sparse=True, dtype=<class ‘numpy.float64’>, handle_unknown=’error’)

  • **n_values:可選值[None,'auto',int],用幾個值(即幾列0、1編碼)來表示特征的離散值,默認是對單個特征,有幾個離散值就有幾個值對應。自己指定,如果學歷分為[高,中,低],但是樣本只有[高,低],為了把學歷中也表示出來,就需要傳入3。
  • **categorical_features:指定了對哪些訓練特征(即那些列)進行編碼,默認對所有訓練特征都進行編碼。也可以自己指定選擇哪些特征,通過索引或者 bool 值來指定,例如對列[a,b,c]中的列[a,b]編碼,則傳入[a,b]。
  • categories:可選值['auto',list]。'auto'默認將特征的所有離散值轉化。如果是list,則將保留categories[list]對應的離散值。一般默認就好。
  • drop:可選值[None,'first',list]。默認None表示將所有的離散值轉化;'first',去掉第一個特征再將離散值轉化,編碼后全為0的表示第一個離散值;list:指定去除的離散值。建議默認就好。
  • **sparse:True返回稀疏矩陣,索引加值的矩陣。
  • dtype:數據類型。
  • handle_unknown:對空值怎么處理,‘error’ 表示報錯,‘ignore’表示忽略。

 

類的方法:

  • fit_transform(self, X, y=None, **fit_params) 傳入數據並二值化。
  • get_feature_names() 返回編碼后的列的名字,形式為:特證名_離散值。

 

代碼示例:

 

import numpy as np
from sklearn.preprocessing import OneHotEncoder

x = np.array([['a'],['b'],['a'],['c']]) # 創建數據
transor=OneHotEncoder(sparse=False)    #創建轉化器具
x_trans = transor.fit_transform(x) # 二值化


print('x為:\n', x)
print('編碼的后的列為:\n',transor.get_feature_names())
print('x_trans為:\n', x_trans)

'''
結果為:
x為:
 [['a']
 ['b']
 ['a']
 ['c']]
 編碼的后的列為:
 ['x0_a' 'x0_b' 'x0_c']
x_trans為:
 [[1. 0. 0.]
 [0. 1. 0.]
 [1. 0. 0.]
 [0. 0. 1.]]
'''

 

4、pandas中的啞變量編碼

對應函數:

  pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)

  •  data:傳入的數據,數組、Series類或者dataframe類。
  • prefix:編碼后列名的前綴,默認用特征名做為前綴,例如性別特征,編碼后的列為[性別_男,性別_女]。如果要傳入,長度要和特征數相同。
  • prefix_sep:編碼后列名的間隔符,默認就好。
  • dummy_na:是否對NaNs類的數據進行單獨的編碼,否的話忽略NaNs數據。
  • sparse:是否輸出稀疏矩陣,即index+值。
  • drop_first:是否去除第一個離散值再編碼。
  • dtype:數據類型。

 

代碼示例:

import pandas as pd

df=pd.DataFrame(data=[['a'],['b'],['c'],['a']],columns=['grade'])

df_dum=pd.get_dummies(df)
print(df_dum)


'''
結果為:
      grade_a  grade_b  grade_c
0        1        0        0
1        0        1        0
2        0        0        1
3        1        0        0
'''

 

 

三、缺失值插補

1、單變量插補

  即只根據特征自身來進行缺失值的補充。

 

對應的類:

  sklearn.impute.SimpleImputer(missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True, add_indicator=False)

  • missing_values:缺失值,用什么表示缺失值。默認是np.nan
  • 'strategy:插補缺失值的方法,'mean':均值;'median':中位數;'most_frequent':頻數最高的數;'constant':用蠶食fill_value的值代替。
  •  fill_value:參數strategy='constant'時用來替換缺失值的值。
  • add_indicator:若為True則替換后對數據添加是否插補缺失值的標簽。

 

類的方法:

  • fit_transform(self, X, y=None, **fit_params) 傳入數據補充缺失值。

 

代碼示例:

from sklearn.impute import SimpleImputer
import numpy as np

x=np.array([1,2,3,4,5,6,7,8,np.nan,10]).reshape(10,1)
imp=SimpleImputer(np.nan)
x_imp=imp.fit_transform(x)

print(x_imp)


'''
結果為:
[[ 1.        ]
 [ 2.        ]
 [ 3.        ]
 [ 4.        ]
 [ 5.        ]
 [ 6.        ]
 [ 7.        ]
 [ 8.        ]
 [ 5.11111111]
 [10.        ]]
'''

 

2、多變量插補法

  缺失值的插補也可以通過利用多變量建模的方式來插補,例如用knn、隨機森林、貝葉斯估計等,可以用不同的插補法,在建模后通過不通的模型效果來選擇最合適的。

  sklearn這里允許我們自己選擇建模的方式,使用迭代器  IterativeImputer 類(這個類還在試驗階段),該類將每個 missing value 的特征建模為其他特征的函數,並使用該估計進行插補。它是以循環的方式實現的:在每個步驟中,一個特征列被指定為輸出 y,而其他特征列被視為輸入 X 。對於已知 y,回歸量適合(X,y)。然后,回歸量用於預測 y 的缺失值。對於 n 迭代方式,然后對 max-iter 插補輪進行重復。最后一輪插補的結果被返回。

 

對應的類:

  sklearn.impute.IterativeImputer(estimator=None, missing_values=nan, sample_posterior=False, max_iter=10, tol=0.001, n_nearest_features=None, initial_strategy=’mean’, imputation_order=’ascending’, min_value=None, max_value=None, verbose=0, random_state=None, add_indicator=False)

  • estimator :estimator對象,默認= BayesianRidge()。循環法插補的每一步使用的估算器。如果sample_posterior為True,則估算器必須支持 return_std其predict方法。
  • missing_values :指定何種占位符表示缺失值,可選 number ,string ,np.nan(default) ,None
  • sample_posterior :布爾值,默認為False,是否從每個插補的擬合估計的(高斯)預測后驗進行采樣。如果設置為True,Estimator 必須支持return_std 其predict 方法。True如果IterativeImputer用於多個插補,則設置為 。
  • max_iter :輸入為int型數據,默認值是10。在返回最后一輪計算的估算值之前要執行的最大插補輪次數。
  • tol :容忍停止條件
  • n_nearest_features :用於估計每個要素列的缺失值的其他要素數。使用每個特征對之間的絕對相關系數(在初始插補之后)測量特征之間的接近度。為了確保在整個插補過程中覆蓋特征,鄰居特征不一定是最接近的,而是以與每個插補目標特征的相關性成比例的概率繪制。當功能數量巨大時,可以提供顯着的加速。如果None,將使用所有功能。
  • initial_strategy :使用哪種策略初始化缺失值。與 SimpleImputer 中的strategy參數相同
  • imputation_order :排序規則
    • ascending :從缺失值最少的功能到最多
    • descending :從具有最多缺失值的功能到最少
    • roman :左到右
    • arabic :右到左
    • random :隨機順序
  • min_value :最小可能的估算值。默認值None將最小值設置為負無窮大。
  • max_value :最大可能的估算值。默認值None將最大值設置為正無窮大。
  • verbose :詳細程度標志控制在評估函數時發出的調試消息。越高越詳細。可以是0,1或2。
  • random_state :偽隨機數生成器的種子使用。如果 n_nearest_features不是None,imputation_order則隨機選擇估計器特征, if random和后驗if的采樣sample_posterior為True。
  • add_indicator :如果為True,則MissingIndicator變換將堆疊到imputer的變換的輸出上。這允許預測估計器盡管插補而解釋缺失。如果某個要素在擬合/訓練時沒有缺失值,即使在變換/測試時缺少值,該要素也不會出現在缺失的指示符上。

 

類的方法:

  • fit_transform(self, X, y=None) 用來插補缺失值

 

代碼示例:

from sklearn.experimental import enable_iterative_imputer   #要先導入這個才能正常使用
from sklearn.impute import IterativeImputer
import numpy as np

imp = IterativeImputer(max_iter=10, random_state=0)
imp.fit([[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]])
X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]
print(np.round(imp.transform(X_test)))


'''
結果為:
[[ 1.  2.]
 [ 6. 12.]
 [ 3.  6.]]
'''

 

3、impyute一個多變量缺失值插補包

  除了sklearn之外,還有兩個常用的缺失值插補的包impytue和fancyimpute,除了簡單的單變量之外,還支持多變量插補。由於 fancyimpute由於包安裝不成功,所以這里不做介紹,impyute包,這里只列出相關的缺失值插補方法與一個簡單示例。

fast_knn 快速knn算法
mice mice算法
mean 均值填充

 

代碼示例:

  這里有三種方法的實現,分別用三個函數:fast_knn, mice, mean,然后計算擬合缺失值的誤差,然后計算出那個算法的誤差最大,循環100次,最后輸出各個算法誤差最大的次數。

  這里每次結果都不一樣,但是knn和mice的算法的誤差比mean的誤差大的次數要少,所以一般建議可以使用knn或者mice算法。

from impyute.imputation.cs import fast_knn, mice, mean
from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
x = iris.data

#記錄三種方法誤差最大的次數,初始為0
knn_cnt = 0
mice_cnt = 0
mean_cnt = 0

for i in range(99):
    #第2列的數據隨機添加缺失值
    rand_x = np.random.randint(0, 150, 10)
    x_copy = np.copy(x)
    x_copy[rand_x, 1] = np.nan

    #用三種方法插補缺失值
    x1 = fast_knn(x_copy, 4)
    x2 = mice(x_copy)
    x3 = mean(x_copy)

    knn_error = np.abs(np.sum(x1[rand_x, 1] - x[rand_x, 1]))  # knn誤差
    mice_error = np.abs(np.sum(x2[rand_x, 1] - x[rand_x, 1]))  # mice誤差
    mean_error = np.abs(np.sum(x3[rand_x, 1] - x[rand_x, 1]))  # mean誤差

    #如果誤差最大,則算法次數加1
    if knn_error == max(knn_error, mice_error, mean_error):
        knn_cnt += 1
    elif mice_error == max(knn_error, mice_error, mean_error):
        mice_cnt += 1
    else:
        mean_cnt += 1

#輸出誤差最大的次數
print(knn_cnt, mice_cnt, mean_cnt)

 

 

4、github上基於sklearn的一個多變量缺失值插補包  

  這個包在github上可以找到,叫MissingImputer,這個包可以通過利用knn, randomforest, xgboost, lightgbm的方法來填補缺失值,數據的訓練和擬合方法和sklearn一樣,所以很推薦使用,需要注意的時它需要額外的包xgboost和lightgbm,可以通過pip進行安裝即可。

 

對應的類:

  MissingImputer(max_iter=10, ini_fill = True, ini_strategy_reg = 'mean', ini_strategy_clf = 'most_frequent', with_cat = False, cat_index = None, tol = 1e-3, model_reg = "knn", model_clf = "knn")

  • max_iter:迭代次數,模型一開始用簡單數據填充缺失,然后訓練模型並擬合缺失,然后用擬合了缺失的數據繼續訓練擬合,重復直到迭代結束。
  • ini_fill:是否要進行簡單填補(False僅對xgb和lgb有效)。
  • ini_strategy_reg:連續變量簡單填補規則, mean or median。
  • ini_strategy_clf:離散變量簡單填補規則, only most_frequent。
  • cat_index:離散變量索引(int)。
  • tol:閾值。
  • model_reg:連續變量采用的預測缺失值模型, be xgboost,lightgbm, randomforest, knn。
  • model_clf:離散變量采用的預測缺失值模型

 

類的方法:

  MissingImputer.fit()訓練,MissingImputer. transform()擬合缺失值。

 

示例代碼:

from MissingImputer.ModelBasedImputer.MissingImputer import MissingImputer
from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
x = iris.data


rand_x = np.random.randint(0, 150, 10)  # 0-150取10個隨機數作為隨機航
x_copy = np.copy(x)
x_copy[rand_x, 1] = np.nan  # 這10個隨機行添加缺失值

model=MissingImputer()
model.fit(x)    # 訓練
x=model.transform(x)    # 擬合

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM