使用PyTorch進行表格數據的深度學習

2021-03-02 相約機器人

作者 | Aakanksha NS

來源 | Medium

編輯 | 代碼醫生團隊

使用表格數據進行深度學習的最簡單方法是通過fast-ai庫,它可以提供非常好的結果,但是對於試圖了解幕後實際情況的人來說,它可能有點抽象。因此在本文中,介紹了如何在Pytorch中針對多類分類問題構建簡單的深度學習模型來處理表格數據。

Pytorch是一個流行的開源機器庫。它像Python一樣易於使用和學習。使用PyTorch的其他一些優勢是其多GPU支持和自定義數據加載器。

代碼

https://jovian.ml/aakanksha-ns/shelter-outcome

數據集

https://www.kaggle.com/c/shelter-animal-outcomes/data

它是一個表格數據集,由訓練集中的約26k行和10列組成。除以外的所有列DateTime都是分類的。

問題陳述

根據保護動物的某些特徵(例如年齡,性別,膚色,品種),預測其結果。

有5種可能的結果:Return_to_owner, Euthanasia, Adoption, Transfer, Died。期望找到動物的結局屬於5類中每一種的概率。

數據預處理

儘管此步驟很大程度上取決於特定的數據和問題,但仍需要遵循兩個必要的步驟:

擺脫Nan價值觀:

Nan(不是數字)表示數據集中缺少值。該模型不接受Nan值,因此必須刪除或替換它們。

對於數字列,一種常見的處理這些值的方法是使用剩餘數據的0,均值,中位數,眾數或其他某種函數來估算它們。缺失值有時可能表示數據集中的基礎特徵,因此人們經常創建一個新的二進位列,該列與具有缺失值的列相對應,以記錄數據是否缺失。

對於分類列,Nan可以將值視為自己的類別!

標籤編碼所有分類列:

由於模型只能接受數字輸入,因此將所有分類元素都轉換為數字。這意味著使用數字代替使用字符串來表示類別。選擇用來表示列中任何類別的數字並不重要,因為稍後將使用分類嵌入來進一步編碼這些類別。這是標籤編碼的一個簡單示例:

使用了LabelEncoderscikit-learn庫中的類對分類列進行編碼。可以定義一個自定義類來執行此操作並跟蹤類別標籤,因為也需要它們對測試數據進行編碼。

標籤編碼目標:

如果目標具有字符串條目,還需要對目標進行標籤編碼。另外請確保維護一個字典,將編碼映射到原始值,因為將需要它來找出模型的最終輸出。

保護成果問題特有的數據處理:

除了上述步驟,還對示例問題進行了更多處理。

刪除了該AnimalID列,因為它是唯一的,不會對訓練有所幫助。

刪除了該OutcomeSubtype列,因為它是目標的一部分,但並沒有要求對其進行預測。

已刪除DateTime列,因為輸入記錄的確切時間戳似乎不是一項重要功能。實際上,首先嘗試將其拆分為單獨的月份和年份列,但後來意識到完全刪除該列會帶來更好的結果!

已刪除Name列,因為該列中的Nan值太多(缺少10k以上)。同樣,在確定動物的結局方面,這似乎不是一個非常重要的特徵。

注意:在NoteBook中,堆疊了train和test列,然後進行了預處理以避免基於測試集上的train set標籤進行標籤編碼(因為這將涉及維護編碼標籤到實際值的字典) 。可以在此處進行堆棧和處理,因為沒有數字列(因此無需進行插補),並且每列的類別數是固定的。實際上,絕對不能這樣做,因為它可能會將某些數據從測試/驗證集中洩漏到訓練數據中,並導致模型評估不準確。例如如果數字列中缺少值,例如age 並決定使用平均值來推算該平均值,則平均值應僅在訓練集合(而不是堆疊的訓練測試有效集合)上計算,並且該值也應用於推算驗證和測試集中的缺失值。

分類嵌入

