利用 PySpark 分散式處理糖尿病資料集,並使用 TensorFlow (Keras) 建立預測模型。模型評估採用準確率、精確率、召回率和 F1 分數等指標,並透過日誌記錄追蹤訓練過程。程式碼中包含 SparkSession 初始化、資料預處理、模型訓練、評估以及錯誤處理機制,確保流程的完整性和穩定性。同時,文章也探討了使用 keras_tuner 進行超引數調校的步驟和方法,以進一步提升模型效能。程式碼範例清晰展示瞭如何定義 DiabetesHyperModel 類別,並利用 hp.Int 和 hp.Float 等函式設定可調超引數的範圍,讓 keras_tuner 自動搜尋最佳引陣列合。

糖尿病預測模型評估與訓練流程實作

本篇將探討如何使用 TensorFlow (Keras) 訓練糖尿病預測模型,並對其效能進行全面評估。整體流程涵蓋資料預處理、模型訓練及評估三大部分,並透過 PySpark 進行大規模資料處理。

模型評估器實作細節

首先,我們來分析 DiabetesModelEvaluator 類別的具體實作:

class DiabetesModelEvaluator:
    """用於評估 TensorFlow (Keras) 模型的類別"""
    
    @staticmethod
    def evaluate_model(model, X_test, y_test):
        """評估 TensorFlow (Keras) 模型的效能"""
        try:
            y_pred = (model.predict(X_test) > 0.5).astype(int)
            accuracy = accuracy_score(y_test, y_pred)
            precision = precision_score(y_test, y_pred)
            recall = recall_score(y_test, y_pred)
            f1 = f1_score(y_test, y_pred)
            
            logger.info(f"準確率:{accuracy:.4f}")
            logger.info(f"精確度:{precision:.4f}")
            logger.info(f"召回率:{recall:.4f}")
            logger.info(f"F1 分數:{f1:.4f}")
        except Exception as e:
            logger.error(f"模型評估過程中發生錯誤:{str(e)}")

內容解密:

  1. evaluate_model 方法:作為靜態方法,此函式無需例項化類別即可直接呼叫,主要負責評估已訓練完成的模型效能。
  2. 預測流程:使用 model.predict(X_test) 進行測試資料的預測,並透過閾值 0.5 將預測結果二值化。
  3. 效能指標計算:分別計算準確率、精確度、召回率及 F1 分數等關鍵評估指標。
  4. 日誌記錄:將評估結果以資訊等級記錄至日誌系統,同時實作例外處理機制以捕捉並記錄潛在錯誤。

主程式執行流程

主程式進入點位於 if __name__ == "__main__": 區塊,主要負責整體流程的控制:

if __name__ == "__main__":
    try:
        # 初始化 SparkSession
        spark = (SparkSession.builder
                 .appName("DiabetesClassification")
                 .config("spark.executor.instances", "4")
                 .config("spark.executor.memory", "4g")
                 .config("spark.executor.cores", "2")
                 .config("spark.driver.memory", "2g")
                 .getOrCreate())
        
        # 定義資料路徑
        data_file_path = "/home/ubuntu/airflow/dags/diabetes.csv"
        train_parquet_path = "/home/ubuntu/airflow/dags/diabetes_train.parquet"
        test_parquet_path = "/home/ubuntu/airflow/dags/diabetes_test.parquet"
        
        # 執行資料預處理
        DiabetesProcessor.preprocess_data(spark, data_file_path, train_parquet_path, test_parquet_path)
        
        # 讀取訓練與測試資料
        train_diabetes_df = spark.read.parquet(train_parquet_path)
        test_diabetes_df = spark.read.parquet(test_parquet_path)
        
        # 資料轉換與模型訓練
        X_train = np.array(train_diabetes_df.select("scaled_features").rdd.flatMap(lambda x: x).collect())
        y_train = np.array(train_diabetes_df.select("Outcome").rdd.flatMap(lambda x: x).collect())
        trained_model = DiabetesModelTrainer.train_tensorflow_model(X_train, y_train)
        
        # 模型評估
        X_test = np.array(test_diabetes_df.select("scaled_features").rdd.flatMap(lambda x: x).collect())
        y_test = np.array(test_diabetes_df.select("Outcome").rdd.flatMap(lambda x: x).collect())
        DiabetesModelEvaluator.evaluate_model(trained_model, X_test, y_test)
        
    except Exception as e:
        logger.error(f"發生錯誤:{str(e)}")

