利用 Python 進行文本分類的十個機器學習方法
什么是文本分類?
文本分類是自然語言處理(NLP)中的一個重要任務,它涉及將文本數據分配到預定義的類別中。例如,垃圾郵件過濾、情感分析、新聞分類等都是常見的文本分類應用場景。
本文將介紹 10 種使用 Python 進行文本分類的機器學習方法,并通過實際代碼示例來幫助你理解和應用這些方法。
1. 樸素貝葉斯分類器
理論知識:樸素貝葉斯分類器是一種基于貝葉斯定理的簡單概率分類器。它假設特征之間相互獨立,因此得名“樸素”。盡管這個假設在現實中很少成立,但樸素貝葉斯分類器在許多實際問題中表現良好。
代碼示例:
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report
# 加載數據集
data = fetch_20newsgroups(subset='train', categories=['sci.space', 'rec.sport.baseball'])
X_train, y_train = data.data, data.target
# 文本向量化
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
# 訓練模型
model = MultinomialNB()
model.fit(X_train_vec, y_train)
# 預測
X_test = fetch_20newsgroups(subset='test', categories=['sci.space', 'rec.sport.baseball']).data
X_test_vec = vectorizer.transform(X_test)
y_test = fetch_20newsgroups(subset='test', categories=['sci.space', 'rec.sport.baseball']).target
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 加載數據集:使用 fetch_20newsgroups 函數加載新聞組數據集。
- 文本向量化:使用 CountVectorizer 將文本轉換為詞頻矩陣。
- 訓練模型:使用 MultinomialNB 訓練樸素貝葉斯分類器。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
2. 支持向量機(SVM)
理論知識:支持向量機(SVM)是一種監督學習模型,用于分類和回歸分析。SVM 的目標是找到一個超平面,使得不同類別的樣本之間的間隔最大化。
代碼示例:
from sklearn.svm import SVC
# 訓練模型
model = SVC(kernel='linear')
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 訓練模型:使用 SVC 類訓練支持向量機模型,選擇線性核函數。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
3. 隨機森林
理論知識:隨機森林是一種集成學習方法,通過構建多個決策樹并取其平均結果來提高預測準確性。每個決策樹都在不同的子樣本上訓練,從而減少過擬合的風險。
代碼示例:
from sklearn.ensemble import RandomForestClassifier
# 訓練模型
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 訓練模型:使用 RandomForestClassifier 訓練隨機森林模型,設置 100 棵樹。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
4. 邏輯回歸
理論知識:邏輯回歸是一種用于二分類問題的線性模型。它通過 logistic 函數將線性組合的輸出映射到 (0, 1) 區間,表示屬于某一類的概率。
代碼示例:
from sklearn.linear_model import LogisticRegression
# 訓練模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 訓練模型:使用 LogisticRegression 訓練邏輯回歸模型,設置最大迭代次數為 1000。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
5. K-近鄰算法(KNN)
理論知識:K-近鄰算法(KNN)是一種基于實例的學習方法。對于一個新的樣本,KNN 會找到訓練集中與其最近的 K 個樣本,并根據這 K 個樣本的類別來決定新樣本的類別。
代碼示例:
from sklearn.neighbors import KNeighborsClassifier
# 訓練模型
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train_vec.toarray(), y_train)
# 預測
y_pred = model.predict(X_test_vec.toarray())
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 訓練模型:使用 KNeighborsClassifier 訓練 KNN 模型,設置 K 值為 5。
- 預測:對測試集進行預測。注意,KNN 需要將稀疏矩陣轉換為密集矩陣。
- 評估模型:計算準確率并生成分類報告。
6. 決策樹
理論知識:決策樹是一種樹形結構的模型,通過一系列規則對樣本進行分類。每個內部節點表示一個屬性上的測試,每個分支代表一個測試結果,每個葉節點代表一個類別。
代碼示例:
from sklearn.tree import DecisionTreeClassifier
# 訓練模型
model = DecisionTreeClassifier()
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 訓練模型:使用 DecisionTreeClassifier 訓練決策樹模型。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
7. 梯度提升樹(GBDT)
理論知識:梯度提升樹(GBDT)是一種基于梯度提升框架的集成學習方法。它通過逐步添加新的決策樹來減少前一個模型的殘差,從而逐步提高模型的性能。
代碼示例:
from sklearn.ensemble import GradientBoostingClassifier
# 訓練模型
model = GradientBoostingClassifier(n_estimators=100)
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 訓練模型:使用 GradientBoostingClassifier 訓練 GBDT 模型,設置 100 棵樹。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
8. XGBoost
理論知識:XGBoost 是一種優化的梯度提升樹算法,通過正則化項來防止過擬合,并且在處理大規模數據時表現出色。
代碼示例:
import xgboost as xgb
# 訓練模型
model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='mlogloss')
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 訓練模型:使用 XGBClassifier 訓練 XGBoost 模型,設置 use_label_encoder 為 False 并選擇多分類損失函數。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
9. LightGBM
理論知識:LightGBM 是一種基于梯度提升框架的高效算法,通過使用直方圖算法和按葉子生長策略來加速訓練過程。
代碼示例:
import lightgbm as lgb
# 訓練模型
model = lgb.LGBMClassifier()
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:1. 訓練模型:使用 LGBMClassifier 訓練 LightGBM 模型。2. 預測:對測試集進行預測。3. 評估模型:計算準確率并生成分類報告。
10. 神經網絡
理論知識:神經網絡是一種模擬人腦神經元結構的模型,通過多層非線性變換來學習復雜的模式。深度學習是神經網絡的一個子領域,通常涉及多層神經網絡。
代碼示例:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
# 構建模型
model = Sequential([
Dense(128, input_dim=X_train_vec.shape[1], activation='relu'),
Dropout(0.5),
Dense(64, activation='relu'),
Dropout(0.5),
Dense(2, activation='softmax')
])
# 編譯模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 訓練模型
model.fit(X_train_vec.toarray(), y_train, epochs=10, batch_size=32, validation_split=0.2)
# 預測
y_pred = model.predict(X_test_vec.toarray())
y_pred = y_pred.argmax(axis=1)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 構建模型:使用 Sequential 模型,添加多個全連接層和 dropout 層。
- 編譯模型:選擇優化器、損失函數和評估指標。
- 訓練模型:訓練模型,設置 epochs 和 batch size,并使用驗證集進行驗證。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
實戰案例:情感分析
案例背景:情感分析是一種常見的文本分類任務,用于判斷文本的情感傾向,如正面、負面或中性。我們將使用 IMDb 電影評論數據集來進行情感分析。
代碼示例:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# 加載數據集
data = pd.read_csv('IMDB Dataset.csv')
X = data['review']
y = data['sentiment'].map({'positive': 1, 'negative': 0})
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 文本向量化
vectorizer = TfidfVectorizer(stop_words='english', max_features=10000)
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
# 訓練模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train_vec, y_train)
# 預測
y_pred = model.predict(X_test_vec)
# 評估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
代碼解釋:
- 加載數據集:使用 pandas 讀取 IMDb 數據集。
- 劃分訓練集和測試集:使用 train_test_split 函數將數據集劃分為訓練集和測試集。
- 文本向量化:使用 TfidfVectorizer 將文本轉換為 TF-IDF 特征矩陣。
- 訓練模型:使用 LogisticRegression 訓練邏輯回歸模型。
- 預測:對測試集進行預測。
- 評估模型:計算準確率并生成分類報告。
總結
本文介紹了 10 種使用 Python 進行文本分類的機器學習方法,包括樸素貝葉斯、支持向量機、隨機森林、邏輯回歸、K-近鄰算法、決策樹、梯度提升樹、XGBoost、LightGBM 和神經網絡。每種方法都提供了詳細的理論知識和代碼示例,幫助你理解和應用這些技術。最后,我們通過一個實際的情感分析案例,展示了如何將這些方法應用于實際問題中。