机器学习中的数据预处理方法与步骤
數據預處理是準備原始數據并使其適用于機器學習模型的過程。這是創建機器學習模型的第一步,也是至關重要的一步。
在創建機器學習項目時,我們并不總是遇到干凈且格式化的數據。并且在對數據進行任何操作時,必須對其進行清理并以格式化的方式放置。所以為此,我們使用數據預處理任務。
為什么我們需要數據預處理?
真實世界的數據通常包含噪聲、缺失值,并且可能采用無法直接用于機器學習模型的不可用格式。數據預處理是清理數據并使其適用于機器學習模型的必要任務,這也提高了機器學習模型的準確性和效率。
它涉及以下步驟:
一、獲取數據集
要創建機器學習模型,我們需要的第一件事是數據集,因為機器學習模型完全適用于數據。以適當格式收集的特定問題的數據稱為數據集。
數據集可能有不同的格式用于不同的目的,例如,如果我們想為商業目的創建關于肝病患者的機器學習模型,那么數據集將是肝病患者所需的數據集。數據集我們通常將其放入 CSV文件中。但是,有時,我們可能還需要使用 HTML 或 xlsx 文件。
什么是 CSV 文件?CSV 代表“逗號分隔值”文件;它是一種文件格式,允許我們保存表格數據,例如電子表格。它對于龐大的數據集很有用,并且可以在程序中使用這些數據集。
二、導入常見庫
為了使用 Python 進行數據預處理,我們需要導入一些預定義的 Python 庫。這些庫用于執行一些特定的工作。我們將使用三個特定的庫進行數據預處理,它們是:
三、導入數據集
3.1 讀取數據
一般使用pandas來讀取文件:
data_set = pd .read_csv('Dataset.csv')data_set是存儲數據集的變量的名稱,在函數內部,我們傳遞了數據集的名稱。一旦我們執行了上面這行代碼,它將成功地在我們的代碼中導入數據集。
這里以心臟病數據集為例:
import pandas as pddata=pd.read_csv('heart.csv')data讀取如下:
3.2提取因變量和自變量
在機器學習中,區分特征矩陣(自變量)和因變量與數據集很重要。在我們的數據集中,有三個自變量age,sex…其中target是因變量。
提取自變量
x= data.iloc[:,:-1].values x如下:
為了提取自變量,我們將使用Pandas 庫的iloc[ ]方法。它用于從數據集中提取所需的行和列。在上面的代碼中,第一個冒號(😃 用于獲取所有行,第二個冒號(😃 用于獲取所有列。這里我們使用了:-1,因為我們不想取最后一列,因為它包含因變量。因此,通過這樣做,我們將獲得特征矩陣。
提取因變量
為了提取因變量,我們將再次使用 Pandas .iloc[] 方法:
在這里,我們只取了最后一列的所有行。它將給出因變量數組。輸出為:
array([0, 0, 0, ..., 0, 1, 0], dtype=int64)3.3 處理缺失數據
數據預處理的下一步是處理數據集中缺失的數據。如果我們的數據集包含一些缺失的數據,那么它可能會給我們的機器學習模型帶來巨大的問題。因此,有必要處理數據集中存在的缺失值。
處理缺失數據的方法: 處理缺失數據主要有兩種方式,分別是:
依然是處理心臟病數據集如下:
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 編碼分類數據
為了便于介紹這個編碼分類,這里我隨意構造了一個數據集:
讀取:
如下:
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 npimputer = 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()類:
輸出為:
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。
對于購買變量
同樣的到底對其進行編碼:
輸出為:
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。但是如果這些變量的取值范圍更大,那么我們還需要對這些變量進行縮放。
注意,以上數據是我編的,不具有實際性,你應該是從這個里面學習對應方法。說白了,對于非字符變量需要編碼,編碼成數字,本來就是數字就不用編碼了。
如果你python基礎不夠好,可以參考我的基礎專欄,其中有教程也有練習題。如果你覺得我專欄的題太少了,你需要更多的刷題,推薦一個免費刷題網站:牛客網
總結
以上是生活随笔為你收集整理的机器学习中的数据预处理方法与步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习数据不平衡问题及其解决方法
- 下一篇: oc语言的特点