當前位置:
首頁 > 最新 > 利用Tensoflow實現兩層神經網路的模型集成

利用Tensoflow實現兩層神經網路的模型集成

簡介:利用模型集成來實現模型性能的提升,一直以來都是一個很熱門的方法。但是其中涉及到很多問題,包括每個基學習器的選擇,怎麼定義diversity,以什麼樣的原則實現模型集成等等。。。那麼基於實用的原則,我設計了一個簡單的模型集成方法。利用兩層神經網路來集成不同邏輯回歸和機器學習模型的結果。這樣做的便利在於:第一,結構簡單,易於實現;第二,相當於兩層邏輯回歸,保持了邏輯回歸的穩定特性;第三,交替訓練兩層網路,也整體上更新了底層基學習器的結果,使得模型最終效果更好。

一、模型結構介紹

利用兩層神經網路來實現模型集成,中間層和輸出層的激活函數都是logit函數(sigmoid)。這樣中間層hidden layer,每個節點相當於是一個邏輯回歸,其初始權重就是已經訓練好的邏輯回歸基學習器的結果,中間層到輸出層的權重就是模型集成的過程。機器學習(我暫時只用了gbdt和rf)訓練的結果,直接在第二層作為結果輸入。然後交替學習兩層神經網路,就實現了多個邏輯回歸模型和機器學習模型的集成。

這樣做的好處是,相當於對神經網路進行了預學習,因為輸入的起始就是邏輯回歸的結果。這些結果可以在隱藏層和其他機器學習結果進行集成,然後交替學習,等於是對輸入的邏輯回歸進行了微調(一定設置好學習率,不然就不是微調,很快結果會崩掉)。這樣結構上和普通神經網路的最大的區別是,輸入層每個邏輯回歸是不同的,相當於第一和第二層不是全連接的。

二、模型結果

我最終採用的還是用網貸的數據展示,更有說服力。但是由於數據量比較小,只拆分了時間內訓練集和時間外測試集(也用阿里反欺詐比賽百萬級的數據進行了測試,也是有效果的)。6個邏輯回歸基學習器訓練和測試的結果如下:

只集成6個邏輯回歸模型的結果如下:

模型結果在測試集上最優的結果增加了0.039,增加了泛化能力。(每個邏輯回歸的變數都不同,都經過了woe變換,單個變數的相關性低於0.6,每個回歸的變數都小於十個,一共34個變數)。

第二組實驗,選擇一些效果稍差變數的邏輯回歸,加上一個GBDT模型的結果,重新訓練:

第二組模型集成的結果:

模型結果在測試集上最優的結果增加了0.029,增加了泛化能力。

三、Tensorflow單層神經網路示例

利用Tensorflow可以很容易構建邏輯回歸模型(單層神經網路,隨你怎麼call)。但是進行調優還是很重要的。自帶的優化器有多個:


AdagradOptimizer

AdagradDAOptimizer

MomentumOptimizer

AdamOptimizer

FtrlOptimizer

ProximalGradientDescentOptimizer

ProximalAdagradOptimizer

RMSPropOptimizer

建議選擇前兩個,用不同的條件嘗試結果,中間當然調參,你們懂得,是門玄學。

單層Demo:

#變數初始化和單層

def retr(num_features,ce=None,m=None,names=None,y=None):

X = tf.placeholder("float", [None, num_features]) # create symbolic variables

Y = tf.placeholder("float", [None, 1])

if ce!=None:

w=tf.Variable(ce)

else:

w = init_weights([num_features, 1]) # like in linear regression, we need a shared variable weight matrix for logistic regression

# w1= init_weights([10, 1])

#b=init_weights([len(xx), 1])

#

#b1=init_weights([10, 1])

# w=tf.cast(w,tf.float32)

# w=tf.Variable(w)

py_x = model1(X, w)

if y!=None:

yy=m[y].values

yy.shape=(len(yy),1)

return X,Y,w,py_x,m[names].values,yy

else:

return X,Y,w,py_x

#訓練和損失函數

def ttt(learning_rate,py_x,Y):

cost = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=py_x,labels=Y))/100

#cost = -tf.reduce_sum(Y*tf.log(py_x) + (1 - Y) * tf.log(1 - py_x))/len(xx)

# train_op = tf.train.AdadeltaOptimizer(learning_rate).minimize(cost) # construct optimizer

train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) # construct optimizer

return cost,train_op


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 木有粗面也木有魚丸 的精彩文章:

TAG:木有粗面也木有魚丸 |