這周已經過去了3天,主要精力都是集中在sklearn的gbdt**解讀上,進展肯定是有,但是感覺阻力比較大,但是這又有什麼辦法呢?人一能之,我十之!但是感覺有時候多花時間的情況下效率很低很低,但是可能也是自己內心浮躁,想回去玩造成了這種效率低下,要看這個演算法,只有不到黃河心不死的決心,即便我被迫需要先應用再解讀,我也一定要花時間去解讀,一定要精通這個演算法,排除萬難!把前幾天關於gbdt的解讀再總結一下!
gbdt = gradientboostingclassifier()
用預設的引數進行一些初始化,生成一些例項變數,這個類主要繼承於乙個gradientboostingbase類
gbdt.fit(x,y)
主要的核心在於這個函式,也是幾乎所有sklearn演算法的建模介面,跟進去過後
首先進行一些檢測是否熱啟動,檢測資料集是否規範,檢查因變數是否合格,檢查引數是否合規
self._init_state()
然後進行stage統計的初始化
self.init_.fit(x, y, sample_weight)
y_pred = self.init_.predict(x)
用初始的函式去擬合併計算,fit中就是簡單的計算log(odds ratio),然後predict就用這個值去填充每乙個**,得到f0的**值y_pred
n_stages = self._fit_stages(x, y, y_pred, sample_weight, random_state,
begin_at_stage, monitor, x_idx_sorted)
這一步就比較關鍵了,乙個stage就是一次迭代,這裡就繼續跟進去看看
_fit_stages中首先是做一些特殊引數的處理,對於預設引數來說,暫時可以不用管
_fit_stages中核心的地方就是以迭代的形式fit每乙個stage
y_pred = self._fit_stage(i, x, y, y_pred, sample_weight,
sample_mask, random_state, x_idx_sorted,
x_csc, x_csr)
先不進到每乙個stage的計算過程,這個計算得到新的**值y_pred,這個y_pred屬於負無窮到正無窮
用y和y_pred計算損失函式的值
self.train_score_[i] = loss_(y, y_pred, sample_weight)
我跟到了這個損失函式裡面,這個損失函式就和邏輯回歸的損失函式幾乎類似,但是為了便於寫**,形式需要變換一下才能看出來,這裡就是邏輯回歸的損失函式乘以2(現在還不清楚為什麼要乘以2)
我們在跟到self._fit_stage中去一**竟
裡面是乙個迴圈建樹,並且進行**的過程,由於是二分類,只建一棵樹,建樹用到的y是殘差
residual = loss.negative_gradient(y, y_pred, k=k,
sample_weight=sample_weight)
殘差是y-logit(y_pred)
tree.fit(x, residual, sample_weight=sample_weight,
check_input=false, x_idx_sorted=x_idx_sorted)
建樹過後要用一系列方法得到新的y_pred
loss.update_terminal_regions(tree.tree_, x, y, residual, y_pred,
sample_weight, sample_mask,
self.learning_rate, k=k)
然後按照這樣的過程迭代,直到滿足最大的n_estimators
這個**裡面關於建回歸樹和最後gbdt**是涉及到cython**
這部分我可能需要進一步研讀理解
不放棄,堅持!人一能之,我十之!
sklearn中的gbdt原始碼分析
簡單看了一下sklearn中的gbdt原始碼 在這裡記錄一下,目前來說還不能把gbdt的所有理論都搞清楚 sklearn有兩個類似於gbdt的實現 gradientboostingclassifier gradientboostingregressor乙個用於分類,另乙個用於回歸 這兩個類其實區別只...
Sklearn引數詳解 GBDT
這篇介紹boosting的第二個模型gbdt,gbdt和adaboost都是boosting模型的一種,但是略有不同,主要有以下兩點不同 class sklearn.ensemble.gradientboostingclassifier loss deviance learning rate 0.1...
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...