用Python的TensorFlow2.0将波士顿房价数据集分为训练集,验证集和测试集(6:2:2),进行Tensorflow2.0的数据加载、线性回归模型的搭建、线性回归模型的交叉验证、模型保持和新数据预测
时间: 2023-06-10 20:06:10 浏览: 121
好的,以下是完整的代码实现:
```python
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载波士顿房价数据集
boston = load_boston()
# 将数据集转化为DataFrame格式
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_df['PRICE'] = boston.target
# 数据集标准化处理
scaler = StandardScaler()
boston_df_scaled = scaler.fit_transform(boston_df)
# 划分训练集、验证集和测试集(6:2:2)
X_train, X_test, y_train, y_test = train_test_split(boston_df_scaled[:, :-1],
boston_df_scaled[:, -1],
test_size=0.2,
random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_train,
y_train,
test_size=0.25,
random_state=123)
# 构建TensorFlow2.0数据管道
train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
val_dataset = tf.data.Dataset.from_tensor_slices((X_val, y_val))
val_dataset = val_dataset.batch(64)
test_dataset = tf.data.Dataset.from_tensor_slices((X_test, y_test))
test_dataset = test_dataset.batch(64)
# 构建线性回归模型
class LinearRegression(tf.keras.Model):
def __init__(self):
super(LinearRegression, self).__init__()
self.dense = tf.keras.layers.Dense(units=1)
def call(self, inputs):
return self.dense(inputs)
# 初始化模型、损失函数、优化器和评估指标
model = LinearRegression()
loss_fn = tf.keras.losses.MeanSquaredError()
optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
metric = tf.keras.metrics.MeanSquaredError()
# 定义交叉验证函数
def cross_validate(model, dataset, loss_fn, metric):
losses = []
metrics = []
for x, y in dataset:
y_pred = model(x)
loss = loss_fn(y, y_pred)
losses.append(loss)
metric.update_state(y, y_pred)
return tf.reduce_mean(losses), metric.result().numpy()
# 训练模型
n_epochs = 50
best_loss = np.inf
for epoch in range(n_epochs):
for x, y in train_dataset:
with tf.GradientTape() as tape:
y_pred = model(x)
loss = loss_fn(y, y_pred)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
# 在验证集上进行交叉验证
val_loss, val_metric = cross_validate(model, val_dataset, loss_fn, metric)
if val_loss < best_loss:
# 保存最优模型
best_loss = val_loss
model.save_weights('best_model.h5')
print('Epoch [{}/{}], Train Loss: {:.4f}, Val Loss: {:.4f}, Val Metric: {:.4f}'
.format(epoch+1, n_epochs, loss.numpy(), val_loss, val_metric))
# 加载最优模型
model.load_weights('best_model.h5')
# 在测试集上进行预测
test_loss, test_metric = cross_validate(model, test_dataset, loss_fn, metric)
print('Test Loss: {:.4f}, Test Metric: {:.4f}'.format(test_loss, test_metric))
```
以上代码实现了以下内容:
1. 加载波士顿房价数据集,并将其转化为DataFrame格式。
2. 对数据集进行标准化处理,并将其划分为训练集、验证集和测试集(6:2:2)。
3. 使用TensorFlow2.0的数据管道构建训练集、验证集和测试集的输入。
4. 构建线性回归模型,并初始化模型、损失函数、优化器和评估指标。
5. 定义交叉验证函数,用于在验证集上进行交叉验证。
6. 训练模型,并在每个epoch结束后在验证集上进行交叉验证,以获取最优模型。
7. 加载最优模型,并在测试集上进行预测,输出测试集的损失和评估指标。
注意:在使用TensorFlow2.0的数据管道时,需要将数据集划分为输入和输出两个部分,即`(X_train, y_train)`和`(X_val, y_val)`,并在`tf.data.Dataset.from_tensor_slices()`函数中传入这两个部分。在训练模型时,需要使用`GradientTape`记录损失函数对模型参数的梯度,并使用`apply_gradients()`方法更新模型参数。在交叉验证函数中,需要使用`update_state()`方法更新评估指标的状态,并使用`result().numpy()`方法获取评估指标的数值。
阅读全文