自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)清洗&預(yù)處理入門完整指南

開發(fā) 開發(fā)工具 機器學(xué)習(xí) 大數(shù)據(jù)
本文是一個初學(xué)者指南,將帶你領(lǐng)略如何在任意的數(shù)據(jù)集上,針對任意一個機器學(xué)習(xí)模型,完成數(shù)據(jù)預(yù)處理工作。

數(shù)據(jù)預(yù)處理是建立機器學(xué)習(xí)模型的***步(也很可能是最重要的一步),對最終結(jié)果有決定性的作用:如果你的數(shù)據(jù)集沒有完成數(shù)據(jù)清洗和預(yù)處理,那么你的模型很可能也不會有效——就是這么簡單。

[[257841]]

人們通常認(rèn)為,數(shù)據(jù)預(yù)處理是一個非常枯燥的部分。但它就是「做好準(zhǔn)備」和「完全沒有準(zhǔn)備」之間的差別,也是表現(xiàn)專業(yè)和業(yè)余之間的差別。就像為度假做好事先準(zhǔn)備一樣,如果你提前將行程細(xì)節(jié)確定好,就能夠預(yù)防旅途變成一場噩夢。

那么,應(yīng)該怎么做呢?

本文將帶你領(lǐng)略,如何在任意的數(shù)據(jù)集上,針對任意一個機器學(xué)習(xí)模型,完成數(shù)據(jù)預(yù)處理工作。

***步,導(dǎo)入

讓我們從導(dǎo)入數(shù)據(jù)預(yù)處理所需要的庫開始吧。庫是非常棒的使用工具:將輸入傳遞給庫,它則完成相應(yīng)的工作。你可以接觸到非常多的庫,但在 PYTHON 中,有三個是最基礎(chǔ)的庫。任何時候,你都很可能最終還是使用到它們。這三個在使用 PYTHON 時***的庫就是 Numpy、Matplotlib 和 Pandas。Numpy 是滿足所有數(shù)學(xué)運算所需要的庫,由于代碼是基于數(shù)學(xué)公式運行的,因此就會使用到它。Maplotlib(具體而言,Matplotlib.pyplot)則是滿足繪圖所需要的庫。Pandas 則是***的導(dǎo)入并處理數(shù)據(jù)集的一個庫。對于數(shù)據(jù)預(yù)處理而言,Pandas 和 Numpy 基本是必需的。

最適當(dāng)?shù)姆绞绞?,在?dǎo)入這些庫的時候,賦予其縮寫的稱呼形式,在之后的使用中,這可以節(jié)省一定的時間成本。這一步非常簡單,可以用如下方式實現(xiàn):

  1. import numpy as np 
  2. import matplotlib.pyplot as plt 
  3. import pandas as pd 

現(xiàn)在,可以通過輸入如下語句讀入數(shù)據(jù)集

  1. dataset = pd.read_csv('my_data.csv') 

這個語句告訴 Pandas(pd) 來讀入數(shù)據(jù)集。在本文中,我也附上數(shù)據(jù)集的前幾行數(shù)據(jù)。

我們有了數(shù)據(jù)集,但需要創(chuàng)建一個矩陣來保存自變量,以及一個向量來保存因變量。為了創(chuàng)建保存自變量的矩陣,輸入語句:

  1. X = dataset.iloc[:, :-1].values 

***個冒號表示提取數(shù)據(jù)集的全部行,「:-1」則表示提取除***一列以外的所有列。***的「.values」表示希望提取所有的值。接下來,我們希望創(chuàng)建保存因變量的向量,取數(shù)據(jù)的***一列。輸入語句:

  1. y = dataset.iloc[:, 3].values 

記住,在查看數(shù)據(jù)集的時候,索引(index)是從 0 開始的。所以,如果希望統(tǒng)計列數(shù),從 0 開始計數(shù)而不是 1?!竅:, :3]」會返回 animal、age 和 worth 三列。其中 0 表示 animal,1 表示 age,2 表示 worth。對于這種計數(shù)方法,即使你沒見過,也會在很短的時間內(nèi)適應(yīng)。

