資料預處理階段,利用 Apache Spark 的 VectorAssembler 將相關特徵向量化,並使用 StandardScaler 進行標準化,確保資料尺度一致性,提升模型訓練效果。模型建構採用 PyTorch,設計包含三個隱藏層的全連線神經網路,並以 ReLU 作為啟用函式,提升模型非線性學習能力。訓練過程中,使用 ModelTrainer 類別管理訓練流程,並記錄訓練損失以監控模型收斂情況。評估階段則利用 ModelEvaluator 類別,計算準確率、精確率、召回率、F1 分數、ROC-AUC 分數和混淆矩陣等指標,全面評估模型效能。程式碼中也包含了錯誤處理機制,確保程式碼的穩定性和可靠性。
資料預處理與深度學習模型定義
在進行糖尿病分類別任務時,資料預處理與深度學習模型的定義是兩個至關重要的步驟。本章節將詳細介紹如何使用 Apache Spark 進行資料預處理,以及如何利用 PyTorch 定義一個適用於糖尿病分類別的深度學習模型。
資料預處理
資料預處理是機器學習流程中的第一步,其目的是將原始資料轉換成適合模型訓練的形式。以下是一個使用 Apache Spark 進行資料預處理的範例程式碼:
feature_cols = [
"Pregnancies",
"Glucose",
"BloodPressure",
"BMI",
"DiabetesPedigreeFunction",
"Age",
]
assembler = VectorAssembler(
inputCols=feature_cols,
outputCol="features"
)
diabetes_df = assembler.transform(diabetes_df)
scaler = StandardScaler(
inputCol="features",
outputCol="scaled_features"
)
scaler_model = scaler.fit(diabetes_df)
diabetes_df = scaler_model.transform(diabetes_df)
train_df, test_df = diabetes_df.randomSplit(
[0.8, 0.2],
seed=42
)
內容解密:
- 特徵欄位選擇:首先,定義了將要用於模型訓練的特徵欄位,包括懷孕次數、血糖值、血壓、身體品質指數(BMI)、糖尿病家族史和年齡。
- 特徵向量化:使用
VectorAssembler將選定的特徵欄位組合成一個名為 “features” 的向量欄位,以便於後續的模型訓練。 - 特徵標準化:透過
StandardScaler對特徵進行標準化處理,使得不同特徵之間的尺度保持一致,有利於提升模型的表現。 - 資料集分割:最後,將預處理後的資料集按照 8:2 的比例分割成訓練集和測試集,並設定隨機種子以確保結果的可復現性。
深度學習模型定義
在完成資料預處理後,接下來需要定義一個深度學習模型來進行糖尿病分類別。以下是一個使用 PyTorch 定義的深度學習模型範例:
class DiabetesClassifierModel(nn.Module):
def __init__(self, input_size, output_size):
super(DiabetesClassifierModel, self).__init__()
self.model = nn.Sequential(
nn.Linear(input_size, 64),
nn.ReLU(),
nn.Linear(64, 32),
nn.ReLU(),
nn.Linear(32, 16),
nn.ReLU(),
nn.Linear(16, output_size),
)
def forward(self, x):
return self.model(x)
內容解密:
- 模型架構定義:該模型繼承自 PyTorch 的
nn.Module,並在__init__方法中定義了模型的架構。使用nn.Sequential容器來簡化模型的定義,將多個線性層和 ReLU 啟用函式按順序堆積疊。 - 線性層與啟用函式:模型包含多個線性層,每個線性層後面都接著一個 ReLU 啟用函式,以引入非線性,使模型能夠學習更複雜的模式。
- 前向傳播:
forward方法定義了模型的前向傳播過程,直接傳回輸入x經過整個模型後的輸出。
深度學習模型訓練與評估的實務解析
在前述章節中,我們已經建立了一個簡單的糖尿病分類別模型。現在,我們將探討模型的訓練與評估過程,並分析相關程式碼。
模型架構的探討
本模型採用三個隱藏層,分別包含64、32和16個神經元。雖然這個架構提供了一個穩固的基礎,但它可能並非最佳選擇,仍取決於資料集的大小和複雜度。目前的架構缺乏正規化技術(如dropout或L2正規化),可能會導致模型過度擬合訓練資料,捕捉到雜訊而非一般模式。反之,如果架構過於簡單,可能會導致欠擬合,無法捕捉資料集的底層結構。此外,目前的訓練方法僅將資料集一次分割為訓練集和測試集,這可能會引入變異性並影響模型的效能。這些潛在問題,包括使用dropout、早期停止、L1/L2正規化和交叉驗證等技術,將在第9章中進行討論。第9章還將展示如何利用PyTorch的學習率排程器進一步提升模型的效能和泛化能力。
前向傳遞方法的定義
forward方法定義了模型的前向傳遞過程,指定了輸入資料如何透過神經網路處理以產生輸出預測結果。它接受一個引數x,代表包含特徵的輸入張量。在forward方法中,輸入張量x被傳遞透過神經網路模型(self.model)。模型產生的輸出張量然後作為前向傳遞的結果被傳回。
程式碼範例:前向傳遞方法
def forward(self, x):
output = self.model(x)
return output
內容解密:
forward方法是神經網路的核心,用於定義資料如何透過網路。x是輸入張量,代表模型的輸入特徵。self.model(x)將輸入張量傳遞透過神經網路,產生輸出預測結果。- 輸出張量被傳回,用於後續的損失計算和反向傳遞。
模型訓練步驟
在這個步驟中,我們定義了ModelTrainer類別及其train方法。該程式碼初始化了模型訓練器,包含神經網路模型、損失函式、最佳化器和訓練資料載入器。它透過根據最佳化過程更新模型的引數來訓練模型。
程式碼範例:ModelTrainer類別
class ModelTrainer:
def __init__(self, model, criterion, optimizer, train_loader):
self.model = model
self.criterion = criterion
self.optimizer = optimizer
self.train_loader = train_loader
def train(self, epochs=100, lr=0.01):
try:
for epoch in range(epochs):
self.model.train()
for inputs, targets in self.train_loader:
self.optimizer.zero_grad()
outputs = self.model(inputs)
loss = self.criterion(outputs.squeeze(), targets)
loss.backward()
self.optimizer.step()
if (epoch + 1) % 10 == 0:
logging.info(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")
except Exception as e:
logging.error(f"Error occurred during model training: {str(e)}")
raise e
內容解密:
ModelTrainer類別負責管理模型的訓練過程。__init__方法初始化訓練所需的元件,包括模型、損失函式、最佳化器和訓練資料載入器。train方法執行訓練迴圈,多次迭代訓練資料集。- 在每個迭代中,模型被設定為訓練模式,並計算梯度、損失和引數更新。
- 每十個epoch記錄一次損失,以監控訓練進度。
- 例外處理機制用於捕捉和記錄訓練過程中發生的錯誤。
模型評估步驟
在這個步驟中,我們定義了ModelEvaluator類別及其evaluate方法。該程式碼使用測試資料集評估訓練好的模型。它計算了諸如準確率、精確率、召回率、F1分數、ROC-AUC分數和混淆矩陣等效能指標,以評估模型的效能。
程式碼範例:ModelEvaluator類別
class ModelEvaluator:
def __init__(self, model, test_loader, y_test_np):
self.model = model
self.test_loader = test_loader
self.y_test_np = y_test_np
def evaluate(self):
try:
with torch.no_grad():
# 評估模型的程式碼將在這裡實作
pass
except Exception as e:
logging.error(f"Error occurred during model evaluation: {str(e)}")
raise e
內容解密:
ModelEvaluator類別負責評估模型的效能。__init__方法初始化評估所需的元件,包括模型、測試資料載入器和真實標籤。evaluate方法在測試資料集上評估模型,計算各種效能指標。- 使用
torch.no_grad()上下文管理器,以避免在評估過程中計算梯度。 - 例外處理機制用於捕捉和記錄評估過程中發生的錯誤。
深度學習模型評估與實作:以糖尿病分類別器為例
在深度學習的應用中,模型的評估是至關重要的一環。本文將以糖尿病分類別器為例,探討如何使用 PyTorch 進行模型的評估。
模型評估器的設計
ModelEvaluator 類別是評估糖尿病分類別器模型的核心元件,負責在測試資料上評估模型的效能。其建構子(__init__ 方法)接受三個關鍵引數:神經網路模型(model)、測試資料載入器(test_loader)以及測試資料的真實標籤(y_test_np)。這些元件對於準確評估模型的效能至關重要。
評估流程
evaluate 方法是 ModelEvaluator 類別的核心,負責執行評估流程。以下是評估流程的詳細步驟:
- 模型評估模式:將模型設定為評估模式(
self.model.eval()),這對於某些層(如 dropout)來說非常重要,因為它們在訓練和評估期間的行為不同。 - 預測生成:使用訓練好的模型對測試資料進行預測。利用
torch.no_grad()上下文管理器確保在評估期間停用梯度計算,從而節省記憶體和計算時間。 - 機率計算:使用 sigmoid 函式(
torch.sigmoid(outputs))將原始輸出分數轉換為機率。 - 最終預測標籤:根據機率確定最終預測標籤(
y_pred),並使用 0.5 的閾值進行分類別。
程式碼範例:模型評估
self.model.eval()
predictions = []
probabilities = []
for inputs, _ in self.test_loader:
outputs = self.model(inputs)
probabilities.extend(torch.sigmoid(outputs).squeeze().tolist())
predictions.extend(outputs.squeeze().tolist())
y_pred = np.array([1 if pred > 0.5 else 0 for pred in probabilities])
內容解密:
- 將模型設定為評估模式,以確保某些層(如 dropout)正確運作。
- 使用
torch.no_grad()停用梯度計算,以節省資源。 - 透過 sigmoid 函式電腦率,並根據 0.5 的閾值確定最終預測標籤。
評估指標的計算
在獲得最終預測標籤後,計算各種效能指標,包括:
- 準確率(Accuracy):衡量正確分類別的樣本比例。
- 精確率(Precision):表示在所有正向預測中,真實正向預測的比例。
- 召回率(Recall):表示在所有實際正向樣本中,真實正向預測的比例。
- F1 分數(F1 Score):提供精確率和召回率之間的平衡。
程式碼範例:評估指標計算
accuracy = accuracy_score(self.y_test_np, y_pred)
precision = precision_score(self.y_test_np, y_pred)
recall = recall_score(self.y_test_np, y_pred)
f1 = f1_score(self.y_test_np, y_pred)
logging.info(f"Accuracy: {accuracy:.4f}")
logging.info(f"Precision: {precision:.4f}")
logging.info(f"Recall: {recall:.4f}")
logging.info(f"F1 Score: {f1:.4f}")
內容解密:
- 使用
accuracy_score、precision_score、recall_score和f1_score函式計算各項評估指標。 - 將結果記錄到日誌中,以便後續分析和除錯。
混淆矩陣與 ROC-AUC 分數
除了上述指標外,還計算了混淆矩陣和 ROC-AUC 分數,以更全面地評估模型的效能。
程式碼範例:混淆矩陣與 ROC-AUC 分數
conf_matrix = confusion_matrix(self.y_test_np, y_pred)
logging.info("Confusion Matrix:\n" + str(conf_matrix))
roc_auc = roc_auc_score(self.y_test_np, probabilities)
logging.info(f"ROC-AUC Score: {roc_auc:.4f}")
內容解密:
- 使用
confusion_matrix函式計算混淆矩陣,以詳細分析真實正向、假正向、真實負向和假負向樣本的分佈。 - 使用
roc_auc_score函式計算 ROC-AUC 分數,以衡量模型區分不同類別的能力。
例外處理
在 evaluate 方法中實作了例外處理,以捕捉和記錄評估過程中可能發生的錯誤,從而實作有效的除錯和錯誤解決。