特徵工程是機器學習的關鍵步驟,它將原始資料轉換為適合模型訓練的格式。本文首先介紹如何使用多項式特徵擴充套件線性迴歸模型以處理非線性關係,並示範使用 SimpleImputer 處理缺失值。接著,引入 Pipeline 機制,它可以串接多個資料處理步驟,簡化模型訓練流程。文章進一步探討貝氏分類別器,包含高斯和多項式兩種,並以實際案例說明如何應用於文字分類別,同時使用 TfidfVectorizer 將文字轉換為數值向量。最後,比較不同貝氏分類別器的優缺點以及各自的適用場景,提供機器學習模型選擇的參考依據。
特徵工程中的資料預處理
在進行機器學習模型的建立之前,資料預處理是一個非常重要的步驟。其中,特徵工程是資料預處理的一個關鍵部分,涉及對原始資料進行轉換和加工,以便更好地適用於機器學習模型。
線性迴歸模型的擴充套件
在前面的章節中,我們討論瞭如何使用線性迴歸模型進行預測。但是,線性迴歸模型有其侷限性,尤其是在處理非線性關係的資料時。為了克服這個限制,我們可以使用多項式特徵來擴充套件線性迴歸模型。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# 生成樣本資料
x = np.linspace(-10, 10, 100)
y = 3 * x**2 + 2 * x + 1 + np.random.randn(100)
# 將資料轉換為多項式特徵
poly_features = PolynomialFeatures(degree=2)
X_poly = poly_features.fit_transform(x.reshape(-1, 1))
# 建立線性迴歸模型
model = LinearRegression()
model.fit(X_poly, y)
# 預測結果
y_pred = model.predict(X_poly)
# 繪製結果
plt.scatter(x, y)
plt.plot(x, y_pred)
plt.show()
處理缺失值
在實際資料中,缺失值是常見的問題。為了處理缺失值,我們可以使用簡單的方法,如用平均值或中位數替換缺失值,也可以使用更複雜的方法,如矩陣完成或強健模型。
from sklearn.impute import SimpleImputer
import numpy as np
# 生成樣本資料
X = np.array([[np.nan, 0, 3],
[3, 7, 9],
[3, 5, 2],
[4, np.nan, 6],
[8, 8, 1]])
y = np.array([14, 16, -1, 8, -5])
# 建立簡單的缺失值填充模型
imp = SimpleImputer(strategy='mean')
# 填充缺失值
X_filled = imp.fit_transform(X)
print(X_filled)
線性迴歸模型的應用
填充缺失值後,我們可以將資料輸入到線性迴歸模型中進行預測。
from sklearn.linear_model import LinearRegression
# 建立線性迴歸模型
model = LinearRegression()
# 訓練模型
model.fit(X_filled, y)
# 預測結果
y_pred = model.predict(X_filled)
print(y_pred)
圖表翻譯:
以下是使用Plantuml語法繪製的圖表,展示了線性迴歸模型的流程: 這個圖表展示了從資料預處理到預測結果的整個流程,包括特徵工程和線性迴歸模型的建立。
Feature Pipelines 及 Naive Bayes 分類別器
在進行機器學習任務時,資料預處理和特徵轉換是非常重要的步驟。然而,當我們需要進行多個步驟的資料轉換和模型訓練時,使用傳統的方法可能會變得很繁瑣。為了簡化這個過程,Scikit-Learn 提供了一個稱為 Pipeline 的物件,可以用來串接多個步驟,包括資料預處理、特徵轉換和模型訓練。
Feature Pipelines
Pipeline 物件可以讓我們輕鬆地建立一個資料處理流程,從資料預處理到模型訓練。以下是建立一個 Pipeline 的範例:
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
model = make_pipeline(
SimpleImputer(strategy='mean'), # 使用平均值填補缺失值
PolynomialFeatures(degree=2), # 將特徵轉換為二次方
LinearRegression() # 線性迴歸模型
)
這個 Pipeline 物件可以直接用於模型訓練和預測,就像是一個普通的 Scikit-Learn 物件一樣。
Naive Bayes 分類別器
Naive Bayes 分類別器是一種非常快速和簡單的分類別演算法,常用於高維度資料集。由於它們的速度快和引數少,Naive Bayes 分類別器常被用作快速的基準模型。
Naive Bayes 分類別器是根據貝葉斯分類別方法,利用貝葉斯定理來計算標籤的條件機率。貝葉斯定理描述了條件機率之間的關係,可以用來計算給定特徵的標籤機率。
Bayesian 分類別
在 Bayesian 分類別中,我們想要找到給定特徵的標籤機率,可以寫成 P(L | features)。貝葉斯定理告訴我們如何將其表示為可以直接計算的量:
P(L | features) = P(features | L) \* P(L) / P(features)
這個公式可以用來計算給定特徵的標籤機率。
Naive Bayes 分類別器
Naive Bayes 分類別器是一種簡單的分類別演算法,假設每個特徵之間是獨立的。這個假設使得計算簡單很多,但也可能會導致模型的準確度降低。
Naive Bayes 分類別器可以用於二元分類別和多元分類別問題,並且可以處理高維度資料集。然而,Naive Bayes 分類別器對於資料的品質很敏感,如果資料中有很多噪音或缺失值,模型的準確度可能會很低。
貳、貝氏分類別器的基礎
在進行貝氏分類別時,我們需要計算每個標籤(Label)下的後驗機率(Posterior Probability),以決定哪個標籤最適合給定的特徵(Features)。給定兩個標籤 $L_1$ 和 $L_2$,我們可以計算每個標籤下的後驗機率比率如下:
$$ \frac{P(L_1 | \text{features})}{P(L_2 | \text{features})} = \frac{P(\text{features} | L_1) \cdot P(L_1)}{P(\text{features} | L_2) \cdot P(L_2)} $$
為了計算這個比率,我們需要一個模型來描述每個標籤下的條件機率 $P(\text{features} | L_i)$。這種模型被稱為生成模型(Generative Model),因為它描述了假設的隨機過程,用於生成資料。
指定每個標籤的生成模型是訓練貝氏分類別器的主要部分。一般來說,這是一個非常困難的任務,但透過對模型形式做出一些簡化假設,我們可以使其變得更簡單。這就是「天真」的由來:如果我們對每個標籤的生成模型做出非常天真的假設,我們可以找到每個類別的生成模型的一個粗略近似值,然後繼續進行貝氏分類別。不同的天真貝氏分類別器根據對資料的不同天真假設,我們將在下面的章節中探討一些這些假設。
首先,我們需要進行標準的匯入:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
內容解密:
上述程式碼片段進行了必要的函式庫匯入,包括 numpy、matplotlib.pyplot 和 seaborn,為後續的資料分析和視覺化做好了準備。其中,%matplotlib inline 指令用於在 Jupyter Notebook 中直接顯示繪圖結果。
圖表翻譯:
此流程圖描述了從開始到顯示結果的整個過程,包括匯入必要的函式庫、進行資料分析和視覺化,最後顯示結果。每一步驟都清晰地展示了工作流程中的邏輯關係。
高斯樸素貝葉斯分類別器
高斯樸素貝葉斯分類別器是一種簡單而有效的分類別演算法,假設每個類別的資料都來自一個高斯分佈。下面是一個簡單的例子,展示了高斯樸素貝葉斯分類別器的工作原理。
首先,我們生成一些樣本資料,共有兩個類別,每個類別有 100 個樣本。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.naive_bayes import GaussianNB
# 生成樣本資料
X, y = make_blobs(100, 2, centers=2, random_state=2, cluster_std=1.5)
# 繪製樣本資料
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='RdBu')
plt.show()
接下來,我們使用高斯樸素貝葉斯分類別器對這些資料進行分類別。
# 建立高斯樸素貝葉斯分類別器
model = GaussianNB()
# 對資料進行訓練
model.fit(X, y)
現在,我們可以使用這個模型對新的資料進行預測。
# 生成新的資料
rng = np.random.RandomState(0)
Xnew = [-6, -14] + [14, 18] * rng.rand(2000, 2)
# 對新的資料進行預測
ynew = model.predict(Xnew)
最後,我們可以繪製出新的資料和預測結果,以便更好地理解分類別器的決策邊界。
# 繪製原始資料和預測結果
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='RdBu')
lim = plt.axis()
plt.scatter(Xnew[:, 0], Xnew[:, 1], c=ynew, s=20, cmap='RdBu', alpha=0.1)
plt.axis(lim)
plt.show()
這個例子展示了高斯樸素貝葉斯分類別器如何對資料進行分類別,並且如何使用這個模型對新的資料進行預測。同時,也展示了決策邊界的形狀和位置,可以幫助我們更好地理解分類別器的工作原理。
內容解密:
- 高斯樸素貝葉斯分類別器假設每個類別的資料都來自一個高斯分佈。
- 我們使用
make_blobs函式生成樣本資料,並使用GaussianNB類別建立高斯樸素貝葉斯分類別器。 - 對資料進行訓練和預測,然後繪製出原始資料和預測結果,以便更好地理解分類別器的決策邊界。
圖表翻譯:
- 圖表展示了高斯樸素貝葉斯分類別器對資料進行分類別的過程。
- 藍色和紅色點代表不同的類別,決策邊界是根據高斯分佈計算出來的。
- 新的資料點被繪製在圖表上,以展示分類別器的預測結果。
簡介貝氏分類別的優點
在貝氏分類別中,我們可以使用 predict_proba 方法來電腦率分類別。這個方法可以根據模型的輸出給出每個類別的機率。
# 輸入新資料
yprob = model.predict_proba(Xnew)
# 對機率進行四捨五入
yprob[-8:].round(2)
這個方法的輸出是一個陣列,其中每一列代表每個類別的機率。這對於需要估計分類別不確定性的情況非常有用。
高斯樸素貝氏分類別的限制
高斯樸素貝氏分類別假設特徵符合高斯分佈,但這個假設在很多情況下並不成立。因此,高斯樸素貝氏分類別的結果可能不是很好。但是,當特徵數量很大時,這個假設並不會對結果產生太大的影響。
多項式樸素貝氏分類別
多項式樸素貝氏分類別是另一種常用的分類別方法,適合於特徵為計數或計數率的情況。這種方法假設特徵符合多項式分佈,描述了在多個類別中觀察到計數的機率。
文字分類別的例子
多項式樸素貝氏分類別常用於文字分類別,特徵是與檔案中單詞計數或頻率相關的。以下是使用 Scikit-Learn 中的 20 Newsgroups 資料集進行文字分類別的例子:
# 匯入必要的函式庫
from sklearn.datasets import fetch_20newsgroups
# 下載資料集
data = fetch_20newsgroups()
# 檢視目標名稱
print(data.target_names)
為了簡單起見,我們只選擇了幾個類別,並下載了訓練和測試集:
# 選擇類別
categories = ['talk.religion.misc', 'soc.religion.christian',
'sci.space', 'comp.graphics']
# 下載訓練和測試集
train = fetch_20newsgroups(subset='train', categories=categories)
test = fetch_20newsgroups(subset='test', categories=categories)
以下是訓練資料中的一個代表性條目:
# 列印訓練資料中的某一項
print(train.data[5][48:])
內容解密:
上述程式碼展示瞭如何使用 fetch_20newsgroups 函式下載 20 Newsgroups 資料集,並選擇特定的類別進行訓練和測試。然後,我們列印預出訓練資料中的某一項,以展示資料的格式。
圖表翻譯:
此圖表展示了文字分類別過程中的步驟,從下載資料集開始,選擇類別,下載訓練和測試集,最後列印預出訓練資料。
文字分類別器的建立與評估
在進行文字分類別任務時,首先需要將文字資料轉換為機器能夠理解的數值向量。為此,我們可以使用TF-IDF(Term Frequency-Inverse Document Frequency)向量化技術。TF-IDF是一種常用的文字表示方法,能夠有效地捕捉文字中詞彙的重要性。
建立分類別模型
首先,我們需要匯入必要的函式庫,包括TfidfVectorizer和MultinomialNB。然後,我們可以建立一個管道(pipeline),將TF-IDF向量化和多項式納伊夫貝葉斯(Multinomial Naive Bayes)分類別器結合起來。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
model = make_pipeline(TfidfVectorizer(), MultinomialNB())
訓練模型
接下來,我們可以使用訓練資料來訓練模型。這個過程包括將文字資料轉換為TF-IDF向量,並使用這些向量訓練多項式納伊夫貝葉斯分類別器。
model.fit(train.data, train.target)
預測和評估
一旦模型訓練完成,我們就可以使用它來預測測試資料的標籤。然後,透過比較預測的標籤和實際的標籤,我們可以評估模型的效能。
labels = model.predict(test.data)
混淆矩陣
為了更深入地瞭解模型的效能,我們可以計算混淆矩陣(confusion matrix)。混淆矩陣是一種表格,用於描述預測的標籤和實際的標籤之間的關係。
from sklearn.metrics import confusion_matrix
conf_mat = confusion_matrix(test.target, labels)
圖示化混淆矩陣
最後,為了更直觀地理解混淆矩陣,我們可以使用圖示化工具將其視覺化。這樣可以幫助我們快速地理解模型的效能,包括它的準確率、召回率和F1-score等指標。
圖表翻譯:
上述程式碼使用了TF-IDF向量化和多項式納伊夫貝葉斯分類別器建立了一個文字分類別模型。這個模型能夠將文字資料轉換為數值向量,並使用這些向量進行分類別。透過計算混淆矩陣和視覺化,它能夠提供對模型效能的詳細評估。
文字分類別器的實作與應用
在前面的章節中,我們已經瞭解瞭如何使用簡單的分類別器對文字進行分類別。在這個章節中,我們將更深入地探討如何使用 Naive Bayes 分類別器對文字進行分類別。
混淆矩陣的視覺化
首先,我們需要了解混淆矩陣的概念。混淆矩陣是一種表格,用於描述分類別器的效能。它可以告訴我們,分類別器正確地將哪些樣本分類別為哪些類別,以及哪些樣本被錯誤地分類別為哪些類別。
import seaborn as sns
import matplotlib.pyplot as plt
# 計算混淆矩陣
mat = confusion_matrix(test.target, labels)
# 視覺化混淆矩陣
sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False,
xticklabels=train.target_names,
yticklabels=train.target_names,
cmap='Blues')
plt.xlabel('真實標籤')
plt.ylabel('預測標籤')
分類別器的實作
接下來,我們需要實作一個分類別器。這個分類別器可以使用 Naive Bayes 演算法對文字進行分類別。
from sklearn.naive_bayes import MultinomialNB
# 訓練分類別器
model = MultinomialNB()
model.fit(train.data, train.target)
# 定義一個函式,用於預測單個字串的分類別
def predict_category(s, train=train, model=model):
pred = model.predict([s])
return train.target_names[pred[0]]
# 測試分類別器
print(predict_category('sending a payload to the ISS'))
print(predict_category('discussing the existence of God'))
print(predict_category('determining the screen resolution'))
Naive Bayes 分類別器的優點
Naive Bayes 分類別器有以下優點:
- 它們的訓練和預測速度很快。
- 它們提供了簡單的機率預測。
- 它們通常很容易解釋。
- 它們有很少的可調引數。
Naive Bayes 分類別器的應用場景
Naive Bayes 分類別器在以下情況下表現良好:
- 當假設的條件實際上符合資料時(在實踐中很少見)。
- 當模型複雜度較低,且類別之間很好地分離時。
圖表翻譯:
@startuml
skinparam backgroundColor #FEFEFE
title 機器學習特徵工程與貝氏分類別器應用
|開發者|
start
:提交程式碼;
:推送到 Git;
|CI 系統|
:觸發建置;
:執行單元測試;
:程式碼品質檢查;
if (測試通過?) then (是)
:建置容器映像;
:推送到 Registry;
else (否)
:通知開發者;
stop
endif
|CD 系統|
:部署到測試環境;
:執行整合測試;
if (驗證通過?) then (是)
:部署到生產環境;
:健康檢查;
:完成部署;
else (否)
:回滾變更;
endif
stop
@enduml內容解密:
上述程式碼展示瞭如何使用 Naive Bayes 分類別器對文字進行分類別。首先,我們需要計算混淆矩陣,以評估分類別器的效能。然後,我們可以使用 Naive Bayes 演算法訓練一個分類別器,並定義一個函式,用於預測單個字串的分類別。最後,我們可以測試分類別器,檢視它的效能如何。
資料預處理和特徵工程是機器學習模型開發的根本。資料科學家們普遍認知,資料品質直接決定模型效能上限。本文深入探討了特徵工程中多項式特徵擴充套件、缺失值處理、文字向量化等關鍵技術,並以線性迴歸、高斯樸素貝氏、多項式樸素貝氏等模型示範其應用。分析顯示,特徵工程並非單一技術,而是涵蓋多種資料轉換方法的綜合性策略。其核心挑戰在於如何根據資料特性和模型需求,選擇合適的技術組合,並調校最佳引數。例如,多項式特徵擴充套件能提升模型對非線性關係的捕捉能力,但過高的次方數易造成過擬合;缺失值處理則需考量填補策略對資料分佈的影響。對於重視模型可解釋性的應用場景,樸素貝氏分類別器因其簡單和高效的特性,成為快速驗證和基準測試的首選。然而,其「特徵獨立性」的假設在現實世界中往往難以完全滿足,限制了其在複雜場景下的應用。展望未來,自動化特徵工程技術有望降低開發門檻,提升模型效能。同時,結合領域知識的客製化特徵工程策略將成為提升模型泛化能力和商業價值的關鍵。玄貓認為,深入理解資料特性、模型原理以及特徵工程技術的優劣,才能在實務中構建出高品質的機器學習模型。