机器学习中的数据预处理方法与步骤
數(shù)據(jù)預(yù)處理是準(zhǔn)備原始數(shù)據(jù)并使其適用于機(jī)器學(xué)習(xí)模型的過(guò)程。這是創(chuàng)建機(jī)器學(xué)習(xí)模型的第一步,也是至關(guān)重要的一步。
在創(chuàng)建機(jī)器學(xué)習(xí)項(xiàng)目時(shí),我們并不總是遇到干凈且格式化的數(shù)據(jù)。并且在對(duì)數(shù)據(jù)進(jìn)行任何操作時(shí),必須對(duì)其進(jìn)行清理并以格式化的方式放置。所以為此,我們使用數(shù)據(jù)預(yù)處理任務(wù)。
為什么我們需要數(shù)據(jù)預(yù)處理?
真實(shí)世界的數(shù)據(jù)通常包含噪聲、缺失值,并且可能采用無(wú)法直接用于機(jī)器學(xué)習(xí)模型的不可用格式。數(shù)據(jù)預(yù)處理是清理數(shù)據(jù)并使其適用于機(jī)器學(xué)習(xí)模型的必要任務(wù),這也提高了機(jī)器學(xué)習(xí)模型的準(zhǔn)確性和效率。
它涉及以下步驟:
一、獲取數(shù)據(jù)集
要?jiǎng)?chuàng)建機(jī)器學(xué)習(xí)模型,我們需要的第一件事是數(shù)據(jù)集,因?yàn)闄C(jī)器學(xué)習(xí)模型完全適用于數(shù)據(jù)。以適當(dāng)格式收集的特定問(wèn)題的數(shù)據(jù)稱為數(shù)據(jù)集。
數(shù)據(jù)集可能有不同的格式用于不同的目的,例如,如果我們想為商業(yè)目的創(chuàng)建關(guān)于肝病患者的機(jī)器學(xué)習(xí)模型,那么數(shù)據(jù)集將是肝病患者所需的數(shù)據(jù)集。數(shù)據(jù)集我們通常將其放入 CSV文件中。但是,有時(shí),我們可能還需要使用 HTML 或 xlsx 文件。
什么是 CSV 文件?CSV 代表“逗號(hào)分隔值”文件;它是一種文件格式,允許我們保存表格數(shù)據(jù),例如電子表格。它對(duì)于龐大的數(shù)據(jù)集很有用,并且可以在程序中使用這些數(shù)據(jù)集。
二、導(dǎo)入常見(jiàn)庫(kù)
為了使用 Python 進(jìn)行數(shù)據(jù)預(yù)處理,我們需要導(dǎo)入一些預(yù)定義的 Python 庫(kù)。這些庫(kù)用于執(zhí)行一些特定的工作。我們將使用三個(gè)特定的庫(kù)進(jìn)行數(shù)據(jù)預(yù)處理,它們是:
三、導(dǎo)入數(shù)據(jù)集
3.1 讀取數(shù)據(jù)
一般使用pandas來(lái)讀取文件:
data_set = pd .read_csv('Dataset.csv')data_set是存儲(chǔ)數(shù)據(jù)集的變量的名稱,在函數(shù)內(nèi)部,我們傳遞了數(shù)據(jù)集的名稱。一旦我們執(zhí)行了上面這行代碼,它將成功地在我們的代碼中導(dǎo)入數(shù)據(jù)集。
這里以心臟病數(shù)據(jù)集為例:
import pandas as pddata=pd.read_csv('heart.csv')data讀取如下:
3.2提取因變量和自變量
在機(jī)器學(xué)習(xí)中,區(qū)分特征矩陣(自變量)和因變量與數(shù)據(jù)集很重要。在我們的數(shù)據(jù)集中,有三個(gè)自變量age,sex…其中target是因變量。
提取自變量
x= data.iloc[:,:-1].values x如下:
為了提取自變量,我們將使用Pandas 庫(kù)的iloc[ ]方法。它用于從數(shù)據(jù)集中提取所需的行和列。在上面的代碼中,第一個(gè)冒號(hào)(😃 用于獲取所有行,第二個(gè)冒號(hào)(😃 用于獲取所有列。這里我們使用了:-1,因?yàn)槲覀儾幌肴∽詈笠涣?#xff0c;因?yàn)樗蜃兞俊R虼?#xff0c;通過(guò)這樣做,我們將獲得特征矩陣。
提取因變量
為了提取因變量,我們將再次使用 Pandas .iloc[] 方法:
在這里,我們只取了最后一列的所有行。它將給出因變量數(shù)組。輸出為:
array([0, 0, 0, ..., 0, 1, 0], dtype=int64)3.3 處理缺失數(shù)據(jù)
數(shù)據(jù)預(yù)處理的下一步是處理數(shù)據(jù)集中缺失的數(shù)據(jù)。如果我們的數(shù)據(jù)集包含一些缺失的數(shù)據(jù),那么它可能會(huì)給我們的機(jī)器學(xué)習(xí)模型帶來(lái)巨大的問(wèn)題。因此,有必要處理數(shù)據(jù)集中存在的缺失值。
處理缺失數(shù)據(jù)的方法: 處理缺失數(shù)據(jù)主要有兩種方式,分別是:
依然是處理心臟病數(shù)據(jù)集如下:
from sklearn.impute import SimpleImputer import numpy as npimputer = SimpleImputer(missing_values=np.nan, strategy='mean')imputerimputer= imputer.fit(x[:, 1:12]) x[:, 1:12]= imputer.transform(x[:, 1:12]) x輸出為:
array([[52., 1., 0., ..., 2., 2., 3.],[53., 1., 0., ..., 0., 0., 3.],[70., 1., 0., ..., 0., 0., 3.],...,[47., 1., 0., ..., 1., 1., 2.],[50., 0., 0., ..., 2., 0., 2.],[54., 1., 0., ..., 1., 1., 3.]])3.4 編碼分類數(shù)據(jù)
為了便于介紹這個(gè)編碼分類,這里我隨意構(gòu)造了一個(gè)數(shù)據(jù)集:
讀取:
如下:
array([['中國(guó)', 28, 21504],['美國(guó)', 29, 32102],['德國(guó)', 27, 34150],['法國(guó)', 25, 28740],['中國(guó)', 24, 18750]], dtype=object)查看目標(biāo):y
array(['是', '是', '否', '否', '否'], dtype=object)這里沒(méi)有缺失值,就不用處理了,但是為了演示這個(gè)過(guò)程,我還是假裝有缺失值來(lái)處理下:
from sklearn.impute import SimpleImputer import numpy as npimputer = SimpleImputer(missing_values=np.nan, strategy='mean')imputerimputer= imputer.fit(x[:, 1:2]) x[:, 1:2]= imputer.transform(x[:, 1:2]) x輸出為:
array([['中國(guó)', 28.0, 21504],['美國(guó)', 29.0, 32102],['德國(guó)', 27.0, 34150],['法國(guó)', 25.0, 28740],['中國(guó)', 24.0, 18750]], dtype=object)可以看到處理與未處理之間是沒(méi)有變化的,因?yàn)檫@個(gè)方法是用均值處理填充缺失值。
現(xiàn)在開(kāi)始講編碼分類:分類數(shù)據(jù)是具有某些類別的數(shù)據(jù),例如在我們的數(shù)據(jù)集中;有兩個(gè)分類變量:國(guó)家和購(gòu)買
由于機(jī)器學(xué)習(xí)模型完全適用于數(shù)學(xué)和數(shù)字,但如果我們的數(shù)據(jù)集有一個(gè)分類變量(字符),那么在構(gòu)建模型時(shí)可能會(huì)產(chǎn)生麻煩。因此有必要將這些分類變量編碼為數(shù)字。這就是為啥需要編碼。
對(duì)于國(guó)家變量:
首先,我們將國(guó)家變量轉(zhuǎn)換為分類數(shù)據(jù)。為此,我們將使用preprocessing庫(kù)中LabelEncoder()類:
輸出為:
array([[0, 28.0, 21504],[3, 29.0, 32102],[1, 27.0, 34150],[2, 25.0, 28740],[0, 24.0, 18750]], dtype=object)可以看到國(guó)家這里被編碼成了0,1,2,3三個(gè)數(shù)字,表示三種。如果這些國(guó)家有重復(fù),數(shù)字就會(huì)重復(fù)。第一個(gè)國(guó)家與第五個(gè)國(guó)家都是中國(guó),編碼后數(shù)字都是0。
對(duì)于購(gòu)買變量
同樣的到底對(duì)其進(jìn)行編碼:
輸出為:
array([1, 1, 0, 0, 0])可以看到”是“被編碼為1,”否“被編碼為0。因?yàn)橘?gòu)買的變量只有兩個(gè)類別是或否,所以自動(dòng)編碼為 0 和 1。
四、將數(shù)據(jù)集拆分為訓(xùn)練集和測(cè)試集
在機(jī)器學(xué)習(xí)數(shù)據(jù)預(yù)處理中,我們將數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集。這是數(shù)據(jù)預(yù)處理的關(guān)鍵步驟之一,因?yàn)橥ㄟ^(guò)這樣做,我們可以提高機(jī)器學(xué)習(xí)模型的性能。
假設(shè),如果我們通過(guò)一個(gè)數(shù)據(jù)集對(duì)我們的機(jī)器學(xué)習(xí)模型進(jìn)行了訓(xùn)練,并且我們通過(guò)一個(gè)完全不同的數(shù)據(jù)集對(duì)其進(jìn)行了測(cè)試。然后,這會(huì)給我們的模型理解模型之間的相關(guān)性帶來(lái)困難。
如果我們訓(xùn)練我們的模型非常好并且它的訓(xùn)練精度也非常高,但是我們給它提供了一個(gè)新的數(shù)據(jù)集,那么它會(huì)降低性能。因此,我們總是嘗試制作一個(gè)在訓(xùn)練集和測(cè)試數(shù)據(jù)集上表現(xiàn)良好的機(jī)器學(xué)習(xí)模型。在這里,我們可以將這些數(shù)據(jù)集定義為:訓(xùn)練集和測(cè)試集。
訓(xùn)練集:用于訓(xùn)練機(jī)器學(xué)習(xí)模型的數(shù)據(jù)集子集,我們已經(jīng)知道輸出。
測(cè)試集:用于測(cè)試機(jī)器學(xué)習(xí)模型的數(shù)據(jù)集子集,并通過(guò)使用測(cè)試集,模型預(yù)測(cè)輸出。
為了拆分?jǐn)?shù)據(jù)集,我們將使用以下代碼行將數(shù)據(jù)集以8:2進(jìn)行拆分:
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, random_state=0)解釋:
- 在上面的代碼中,第一行用于導(dǎo)入將數(shù)據(jù)集的數(shù)組拆分為隨機(jī)訓(xùn)練和測(cè)試子集。
- x_train:訓(xùn)練數(shù)據(jù)的特征
- x_test:測(cè)試數(shù)據(jù)的特征
- y_train:訓(xùn)練數(shù)據(jù)的因變量
- y_test:測(cè)試數(shù)據(jù)的自變量
在train_test_split() 函數(shù)中,我們傳遞了四個(gè)參數(shù),其中前兩個(gè)用于數(shù)據(jù)數(shù)組,test_size用于指定測(cè)試集的大小。test_size 可能是 0.5、0.3 或0 .2,它表示訓(xùn)練集和測(cè)試集的劃分比率。一般采用0.3或者0.2。
可以挨個(gè)查看一下:
五、特征縮放
特征縮放是機(jī)器學(xué)習(xí)中數(shù)據(jù)預(yù)處理的最后一步。它是一種將數(shù)據(jù)集的自變量標(biāo)準(zhǔn)化在特定范圍內(nèi)的技術(shù)。在特征縮放中,我們將變量放在相同的范圍和相同的比例中,這樣任何變量都不會(huì)支配另一個(gè)變量。
正如我們所看到的,年齡和工資列的值不在同一個(gè)范圍內(nèi)。機(jī)器學(xué)習(xí)模型是基于歐幾里德距離的,如果我們不對(duì)變量進(jìn)行縮放,那么它會(huì)在我們的機(jī)器學(xué)習(xí)模型中引起一些問(wèn)題。
歐幾里得距離為:
如果我們從年齡和薪水計(jì)算任何兩個(gè)值,那么薪水值將支配年齡值,并且會(huì)產(chǎn)生不正確的結(jié)果。所以為了消除這個(gè)問(wèn)題,我們需要為機(jī)器學(xué)習(xí)執(zhí)行特征縮放。
在機(jī)器學(xué)習(xí)中執(zhí)行特征縮放有兩種方法:
- 標(biāo)準(zhǔn)化
- 正常化
標(biāo)準(zhǔn)化方法:x為原始值,mean為平均值,a為標(biāo)準(zhǔn)差,x’為標(biāo)準(zhǔn)化后的值
正常化方法:x為原始值,min為最小值,max為最大值,x’為正常化后的值
在這里,我們將對(duì)數(shù)據(jù)集使用標(biāo)準(zhǔn)化方法,對(duì)于特征縮放,我們將sklearn.preprocessing庫(kù)的StandardScaler類導(dǎo)入為:
from sklearn.preprocessing import StandardScaler現(xiàn)在,我們將為自變量或特征創(chuàng)建StandardScaler類的對(duì)象。然后我們將擬合和轉(zhuǎn)換訓(xùn)練數(shù)據(jù)集。
from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_train查看輸出:
array([[-0.96225045, 0.72760688, -0.70185794],[ 1.34715063, 1.21267813, 1.2711634 ],[ 0.57735027, -0.72760688, 0.6452625 ],[-0.96225045, -1.21267813, -1.21456796]])對(duì)于測(cè)試數(shù)據(jù)集,我們將直接應(yīng)用transform()函數(shù)而不是fit_transform()因?yàn)樗呀?jīng)在訓(xùn)練集中完成了。
x_test = st_x .transform(x_test) x_test輸出為:
array([[-0.19245009, 0.24253563, 1.65243796]])通過(guò)執(zhí)行上述代碼行,我們將得到 x_train 和 x_test 的縮放值。正如我們?cè)谏厦娴妮敵鲋锌吹降?#xff0c;所有變量都在值 -1 到 1 之間縮放,不過(guò)還是會(huì)有幾個(gè)值在縮放后遠(yuǎn)離這個(gè)范圍,這是正常的。
注意:
在這里,我們沒(méi)有對(duì)因變量進(jìn)行縮放,因?yàn)橹挥袃蓚€(gè)值 0 和 1。但是如果這些變量的取值范圍更大,那么我們還需要對(duì)這些變量進(jìn)行縮放。
注意,以上數(shù)據(jù)是我編的,不具有實(shí)際性,你應(yīng)該是從這個(gè)里面學(xué)習(xí)對(duì)應(yīng)方法。說(shuō)白了,對(duì)于非字符變量需要編碼,編碼成數(shù)字,本來(lái)就是數(shù)字就不用編碼了。
如果你python基礎(chǔ)不夠好,可以參考我的基礎(chǔ)專欄,其中有教程也有練習(xí)題。如果你覺(jué)得我專欄的題太少了,你需要更多的刷題,推薦一個(gè)免費(fèi)刷題網(wǎng)站:牛客網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的机器学习中的数据预处理方法与步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器学习数据不平衡问题及其解决方法
- 下一篇: oc语言的特点