利用 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)}")
內容解密:
evaluate_model方法:作為靜態方法,此函式無需例項化類別即可直接呼叫,主要負責評估已訓練完成的模型效能。- 預測流程:使用
model.predict(X_test)進行測試資料的預測,並透過閾值 0.5 將預測結果二值化。 - 效能指標計算:分別計算準確率、精確度、召回率及 F1 分數等關鍵評估指標。
- 日誌記錄:將評估結果以資訊等級記錄至日誌系統,同時實作例外處理機制以捕捉並記錄潛在錯誤。
主程式執行流程
主程式進入點位於 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)}")
內容解密:
- SparkSession 初始化:組態適當的執行引數以最佳化資源分配。
- 資料預處理:呼叫
DiabetesProcessor.preprocess_data方法完成資料清理與特徵工程。 - 模型訓練與評估流程:依序完成資料讀取、模型訓練及效能評估等步驟。
- 例外處理機制:透過 try-except 區塊捕捉並記錄執行過程中的錯誤資訊。
技術實作重點分析
- 分散式資料處理:利用 PySpark 進行大規模資料的預處理作業。
- 深度學習模型訓練:採用 TensorFlow (Keras) API 建立並訓練糖尿病預測模型。
- 全面效能評估:計算多項評估指標以全面衡量模型效能。
- 健全的錯誤處理:在關鍵流程中實作例外處理機制以確保系統穩定性。
本實作案例完整示範了從資料預處理到模型訓練與評估的整體流程,為開發高效的糖尿病預測系統提供了完整的技術參考。
深度學習框架比較:TensorFlow 與 PyTorch 在糖尿病預測任務中的表現
本章節將探討 TensorFlow 和 PyTorch 兩大深度學習框架在糖尿病預測任務中的表現。我們將根據相同的 Pima 糖尿病資料集,對比分析這兩種框架的訓練損失、精確度、召回率和 F1 分數,以評估它們在識別糖尿病病例方面的預測能力。
TensorFlow 模型訓練與評估
首先,我們來分析 TensorFlow 模型的訓練過程和評估結果。在訓練過程中,模型的損失值隨著迭代次數的增加而不斷下降,表明模型正在學習並提高其預測效能。
訓練過程中的損失值變化
| Epoch | Loss |
|---|---|
| 10/100 | 0.6353 |
| 20/100 | 0.5995 |
| 30/100 | 0.5723 |
| 40/100 | 0.5581 |
| 50/100 | 0.5513 |
| 60/100 | 0.5472 |
| 70/100 | 0.5316 |
| 80/100 | 0.5275 |
| 90/100 | 0.5181 |
| 100/100 | 0.5123 |
此圖示說明瞭損失值隨著訓練迭代次數的增加而下降的趨勢。
評估指標
在測試資料集上,TensorFlow 模型的評估結果如下:
| Metric | Value |
|---|---|
| Accuracy | 0.7692 |
| Precision | 0.7059 |
| Recall | 0.5854 |
| F1 Score | 0.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 分數等評估指標。
損失值比較
| Epoch | TensorFlow | PyTorch |
|---|---|---|
| 10/100 | 0.6353 | 0.5899 |
| 20/100 | 0.5995 | 0.4330 |
| 30/100 | 0.5723 | 0.4608 |
| 40/100 | 0.5581 | 0.4612 |
| 50/100 | 0.5513 | 0.5155 |
| 60/100 | 0.5472 | 0.4025 |
| 70/100 | 0.5316 | 0.3406 |
| 80/100 | 0.5275 | 0.4323 |
| 90/100 | 0.5181 | 0.4822 |
| 100/100 | 0.5123 | 0.3203 |
內容解密:
- TensorFlow 的損失值隨著訓練過程持續下降,顯示出有效的最佳化和學習能力。
- PyTorch 的損失值則出現波動,表明其最佳化動態或學習行為可能存在差異。
- 不同框架在每個 epoch 的損失值變化趨勢不同,反映出其收斂行為的差異。
評估指標比較
| Metric | TensorFlow | PyTorch |
|---|---|---|
| Accuracy | 0.7692 | 0.7607 |
| Precision | 0.7059 | 0.6585 |
| Recall | 0.5854 | 0.6585 |
| F1 Score | 0.6400 | 0.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在指定範圍內進行探索。 - 編譯模型時使用標準的二元交叉熵損失函式和準確率作為評估指標。