內容解密:

  1. SparkSession 初始化:組態適當的執行引數以最佳化資源分配。
  2. 資料預處理:呼叫 DiabetesProcessor.preprocess_data 方法完成資料清理與特徵工程。
  3. 模型訓練與評估流程:依序完成資料讀取、模型訓練及效能評估等步驟。
  4. 例外處理機制:透過 try-except 區塊捕捉並記錄執行過程中的錯誤資訊。

技術實作重點分析

  1. 分散式資料處理:利用 PySpark 進行大規模資料的預處理作業。
  2. 深度學習模型訓練:採用 TensorFlow (Keras) API 建立並訓練糖尿病預測模型。
  3. 全面效能評估:計算多項評估指標以全面衡量模型效能。
  4. 健全的錯誤處理:在關鍵流程中實作例外處理機制以確保系統穩定性。

本實作案例完整示範了從資料預處理到模型訓練與評估的整體流程,為開發高效的糖尿病預測系統提供了完整的技術參考。

深度學習框架比較:TensorFlow 與 PyTorch 在糖尿病預測任務中的表現

本章節將探討 TensorFlow 和 PyTorch 兩大深度學習框架在糖尿病預測任務中的表現。我們將根據相同的 Pima 糖尿病資料集,對比分析這兩種框架的訓練損失、精確度、召回率和 F1 分數,以評估它們在識別糖尿病病例方面的預測能力。

TensorFlow 模型訓練與評估

首先,我們來分析 TensorFlow 模型的訓練過程和評估結果。在訓練過程中,模型的損失值隨著迭代次數的增加而不斷下降,表明模型正在學習並提高其預測效能。

訓練過程中的損失值變化

EpochLoss
10/1000.6353
20/1000.5995
30/1000.5723
40/1000.5581
50/1000.5513
60/1000.5472
70/1000.5316
80/1000.5275
90/1000.5181
100/1000.5123

此圖示說明瞭損失值隨著訓練迭代次數的增加而下降的趨勢。

評估指標

在測試資料集上,TensorFlow 模型的評估結果如下:

MetricValue
Accuracy0.7692
Precision0.7059
Recall0.5854
F1 Score0.6400
評估指標解讀
  • 準確率(Accuracy):模型正確預測的比例為 76.92%,表明模型整體上具有較好的預測能力。
  • 精確度(Precision):模型預測為陽性的樣本中,真正為陽性的比例為 70.59%,表明模型具有較好的陽性預測能力。
  • 召回率(Recall):模型正確識別出的陽性樣本佔所有陽性樣本的比例為 58.54%,表明模型在識別陽性樣本方面仍有改進空間。
  • F1 分數:綜合考慮精確度和召回率,模型的 F1 分數為 0.64,表明模型在平衡精確度和召回率方面取得了一定的成效。

TensorFlow 與 PyTorch 的比較

透過對比 TensorFlow 和 PyTorch 在相同資料集上的表現,我們可以更深入地瞭解這兩種框架的優缺點。比較的指標包括訓練損失、精確度、召回率和 F1 分數。

對比分析

  • 訓練損失:兩種框架在訓練過程中都表現出損失值下降的趨勢,但下降的速度和穩定性可能存在差異。
  • 評估指標:透過比較兩種框架在測試資料集上的準確率、精確度、召回率和 F1 分數,可以評估它們在糖尿病預測任務中的表現。
程式碼解析:

- 模型定義:使用 TensorFlow 的 Keras API 定義了一個簡單的神經網路模型。

- 層組態:模型包含兩個隱藏層,分別具有64和32個神經元,使用 ReLU 作為啟用函式。輸出層使用 sigmoid 啟用函式進行二分類別。

- 編譯模型:使用 Adam 最佳化器和二元交叉熵損失函式編譯模型,並監控準確率指標。


