資料預處理是準備原始資料并使其适用于機器學習模型的過程。這是建立機器學習模型的第一步,也是至關重要的一步。
在建立機器學習項目時,我們并不總是遇到幹淨且格式化的資料。并且在對資料進行任何操作時,必須對其進行清理并以格式化的方式放置。是以為此,我們使用資料預處理任務。
為什麼我們需要資料預處理?
真實世界的資料通常包含噪聲、缺失值,并且可能采用無法直接用于機器學習模型的不可用格式。資料預處理是清理資料并使其适用于機器學習模型的必要任務,這也提高了機器學習模型的準确性和效率。
它涉及以下步驟:
- 擷取資料集
- 導入相關庫
- 導入資料集
- 查找缺失的資料
- 編碼分類資料
- 将資料集拆分為訓練集和測試集
- 特征縮放
一、擷取資料集
要建立機器學習模型,我們需要的第一件事是資料集,因為機器學習模型完全适用于資料。以适當格式收集的特定問題的資料稱為資料集。
資料集可能有不同的格式用于不同的目的,例如,如果我們想為商業目的建立關于肝病患者的機器學習模型,那麼資料集将是肝病患者所需的資料集。資料集我們通常将其放入 CSV檔案中。但是,有時,我們可能還需要使用 HTML 或 xlsx 檔案。
什麼是 CSV 檔案?CSV 代表“逗号分隔值”檔案;它是一種檔案格式,允許我們儲存表格資料,例如電子表格。它對于龐大的資料集很有用,并且可以在程式中使用這些資料集。
二、導入常見庫
為了使用 Python 進行資料預處理,我們需要導入一些預定義的 Python 庫。這些庫用于執行一些特定的工作。我們将使用三個特定的庫進行資料預處理,它們是:
- numpy
- matplotlib
- pandas
三、導入資料集
3.1 讀取資料
一般使用pandas來讀取檔案:
data_set = pd .read_csv('Dataset.csv')
data_set是存儲資料集的變量的名稱,在函數内部,我們傳遞了資料集的名稱。一旦我們執行了上面這行代碼,它将成功地在我們的代碼中導入資料集。
這裡以心髒病資料集為例:
import pandas as pd
data=pd.read_csv('heart.csv')
data
讀取如下:
3.2提取因變量和自變量
在機器學習中,區分特征矩陣(自變量)和因變量與資料集很重要。在我們的資料集中,有三個自變量age,sex…其中target是因變量。
提取自變量
x= data.iloc[:,:-1].values
x
如下:
為了提取自變量,我們将使用Pandas 庫的iloc[ ]方法。它用于從資料集中提取所需的行和列。在上面的代碼中,第一個冒号(???? 用于擷取所有行,第二個冒号(???? 用于擷取所有列。這裡我們使用了:-1,因為我們不想取最後一列,因為它包含因變量。是以,通過這樣做,我們将獲得特征矩陣。
提取因變量
為了提取因變量,我們将再次使用 Pandas .iloc[] 方法:
y = data .iloc[:,-1].values
y
在這裡,我們隻取了最後一列的所有行。它将給出因變量數組。輸出為:
array([0, 0, 0, ..., 0, 1, 0], dtype=int64)
3.3 處理缺失資料
資料預處理的下一步是處理資料集中缺失的資料。如果我們的資料集包含一些缺失的資料,那麼它可能會給我們的機器學習模型帶來巨大的問題。是以,有必要處理資料集中存在的缺失值。
處理缺失資料的方法: 處理缺失資料主要有兩種方式,分别是:
- 通過删除特定的行:第一種方法通常用于處理空值。這樣,我們隻需删除包含空值的特定行或列。但這種方式效率不高,删除資料可能會導緻資訊丢失,無法給出準确的輸出。
- 通過計算平均值:通過這種方式,我們将計算包含任何缺失值的列或行的平均值,并将其放在缺失值的位置。這種政策對于具有數字資料的特征很有用,例如年齡、薪水、年份等。在這裡,我們将使用這種方法。
依然是處理心髒病資料集如下:
from sklearn.impute import SimpleImputer
import numpy as np
imputer = 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 編碼分類資料
為了便于介紹這個編碼分類,這裡我随意構造了一個資料集:
讀取:
import pandas as pd
data=pd.read_csv('ceshi.csv',encoding='gbk')
x= data.iloc[:,:-1].values
y = data .iloc[:,-1].values
x
如下:
array([['中國', 28, 21504],
['美國', 29, 32102],
['德國', 27, 34150],
['法國', 25, 28740],
['中國', 24, 18750]], dtype=object)
檢視目标:y
array(['是', '是', '否', '否', '否'], dtype=object)
這裡沒有缺失值,就不用處理了,但是為了示範這個過程,我還是假裝有缺失值來處理下:
from sklearn.impute import SimpleImputer
import numpy as np
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputerimputer= imputer.fit(x[:, 1:2])
x[:, 1:2]= imputer.transform(x[:, 1:2])
x
輸出為:
array([['中國', 28.0, 21504],
['美國', 29.0, 32102],
['德國', 27.0, 34150],
['法國', 25.0, 28740],
['中國', 24.0, 18750]], dtype=object)
可以看到處理與未處理之間是沒有變化的,因為這個方法是用均值處理填充缺失值。
現在開始講編碼分類:分類資料是具有某些類别的資料,例如在我們的資料集中;有兩個分類變量:國家和購買
由于機器學習模型完全适用于數學和數字,但如果我們的資料集有一個分類變量(字元),那麼在構模組化型時可能會産生麻煩。是以有必要将這些分類變量編碼為數字。這就是為啥需要編碼。
對于國家變量:
首先,我們将國家變量轉換為分類資料。為此,我們将使用preprocessing庫中LabelEncoder()類:
from sklearn.preprocessing import LabelEncoder
label_encoder_x= LabelEncoder()
x[:, 0]= label_encoder_x.fit_transform(x[:, 0])
x
輸出為:
array([[0, 28.0, 21504],
[3, 29.0, 32102],
[1, 27.0, 34150],
[2, 25.0, 28740],
[0, 24.0, 18750]], dtype=object)
可以看到國家這裡被編碼成了0,1,2,3三個數字,表示三種。如果這些國家有重複,數字就會重複。第一個國家與第五個國家都是中國,編碼後數字都是0。
對于購買變量
同樣的到底對其進行編碼:
labelencoder_y= LabelEncoder()
y= labelencoder_y.fit_transform(y)
y
輸出為:
array([1, 1, 0, 0, 0])
可以看到”是“被編碼為1,”否“被編碼為0。因為購買的變量隻有兩個類别是或否,是以自動編碼為 0 和 1。
四、将資料集拆分為訓練集和測試集
在機器學習資料預進行中,我們将資料集分為訓練集和測試集。這是資料預處理的關鍵步驟之一,因為通過這樣做,我們可以提高機器學習模型的性能。
假設,如果我們通過一個資料集對我們的機器學習模型進行了訓練,并且我們通過一個完全不同的資料集對其進行了測試。然後,這會給我們的模型了解模型之間的相關性帶來困難。
如果我們訓練我們的模型非常好并且它的訓練精度也非常高,但是我們給它提供了一個新的資料集,那麼它會降低性能。是以,我們總是嘗試制作一個在訓練集和測試資料集上表現良好的機器學習模型。在這裡,我們可以将這些資料集定義為:訓練集和測試集。
訓練集:用于訓練機器學習模型的資料集子集,我們已經知道輸出。
測試集:用于測試機器學習模型的資料集子集,并通過使用測試集,模型預測輸出。
為了拆分資料集,我們将使用以下代碼行将資料集以8:2進行拆分:
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)
解釋:
- 在上面的代碼中,第一行用于導入将資料集的數組拆分為随機訓練和測試子集。
- x_train:訓練資料的特征
- x_test:測試資料的特征
- y_train:訓練資料的因變量
- y_test:測試資料的自變量
在train_test_split() 函數中,我們傳遞了四個參數,其中前兩個用于資料數組,test_size用于指定測試集的大小。test_size 可能是 0.5、0.3 或0 .2,它表示訓練集和測試集的劃分比率。一般采用0.3或者0.2。
可以挨個檢視一下:
五、特征縮放
特征縮放是機器學習中資料預處理的最後一步。它是一種将資料集的自變量标準化在特定範圍内的技術。在特征縮放中,我們将變量放在相同的範圍和相同的比例中,這樣任何變量都不會支配另一個變量。
正如我們所看到的,年齡和工資列的值不在同一個範圍内。機器學習模型是基于歐幾裡德距離的,如果我們不對變量進行縮放,那麼它會在我們的機器學習模型中引起一些問題。
歐幾裡得距離為:
如果我們從年齡和薪水計算任何兩個值,那麼薪水值将支配年齡值,并且會産生不正确的結果。是以為了消除這個問題,我們需要為機器學習執行特征縮放。
在機器學習中執行特征縮放有兩種方法:
- 标準化
- 正常化
标準化方法:x為原始值,mean為平均值,a為标準差,x’為标準化後的值
正常化方法:x為原始值,min為最小值,max為最大值,x’為正常化後的值
在這裡,我們将對資料集使用标準化方法,對于特征縮放,我們将sklearn.preprocessing庫的StandardScaler類導入為:
from sklearn.preprocessing import StandardScaler
現在,我們将為自變量或特征建立StandardScaler類的對象。然後我們将拟合和轉換訓練資料集。
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]])
對于測試資料集,我們将直接應用transform()函數而不是fit_transform()因為它已經在訓練集中完成了。
x_test = st_x .transform(x_test)
x_test
輸出為:
array([[-0.19245009, 0.24253563, 1.65243796]])
通過執行上述代碼行,我們将得到 x_train 和 x_test 的縮放值。正如我們在上面的輸出中看到的,所有變量都在值 -1 到 1 之間縮放,不過還是會有幾個值在縮放後遠離這個範圍,這是正常的。
注意:
在這裡,我們沒有對因變量進行縮放,因為隻有兩個值 0 和 1。但是如果這些變量的取值範圍更大,那麼我們還需要對這些變量進行縮放。