如果有缺失數(shù)據(jù)會怎么樣?

事實上,我們總會遇到數(shù)據(jù)缺失。對此,我們可以將存在缺失的行直接刪除,但這不是一個好辦法,還很容易引發(fā)問題。因此需要一個更好的解決方案。最常用的方法是,用其所在列的均值來填充缺失。為此,你可以利用 scikit-learn 預(yù)處理模型中的 inputer 類來很輕松地實現(xiàn)。(如果你還不知道,那么我強烈建議你搞明白它:scikit-learn 包含非常棒的機器學(xué)習(xí)模型)。在機器學(xué)習(xí)中,你可能并不適應(yīng)諸如「方法」、「類」和「對象」這些術(shù)語。這不是什么大問題!

  • 類就是我們希望為某目的所建立的模型。如果我們希望搭建一個棚子,那么搭建規(guī)劃就是一個類。
  • 對象是類的一個實例。在這個例子中,根據(jù)規(guī)劃所搭建出來的一個棚子就是一個對象。同一個類可以有很多對象,就像可以根據(jù)規(guī)劃搭建出很多個棚子一樣。
  • 方法是我們可以在對象上使用的工具,或在對象上實現(xiàn)的函數(shù):傳遞給它某些輸入,它返回一個輸出。這就像,當(dāng)我們的棚子變得有點不通氣的時候,可以使用「打開窗戶」這個方法。

[[257842]]

圖:Roman Kraft 發(fā)布于 Unsplash

為了使用 imputer,輸入類似如下語句。

  1. from sklearn.preprocessing import Imputer 
  2. imputer = Imputer(missing_values = np.nan, strategy = ‘mean’, axis = 0

均值填充是默認(rèn)的填充策略,所以其實不需要指定,加在此處是為了方便了解可以包含什么信息。missing_values 的默認(rèn)值是 nan。如果你的數(shù)據(jù)集中存在「NaN」形式的缺失值,那么你應(yīng)該關(guān)注 np.nan,可以在此查看官方文檔:

https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html

為了擬合這個 imputer,輸入:

  1. imputerimputer = imputer.fit(X[:, 1:3]) 

我們只希望在數(shù)據(jù)存在缺失的列上擬合 imputer。這里的***個冒號表示包含所有行,而「1:3」則表示我們?nèi)∷饕秊?1 和 2 的列。不要擔(dān)心,你很快就會習(xí)慣 PTYHON 的計數(shù)方法的。

現(xiàn)在,我們希望調(diào)用實際上可以替換填充缺失數(shù)據(jù)的方法。通過輸入以下語句完成:

  1. X[:, 1:3] = imputer.transform(X[:, 1:3]) 

多嘗試一些不同的填充策略。也許在某些項目中,你會發(fā)現(xiàn),使用缺失值所在列的中位數(shù)或眾數(shù)來填充缺失值會更加合理。填充策略之類的決策看似細(xì)微,但其實意義重大。因為流行通用的方法并不一定就是正確的選擇,對于模型而言,均值也不一定是***的缺失填充選擇。

畢竟,幾乎所有正閱讀本文的人,都有高于平均水平的手臂數(shù)。

[[257843]]

圖:Matthew Henry 發(fā)布于 Unsplash

如果包含屬性數(shù)據(jù),會怎么樣呢?

這是一個好問題。沒有辦法明確地計算諸如貓、狗、麋鹿的均值。那么可以怎么做呢?可以將屬性數(shù)據(jù)編碼為數(shù)值!你可能希望使用 sklearn.preprocessing 所提供的 LabelEncoder 類。從你希望進行編碼的某列數(shù)據(jù)入手,調(diào)用 label encoder 并擬合在你的數(shù)據(jù)上。

  1. from sklearn.preprocessing import LabelEncoder 
  2. labelencoder_X = LabelEncoder() 
  3. X[:, 0] = labelencoder_X.fit_transform(X[:, 0]) 

(還記得括號里的數(shù)字所表示的含義嗎?「:」表示希望提取所有行的數(shù)據(jù),0 表示希望提取***列)

