python進(jìn)行數(shù)據(jù)預(yù)處理的4個重要步驟
如果有正確的數(shù)據(jù)預(yù)處理和特征工程,該模型更有可能與數(shù)據(jù)未得到很好預(yù)處理的模型相比,產(chǎn)生更好的結(jié)果。
數(shù)據(jù)預(yù)處理主要有4個重要步驟。
- 拆分訓(xùn)練集和測試集
- 處理缺失值
- 處理分類特征
- 進(jìn)行標(biāo)準(zhǔn)化處理
拆分訓(xùn)練集和測試集
訓(xùn)練集和測試集拆分是機(jī)器學(xué)習(xí)中的重要步驟之一。
這非常重要,因為你的模型需要在部署之前進(jìn)行評估。
訓(xùn)練集和測試集拆分背后的主要思想是將原始數(shù)據(jù)集轉(zhuǎn)換為兩部分
- 訓(xùn)練集
- 測試集
其中訓(xùn)練集由訓(xùn)練數(shù)據(jù)和訓(xùn)練標(biāo)簽組成,測試集由測試數(shù)據(jù)和測試標(biāo)簽組成。
最簡單的方法是使用 scikit-learn 的 一個內(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)
在這里,我們在 train_test_split 中傳入了 X 和 y 作為參數(shù) ,它將 X 和 y 進(jìn)行拆分,其中訓(xùn)練集占 80%,測試集占 20% 。
處理缺失值
你可能聽說過一個著名的機(jī)器學(xué)習(xí)短語,它是
Garbage in Garbage out
如果你的數(shù)據(jù)集充滿了缺失值,那么你的模型效果也不好。
因此,處理此類缺失值很重要。
讓我們用一個虛擬數(shù)據(jù)集來看看我們?nèi)绾谓鉀Q這個問題。
首先查看一下數(shù)據(jù)集中的缺失值。
df.isna().sum()
我們可以看到數(shù)據(jù)集中有缺失值。
填充缺失值的一種方法是用該列的平均值填充。
例如,我們可以用該列所有學(xué)生的平均值來填充 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ù)來做到這一點。
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ù)框中的所有空行并將其存儲在另一個數(shù)據(jù)框中。
dropedD.isna().sum()
處理分類特征
我們可以通過將它們轉(zhuǎn)換為整數(shù)來處理分類特征。有兩種常見的方法可以做到這一點。
- Label Encoding
- One Hot Encoding
在 Label Encoder中,將分類值轉(zhuǎn)換為數(shù)字標(biāo)簽。假設(shè)這是我們的數(shù)據(jù)集
在 Country 列上使用 Label Encoding 會將 India 轉(zhuǎn)換為 1,將 USA 轉(zhuǎn)換為 2,將 China 轉(zhuǎn)換為 0。
這種技術(shù)有一個缺點,即由于 USA 的標(biāo)簽高,它給予 USA 最高優(yōu)先級,而 China 的優(yōu)先級最低,標(biāo)簽為 0。
from sklearn.preprocessing import LabelEncoder l1 = LabelEncoder() l1.fit(catDf['Country']) catDf.Country = l1.transform(catDf.Country) print(catDf)
如代碼所示,我們實例化了一個 LabelEncoder 對象,然后使用 fit 方法將其應(yīng)用到分類列上,然后使用 transform 方法進(jìn)行轉(zhuǎn)換。
在 OneHotEncoder 中 ,我們?yōu)槊總€唯一的分類值創(chuàng)建一個新列。
下面通過一個例子來了解一下。
我們將添加另一個分類列,即 “Continent”。
catDf['Continent'] = ['Asia', 'North America', 'Asia']
現(xiàn)在因為我們有 2 個分類列,它們是 [['Country', 'Continent']],我們可以對它們進(jìn)行獨熱編碼。
有兩種方法可以做到這一點。
1.DataFrame.get_dummies
這是一種非常常見的方法,我們使用 pandas 內(nèi)置函數(shù) get_dummies 將數(shù)據(jù)幀中的分類值轉(zhuǎn)換為獨熱編碼。
pd.get_dummies(data=catDf)
這將 返回 一個數(shù)據(jù)幀。
在這里我們可以看到它已經(jīng)將 Country 列的唯一值轉(zhuǎn)換為 3 個不同的列,分別是 Country_China、Country_India 和 Country_USA。同樣,Continent 列的 2 個唯一值已轉(zhuǎn)換為 2 個不同的列,分別命名為 Continent_Asia 和 Continent_North America。
2.OneHotEncoder
使用 scikit-learn 中的 OneHotEncoder 也是一種常見的做法。
它提供了更多的靈活性和更多的選擇,但使用起來有點困難。
讓我們看看如何為我們的數(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 對象,并在數(shù)據(jù)框中對我們想要的列(列號 0 和列號 3)上使用了它的 fit_transform方法。
fit_transform 的返回類型 是 numpy.ndarray ,所以我們通過pd.DataFrame 將其轉(zhuǎn)換為數(shù)據(jù)框 ,并存儲在一個變量中。
然后,為了將它加入我們的原始數(shù)據(jù)幀,可以使用 pd.concat 連接 2 個不同數(shù)據(jù)幀。
你可以看到,與 pd.get_dummies 相比,它的可讀性并不清晰
但是如果你比較使用 pd.get_dummies 和 OneHotEncoder 獲得的最后 5 列,它們都是相等的。
標(biāo)準(zhǔn)化數(shù)據(jù)集
某些實驗證明,與未標(biāo)準(zhǔn)化的數(shù)據(jù)集相比,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型在標(biāo)準(zhǔn)化數(shù)據(jù)集上的表現(xià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
正則化是將 **每個樣本縮放到單位范數(shù)(每個樣本的范數(shù)為1)**的過程。
如果你計劃使用二次型(點積)或任何其他核方法來計算兩個樣本之間的相似性,則此過程會很有用。
Normalization 主要思想是對每個樣本計算其p-范數(shù),然后對該樣本中每個元素除以該范數(shù),這樣處理的結(jié)果是使得每個處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。
使用過程非常簡單,與 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個重要步驟的詳細(xì)內(nèi)容,更多關(guān)于python 數(shù)據(jù)預(yù)處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
TensorFlow實現(xiàn)MLP多層感知機(jī)模型
這篇文章主要為大家詳細(xì)介紹了TensorFlow實現(xiàn)MLP多層感知機(jī)模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03Python直接使用plot()函數(shù)畫圖的方法實例
Python非常簡單而又非常強大,它的功能之一就是畫出漂亮的圖表,實現(xiàn)數(shù)據(jù)的可視化,下面這篇文章主要給大家介紹了關(guān)于Python直接使用plot()函數(shù)畫圖的相關(guān)資料,需要的朋友可以參考下2022-05-05使用Pytorch實現(xiàn)two-head(多輸出)模型的操作
這篇文章主要介紹了使用Pytorch實現(xiàn)two-head(多輸出)模型的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05