```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 糖尿病預測模型訓練與效能評估

package "糖尿病預測系統" {
    package "資料處理" {
        component [PySpark 分散式] as spark
        component [資料預處理] as preprocess
        component [特徵工程] as feature
    }

    package "模型訓練" {
        component [TensorFlow/Keras] as tf
        component [keras_tuner] as tuner
        component [超引數調校] as hpo
    }

    package "效能評估" {
        component [準確率] as accuracy
        component [F1 分數] as f1
        component [日誌記錄] as log
    }
}

spark --> preprocess : 大規模處理
preprocess --> tf : 訓練資料
tf --> tuner : 自動調參
accuracy --> f1 : 綜合評估

note bottom of tuner
  超引數搜尋
  自動最佳化
end note

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

此圖示呈現了從資料前處理到結果分析的整個流程。

圖表解析:

  • 圖表展示了使用 TensorFlow Keras 進行糖尿病預測的流程,包括資料前處理、模型訓練和評估等步驟。
  • 每個步驟之間的箭頭表示了流程的先後順序。

透過這樣的分析和比較,我們可以更好地理解 TensorFlow 和 PyTorch 在糖尿病預測任務中的表現,並為未來的研究和應用提供參考。

深度學習框架比較:TensorFlow 與 PyTorch 在分類別任務中的表現

在深度學習領域,選擇合適的框架對於模型的效能和佈署至關重要。本篇文章將對比 TensorFlow 和 PyTorch 兩大主流框架在分類別任務中的表現,包括損失值、準確率、精確率、召回率和 F1 分數等評估指標。

損失值比較

EpochTensorFlowPyTorch
10/1000.63530.5899
20/1000.59950.4330
30/1000.57230.4608
40/1000.55810.4612
50/1000.55130.5155
60/1000.54720.4025
70/1000.53160.3406
80/1000.52750.4323
90/1000.51810.4822
100/1000.51230.3203

內容解密:

  • TensorFlow 的損失值隨著訓練過程持續下降,顯示出有效的最佳化和學習能力。
  • PyTorch 的損失值則出現波動,表明其最佳化動態或學習行為可能存在差異。
  • 不同框架在每個 epoch 的損失值變化趨勢不同,反映出其收斂行為的差異。

評估指標比較

MetricTensorFlowPyTorch
Accuracy0.76920.7607
Precision0.70590.6585
Recall0.58540.6585
F1 Score0.64000.6585

內容解密:

  • TensorFlow 的準確率(0.77)略高於 PyTorch(0.76),顯示兩者皆具有良好的預測能力。
  • TensorFlow 的精確率(0.71)高於 PyTorch(0.66),表明 TensorFlow 在識別真陽性例項方面表現較佳。
  • PyTorch 的召回率(0.66)高於 TensorFlow(0.59),顯示 PyTorch 能夠捕捉更多的真實陽性例項。
  • PyTorch 的 F1 分數(0.66)略高於 TensorFlow(0.64),表明 PyTorch 在精確率和召回率之間取得了更好的平衡。

超引數調校最佳化模型效能

為了進一步提升模型效能,我們可以使用 keras_tuner 對超引數進行調校。以下為使用 keras_tuner 的步驟:

Step 1: 必要的匯入

from keras_tuner import HyperModel, RandomSearch

Step 2: 定義 DiabetesHyperModel 類別

class DiabetesHyperModel(HyperModel):
    """HyperModel for tuning the Keras model."""
    def build(self, hp):
        model = Sequential()
        model.add(
            Dense(
                units=hp.Int('units_1', min_value=32, max_value=128, step=32),
                input_dim=X_train.shape[1]
            )
        )
        model.add(ReLU())
        model.add(
            Dense(
                units=hp.Int('units_2', min_value=16, max_value=64, step=16)
            )
        )
        model.add(ReLU())
        model.add(
            Dense(
                units=hp.Int('units_3', min_value=8, max_value=32, step=8)
            )
        )
        model.add(ReLU())
        model.add(Dense(1, activation='sigmoid'))

內容解密:

  • DiabetesHyperModel 繼承自 HyperModel,允許我們定義具有可調超引數的模型架構。
  • build 方法中,我們定義了一個具有三個密集層的基礎順序模型。
  • 每個密集層的單元數由 hp.Int 指定,允許 keras_tuner 在指定範圍內探索不同的值。
  • 使用 hp.Float 指定學習率,同樣允許 keras_tuner 在指定範圍內進行探索。
  • 編譯模型時使用標準的二元交叉熵損失函式和準確率作為評估指標。