2016-11-21 48 views
2

我想在數據科學項目中進行預測,並通過非對稱函數計算誤差。自定義丟失函數sklearn

是否有可能調整的隨機森林或梯度推進(的sklearn)的損失函數?

我已閱讀,則需要修改.pyx文件,但我無法找到任何在我sklearn文件夾(我是在Ubuntu 14.04 LTS)。

您有什麼建議嗎?

回答

2

您不需要更改任何文件中的任何內容。

修改.py文件通常是一個壞主意,一個應該避免這樣做。

如果你想創建自己的評分函數,here是鏈接到sklearn的文檔,說明如何做到這一點。

+7

您的鏈接用於評分,而不是用於培訓的目標函數。 –

+4

錯了。鏈接到的「評分功能」可以在訓練期間進行優化。 – AlexG

+2

謝謝MMF,但我理解像米哈伊爾。我瞭解到,您的鏈接顯示將構建由scikitlearn執行的k-fold交叉驗證所使用的記分器。您的鏈接中的記分員不在增長的樹過程中使用。 –

2

是的,可以調整。例如:

class ExponentialPairwiseLoss(object): 
    def __init__(self, groups): 
     self.groups = groups 

    def __call__(self, preds, dtrain): 
     labels = dtrain.get_label().astype(np.int) 
     rk = len(np.bincount(labels)) 
     plus_exp = np.exp(preds) 
     minus_exp = np.exp(-preds) 
     grad = np.zeros(preds.shape) 
     hess = np.zeros(preds.shape) 
     pos = 0 
     for size in self.groups: 
      sum_plus_exp = np.zeros((rk,)) 
      sum_minus_exp = np.zeros((rk,)) 
      for i in range(pos, pos + size, 1): 
       sum_plus_exp[labels[i]] += plus_exp[i] 
       sum_minus_exp[labels[i]] += minus_exp[i] 
      for i in range(pos, pos + size, 1): 
       grad[i] = -minus_exp[i] * np.sum(sum_plus_exp[:labels[i]]) +\ 
          plus_exp[i] * np.sum(sum_minus_exp[labels[i] + 1:]) 
       hess[i] = minus_exp[i] * np.sum(sum_plus_exp[:labels[i]]) +\ 
          plus_exp[i] * np.sum(sum_minus_exp[labels[i] + 1:]) 
      pos += size 
     return grad, hess