python進(jìn)行數(shù)據(jù)預(yù)處理的4個(gè)重要步驟
如果有正確的數(shù)據(jù)預(yù)處理和特征工程,該模型更有可能與數(shù)據(jù)未得到很好預(yù)處理的模型相比,產(chǎn)生更好的結(jié)果。
數(shù)據(jù)預(yù)處理主要有4個(gè)重要步驟。
- 拆分訓(xùn)練集和測(cè)試集
- 處理缺失值
- 處理分類特征
- 進(jìn)行標(biāo)準(zhǔn)化處理
拆分訓(xùn)練集和測(cè)試集
訓(xùn)練集和測(cè)試集拆分是機(jī)器學(xué)習(xí)中的重要步驟之一。
這非常重要,因?yàn)槟愕哪P托枰诓渴鹬斑M(jìn)行評(píng)估。
訓(xùn)練集和測(cè)試集拆分背后的主要思想是將原始數(shù)據(jù)集轉(zhuǎn)換為兩部分
- 訓(xùn)練集
- 測(cè)試集
其中訓(xùn)練集由訓(xùn)練數(shù)據(jù)和訓(xùn)練標(biāo)簽組成,測(cè)試集由測(cè)試數(shù)據(jù)和測(cè)試標(biāo)簽組成。
最簡(jiǎn)單的方法是使用 scikit-learn 的 一個(gè)內(nèi)置函數(shù) train_test_split。
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
在這里,我們?cè)?train_test_split 中傳入了 X 和 y 作為參數(shù) ,它將 X 和 y 進(jìn)行拆分,其中訓(xùn)練集占 80%,測(cè)試集占 20% 。
處理缺失值
你可能聽說(shuō)過(guò)一個(gè)著名的機(jī)器學(xué)習(xí)短語(yǔ),它是
Garbage in Garbage out
如果你的數(shù)據(jù)集充滿了缺失值,那么你的模型效果也不好。
因此,處理此類缺失值很重要。
讓我們用一個(gè)虛擬數(shù)據(jù)集來(lái)看看我們?nèi)绾谓鉀Q這個(gè)問(wèn)題。
首先查看一下數(shù)據(jù)集中的缺失值。
df.isna().sum()

我們可以看到數(shù)據(jù)集中有缺失值。
填充缺失值的一種方法是用該列的平均值填充。
例如,我們可以用該列所有學(xué)生的平均值來(lái)填充 Final 列的缺失值。
為此,我們可以使用 sklearn.impute 中的 SimpleImputer 。
from sklearn.impute import SimpleImputer imputer = SimpleImputer(fill_value=np.nan, startegy='mean') X = imputer.fit_transform(df)
這將使用 該列的 平均值 填充數(shù)據(jù)框 df 中的所有缺失值 。
可以使用 fit_transform 函數(shù)來(lái)做到這一點(diǎn)。
X = pd.DataFrame(X, columns=df.columns) print(X)

現(xiàn)在,可以看到所有缺失值都用均值進(jìn)行了填充
X.isna().sum()

我們也可以在 SimpleImputer 中使用 mean、 meadian、 mode 等 。
如果 缺失值的行數(shù)較少,或者我們的數(shù)據(jù)不建議填充缺失值,那么可以在 pandas 中使用 dropna 刪除缺失的行。
dropedDf = df.dropna()
在這里,我們刪除了數(shù)據(jù)框中的所有空行并將其存儲(chǔ)在另一個(gè)數(shù)據(jù)框中。
dropedD.isna().sum()

處理分類特征
我們可以通過(guò)將它們轉(zhuǎn)換為整數(shù)來(lái)處理分類特征。有兩種常見的方法可以做到這一點(diǎn)。
- Label Encoding
- One Hot Encoding
在 Label Encoder中,將分類值轉(zhuǎn)換為數(shù)字標(biāo)簽。假設(shè)這是我們的數(shù)據(jù)集

在 Country 列上使用 Label Encoding 會(huì)將 India 轉(zhuǎn)換為 1,將 USA 轉(zhuǎn)換為 2,將 China 轉(zhuǎn)換為 0。
這種技術(shù)有一個(gè)缺點(diǎn),即由于 USA 的標(biāo)簽高,它給予 USA 最高優(yōu)先級(jí),而 China 的優(yōu)先級(jí)最低,標(biāo)簽為 0。
from sklearn.preprocessing import LabelEncoder l1 = LabelEncoder() l1.fit(catDf['Country']) catDf.Country = l1.transform(catDf.Country) print(catDf)

如代碼所示,我們實(shí)例化了一個(gè) LabelEncoder 對(duì)象,然后使用 fit 方法將其應(yīng)用到分類列上,然后使用 transform 方法進(jìn)行轉(zhuǎn)換。
在 OneHotEncoder 中 ,我們?yōu)槊總€(gè)唯一的分類值創(chuàng)建一個(gè)新列。
下面通過(guò)一個(gè)例子來(lái)了解一下。
我們將添加另一個(gè)分類列,即 “Continent”。
catDf['Continent'] = ['Asia', 'North America', 'Asia']

現(xiàn)在因?yàn)槲覀冇?2 個(gè)分類列,它們是 [['Country', 'Continent']],我們可以對(duì)它們進(jìn)行獨(dú)熱編碼。
有兩種方法可以做到這一點(diǎn)。
1.DataFrame.get_dummies
這是一種非常常見的方法,我們使用 pandas 內(nèi)置函數(shù) get_dummies 將數(shù)據(jù)幀中的分類值轉(zhuǎn)換為獨(dú)熱編碼。
pd.get_dummies(data=catDf)
這將 返回 一個(gè)數(shù)據(jù)幀。

在這里我們可以看到它已經(jīng)將 Country 列的唯一值轉(zhuǎn)換為 3 個(gè)不同的列,分別是 Country_China、Country_India 和 Country_USA。同樣,Continent 列的 2 個(gè)唯一值已轉(zhuǎn)換為 2 個(gè)不同的列,分別命名為 Continent_Asia 和 Continent_North America。
2.OneHotEncoder
使用 scikit-learn 中的 OneHotEncoder 也是一種常見的做法。
它提供了更多的靈活性和更多的選擇,但使用起來(lái)有點(diǎn)困難。
讓我們看看如何為我們的數(shù)據(jù)集做這件事。
from sklearn.preprocessing import OneHotEncoder oh = OneHotEncoder() s1 = pd.DataFrame(oh.fit_transform(catDf.iloc[:, [0,3]])) catDf = pd.concat([catDf, s1], axis=1)
在這里,我們已經(jīng)初始化了 OneHotEncoder 對(duì)象,并在數(shù)據(jù)框中對(duì)我們想要的列(列號(hào) 0 和列號(hào) 3)上使用了它的 fit_transform方法。
fit_transform 的返回類型 是 numpy.ndarray ,所以我們通過(guò)pd.DataFrame 將其轉(zhuǎn)換為數(shù)據(jù)框 ,并存儲(chǔ)在一個(gè)變量中。
然后,為了將它加入我們的原始數(shù)據(jù)幀,可以使用 pd.concat 連接 2 個(gè)不同數(shù)據(jù)幀。

你可以看到,與 pd.get_dummies 相比,它的可讀性并不清晰
但是如果你比較使用 pd.get_dummies 和 OneHotEncoder 獲得的最后 5 列,它們都是相等的。
標(biāo)準(zhǔn)化數(shù)據(jù)集
某些實(shí)驗(yàn)證明,與未標(biāo)準(zhǔn)化的數(shù)據(jù)集相比,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型在標(biāo)準(zhǔn)化數(shù)據(jù)集上的表現(xiàn)更好。
有幾種方法可以做到這一點(diǎn)。我將討論標(biāo)準(zhǔn)化數(shù)據(jù)集的 2 種常用方法。
1、Standard Scaler

使用這種技術(shù),可以將數(shù)據(jù)集轉(zhuǎn)化為均值為 0,標(biāo)準(zhǔn)差為 1。
from sklearn.preprocessing import StandardScaler ss = StandardScaler() catDf.iloc[:,1:-1] = ss.fit_transform(catDf.iloc[:,1:-1]) print(catDf)

2、Normalization
正則化是將 **每個(gè)樣本縮放到單位范數(shù)(每個(gè)樣本的范數(shù)為1)**的過(guò)程。
如果你計(jì)劃使用二次型(點(diǎn)積)或任何其他核方法來(lái)計(jì)算兩個(gè)樣本之間的相似性,則此過(guò)程會(huì)很有用。
Normalization 主要思想是對(duì)每個(gè)樣本計(jì)算其p-范數(shù),然后對(duì)該樣本中每個(gè)元素除以該范數(shù),這樣處理的結(jié)果是使得每個(gè)處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。
使用過(guò)程非常簡(jiǎn)單,與 StandaradScaler 類似。
from sklearn.preprocessing import Normalizer norm = Normalizer() catDf.iloc[:,1:-1] = norm.fit_transform(catDf.iloc[:,1:-1]) catDf

以上就是python進(jìn)行數(shù)據(jù)預(yù)處理的4個(gè)重要步驟的詳細(xì)內(nèi)容,更多關(guān)于python 數(shù)據(jù)預(yù)處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch查看通道數(shù) 維數(shù) 尺寸大小方式
這篇文章主要介紹了pytorch查看通道數(shù) 維數(shù) 尺寸大小方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python實(shí)現(xiàn)aes加密解密多種方法解析
這篇文章主要介紹了Python實(shí)現(xiàn)aes加密解密多種方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
使用 Python 和 OpenCV 實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖功能
在現(xiàn)代應(yīng)用中,人臉檢測(cè)是一項(xiàng)非常重要的技術(shù),廣泛應(yīng)用于安全監(jiān)控、身份驗(yàn)證等領(lǐng)域,本文詳細(xì)介紹了如何使用 Python 和 OpenCV 庫(kù)實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖,并通過(guò)具體的代碼示例展示了整個(gè)過(guò)程,感興趣的朋友一起看看吧2024-11-11
用Python實(shí)現(xiàn)數(shù)據(jù)篩選與匹配實(shí)例
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)數(shù)據(jù)篩選與匹配實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
pytorch實(shí)現(xiàn)用Resnet提取特征并保存為txt文件的方法
今天小編大家分享一篇pytorch實(shí)現(xiàn)用Resnet提取特征并保存為txt文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python之ThreadPoolExecutor線程池問(wèn)題
這篇文章主要介紹了Python之ThreadPoolExecutor線程池問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
python簡(jiǎn)單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程
你會(huì)用python獲取各種DOS命令顯示的內(nèi)容核心嗎?說(shuō)的可不是返回值,是用system()函數(shù)調(diào)用windows操作系統(tǒng)的DOS命令來(lái)做點(diǎn)事情,需要的朋友可以參考下2021-10-10