分類嵌入與NLP中常用的詞嵌入非常相似。基本思想是在列中具有每個類別的固定長度矢量表示。這與單次編碼的不同之處在於,使用嵌入而不是使用稀疏矩陣,而是為每個類別獲得了一個密集矩陣,其中相似類別的值在嵌入空間中彼此接近。因此,此過程不僅節省了內存(因為具有太多類別的列的一鍵編碼實際上會炸毀輸入矩陣,而且它是非常稀疏的矩陣),而且還揭示了分類變量的內在屬性。

例如,如果有一列顏色,並且找到了它的嵌入,則可以期望red並且pink在嵌入空間中,該距離比red和更近。blue

分類嵌入層等效於每個單編碼輸入上方的額外層:

對於保護所結果問題,只有分類列,但將考慮少於3個值的列為連續列。為了確定每一列嵌入向量的長度,從fast-ai庫中獲取了一個簡單的函數:

emb_c = {n: len(col.cat.categories) for n,col in X.items() if len(col.cat.categories) > 2}emb_cols = emb_c.keys() emb_szs = [(c, min(50, (c+1)//2)) for _,c in emb_c.items()] 

Pytorch數據集和DataLoader

擴展了DatasetPytorch提供的(抽象)類,以便在訓練時更輕鬆地訪問數據集並有效使用DataLoader模塊來管理批次。這涉及根據特定數據集覆蓋__len__和__getitem__方法。

由於只需要嵌入分類列,因此將輸入分為兩部分:數字部分和分類部分。

class ShelterOutcomeDataset(Dataset):    def __init__(self, X, Y, emb_cols):        X = X.copy()        self.X1 = X.loc[:,emb_cols].copy().values.astype(np.int64)         self.X2 = X.drop(columns=emb_cols).copy().values.astype(np.float32)         self.y = Y            def __len__(self):        return len(self.y)        def __getitem__(self, idx):        return self.X1[idx], self.X2[idx], self.y[idx]

然後,選擇批處理大小,並將其與數據集一起饋入DataLoader。深度學習通常是分批進行的。DataLoader幫助在訓練之前有效地管理這些批次並重新整理數據。

train_ds = ShelterOutcomeDataset(X_train, y_train, emb_cols)valid_ds = ShelterOutcomeDataset(X_val, y_val, emb_cols) batch_size = 1000train_dl = DataLoader(train_ds, batch_size=batch_size,shuffle=True)valid_dl = DataLoader(valid_ds, batch_size=batch_size,shuffle=True)

要進行健全性檢查,可以遍歷創建的DataLoader以查看每個批次:

模型

數據分為連續的和分類的部分。首先根據先前確定的大小將分類部分轉換為嵌入向量,然後將它們與連續部分連接起來,以饋送到網絡的其餘部分。這張照片演示了使用的模型:

class ShelterOutcomeModel(nn.Module):    def __init__(self, embedding_sizes, n_cont):        super().__init__()        self.embeddings = nn.ModuleList([nn.Embedding(categories, size) for categories,size in embedding_sizes])        n_emb = sum(e.embedding_dim for e in self.embeddings)         self.n_emb, self.n_cont = n_emb, n_cont        self.lin1 = nn.Linear(self.n_emb + self.n_cont, 200)        self.lin2 = nn.Linear(200, 70)        self.lin3 = nn.Linear(70, 5)        self.bn1 = nn.BatchNorm1d(self.n_cont)        self.bn2 = nn.BatchNorm1d(200)        self.bn3 = nn.BatchNorm1d(70)        self.emb_drop = nn.Dropout(0.6)        self.drops = nn.Dropout(0.3)             def forward(self, x_cat, x_cont):        x = [e(x_cat[:,i]) for i,e in enumerate(self.embeddings)]        x = torch.cat(x, 1)        x = self.emb_drop(x)        x2 = self.bn1(x_cont)        x = torch.cat([x, x2], 1)        x = F.relu(self.lin1(x))        x = self.drops(x)        x = self.bn2(x)        x = F.relu(self.lin2(x))        x = self.drops(x)        x = self.bn3(x)        x = self.lin3(x)        return x

訓練

現在在訓練集上訓練模型。使用了Adam優化器來優化交叉熵損失。訓練非常簡單:遍歷每批,進行前向遍歷,計算梯度,進行梯度下降,並根據需要重複此過程。可以看一下NoteBook以了解代碼。

https://jovian.ml/aakanksha-ns/shelter-outcome

測試輸出

由於有興趣查找測試輸入的每個類別的概率,因此在模型輸出上應用Softmax函數。還進行了Kaggle提交,以查看此模型的性能如何:

僅進行了很少的功能工程和數據探索,並使用了非常基礎的深度學習架構,但模型完成了約50%的解決方案。這表明使用神經網絡對表格數據建模的這種方法非常強大!

推薦閱讀

使用CNN和PyTorch進行面部關鍵點檢測

點擊「閱讀原文」圖書配套資源

相關焦點

  • 一個簡單的更改讓PyTorch讀取表格數據的速度提高20倍
    深度學習:需要速度在訓練深度學習模型時,性能至關重要。 數據集可能非常龐大,而低效的訓練方法意味著迭代速度變慢,超參數優化的時間更少,部署周期更長以及計算成本更高。由於有許多潛在的問題要探索,很難證明花太多時間來進行加速工作是合理的。 但是幸運的是,有一些簡單的加速方法!
  • 深度學習-使用PyTorch的表格數據
    作者 | Offir Inbar來源 | Medium編輯 | 代碼醫生團隊這篇文章將通過一個實際的例子提供有關將Pytorch用於表格數據的詳細的端到端指南
  • PyTorch  深度學習新手入門指南
    ,這篇文章是為想開始用pytorch來進行深度學習項目研究的人準備的。pytorch 因其出色的調試能力,對多種平臺的支持和容易上手而聞名,它並沒有涉及到類似keras中的大量計算。  開始設置  步驟1:硬體設置:深度學習模型總是伴隨著大量的數據。顯然,GPU是必須的。
  • 最全面的深度學習框架pytorch搭建過程
    深度學習一直是比較熱門的話題,在動手學習之前,需要搭建深度學習框架,如pytorch、TensorFlow、caffe、mxnet等。
  • 【深度學習】深度學習之Pytorch基礎教程!
    ,深度學習框架開始大量的出現。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源的深度學習框架。目前研究人員正在使用的深度學習框架不盡相同,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。這其中,TensorFlow和Pytorch佔據了深度學習的半壁江山。
  • pytorch專題前言 | 為什麼要學習pytorch?
    就像現在的智慧型手機使用一樣。你也不想以後被兒女教編程時候面對兒女的不耐煩吧。(現在要耐心教父母以及家裡的老人使用智慧型手機哦)第二點,藝多不壓身。找工作的時候多一項技能就多一點機會和薪酬,何況編程這種大技能。而且編程鍛鍊思維活化腦子,也許會對課題的瓶頸突破起到關鍵作用。第三點,很多人認為做實驗寫論文沒時間去學習編程這麼掉頭髮的東西。
  • 深度學習大講堂之pytorch入門
    ,他們也一直在支持一些開源的深度學習框架,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。這其中,TensorFlow和Pytorch佔據了深度學習的半壁江山。今天小天就帶大家從數據操作、自動求梯度和神經網絡設計的pytorch版本三個方面來入門pytorch。
  • 在Linux系統中安裝深度學習框架Pytorch
    設為星標才不會錯過哦     你好呀 我是然怡這篇推文是兩個月前復現深度學習論文時做的筆記一系列的筆記做了好幾篇看著閱讀量很低就沒有再發公眾號很久沒有推文了前幾天對公眾號進行了小改「然怡乾貨鋪」改為「水文sw」頭像也是換了的
  • 深度學習框架搭建之PyTorch
    深度學習框架搭建之PyTorchPyTorch 簡介PyTorch 是由 Facebook 推出,目前一款發展與流行勢頭非常強勁的深度學習框架。PyTorch 與 NumPy 非常相似,可以說是它的替代者,支持 GPU 加速運算,用來搭建和訓練深度神經網絡。如果學習過 NumPy 以及常見的深度學習概念(如卷積層,循環層等),非常容易上手PyTorch。目前主流的深度學習框架主要有 TensorFlow,PyTorch,mxnet,caffe和Keras 等。
  • 深度學習之Pytorch基礎教程!
    作者:李祖賢,Datawhale高校群成員,深圳大學隨著深度學習的發展
  • 深度學習自救指南(一)| Anaconda、PyTorch的下載和安裝
    在我們進行深度學習的過程中,離不開Anaconda環境和PyTorch深度學習框架。
  • 深度學習黑客競賽神器:基於PyTorch圖像特徵工程的深度學習圖像增強
    當我們沒有足夠的數據時,圖像增強是一個非常有效的方法我們可以在任何場合使用圖像增強進行深度學習——黑客競賽、工業項目等等我們還將使用PyTorch建立一個圖像分類模型,以了解圖像增強是如何形成圖片的在深度學習黑客競賽中表現出色的技巧(或者坦率地說,是任何數據科學黑客競賽) 通常歸結為特徵工程。
  • Keras vs PyTorch:誰是第一深度學習框架?
    兩大框架的連結:  Keras:https://github.com/keras-team/keras (https://keras.io/)  PyTorch:https://github.com/pytorch/pytorch  你想學習深度學習嗎?
  • 寫給純小白的深度學習環境搭建寶典:pytorch+tensorflow
    每天給小編五分鐘,小編用自己的代碼,讓你輕鬆學習人工智慧。本文將手把手帶你快速搭建你自己的深度學習環境,然後實現自己的第一個深度學習程序。野蠻智能,小白也能看懂的人工智慧。精講深度學習RNN三大核心點,三分鐘掌握循環神經網絡進行簡單了解。下面進入實戰環節。
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    PyTorch提供了兩個高級功能: 1.具有強大的GPU加速的張量計算(如Numpy) 2.包含自動求導系統的深度神經網絡 除了Facebook之外,Twitter、GMU和Salesforce等機構都採用了PyTorch。
  • GitHub趨勢榜第一:TensorFlow+PyTorch深度學習資源大匯總
    來源:Github編輯整理:元子【新智元導讀】該項目是Jupyter Notebook中TensorFlow和PyTorch的各種深度學習架構本文搜集整理了Jupyter Notebook中TensorFlow和PyTorch的各種深度學習架構,模型和技巧,內容非常豐富,適用於Python 3.7,適合當做工具書。大家可以將內容按照需要進行分割,列印出來,或者做成電子書等,隨時查閱。
  • PyTorch常見的12坑
    7. pytorch的可重複性問題參考這篇博文:https://blog.csdn.net/hyk_1996/article/details/84307108 8. 多GPU的處理機制使用多GPU時,應該記住pytorch的處理邏輯是:1.在各個GPU上初始化模型。2.前向傳播時,把batch分配到各個GPU上進行計算。
  • 手把手教 | 深度學習庫PyTorch(附代碼)
    注意:本文假定你對深度學習有基本的認知。 PyTorch是一個基於python的庫,它旨在提供一個靈活的深度學習開發平臺。PyTorch的工作流程儘可能接近Python的科學計算庫--- numpy。 你可能會問,我們為什麼要用PyTorch來構建深度學習模型呢?
  • PyTorch官方出品了一本深度學習書,免費提供給開發者
    根據出版商Manning出版社的介紹,這本書的核心,是教你如何使用Python 和 PyTorch 實現深度學習算法。所以出版商介紹稱,想要更好的消化這本書,需要對Python知識和基本線性代數有了解,對深度學習有一些理解更好,但並不需要你具備使用PyTorch或其他深度學習框架的經驗。在多位業內人士看來,這本書的優點是易上手。
  • Torch7 開源 PyTorch:Python 優先深度學習框架
    據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。PyTorch 是一個 Python 軟體包,其提供了兩種高層面的功能:如有需要,你也可以復用你最喜歡的 Python 軟體包(如 numpy、scipy 和 Cython)來擴展 PyTorch。