單調約束在機器學習模型中的應用

單調約束在機器學習模型中的應用

在數據科學和人工智能領域取得重大進展之後,我們往往會聽到有關倫理和可解釋性AI的討論,尤其是在銀行和保險等行業中。儘管有許多易於訪問且具有高度預測性的算法可供使用,但是對於從事這些行業的分析師和數據科學家而言,面臨著選擇預測準確性還是履行其監管職責的兩難選擇。研究人員和行業專家正努力使機器學習模型透明化和可解釋化。

使模型輸出更實用的一種創新稱為單調約束。

什麼是單調性?

單調是一個函數或數量的變化。


單調約束在機器學習模型中的應用

單調遞增函數:如果對所有 x和 y,當 x≤y時,都有f(x)≤ f(y),則該函數被稱為單調遞增函數(見圖1)。這個函數不一定要增加,只是不能減少。

單調遞減函數:如果對所有 x和 y,當 x≤y時,都有 f(x)≥f(y),則該函數被稱為單調遞減函數(見圖2)。這個函數不一定要減少,只是不能增加。

為什麼要在機器學習模型中應用單調性?

現在,你一定想知道為什麼我們需要一個約束模型。在現實生活中,許多場景都表現出單調關係,請看下面給出的一些例子。

  1. 信用評分越高,貸款被批准的可能性越大。
  2. 保險費隨著駕照年齡的增長而下降。
  3. 保險費隨保險金額的增加而增加。

在缺乏單調約束的情況下,銀行和保險公司可能會面臨一種不合邏輯和不道德的決策的奇怪情況,比如信用評分較高(比如610分)的申請被拒絕,而信用評分較低(比如600分)的申請被批准。類似地,客戶A為100萬美元的房產支付1000美元的溢價,客戶B為110萬美元的房產支付990美元的溢價。在上面的例子中,我們假設所有其他因素對於兩對客戶都是相同的。

機器學習模型示例

我將在python中使用XGBoost向您介紹這個概念,並且本教程的底部也提供了LightGBM實現的代碼。

生成樣本數據

第一步,我們將根據上述兩種情況模擬一些數據。

場景1:以正斜率模擬數據

<code>import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
#Sample data with positive slope
size = 100
Xp = np.linspace(0,7, size)
yp = Xp**2 + 10 - (10 * np.random.random(size))
plt.plot(Xp, yp, '.', color='b');/<code>
單調約束在機器學習模型中的應用

在這種情況下,兩個變量x和y之間存在正相關關係,當x增加時,y也會增加,而當x減少y時也會減少,例如保險金額和保費金額。

場景2:以負斜率模擬數據

<code>def f(Xn, a, b, c):
    """Fit function y=f(x,p) with parameters p=(a,b,c). """
    return a * np.exp(- b * Xn) +c
#Sample data with negative slope
size = 100
Xn = np.linspace(0, 2, size)
yi = f(Xn, a=2.5, b=1.3, c=.5)
#add some noise
yn = yi + 0.5 * np.random.random(size=len(Xn))/<code>
單調約束在機器學習模型中的應用

這種情況是兩個變量之間的負相關關係,當x增加時,y減少,當x減少時,y增加,例如,駕照年齡和保費金額。

擬合無單調約束的機器學習模型

我們將在兩個場景中使用缺省參數和不強制任何約束來擬合增強樹模型。

<code>#Code for positive scenario, use same code for other scenario Creating DMatrix
import xgboost as xgb
dtrain_positive = xgb.DMatrix(Xp.reshape(-1,1), label=yp)
#Setting default parameters
params_no_constraints = 
{'booster':'gbtree',
'eta':0.3,
'gamma':0,
'max_depth':6,
'min_child_weight':1,
'colsample_bytree':1
}
#Model Fitting
model_no_constraints_positive = xgb.train(params=params_no_constraints, dtrain=dtrain_positive)
#Prediction
preds_positive = model_no_constraints_positive.predict(dtrain_positive)
#Plotting observed versus prediction
plt.plot(Xp,yp,'.',color = "b")
plt.plot(Xp, preds_positive.reshape(-1,1), color = "r")
plt.xlabel("X")
plt.ylabel("Non-monotonic Model Fit")/<code>

您可以看到輸出的可視化

單調約束在機器學習模型中的應用

我們來分析一下輸出,藍點顯示X個數據點,紅線顯示擬合模型。我們可以看到兩個模型都表現良好,能夠捕獲數據的整體趨勢,而且這種曲線也很自然,但是這可能會影響決策。當我們在很短的時間間隔內分析模型時,我們可以觀察到與我們期望相反的趨勢。例如,在上述模型中,Yb Ym與我們的預期相反。

對模型添加單調約束

現在,我們將添加附加參數(即單調約束)對樣本數據進行建模。根據XGBoost文檔,它們分別為1和-1。

<code>params_increasing_monotone = 
{'booster':'gbtree',
'eta':0.3,
'gamma':0,
'max_depth':6,
'min_child_weight':1,
'colsample_bytree':1,
'monotone_constraints':1
}/<code>

讓我們在X值上繪製預測線,以可視化我們的擬合模型。

單調約束在機器學習模型中的應用

我們可以看到整體的趨勢看起來與早期的非單調模型相似。現在,解釋這些機器學習模型變得容易多了,不像以前那樣有矛盾的情況。

LightGBM中單調約束的實現

您可以使用以下Python代碼對數據建模並分析輸出,對於其餘步驟,您可以使用與上述相同的代碼。

<code>#Fitting LightGBM model with monotonic constraints
import lightgbm as lgb
monotone_model = lgb.LGBMRegressor(min_child_samples=5,
monotone_constraints="-1") # 1 for increasing constraints
monotone_model.fit(X.reshape(-1,1),y)
#predicted output from the model from the same input
prediction = monotone_model.predict(X.reshape(-1,1))/<code>

最後

我們在這裡討論了單變量模型的單調約束,這些約束也可以應用於多個變量,並且可以使用部分依賴圖來分析對單個變量的影響。有時,強制約束有助於避免過度擬合,這取決於數據之間的關係,但是當您有一個過度擬合的模型時,測試這種技術沒有害處。


分享到:


相關文章: