正则化
L1 正则化
loss = s * abs(w1 + w2 + ...) + mse
L2 正则化
loss = s *(w1**2 + w2**2 + ...) + mse
import keras
from keras import layers
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras import regularizers
data = pd.read_csv('./dataset/credit-a.csv', header=None)
x = data.iloc[:, :-1].values
y = data.iloc[:,-1].replace(-1,0).values.reshape(-1, 1)
x_train = x[:int(len(x) * 0.75)]
x_test = x[int(len(x) * 0.75):]
y_train = y[:int(len(y) * 0.75)]
y_test = y[int(len(y) * 0.75):]
x_train.shape, x_test.shape, y_train.shape, y_test.shape
model = keras.Sequential()
model.add(layers.Dense(128, kernel_regularizer=regularizers.L2(0.005),input_shape=(None, 15),activation='relu'))
model.add(layers.Dense(128, kernel_regularizer=regularizers.L2(0.005),activation='relu'))
model.add(layers.Dense(128, kernel_regularizer=regularizers.L2(0.005),activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['acc']
)
history = model.fit(x_train, y_train, epochs=1000,
validation_data=(x_test,y_test))
model.evaluate(x_train, y_train)
model.evaluate(x_test, y_test)
plt.plot(history.epoch, history.history.get('val_acc'), c='r',label='val_acc')
plt.plot(history.epoch, history.history.get('acc'), c='b', label='acc')
plt.legend()
代码结果分析
我们发现,加了L2正则化后,训练集和测试集上具有偏差。
我们现在提供一个交叉验证的方法,有兴趣的博友可以再去进行代码完善。这里简单讲解一下交叉验证方法的思想。
1)首先将数据集划分为五等份,A、B、C、D、E
2)第一次进行训练的数据集是B C D E,进行验证的数据集是A
第二次进行训练的数据集是A C D E,进行验证的数据集是B,以此类推
3)就这样对每次训练后的结果取平均值,然后作为最终结果即可
说明:
基于JupyterNoteBook(Annaconda3)搭建的tensorflow开发环境。
所使用到的数据集见我的博客上传的资源中,欢迎大家下载。