?
一、說明
????????在使用BERT(1)進行文本分類中,我向您展示了一個BERT如何標記文本的示例。在下面的文章中,讓我們更深入地研究是否可以使用 BERT 來預測文本是使用 PyTorch 傳達積極還是消極的情緒。首先,我們需要準備數據,以便使用 PyTorch 框架進行分析。
二、什么是 PyTorch
????????PyTorch 是用于構建深度學習模型的框架,深度學習模型是一種機器學習,通常用于圖像識別和語言處理等應用程序。它由Facebook的人工智能研究小組于2016年開發,由于其靈活性,易用性和動態計算圖構建而廣受歡迎。
????????PyTorch 提供了一個基于 Python 的科學計算包,它使用圖形處理單元 (GPU)?的強大功能來加速張量運算的計算。它具有簡單直觀的API,允許開發人員快速構建和訓練深度學習模型。PyTorch 還支持自動微分,使用戶能夠計算任意函數的梯度。
三、準備我們的數據集
????????首先,讓我們從Github下載我們的數據。這里有一個關于如何從Github下載CSV文件的小提醒。只需繼續并單擊以下鏈接:
github.com
????????然后,右鍵單擊“原始”,然后左鍵單擊“將鏈接文件下載為...”。您將看到“垃圾郵件.csv”并下載它。下載后,將其保存到您的首選文件夾中以供以后使用。
????????現在,讓我們導入數據。我們看到一條錯誤消息,告訴我們部分數據未采用 UTF-8 編碼。
import pandas as pd
df = pd.read_csv("spam.csv")ERROR:
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 606-607: invalid continuation byte
我們可以通過了解數據包含的字符編碼并在讀取數據時調用該編碼來修復此錯誤。
# Use chardet to know the character encoding
import chardet
with open("spam.csv", 'rb') as rawdata:result = chardet.detect(rawdata.read(100000))
resultOutput:
{'encoding': 'Windows-1252', 'confidence': 0.7270322499829184, 'language': ''}
似乎我們的數據是在“Windows-1252”中編碼的。那讓我們再讀一遍。它奏效了!
df = pd.read_csv("spam.csv", encoding = 'Windows-1252')
df.head()
?
????????如我們所見,我們實際上并不需要“v1”和“v2”以外的列。此外,如果我們將“v1”和“v2”重命名為“類別”和“消息”,則更容易理解。
df = df.loc[:, ['v1', 'v2']]
df = df.rename(columns={'v1': 'Category', 'v2': 'Message'})
df.head()
?
????????現在,我們應該看看我們的數據集,看看每個類別中有多少條消息。
df['Category'].value_counts()Output:
ham 4825
spam 747
Name: Category, dtype: int64
四、創建平衡數據集
????????事實證明,正常郵件比垃圾郵件多。構建機器學習模型時,如果數據集不平衡,其中一個類中的數據數量明顯多于另一個類,則可能會對模型的性能產生各種影響。一些潛在的后果。例如:
-1 有偏差模型:如果數據集不平衡,模型可能會偏向多數類,而對少數類表現不佳。這是因為模型更有可能預測多數類,這將導致少數類的準確性較差。
-2 泛化不良:不平衡的數據集可能導致模型泛化不良。這是因為該模型將在不代表數據真實世界分布的數據集上進行訓練,因此它可能無法很好地概括看不見的數據。
-3?評估不準確:如果使用準確性作為指標評估模型,則可能會產生誤導性結果。例如,始終預測不平衡數據集中多數類的模型可能具有很高的準確性,但對少數類沒有用。
-4 過擬合:由于數據點數量較多,模型可能會過度擬合多數類,從而導致測試數據的性能不佳。
為了解決這些問題,可以使用各種技術來平衡數據集,例如對少數類進行過采樣,對多數類進行欠采樣,或同時使用兩者的組合。在這篇文章中,我將使用欠采樣方法。
df_spam = df[df['Category']=='spam']
df_ham = df[df['Category']=='ham']
df_ham_downsampled = df_ham.sample(df_spam.shape[0])
df_balanced = pd.concat([df_ham_downsampled, df_spam])
df_balanced['Category'].value_counts()Output:
ham 747
spam 747
Name: Category, dtype: int64
五、標記數據
????????當數據表示為數字而不是分類為用于訓練和測試的模型時,機器學習算法在準確性和其他性能指標方面表現更好。我們需要用數值對分類值進行標簽編碼。在這里,我們創建了一個新列“標簽”,如果郵件是垃圾郵件,我們將其標記為 1,否則為 0。
df_balanced['Label']=df_balanced['Category'].apply(lambda x: 1 if x=='spam' else 0)
df_balanced = df_balanced.reset_index(drop=True)display(df_balanced)
?
由作者創建
六、訓練、驗證和測試數據集:誰是誰
????????要記住的一件事是,當我們使用 train_test_split 庫來訓練模型時,我們實際上是將數據集拆分為 TRAINING 數據集和 VALIDATION 數據集,而不是 TRAINING 數據集和 TESTING 數據集。下面提醒一下這些數據集的含義。
- 訓練集:用于構建我們的模型。我們將使用訓練集來找到具有反向傳播規則的“最佳”權重和偏差。在此階段,我們通常會創建多個算法,以便在交叉驗證階段比較它們的性能。
- 交叉驗證集:此數據集用于比較基于訓練集創建的預測算法的性能。我們選擇性能最佳的算法。
- 測試集:這是“未來”數據集。現在我們已經選擇了我們喜歡的預測算法,但我們還不知道它將如何在完全看不見的真實世界數據上執行。因此,我們將我們選擇的預測算法應用于我們的測試集,以查看它將如何執行,以便我們可以了解我們的算法在野外的性能。
????????因此,在測試集中,我們沒有數據的標簽,而是使用我們的模型來預測標簽。我們只能將手頭的數據集拆分為訓練集和驗證集,因為我們還沒有“未來”數據。
七、拆分為訓練數據集和驗證數據集
????????現在我們了解了這三種類型的數據的真正含義,我們可以使用scikit-learn的train_test_split來拆分數據。
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(df_balanced['Message'],df_balanced['Label'], stratify=df_balanced['Label'], test_size=.2)X_train.head()Output:
708 ;-) ok. I feel like john lennon.
1386 Cashbin.co.uk (Get lots of cash this weekend!)...
1492 REMINDER FROM O2: To get 2.50 pounds free call...
119 Back in brum! Thanks for putting us up and kee...
89 Sorry, I can't help you on this.
Name: Message, dtype: object
八、總結
????????我們已經學會了如何下載和拆分數據。在下一篇文章中,我們將首先對其進行標記,并使用DistilBERT訓練分類器。達門·