商業邏輯約束資料
適用於需要確保業務規則的情境。
透過 Constraints YAML 定義欄位間的邏輯關係、範圍限制與比例維護,確保合成資料符合業務規範。支援四種約束類型:遺失值群組、欄位約束、欄位組合、欄位比例。
如果您的資料沒有特殊約束需求,可以直接使用預設合成方式,參考快速入門。
Constraints YAML 範例
將以下內容儲存為 business_constraints.yaml:
# 空值處理規則
nan_groups:
# 當資本額為空時刪除整筆資料(企業基本資訊不完整)
capital: 'delete'
# 欄位約束條件
field_constraints:
# 時間邏輯約束:成立日期 < 第一次申請日期 <= 最新申請日期 < 最新追蹤日期
- "established_date < first_apply_date"
- "first_apply_date <= latest_apply_date"
- "latest_apply_date < latest_track_date"
# 數值關係約束:核准金額不超過申請金額
- "latest_apply_amount_approved <= latest_apply_amount_requested"
# 範圍約束
- "capital > 0" # 資本額必須為正
- "latest_track_profit_ratio >= -1.0 & latest_track_profit_ratio <= 1.0" # 利潤率範圍
- "latest_apply_amount_requested > 0" # 申請金額必須為正
# 欄位組合約束(正面表列)
field_combinations:
# 申請狀態與核准金額的配對關係
-
- latest_apply_status: latest_apply_amount_approved
- approved: # 核准時必須有金額
- 1000000
- 5000000
- 10000000
- 20000000
rejected: # 拒絕時金額為空
- "pd.NA"
withdrawn: # 撤回時金額為空
- "pd.NA"
# 欄位比例維護
field_proportions:
# 維護產業分布,容許 10% 誤差
- fields: 'industry'
mode: 'all'
tolerance: 0.1
# 維護風險等級分布,容許 5% 誤差
- fields: 'latest_track_risk_level'
mode: 'all'
tolerance: 0.05約束類型詳細說明
nan_groups(遺失值群組約束)
定義當特定欄位為空值時的處理規則。
capital: 'delete'
- 說明:當
capital欄位為空值時,刪除整筆資料 - 適用情境:某欄位為空時整筆資料無意義(如企業沒有資本額資訊)
- 處理方式:
delete(刪除整筆)、erase(清除關聯欄位)、copy(複製其他欄位值)
field_constraints(欄位約束)
定義單一或多欄位的數值範圍與邏輯關係。
時間邏輯約束
"established_date < first_apply_date"- 說明:企業成立日期必須早於第一次申請日期
- 適用情境:時間先後順序的業務邏輯
"first_apply_date <= latest_apply_date"- 說明:第一次申請日期必須早於或等於最新申請日期
- 適用情境:允許相等是因為可能只有一次申請
數值關係約束
"latest_apply_amount_approved <= latest_apply_amount_requested"- 說明:核准金額不能超過申請金額
- 適用情境:金融機構的基本審核原則
範圍約束
"capital > 0"- 說明:資本額必須為正數
- 適用情境:邏輯上不可能為零或負數的欄位
"latest_track_profit_ratio >= -1.0 & latest_track_profit_ratio <= 1.0"- 說明:利潤率範圍在 -100% 到 100% 之間
- 適用情境:比率類欄位的合理範圍
- 語法:使用
&(AND)組合多個條件
field_combinations(欄位組合約束)
定義欄位值之間的有效配對關係(正面表列)。
申請狀態與核准金額配對
-
- latest_apply_status: latest_apply_amount_approved
- approved: [1000000, 5000000, 10000000, 20000000]
rejected: ["pd.NA"]
withdrawn: ["pd.NA"]- 說明:定義不同申請狀態允許的核准金額
approved:核准狀態可以有具體金額(列出常見額度)rejected、withdrawn:拒絕或撤回狀態金額必須為空- 注意:這是正面表列,未列出的組合會被視為無效
語法規則
- 空值必須使用
"pd.NA"(注意大小寫) - 字串值必須加引號如
"approved" - 數值不需要引號
field_proportions(欄位比例約束)
維護類別分布或空值比例接近原始資料。
維護產業分布
- fields: 'industry'
mode: 'all'
tolerance: 0.1fields:要維護比例的欄位名稱mode: 'all':維護所有類別的分布tolerance: 0.1:容許的誤差範圍(±10%)
維護風險等級分布
- fields: 'latest_track_risk_level'
mode: 'all'
tolerance: 0.05tolerance: 0.05:更嚴格的容差(±5%)確保風險分布接近原始資料
維護空值比例
- fields: 'workclass'
mode: 'missing'
tolerance: 0.03mode: 'missing':僅維護遺失值(NA)的比例- 適用情境:保持資料品質特徵
注意:此約束透過移除過量資料來達成比例,可能減少合成資料的總筆數。
使用方式
反覆抽樣模式(合成資料生成)
合成過程會自動過濾不符合約束的資料:
Loader:
data:
filepath: 'denormalized_data.csv'
schema: 'denormalized_schema.yaml'
Preprocessor:
default:
method: 'default'
Synthesizer:
default:
method: 'default'
Constrainer:
apply_constraints:
method: resample # 或 auto(會自動判斷)
constraints_yaml: 'business_constraints.yaml'
target_rows: None # 不指定則使用原始資料筆數
sampling_ratio: 10.0 # 每次採樣為目標筆數的 10 倍
max_trials: 300 # 最多嘗試 300 次
Postprocessor:
default:
method: 'default'
Reporter:
output:
method: 'save_data'
source: 'Postprocessor'驗證檢查模式(檢查現有資料)
如果要檢查原始資料或合成資料是否符合約束:
Loader:
original_data:
filepath: 'denormalized_data.csv'
schema: 'denormalized_schema.yaml'
Constrainer:
check_constraints:
method: validate
source: Loader # 指定要檢查的資料來源
constraints_yaml: 'business_constraints.yaml'
Reporter:
validation_report:
method: save_validation
output: 'data_validation' # 輸出檔名前綴
include_details: true # 包含詳細違規記錄這會產生三個 CSV 檔案:
data_validation_summary.csv:總體統計(通過率、違規率等)data_validation_violations.csv:各約束的違規統計data_validation_details.csv:詳細違規記錄(每條規則最多 10 筆範例)
約束定義原則
實務上建議先與領域專家討論,確認業務規則中的硬性限制與資料品質要求。接著透過探索性資料分析識別約束模式,將識別的約束寫入 YAML 檔案。定義完成後,在 validate 模式下使用 Constrainer 檢查原始資料的符合情況。若違反比例過高(>5%),需要重新評估約束定義的合理性,並根據驗證結果逐步完善約束定義。
約束定義時需注意以下重要原則:
- 所有約束條件必須同時滿足(AND 邏輯)
- 四種約束類型的執行順序固定無法調整
- field_combinations 採用正面表列方式,只允許明確列出的組合
- 空值必須使用
"pd.NA"(注意大小寫) - 字串值必須加引號如
"approved" - field_constraints 支援 pandas 查詢語法,可以使用
&(AND)、|(OR)等運算子組合條件