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