<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5605字,需瀏覽 12分鐘

           ·

          2023-01-03 22:24

          每天學(xué)Python新技能

          后臺回復(fù)【大禮包】送你Python自學(xué)大禮包


          文章來源:數(shù)據(jù)STUDIO

          凡事預(yù)則立,不預(yù)則廢,訓(xùn)練機器學(xué)習(xí)模型也是如此。數(shù)據(jù)清洗和預(yù)處理是模型訓(xùn)練之前的必要過程,否則模型可能就「廢」了。本文是一個初學(xué)者指南,將帶你領(lǐng)略如何在任意的數(shù)據(jù)集上,針對任意一個機器學(xué)習(xí)模型,完成數(shù)據(jù)預(yù)處理工作。

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

          人們通常認為,數(shù)據(jù)預(yù)處理是一個非常枯燥的部分。但它就是「做好準備」和「完全沒有準備」之間的差別,也是表現(xiàn)專業(yè)和業(yè)余之間的差別。就像為度假做好事先準備一樣,如果你提前將行程細節(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):

          import numpy as np
          import matplotlib.pyplot as plt
          import pandas as pd

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

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

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

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

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

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

          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)我們的棚子變得有點不通氣的時候,可以使用「打開窗戶」這個方法。

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

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

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

          為了擬合這個 imputer,輸入:

          imputer = 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ù)的方法。通過輸入以下語句完成:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          labelencoder_y = LabelEncoder()
          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)練集和測試集,永遠不要用測試集來訓(xùn)練!需要避免過擬合(可以認為,過擬合就像在一次測驗前,記憶了許多細節(jié),但沒有理解其中的信息。如果只是記憶細節(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é)果。過擬合永遠都不是你想要的結(jié)果,學(xué)習(xí)才是!

          首先,導(dǎo)入:

          from sklearn.model_selection import train_test_split

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

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

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

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

          from sklearn.preprocessing import StandardScaler

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

          sc_X = StandardScaler()

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

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

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

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

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

          對于這個問題,有些人認為需要,有些則認為不需要。這取決于你對模型可解釋性的看重誠度。將所有數(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ù)做編碼?是否編碼啞變量……有非常多需要考慮的細節(jié)。現(xiàn)在,你已經(jīng)完全了解了這些,可以親自動手試試了,準備數(shù)據(jù)吧!

          原文鏈接:https://towardsdatascience.com/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d
          作者:Anne Bonner 機器之心編譯

          1. 中國各城市首輪感染高峰期再預(yù)測!(更新版)

          2. 美化 Jupyter Notebook 格式就沒輸過誰!

          3. 9個技巧使你的Python代碼更Pythonic

          4. Jupyter Notebook 五大效率插件



          瀏覽 79
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久9999 | 高清无码黄色视频 | av老司机在线 | 亚洲天堂网在线观看视频 | 青娱乐在线视频2 |