資料預處理階段,利用 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
)

內容解密:

  1. 特徵欄位選擇:首先,定義了將要用於模型訓練的特徵欄位,包括懷孕次數、血糖值、血壓、身體品質指數(BMI)、糖尿病家族史和年齡。
  2. 特徵向量化:使用 VectorAssembler 將選定的特徵欄位組合成一個名為 “features” 的向量欄位,以便於後續的模型訓練。
  3. 特徵標準化:透過 StandardScaler 對特徵進行標準化處理,使得不同特徵之間的尺度保持一致,有利於提升模型的表現。
  4. 資料集分割:最後,將預處理後的資料集按照 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)

內容解密:

  1. 模型架構定義:該模型繼承自 PyTorch 的 nn.Module,並在 __init__ 方法中定義了模型的架構。使用 nn.Sequential 容器來簡化模型的定義,將多個線性層和 ReLU 啟用函式按順序堆積疊。
  2. 線性層與啟用函式:模型包含多個線性層,每個線性層後面都接著一個 ReLU 啟用函式,以引入非線性,使模型能夠學習更複雜的模式。
  3. 前向傳播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

內容解密:

  1. forward方法是神經網路的核心,用於定義資料如何透過網路。
  2. x是輸入張量,代表模型的輸入特徵。
  3. self.model(x)將輸入張量傳遞透過神經網路,產生輸出預測結果。
  4. 輸出張量被傳回,用於後續的損失計算和反向傳遞。

模型訓練步驟

在這個步驟中,我們定義了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

內容解密:

  1. ModelTrainer類別負責管理模型的訓練過程。
  2. __init__方法初始化訓練所需的元件,包括模型、損失函式、最佳化器和訓練資料載入器。
  3. train方法執行訓練迴圈,多次迭代訓練資料集。
  4. 在每個迭代中,模型被設定為訓練模式,並計算梯度、損失和引數更新。
  5. 每十個epoch記錄一次損失,以監控訓練進度。
  6. 例外處理機制用於捕捉和記錄訓練過程中發生的錯誤。

模型評估步驟

在這個步驟中,我們定義了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

內容解密:

  1. ModelEvaluator類別負責評估模型的效能。
  2. __init__方法初始化評估所需的元件,包括模型、測試資料載入器和真實標籤。
  3. evaluate方法在測試資料集上評估模型,計算各種效能指標。
  4. 使用torch.no_grad()上下文管理器,以避免在評估過程中計算梯度。
  5. 例外處理機制用於捕捉和記錄評估過程中發生的錯誤。

深度學習模型評估與實作:以糖尿病分類別器為例

在深度學習的應用中,模型的評估是至關重要的一環。本文將以糖尿病分類別器為例,探討如何使用 PyTorch 進行模型的評估。

模型評估器的設計

ModelEvaluator 類別是評估糖尿病分類別器模型的核心元件,負責在測試資料上評估模型的效能。其建構子(__init__ 方法)接受三個關鍵引數:神經網路模型(model)、測試資料載入器(test_loader)以及測試資料的真實標籤(y_test_np)。這些元件對於準確評估模型的效能至關重要。

評估流程

evaluate 方法是 ModelEvaluator 類別的核心,負責執行評估流程。以下是評估流程的詳細步驟:

  1. 模型評估模式:將模型設定為評估模式(self.model.eval()),這對於某些層(如 dropout)來說非常重要,因為它們在訓練和評估期間的行為不同。
  2. 預測生成:使用訓練好的模型對測試資料進行預測。利用 torch.no_grad() 上下文管理器確保在評估期間停用梯度計算,從而節省記憶體和計算時間。
  3. 機率計算:使用 sigmoid 函式(torch.sigmoid(outputs))將原始輸出分數轉換為機率。
  4. 最終預測標籤:根據機率確定最終預測標籤(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_scoreprecision_scorerecall_scoref1_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 方法中實作了例外處理,以捕捉和記錄評估過程中可能發生的錯誤,從而實作有效的除錯和錯誤解決。