tensorflow回归例子

主要内容是tensorflow的培训资料。我只是加了些注释以便更好的理解代码。此代码在我本地运行通过。

在这里插入图片描述

1.导入基本包

#使用 seaborn 绘制矩阵图 (pairplot)

#!pip install -q seaborn

from future import absolute_import, division, print_function, unicode_literals

import pathlib

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

#try:

%tensorflow_version only exists in Colab.

#%tensorflow_version 2.x
#except Exception:

pass

import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers

print(tf.version)

2.下载Auto MPG 数据集

dataset_path = keras.utils.get_file(“auto-mpg.data”, “http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data”)
dataset_path

column_names = [‘MPG’,‘Cylinders’,‘Displacement’,‘Horsepower’,‘Weight’,
‘Acceleration’, ‘Model Year’, ‘Origin’]
raw_dataset = pd.read_csv(dataset_path, names=column_names,
na_values = “?”, comment=’\t’,
sep=" ", skipinitialspace=True)

dataset = raw_dataset.copy()
dataset.tail()

#数据集中包括一些未知值
dataset.isna().sum()#
#pd.isna(obj) /isnull(obj) #检测类似数组对象缺失值

3.数据清洗

#为了保证这个初始示例的简单性,删除这些行。
dataset = dataset.dropna()

#“Origin” 列实际上代表分类,而不仅仅是一个数字。所以把它转换为独热码 (one-hot):
origin = dataset.pop(‘Origin’)

dataset[‘USA’] = (origin == 1)*1.0
dataset[‘Europe’] = (origin == 2)*1.0
dataset[‘Japan’] = (origin == 3)*1.0
dataset.tail()

“”"
#pandas 实现随机抽样,其中一些参数
df.sample(n=None, frac=None, replace=False, weights=None, random_state=None,axis=None)

n:指定抽取的样本量,(这里我设定的是小类数据的1.05,即 n = N*(1+0.05))

frac:指定抽取的样本比例;

replace:是否有放回抽样,默认无放回。(对于不平衡数据欠抽样时,将replace=False)

weights:指定样本抽中的概率,默认等概论抽样;

random_state:指定抽样的随机种子,可以使得每次抽样的种子一样,每次抽样结果一样

axis:是选择抽取数据的行还是列。axis=0的时是抽取行,axis=1时是抽取列
“”"

train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)

#通过diag_kind='kde’显示双变量间的核密度并用其估计其特征
sns.pairplot(train_dataset[[“MPG”, “Cylinders”, “Displacement”, “Weight”]], diag_kind=“kde”)

#pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
train_stats = train_dataset.describe()
train_stats.pop(“MPG”)
train_stats = train_stats.transpose()#transpose是转置
train_stats

#将特征值从目标值或者"标签"中分离。 这个标签是你使用训练模型进行预测的值。
train_labels = train_dataset.pop(‘MPG’)
test_labels = test_dataset.pop(‘MPG’)

#归一化
def norm(x):
return (x - train_stats[‘mean’]) / train_stats[‘std’]
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)

4.构建模型

def build_model():
model = keras.Sequential([
layers.Dense(64, activation=‘relu’, input_shape=[len(train_dataset.keys())]),
layers.Dense(64, activation=‘relu’),
layers.Dense(1)
])

optimizer = tf.keras.optimizers.RMSprop(0.001)
#均方误差(MSE)是用于回归问题的常见损失函数(分类问题中使用不同的损失函数)。
#类似的,用于回归的评估指标与分类不同。 常见的回归指标是平均绝对误差(MAE)
model.compile(loss=‘mse’,
optimizer=optimizer,
metrics=[‘mae’, ‘mse’])
return model

model = build_model()

model.summary()

example_batch = normed_train_data[:10]
example_result = model.predict(example_batch)
example_result

通过为每个完成的时期打印一个点来显示训练进度

class PrintDot(keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs):
if epoch % 100 == 0: print(’’)
print(’.’, end=’’)

EPOCHS = 1000

history = model.fit(
normed_train_data, train_labels,
epochs=EPOCHS, validation_split = 0.2, verbose=0,
callbacks=[PrintDot()])

hist = pd.DataFrame(history.history)
hist[‘epoch’] = history.epoch
hist.tail()

def plot_history(history):
hist = pd.DataFrame(history.history)
hist[‘epoch’] = history.epoch

plt.figure()
plt.xlabel(‘Epoch’)
plt.ylabel(‘Mean Abs Error [MPG]’)
plt.plot(hist[‘epoch’], hist[‘mean_absolute_error’],
label=‘Train Error’)
plt.plot(hist[‘epoch’], hist[‘val_mean_absolute_error’],
label = ‘Val Error’)
plt.ylim([0,5])
plt.legend()

#均方误差(MSE)是用于回归问题的常见损失函数(分类问题中使用不同的损失函数)。
plt.figure()
plt.xlabel(‘Epoch’)
plt.ylabel(‘Mean Square Error [ M P G 2 MPG^2 ]’)
plt.plot(hist[‘epoch’], hist[‘mean_squared_error’],
label=‘Train Error’)
plt.plot(hist[‘epoch’], hist[‘val_mean_squared_error’],
label = ‘Val Error’)
plt.ylim([0,20])
plt.legend()
plt.show()

plot_history(history)

model = build_model()

#patience 值用来检查改进 epochs 的数量

early_stop = keras.callbacks.EarlyStopping(monitor=‘val_loss’, patience=10)

history = model.fit(normed_train_data, train_labels, epochs=EPOCHS,
validation_split = 0.2, verbose=0, callbacks=[early_stop, PrintDot()])

plot_history(history)

loss, mae, mse = model.evaluate(normed_test_data, test_labels, verbose=0)

print(“Testing set Mean Abs Error: {:5.2f} MPG”.format(mae))

test_predictions = model.predict(normed_test_data).flatten()

plt.scatter(test_labels, test_predictions)
plt.xlabel(‘True Values [MPG]’)
plt.ylabel(‘Predictions [MPG]’)
plt.axis(‘equal’)
plt.axis(‘square’)
plt.xlim([0,plt.xlim()[1]])
plt.ylim([0,plt.ylim()[1]])
_ = plt.plot([-100, 100], [-100, 100])

#使用figure()函数重新申请一个figure对象

plt.figure()
error = test_predictions - test_labels
plt.hist(error, bins = 25)
plt.xlabel(“Prediction Error [MPG]”)
_ = plt.ylabel(“Count”)

发布了21 篇原创文章 · 获赞 18 · 访问量 1470

猜你喜欢

转载自blog.csdn.net/zephyr_wang/article/details/102018691