點擊藍色字體關注我們哦
1.簡介
該部分是比較基礎的深度網絡部分,是基於keras實現的多層感知機網絡(mlp),使用nn個人感覺最大的一個好處就是目標函數自定義很方便,下面將從數據處理、網絡搭建和模型訓練三個部分介紹。如果只是想要閱讀代碼,可直接移步到尾部鏈接。
2. 數據處理
神經網絡對數據的要求比較多,不能處理缺失值,並且數據分佈對其影響也很大,輸入模型前需要對數據做預處理。具體需要做如下處理
onehot:參考上一節
填充:常用的有均值填充,常數值填充,中位數填充等,根據數據場景做選擇,這裏直接填充的常數值-1
for i in train_x.columns:
if train_x[i].isnull().sum() != 0:
train_x[i] = train_x[i].fillna(-1)
test[i] = test[i].fillna(-1)
歸一化:如果各個特徵值差距很大,會嚴重影響模型參數分佈,需要對整體數據進行歸一化處理
scaler = StandardScaler()
train_X = scaler.fit_transform(train_x)
test_X = scaler.transform(test)
3.模型部分
def MLP(dropout_rate=0.25, activation='relu'):
start_neurons = 512
model = Sequential()
model.add(Dense(start_neurons, input_dim=train_X.shape[1], activation=activation))
model.add(BatchNormalization())
model.add(Dropout(dropout_rate))
model.add(Dense(start_neurons // 2, activation=activation))
model.add(BatchNormalization())
model.add(Dropout(dropout_rate))
model.add(Dense(start_neurons // 4, activation=activation))
model.add(BatchNormalization())
model.add(Dropout(dropout_rate))
model.add(Dense(start_neurons // 8, activation=activation))
model.add(BatchNormalization())
model.add(Dropout(dropout_rate / 2))
model.add(Dense(classes, activation='sigmoid'))
return model
這裏定義的是四層感知網絡,爲了提高網絡的性能,添加的dropout層和BN層。Dropout的具體工作原理是隨機的使一些神經元失活,從而達到防止過擬合的作用。直觀的理解的話,dropout有點像集成學習中的bagging的思路,每次訓練的時候只訓練一部分神經元,相當於訓練了多個弱分類器,預測的時候則是全部分類器同時作用。而bagging的作用也是爲了減少方差(防止過擬合)。BN,Batch Normalization,就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相近的分佈,可以加速訓練。
針對不同的網絡,輸出層的激活函數不同
二分類:
sigmoid
多分類:
softmax
迴歸:
linear
4. 模型訓練
首先需要定義網絡模型,然後定義loss優化和目標函數,keras訓練函數和sklearn很相似,直接調用fit函數即可。
model = MLP(dropout_rate=0.5, activation='relu')
'adam', loss='binary_crossentropy', metrics=['accuracy']) =
history = model.fit(x_train, y_train,
validation_data=[x_valid, y_valid],
epochs=epochs,
batch_size=batch_size,
callbacks=[call_ES, ],
shuffle=True,
verbose=1)
optimizer:loss優化函數,常用的有sgd, rmsprop, adam等
loss:常用的loss損失函數
二分類:binary_crossentropy等
多分類:categorical_crossentropy等
迴歸:mse,mae等
metrics:評價函數:
分類:accuracy等
迴歸:mse, mae等
callbacks:這個是回調函數,該函數是在加載完一次數據後調用,可以用他來加載loss,打印tensorboard,提前停止等,這裏給出了提前停止的代碼
call_ES = keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=patience,
verbose=1,
mode='auto',
baseline=None)
##分類
predictions = model.predict_proba(test_X, batch_size=batch_size)
##迴歸&分類
oof_preds[val_] = model.predict(x_valid, batch_size=batch_size)
threshold = 0.5
result = []
for pred in predictions:
result.append(1 if pred > threshold else 0)
對於多分類:
result = np.argmax(predictions, axis=1)
5. 寫在最後
基於keras實現的多層感知機,可以用在模型的初次嘗試階段,如果數據集比較大,最終結果可能會比較好。如果是數據挖掘類競賽可以結合lgb和xgb做模型融合,往往能提升最終的性能。如果文章對你有用,點個在看鼓勵一下吧!
本文分享自微信公衆號 - AI成長社(ai-growth)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。