這就是將***列中的屬性變量替換為數(shù)值所需的全部工作了。例如,麋鹿將用 0 表示,狗將用 2 表示,貓將用 3 表示。

你發(fā)現(xiàn)什么潛在問題了嗎?

標(biāo)注體系暗含以下信息:所使用的數(shù)值層級關(guān)系可能會影響模型結(jié)果:3 比 0 的數(shù)值大,但貓并不一定比麋鹿大。

[[257844]]

圖:Cel Lisboa 發(fā)布于 Unsplash

我們需要創(chuàng)建啞變量。

我們可以為貓創(chuàng)建一列數(shù)據(jù),為麋鹿創(chuàng)建一列數(shù)據(jù),……以此類推。然后,將每一列分別以 0/1 填充(認(rèn)為 1=Yes,0 = No)。這表明,如果原始列的值為貓,那么就會在麋鹿一列得到 0,狗一列得到 0,貓一列得到 1。

看上去非常復(fù)雜。輸入 OneHotEncoder 吧!

導(dǎo)入編碼器,并制定對應(yīng)列的索引。

  1. from sklearn.preprocessing import OneHotEncoder 
  2. onehotencoder = OneHotEncoder(categorical_features = [0]) 

接著是一點擬合和轉(zhuǎn)換。

  1. X = onehotencoder.fit_transform(X).toarray() 

現(xiàn)在,你的那一列數(shù)據(jù)已經(jīng)被替換為了這種形式:數(shù)據(jù)組中的每一個屬性數(shù)據(jù)對應(yīng)一列,并以 1 和 0 取代屬性變量。非常貼心,對吧?如果我們的 Y 列也是如「Y」和「N」的屬性變量,那么我們也可以在其上使用這個編碼器。

  1. labelencoder_y = LabelEncoder() 
  2. y = labelencoder_y.fit_transform(y) 

這會直接擬合并將 y 表示為編碼變量:1 表示「Y」,0 表示「N」。

訓(xùn)練集與測試集的劃分

現(xiàn)在,你可以開始將數(shù)據(jù)集劃分為訓(xùn)練集和測試集了。這已經(jīng)在之前的圖像分類教程一文中論述過了。不過記得,一定要將你的數(shù)據(jù)分為訓(xùn)練集和測試集,永遠(yuǎn)不要用測試集來訓(xùn)練!需要避免過擬合(可以認(rèn)為,過擬合就像在一次測驗前,記憶了許多細(xì)節(jié),但沒有理解其中的信息。如果只是記憶細(xì)節(jié),那么當(dāng)你自己在家復(fù)習(xí)知識卡片時,效果會很好,但在所有會考察新信息的真實測驗中,都會不及格。)

現(xiàn)在,我們有了需要學(xué)習(xí)的模型。模型需要在數(shù)據(jù)上訓(xùn)練,并在另外的數(shù)據(jù)上完成測試。對訓(xùn)練集的記憶并不等于學(xué)習(xí)。模型在訓(xùn)練集上學(xué)習(xí)得越好,就應(yīng)該在測試集給出更好的預(yù)測結(jié)果。過擬合永遠(yuǎn)都不是你想要的結(jié)果,學(xué)習(xí)才是!

[[257845]]

Janko Ferlič 發(fā)布于 Unsplash

首先,導(dǎo)入:

  1. from sklearn.model_selection import train_test_split 

現(xiàn)在,可以創(chuàng)建 X_train、X_test、y_train 和 y_test 集合了。

  1. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0

一種常見的方法是將數(shù)據(jù)集按 80/20 進行劃分,其中 80% 的數(shù)據(jù)用作訓(xùn)練,20% 的數(shù)據(jù)用作測試。這也是為何指定 test_size 為 0.2 的原因。你也可以根據(jù)自己的需求來任意劃分。你并不需要設(shè)置 random_state,這里設(shè)置的原因是為了可以完全復(fù)現(xiàn)結(jié)果。

特征縮放

什么是特征縮放?為什么需要特征縮放?

