欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解python?sklearn中的數據預處理方法

 更新時間:2023年08月27日 10:13:05   作者:rink1t  
本篇文章主要講解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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python3 XML 獲取雅虎天氣的實現方法

    Python3 XML 獲取雅虎天氣的實現方法

    下面小編就為大家分享一篇Python3 XML 獲取雅虎天氣的實現方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • python實現高效的遺傳算法

    python實現高效的遺傳算法

    這篇文章主要介紹了python實現高效的遺傳算法。想了解算法的同學,可以參考下
    2021-04-04
  • Django如何利用uwsgi和nginx修改代碼自動重啟

    Django如何利用uwsgi和nginx修改代碼自動重啟

    這篇文章主要介紹了Django如何利用uwsgi和nginx修改代碼自動重啟問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python連接es之es更新操作示例詳解

    Python連接es之es更新操作示例詳解

    這篇文章主要為大家介紹了Python連接es之es更新操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Python使用concurrent.futures模塊實現多進程多線程編程

    Python使用concurrent.futures模塊實現多進程多線程編程

    Python的concurrent.futures模塊可以很方便的實現多進程、多線程運行,減少了多進程帶來的的同步和共享數據問題,下面就跟隨小編一起了解一下concurrent.futures模塊的具體使用吧
    2023-12-12
  • 橫向對比分析Python解析XML的四種方式

    橫向對比分析Python解析XML的四種方式

    這篇文章主要以橫向對比方式分析Python解析XML的四種方式,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 基于python的前后端分離的模擬實現

    基于python的前后端分離的模擬實現

    前后端分離核心是UI界面展示層(View)和數據處理層(Model)通過控制層(Controller)進行解耦合,在MVC設計模式中,前端主要負責數據展示和用戶交互(View),后端處理業(yè)務邏輯和數據存儲(Model),通過API接口進行通信,提高了開發(fā)效率,便于前后端分工合作,有利于代碼的維護和迭代
    2024-10-10
  • Python中拆包的實現

    Python中拆包的實現

    拆包是一個非常實用且常見的操作,它能夠簡化代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • python3在同一行內輸入n個數并用列表保存的例子

    python3在同一行內輸入n個數并用列表保存的例子

    今天小編就為大家分享一篇python3在同一行內輸入n個數并用列表保存的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Pyinstaller打包.py生成.exe的方法和報錯總結

    Pyinstaller打包.py生成.exe的方法和報錯總結

    今天小編就為大家分享一篇關于Pyinstaller打包.py生成.exe的方法和報錯總結,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評論