欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 10:39:04
...

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

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')
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)
  • 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)

代码地址:data_mining_models

写在后面

欢迎您关注作者知乎:ML与DL成长之路

推荐关注公众号:AI成长社,ML与DL的成长圣地。