看看我們的數(shù)據(jù)。我們有一列動物年齡,范圍是 4~17,還有一列動物價值,范圍是$48,000-$83,000。價值一欄的數(shù)值不僅遠(yuǎn)大于年齡一欄,而且它還包含更加廣闊的數(shù)據(jù)范圍。這表明,歐式距離將完全由價值這一特征所主導(dǎo),而忽視年齡數(shù)據(jù)的主導(dǎo)效果。如果歐式距離在特定機器學(xué)習(xí)模型中并沒有具體作用會怎么樣?縮放特征將仍能夠加速模型,因此,你可以在數(shù)據(jù)預(yù)處理中,加入特征縮放這一步。

特征縮放的方法有很多。但它們都意味著我們將所有的特征放在同一量綱上,進而沒有一個會被另一個所主導(dǎo)。

導(dǎo)入相關(guān)庫開始:

  1. from sklearn.preprocessing import StandardScaler 

創(chuàng)建一個需要縮放對象并調(diào)用 Standard Scaler

  1. sc_X = StandardScaler() 

直接在數(shù)據(jù)集上進行擬合以及變換。獲取對象并應(yīng)用方法。

  1. X_train = sc_X.fit_transform(X_train) 
  2. X_test = sc_X.transform(X_test) 

不需要在測試集上進行擬合,只進行變換。

  1. sc_y = StandardScaler() 
  2. y_train = sc_y.fit_transform(y_train) 

對于啞變量而言,是否需要進行縮放?

對于這個問題,有些人認(rèn)為需要,有些則認(rèn)為不需要。這取決于你對模型可解釋性的看重誠度。將所有數(shù)據(jù)縮放至同一量綱固然有好處,但缺點是,這丟失了解釋每個觀測樣本歸屬于哪個變量的便捷性。

對于 Y 呢?如果因變量是 0 和 1,那么并不需要進行特征縮放。這是一個具有明確相關(guān)值的分類問題。但如果其取值范圍非常大,那么答案是你需要做縮放。

恭喜你,你已經(jīng)完成了數(shù)據(jù)預(yù)處理的工作!

通過少量的幾行代碼,你已經(jīng)領(lǐng)略了數(shù)據(jù)清洗和預(yù)處理的基礎(chǔ)。毫無疑問,在數(shù)據(jù)預(yù)處理這一步中,你可以加入很多自己的想法:你可能會想如何填充缺失值。思考是否縮放特征以及如何縮放特征?是否引入啞變量?是否要對數(shù)據(jù)做編碼?是否編碼啞變量……有非常多需要考慮的細(xì)節(jié)?,F(xiàn)在,你已經(jīng)完全了解了這些,可以親自動手試試了,準(zhǔn)備數(shù)據(jù)吧!

原文鏈接:

https://towardsdatascience.com/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d

【本文是51CTO專欄機構(gòu)“機器之心”的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】 

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2024-05-15 15:27:39

2024-01-03 16:01:23

2022-03-28 14:08:02

Python數(shù)據(jù)清洗數(shù)據(jù)集

2024-12-20 13:00:00

Python文本清洗預(yù)處理

2016-12-20 16:07:13

Python數(shù)據(jù)預(yù)處理

2016-12-18 15:03:57

Python Scikit Lea數(shù)據(jù)

2021-11-12 15:43:10

Python自然語言數(shù)據(jù)

2022-11-16 08:41:43

2025-03-07 08:00:00

數(shù)據(jù)數(shù)據(jù)集集神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)預(yù)處理

2011-04-13 09:53:20

2010-06-21 13:43:46

2025-02-08 10:58:07

2023-12-13 11:23:15

2023-05-05 19:29:41

2021-03-28 08:57:57

Python 文本數(shù)據(jù)

2022-08-30 09:24:47

數(shù)據(jù)算法

2022-06-03 00:42:15

數(shù)據(jù)安全數(shù)據(jù)量

2009-09-23 11:37:31

Hibernate S

2019-01-28 17:42:33

Python數(shù)據(jù)預(yù)處理數(shù)據(jù)標(biāo)準(zhǔn)化

2018-04-04 10:19:32

深度學(xué)習(xí)
點贊
收藏

51CTO技術(shù)棧公眾號