2020_11_01
DNN Regression
参考资料:《Python深度学习》 Francois Choll
神经网络可以主要解决三大类问题:二分类、多分类、回归。
回归问题特点在于结果是连续值,因此调参过程也与分类问题相异。
在了解DNN回归问题后,我们可以以波士顿房价预测的经典问题作为案例与模板。
数据准备
Code Block
# 从Keras.datasets数据集中导入 Boston_Housing Problem
from keras.datasets import boston_housing# 导入数据(train_data, train_targets),(test_data, test_targets) = \boston_housing.load_data()
波士顿房价预测案例数据集已经内置于Keras.datasets数据库中,作为公开练习数据使用。
详细内容参考:https://keras.io/zh/datasets/
IPython:
In [1]: train_data.shape
Out[1]: (404, 13)In [2]: train_targets.shape
Out[2]: (404,)In [3]: test_data.shape
Out[3]: (102, 13)In [4]: test_targets.shape
Out[4]: (102,)In [5]: type(train_data)
Out[5]: numpy.ndarray
了解到:
- 训练集与测试集都是小数据量,分别为404,102条。其中,输入特征变量个数为13个。
- 训练集和测试集的数据格式都是np.array数组。
标准化
# 数据标准化mean = train_data.mean(axis = 0)
train_data -= mean
std = train_data.std(axis = 0)
train_data /= std# !用于测试数据标准化的均值和标准差都是在训练数据上计算得到的
test_data -= mean
test_data /= std
标准化是让模型更加普适性的操作,不会对于训练集产生依赖性。
搭建神经网络
# 构建神经网络
def build_model():model = models.Sequential()model.add(layers.Dense(64, activation='relu',input_shape = (train_data.shape[1],)))model.add(layers.Dense(64, activation='relu'))# !网络的最后一层只有一个单元,没有激活,是一个线性层# !这是标量回归(标量回归是预测单一连续值的回归)的典型设置model.add(layers.Dense(1))# !编译网络用的是mse损失函数,即均方误差(MSE, mean squared error)# !预测值与目标值之差的平方,这是回归问题常用的损失函数# !平均绝对误差(MAE, mean absolute error)# !是预测值与目标值之差的绝对值model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])return model
K折训练
# K折验证k = 4
num_value_sample = len(train_data) // k
num_epochs = 100
all_scores = []for i in range(k):print("Processing fold #", i)# !提取第i折的训练集与验证集val_data = train_data[i * num_value_sample : (i + 1) * num_value_sample]val_targets = train_targets[i * num_value_sample : \(i + 1) * num_value_sample]partial_train_data = np.concatenate([train_data[:i * num_value_sample],train_data[(i + 1) * num_value_sample:]],axis = 0)partial_train_targets = np.concatenate([train_targets[:i * num_value_sample],train_targets[(i + 1) * num_value_sample:]],axis = 0)# !使用训练集训练model = build_model()model.fit(partial_train_data, partial_train_targets,epochs = num_epochs,batch_size = 1,verbose=0)# !使用验证集验证val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)all_scores.append(val_mae)
All Code
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 31 19:07:30 2020@author: Gavin
"""import numpy as np
import pandas as pd
# 从Keras.datasets数据集中导入 Boston_Housing Problem
from keras.datasets import boston_housing
# 从Keras导入构建神经网络的库
from keras import models
from keras import layers# 导入数据
# !数据类型均为 np.ndarray
(train_data, train_targets),(test_data, test_targets) = \boston_housing.load_data()# 数据标准化mean = train_data.mean(axis = 0)
train_data -= mean
std = train_data.std(axis = 0)
train_data /= std# !用于测试数据标准化的均值和标准差都是在训练数据上计算得到的
test_data -= mean
test_data /= std# 构建神经网络
def build_model():model = models.Sequential()model.add(layers.Dense(64, activation='relu',input_shape = (train_data.shape[1],)))model.add(layers.Dense(64, activation='relu'))# !网络的最后一层只有一个单元,没有激活,是一个线性层# !这是标量回归(标量回归是预测单一连续值的回归)的典型设置model.add(layers.Dense(1))# !编译网络用的是mse损失函数,即均方误差(MSE, mean squared error)# !预测值与目标值之差的平方,这是回归问题常用的损失函数# !平均绝对误差(MAE, mean absolute error)# !是预测值与目标值之差的绝对值model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])return model# K折验证k = 4
num_value_sample = len(train_data) // k
num_epochs = 500
all_scores = []for i in range(k):print("Processing fold #", i)# !提取第i折的训练集与验证集val_data = train_data[i * num_value_sample : (i + 1) * num_value_sample]val_targets = train_targets[i * num_value_sample : \(i + 1) * num_value_sample]partial_train_data = np.concatenate([train_data[:i * num_value_sample],train_data[(i + 1) * num_value_sample:]],axis = 0)partial_train_targets = np.concatenate([train_targets[:i * num_value_sample],train_targets[(i + 1) * num_value_sample:]],axis = 0)# !使用训练集训练model = build_model()model.fit(partial_train_data, partial_train_targets,epochs = num_epochs,batch_size = 1,verbose=0)# !使用验证集验证val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)all_scores.append(val_mae)