2025年12月30日 星期二

MySQL to Data Frame

 在進行機器學習或深度學習模型訓練時,將 MySQL 資料轉換為模型可吸收的格式(通常是 Tensor 或 NumPy Array)是一個標準的資料管線(Data Pipeline)流程。

以下是將 MySQL 資料處理並輸入模型的四個主要階段:


1. 資料提取 (Data Extraction)

首先,你需要從 MySQL 中讀取資料。最常用的工具是 Python 的 pandas 庫配合資料庫連接器。

  • 推薦工具: SQLAlchemymysql-connector-python

  • 操作方式:

    Python
    import pandas as pd
    from sqlalchemy import create_engine
    
    # 建立資料庫連線
    engine = create_engine('mysql+mysqlconnector://user:password@host:port/database')
    
    # 使用 SQL 語法讀取資料到 DataFrame
    query = "SELECT * FROM training_table"
    df = pd.read_sql(query, engine)
    

2. 資料清洗與預處理 (Data Preprocessing)

MySQL 存儲的原始資料通常無法直接進入模型,需要經過以下處理:

A. 處理缺失值 (Missing Values)

  • 刪除: 丟棄含有空值的欄位。

  • 填補: 使用平均值、中位數或眾數填補。

B. 特徵編碼 (Feature Encoding)

模型只能處理數字,因此類別型資料(如:性別、城市)需要轉換:

  • One-Hot Encoding: 用於無順序關係的類別。

  • Label Encoding: 用於有順序關係的類別。

C. 數值縮放 (Feature Scaling)

為了防止某些數值過大的特徵主導模型訓練(例如「年齡」與「年收入」的差異):

  • 標準化 (Standardization): 使資料符合 $z = \frac{x - \mu}{\sigma}$

  • 歸一化 (Normalization): 將數值縮放到 $[0, 1]$ 區間。


3. 資料轉換與切分 (Data Transformation & Splitting)

在輸入模型前,必須將 DataFrame 轉換為矩陣格式,並區分特徵與標籤。

  1. 分離特徵 (X) 與標籤 (y):

    Python
    X = df.drop('target_column', axis=1).values
    y = df['target_column'].values
    
  2. 切分訓練集與測試集:

    Python
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    

4. 輸入模型 (Model Feeding)

視你使用的框架而定,輸入方式略有不同:

  • Scikit-learn: 直接傳入 NumPy 陣列。

    model.fit(X_train, y_train)

  • TensorFlow/PyTorch: 需轉換為 Tensor 格式。

    Python
    import torch
    X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
    

進階建議:大數據處理

如果你的 MySQL 資料量極大(數千萬行以上),直接一次性讀取會導致記憶體(RAM)崩潰。建議採取以下策略:

  1. 分批讀取 (Chunking): 使用 pd.read_sql(query, engine, chunksize=10000) 分批處理。

  2. ETL 工具: 先將資料從 MySQL 導出成 .parquet.csv 格式,再由模型讀取。

  3. 使用 Dataset API: 像是 TensorFlow 的 tf.data.Dataset 可以建立流式處理管線,邊讀取邊訓練。

總結流程圖

您目前的資料量大約是多少?或是您正打算使用哪種模型框架(如 XGBoost 或 TensorFlow)? 我可以針對您的具體情況提供更精準的程式碼範例。

沒有留言:

張貼留言