詳解python?sklearn中的數據預處理方法
前言
本篇文章主要講解Python的sklearn庫中常用的數據預處理方法,主要介紹工具中的內容,即該庫中的相關方法包含的常用接口和基本使用,并不適合手把手入門學習,此外將涉及更少的原理和使用情況說明。
sklearn中的數據預處理
sklearn.preprocessing
:sklearn中的數據預處理模塊sklearn.impute
:sklearn中的缺失值填充模塊
本文主要涉及的方法:
- 極差歸一化:
sklearn.preprocessing.MinMaxScaler
- 數據標準化:
sklearn.preprocessing.StandardScaler
- 標簽編碼:
sklearn.preprocessing.LabelEncoder
- 特征編碼:
sklearn.preprocessing.OrdinalEncoder
- 數據二值化:
sklearn.preprocessing.Binarizer
- 數據分箱:
sklearn.preprocessing.KBinsDiscretizer
- 缺失值處理:
sklearn.impute.SimpleImputer
ps:擬合的時候可以傳入多個特征數據,sklearn中的方法大多都會自動分別對每一列進行處理,但sklearn一般不支持一維數據導入,至少為二維,若想傳入一維數組進行處理可以使用reshape(-1, 1)
轉為二維數組,若想傳入單個Series對象則需要先將其轉為DataFrame對象。
數據無量綱化
極差歸一化:統(tǒng)一量綱,將某特征下所有的值歸一化在指定范圍內,默認該范圍為 [0,1][0, 1][0,1],也可以手動確定范圍。
常用接口如下:
import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 準備測試數據 # 常用接口 scaler = MinMaxScaler() # 默認范圍為 [0,1] scaler = MinMaxScaler(feature_range=[5, 10]) # 自定義歸一化數據范圍 scaler.fit(data) # 擬合數據 scaler.partial_fit(data) # 數據量大的時候fit()報錯,可以使用partial_fit() result = scaler.transform(data) # 變換數據 result = scaler.fit_transform(data) # 擬合和變換一步達成 data = scaler.inverse_transform(result) # 逆向變換
.partial_fit()
:該方法是一種增量學習的方式,可以逐步從流式數據中學習縮放參數,當數據量太大導致 .fit()
接口報錯時,可以使用該接口
我們把大批量的數據想象成一個大湖,既然我們無法一次性將這個大湖中的所有水進行處理(學習),但我們可以將其延伸出來一條小河,對順著小何流動的水(數據流)不斷進行處理(學習)。
- 增量學習:是一種可以逐步從新數據中學習的機器學習方法。它不需要重新訓練整個模型,而是可迭代地更新模型參數。
- 流式數據:指的是連續(xù)不斷產生的數據流
Z-score標準化:統(tǒng)一量綱,且變換后的數據服從均值為0方差為1的標準正態(tài)分布。
常用接口如下:和MinMaxScaler基本一樣
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 準備測試數據 # 常用接口 scaler = StandardScaler() # 創(chuàng)建對象 scaler.fit(data) # 擬合數據 scaler.partial_fit(data) # 數據量大的時候fit()報錯,可以使用partial_fit() result = scaler.transform(data) # 變換數據 result = scaler.fit_transform(data) # 擬合和變換一步達成 data = scaler.inverse_transform(result) # 逆向變換 # 常用屬性 scaler.var_ # 擬合后查看各列數據的方差 scaler.mean_ # 擬合后查看各列數據的均值
對于 StandardScaler 和 MinMaxScaler 來說,空值NaN
會被當做是缺失值,在 fit 的時候忽略,在 transform 的時候保持缺失 NaN 的狀態(tài)顯示。
缺失值處理
SimpleImputer 是sklearn中的簡單填充方案,可以填充均值、中位數、眾數或特定值
常用參數:
missing_values
:改組數據中的缺失值是什么樣的,默認為 np.nan
strategy
:填充策略,默認為'mean'
'mean'
:均值填充'median'
:中位數填充'most_frequent'
:眾數填充'constant'
:填充固定值,該值在fill_value
參數中設置
fill_value
:在 strategy
參數設置為 'constant'
時,設置填充值
copy
:默認為True,給處理后的數據創(chuàng)建副本并返回,否則在原對象上進行修改
常用接口:
import pandas as pd import numpy as np from sklearn.impute import SimpleImputer data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 準備測試數據 # 常用接口 imp_mean = SimpleImputer() # 均值填充缺失值 imp_median = SimpleImputer(strategy='median') # 中位數填充缺失值 imp_mode = SimpleImputer(strategy='most_frequent') # 眾數填充 imp_0 = SimpleImputer(strategy='constant', fill_value=0) # 0填充 imp_mean.fit(data) # 擬合數據 result = imp_mean.transform(data) # 變換數據 result = imp_mean.fit_transform(data) # 擬合和變換一步到位
除了使用sklearn中的SimpleImputer進行簡單填充,利用pandas也可以直接進行填充:
import pandas as pd import numpy as np data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 準備測試數據 data.iloc[0:2, 0:2] = np.nan # 使用pandas進行缺失值填充 result = data.fillna(0) # 0填充所有缺失值 # 均值填充第0列,中位數填充、眾數填充同理 result = data.iloc[:, 0] = data.iloc[:, 0].fillna(data.iloc[:, 0].mean()) result = data.dropna(axis=0) # 刪除所有含有缺失值的樣本數據
注意:pandas中的.mean()
和.median()
方法返回對應均值或中位數,但由于眾數可能含有多個,取眾數.mode()
方法返回的是一個Series對象,填充時取其中的任意值即可,一般取索引為0的值。
中位數只可能是一個或者兩個,若為兩個,則取這兩個數的均值,但眾數則可能有很多個
編碼和啞變量
LabelEncoder和OrdinalEncoder分別用于給標簽和特征數據進行編碼,主要用于非名義變量。
import pandas as pd from sklearn.preprocessing import LabelEncoder, OrdinalEncoder, OneHotEncoder # 準備測試數據 data_dic = { '性別': ['男', '女', '女', '男', '女'], '學歷': ['小學', '初中', '初中', '大學', '高中'], '標簽': ['標簽3', '標簽1', '標簽2', '標簽3', '標簽2'], } data = pd.DataFrame(data_dic) # 常用接口 le = LabelEncoder() # 創(chuàng)建對象 oe = OrdinalEncoder() le = le.fit(data.loc[:, '標簽']) # 擬合數據 result = le.transform(data.loc[:, '標簽']) # 變換數據 result = le.fit_transform(data.loc[:, '標簽']) # 擬合和變換一步達成 data = le.inverse_transform(result) # 逆向變換 data = pd.DataFrame(data_dic) # 一般這樣寫 result = LabelEncoder().fit_transform(data.loc[:, '標簽']) result = OrdinalEncoder().fit_transform(data.loc[:, ['性別', '學歷']]) # 常用屬性 le.classes_ # 返回原來的字符串標簽唯一值數組, 按該數組順序編號 oe.categories_ # 返回原來的字符串標簽數組, 按該數組順序編號
OrdinalEcoder和LabelEncoder用法和接口幾乎一致,區(qū)別在于LabelEncoder可以處理一維數據,且使用.classes_
屬性來查看標簽編號數組,OrdinalEncoder不能處理一維數據,且使用.categories_
屬性來查看標簽編號數組
OneHotEncoder獨熱編碼主要用于名義變量,將特征轉換為啞變量。
特征可以轉換為啞變量,標簽也可以,許多算法可以處理多標簽問題,但這樣的做法在現實中不常見。
常用參數:
categories
:表示每個特征都有哪些類別,默認為 'auto',一般情況我們都用默認值
'auto'
:為自行判斷- 嵌套列表:列表中里面每個元素都是一個包含特征類別的列表。
'handle_unknown'
:表示對于未注明特征或類別的處理方式,默認為 'error'
'error'
:設置categories
后,算法遇到了列表中沒有包含的特征或類別時,會報錯,'ignore'
:未在categories
注明的特征或類別的啞變量都會顯示0,在逆向變換時未知特征或類別則會顯示None
import pandas as pd from sklearn.preprocessing import OneHotEncoder # 準備測試數據 data_dic = { '性別': ['男', '女', '女', '男', '女'], '學歷': ['小學', '初中', '初中', '大學', '高中'], '標簽': ['標簽3', '標簽1', '標簽2', '標簽3', '標簽2'], } data = pd.DataFrame(data_dic) # 常用接口 encoder = OneHotEncoder() encoder.fit(data[['性別']]) # 擬合數據 result = encoder.transform(data[['性別']]) # 變換數據 result = encoder.fit_transform(data[['性別']]) # 擬合和變換一步到位 data = encoder.inverse_transform(result) # 逆向變換 # 一般這樣寫 result = OneHotEncoder().fit_transform(data[['性別']])
注意:OneHotEncoder在transform后返回的是稀疏矩陣,需要使用 .toarray()
方法轉為矩陣(二維數組);inverse_transfrom可以接收稀疏矩陣也可以接收正常的矩陣,返回正常的矩陣。
此外,在經過OneHotEncoder處理后我們需要自行使用pandas將啞變量拼接到原矩陣(pd.concat())和刪除原來的特征(pd.drop())
連續(xù)型特征處理
Binarizer用于將數據二值化,所謂數據二值化,就是設置一個閾值,小于等于該閾值的記為0,大于該閾值的記為1。
常用接口:
import numpy as np from sklearn.preprocessing import Binarizer data = np.arange(10, 20).reshape(-1, 1) bin = Binarizer(threshold=15) # 默認threshold為0 bin.fit(data) # 擬合數據 result = bin.transform(data) # 變換數據 result = bin.fit_transform(data) # 擬合和變換一步達成 # 一般這樣用 result = Binarizer(threshold=15).fit_transform(data)
KBinsDiscretizer用于將連續(xù)型變量劃分為分類變量,能夠將連續(xù)型變量排序后按順序分箱后編碼。
常用參數:
'n_bins'
:每個特征中分箱的個數,默認為5,
'encode'
:編碼方式,默認為 'onehot'
'onehot'
:獨熱編碼為啞變量,返回一個稀疏矩陣'onehot-dense'
:獨熱編碼為啞變量,返回一個密集矩陣 (一般的矩陣)'ordinal'
:每個特征的每箱數據都被編碼為一個整數,返回編碼后的矩陣
'strategy'
:定義分箱方式,默認為 'quantile'
'uniform'
:等寬分箱,每個特征的每箱數據中的極差不得高于 max(x)−min(x)Nbins\frac{max(x)-min(x)}{N_{bins}}Nbins?max(x)−min(x)?,其中 xxx 表示某特征下的數據,NbinsN_{bins}Nbins? 表示分箱個數'quantile'
:等位分箱,即每個特征中的每個箱內的樣本數量都相同'kmeans'
:按kmeans聚類分箱,每個箱中的值到最近的一維k均值聚類的簇心的距離都相同
常用接口:
import numpy as np import pandas as pd from sklearn.preprocessing import KBinsDiscretizer data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 準備測試數據 est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile') est.fit(data) # 擬合數據 result = est.transform(data) # 變換數據 result = est.fit_transform(data) # 擬合和變換一步到位 data = est.inverse_transform(result) # # 一般這樣用 result = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile').fit_transform(data)
需要注意的是,這里的inverse_transform已經無法將數據轉為原來的數據,因為在進行分箱離散化時,原始的連續(xù)值已經被轉換到了分箱區(qū)間中,inverse_transform不可能恢復到與原始值完全相同的結果,但是它可以通過區(qū)間映射,將分類變量映射回連續(xù)值的范圍中,從而部分恢復原始數據的連續(xù)分布區(qū)間,結果并不會每一個值都完全等于原始數據,但整體上逼近了原始數據的分布范圍。
不建議使用inverse_transform,因為逆向變換后的數據已經不是原本的數據了。
到此這篇關于詳解python sklearn中的數據預處理方法的文章就介紹到這了,更多相關python sklearn數據預處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用concurrent.futures模塊實現多進程多線程編程
Python的concurrent.futures模塊可以很方便的實現多進程、多線程運行,減少了多進程帶來的的同步和共享數據問題,下面就跟隨小編一起了解一下concurrent.futures模塊的具體使用吧2023-12-12Pyinstaller打包.py生成.exe的方法和報錯總結
今天小編就為大家分享一篇關于Pyinstaller打包.py生成.exe的方法和報錯總結,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04