AI成长社深度学习与生物信息机器学习

keras做二分类,多分类以及回归任务

2019-09-26  本文已影响0人  文一休

【lightgbm/xgboost/nn代码整理三】keras做二分类,多分类以及回归任务

1.简介

该部分是比较基础的深度网络部分,是基于keras实现的多层感知机网络(mlp),使用nn个人感觉最大的一个好处就是目标函数自定义很方便,下面将从数据处理、网络搭建和模型训练三个部分介绍。如果只是想要阅读代码,可直接移步到尾部链接。

2. 数据处理

神经网络对数据的要求比较多,不能处理缺失值,并且数据分布对其影响也很大,输入模型前需要对数据做预处理。具体需要做如下处理

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,就是在深度神经网络训练过程中使得每一层神经网络的输入保持相近的分布,可以加速训练。

针对不同的网络,输出层的激活函数不同

4. 模型训练

首先需要定义网络模型,然后定义loss优化和目标函数,keras训练函数和sklearn很相似,直接调用fit函数即可。

model = MLP(dropout_rate=0.5, activation='relu')
model.compile(optimizer='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)

模型预测部分

##分类
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)

代码地址:data_mining_models

写在最后

关注公号:

AI成长社
ML与DL的成长圣地。
知乎专栏:ML与DL成长之路
上一篇 下一篇

猜你喜欢

热点阅读