首先,我们应该清楚分类模型和回归模型的本质区别,才能在搭建模型的时候得心应手。
- 分类模型:预测的是类别,模型的输出是在各个类别上的概率分布。所以分类模型在最后一层上的输出值个数是多个。
- 预测模型:预测的是数值,模型的输出是一个实数值。所以回归模型在最后一层上的输出值个数是一个。
清楚了分类模型和预测模型的区别之后,我们就以一个实例来讲解回归模型的搭建过程。该实例是一个房价预测的模型,采用的数据集是sklearn.datasets 的 fetch_california_housing数据集。我们依然将模型的构建过程分为七步:
一:导入包
1 import numpy as np 2 import pandas as pd 3 import matplotlib as mpl 4 import matplotlib.pyplot as plt 5 import sklearn 6 7 import os 8 import sys 9 import time 10 11 import tensorflow as tf 12 import tensorflow.keras as keras 13 14 for module in np, pd, mpl, sklearn, tf, keras: 15 print (module.__name__, module.__version__)
二:数据加载
1 # 数据加载 2 from sklearn.datasets import fetch_california_housing 3 housing = fetch_california_housing(data_home='C:/Users/rencm/scikit_learn_data', download_if_missing=True)
三:切分训练集和验证集
1 # 切分训练集和验证集 2 from sklearn.model_selection import train_test_split 3 x_train_all, x_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state = 7) 4 x_train, x_valid, y_train, y_valid = train_test_split(x_train_all, y_train_all, random_state = 11) 5 print (x_train.shape, x_valid.shape, x_test.shape)
四:输入数据归一化处理
1 # 输入数据归一化处理 2 from sklearn.preprocessing import StandardScaler 3 scaler = StandardScaler() 4 x_train_scaled = scaler.fit_transform(x_train) 5 x_valid_scaled = scaler.transform(x_valid) 6 x_test_scaled = scaler.transform(x_test)
五:模型建立
1 # 模型建立 2 model = keras.models.Sequential([ 3 keras.layers.Dense(30, activation = 'relu', input_shape = x_train.shape[1:]), 4 keras.layers.Dense(1) 5 ]) 6 model.compile( 7 loss = 'mean_squared_error', 8 optimizer = 'sgd' 9 ) 10 print (model.summary())
这里指的注意的一点是:我们的最后一层即输出层的输出个数为1,这是个分类模型的唯一区别。
六:训练模型
# 训练模型 history = model.fit( x_train_scaled, y_train, validation_data=(x_valid_scaled, y_valid), epochs = 100, callbacks=[ keras.callbacks.EarlyStopping(min_delta = 1e-2, patience = 5) ] )
七:测试模型
1 # 测试模型 2 model.evaluate(x_test_scaled, y_test)
总结:
通过以上的过程可以看出,分类模型和回归模型的通用步骤都是一样的,只有在模型建立的时候有一点不同。即分类模型的输出层有多个输出,需要使用softmax激活函数,而回归模型的输出层只有一个输出,没有激活函数。