如何使用TensorFlow数据集预测汽车MPG的燃油效率?
燃油效率通常被衡量为每加仑英里数(Miles Per Gallon,简称MPG),它是衡量汽车燃油经济性的重要标准之一。在汽车行业中,预测车辆的燃油效率是一个关键的问题。本文将介绍如何使用TensorFlow数据集预测汽车的MPG。
更多Python教程,请阅读:Python 教程
TensorFlow数据集简介
TensorFlow数据集是一个由TensorFlow开发团队维护的数据集工具包,它可以加载和处理常用的数据集,并用于深度学习任务。包括图像、文本、音频和其他领域的数据集。TensorFlow数据集不仅提供了数据集,还提供了数据预处理、数据增强、数据格式转换等常用功能,方便用户用于模型训练和评估。本文所使用的数据集为UCI Machine Learning Repository提供的Auto MPG数据集。
下载Auto MPG数据集
在本文中,我们使用Auto MPG数据集,数据集包含了不同品牌的汽车的各种属性和MPG值。将数据集下载到本地,并将数据集的文件名命名为auto-mpg.data。
!wget https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data
加载数据集
对于数据集的加载,TensorFlow数据集提供了一组快速加载数据集的API。首先,需要安装TensorFlow数据集,可以通过以下命令进行安装。
!pip install tensorflow-datasets
安装好TensorFlow数据集后,我们可以通过tensorflow-datasets模块快速读取Auto MPG数据集,具体代码如下:
import tensorflow_datasets as tfds
dataset = tfds.load("auto_mpg", split=tfds.Split.TRAIN)
for data in dataset.take(1):
print(data)
我们使用tfds.load()方法加载数据集,其中的参数”auto_mpg”表示数据集的名称,”tfds.Split.TRAIN”表示分割方式为训练集。通过take()方法可以选择取出一定量的数据进行处理,我们这里取出一个数据进行展示。
数据处理
数据集处理包括特征工程和数据准备两个方面。在这个过程中,我们将探索数据并将其转换为可用于训练模型的形式。
数据集探索
在使用数据集之前,我们需要先了解这个数据集的内容和格式。打印出前五行数据,查看数据集的格式。
import pandas as pd
dataframe = pd.read_csv("auto-mpg.data", header=None, sep="\s+", encoding="utf-8")
dataframe.columns = ["mpg", "cylinders", "displacement", "horsepower", "weight", "acceleration", "model year", "origin", "car name"]
print(dataframe.head())
输出结果如下:
mpg cylinders displacement horsepower weight acceleration model year origin car name
0 18.0 8 307.0 130.0 3504.0 12.0 70 1 chevrolet chevelle malibu
1 15.0 8 350.0 165.0 3693.0 11.5 70 1 buick skylark 320
2 18.0 8 318.0 150.0 3436.0 11.0 70 1 plymouth satellite
3 16.0 8 304.0 150.0 3433.0 12.0 70 1 amc rebel sst
4 17.0 8 302.0 140.0 3449.0 11.0 70 1 ford torino
以上代码将Auto MPG数据集文件加载到pandas的dataframe中,并进行了一些列别。输出结果显示,该数据集包含了九个字段,包括`mpg`(每加仑的英里数),`cylinders`(气缸数),`displacement`(排量),`horsepower`(马力),`weight`(重量),`acceleration`(加速度),`model year`(生产年份),`origin`(产地)和`car name`(汽车型号)。其中`horsepower`字段的数据类型是字符串,我们需要将其转换为浮点数类型。
```python
import numpy as np
dataframe.replace("?", np.nan, inplace=True)
dataframe.dropna(inplace=True)
dataframe["horsepower"] = dataframe["horsepower"].astype("float")
print(dataframe.info())
输出结果如下:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 392 entries, 0 to 398
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 mpg 392 non-null float64
1 cylinders 392 non-null int64
2 displacement 392 non-null float64
3 horsepower 392 non-null float64
4 weight 392 non-null float64
5 acceleration 392 non-null float64
6 model year 392 non-null int64
7 origin 392 non-null int64
8 car name 392 non-null object
dtypes: float64(5), int64(3), object(1)
memory usage: 30.6+ KB
None
以上代码中,我们使用了pandas.DataFrame.replace()方法,将horsepower字段中的”?”替换成NaN缺失值,并通过pandas.DataFrame.dropna()方法删除了缺失值所在的行。接下来,将horsepower字段的数据类型转换为float类型,并通过pandas.DataFrame.info()方法输出dataframe的一些信息,包含了行数、列数、每个字段的类型等。
特征工程
特征工程的目的是将数据转换为模型可以理解的形式。在这个过程中,我们将对每个特征进行分析,并进行一些操作,例如特征缩放、特征选择和属性组合等。
import tensorflow as tf
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
train_dataset = dataframe.sample(frac=0.8, random_state=0)
test_dataset = dataframe.drop(train_dataset.index)
train_stats = train_dataset.describe()
train_stats.pop("mpg")
train_stats = train_stats.transpose()
train_labels = train_dataset.pop("mpg")
test_labels = test_dataset.pop("mpg")
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
以上代码中,我们首先按80:20的比例将数据集划分为训练集和测试集。然后,通过pandas.DataFrame.describe()方法获取主要的统计信息,例如均值、最大值、最小值等。将数据中的标签字段mpg单独取出,作为训练集和测试集的标签。
norm()函数用于将每个字段进行标准化处理,即所有字段按照均值为0,方差为1的标准正态分布进行缩放。最后将正态化的训练集和测试集数据保存在normed_train_data和normed_test_data中用于模型训练和评估。
搭建模型
使用TensorFlow Keras API来定义和编译神经网络模型。在这个过程中,我们将配置各层的节点数量和节点功能,并定义损失函数和优化器。
def build_model():
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation="relu", input_shape=[len(train_dataset.keys()]),
tf.keras.layers.Dense(64, activation="relu"),
tf.keras.layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss="mse",
optimizer=optimizer,
metrics=["mae", "mse"])
return model
model = build_model()
model.summary()
以上代码中,我们使用tf.keras.Sequential()方法来定义一个序列模型,该模型包含三个全连接层。第一层有64个节点,激活函数为ReLU,输入为训练集中的特征数量。第二层同样有64个节点,并重新使用ReLU作为激活函数。最后的输出层只有一个节点,它没有激活函数,因为我们要预测的是单一值。
在优化器中使用了RMSprop算法和学习率为0.001,损失函数使用均方误差(Mean Squared Error,MSE),计算模型的评估指标包括平均绝对误差(Mean Absolute Error,MAE)和均方误差(MSE)。
训练模型
有了数据集和模型之后,我们就可以训练模型了。在训练过程中,我们需要为训练集和测试集提供数据,设置训练的epoch数量和批次大小,并使用model.fit()方法来训练模型。
history = model.fit(normed_train_data, train_labels, epochs=500, validation_split=0.2, verbose=0)
hist = pd.DataFrame(history.history)
hist["epoch"] = history.epoch
print(hist.tail())
model.fit()方法有许多参数可以配置,包括epochs(训练的epoch数量),batch_size(批次大小),validation_split(用于验证的数据比例)和verbose(日志输出级别)等。其中,verbose参数控制输出的详细程度,如设置为0,则不输出任何信息。
评估模型
在训练之后,我们需要评估模型的性能。通过model.evaluate()方法可以评估经过训练后的模型在测试数据集上的性能表现。
test_loss, test_mae, test_mse = model.evaluate(normed_test_data, test_labels, verbose=0)
print(f"Test Loss: {test_loss:.2f}\nTest MAE: {test_mae:.2f}\nTest MSE: {test_mse:.2f}")
以上代码中,我们使用model.evaluate()方法,在测试数据集上对模型进行评估。输出模型在测试数据集上的损失值(Test Loss)、平均绝对误差(Test MAE)和均方误差(Test MSE)等指标。
我们还可以使用model.predict()方法对新样本进行预测,例如:
mpg_pred = model.predict(norm(pd.DataFrame({"cylinders": [6], "displacement": [225], "horsepower": [100], "weight": [3060], "acceleration": [17.5], "model year": [76], "origin": [1]})))
print(f"Prediction of MPG: {mpg_pred[0][0]:.2f}")
此处我们输入了一个与Auto MPG数据集类似的新样本,并使用模型进行预测。输出预测结果。预测结果可能会与实际值有所偏差,这需要我们对预测模型进行更深入的研究和改进。
结论
在此文中,我们介绍了如何使用TensorFlow数据集预测汽车MPG的燃油效率。通过数据集的处理和分析,使用序列模型进行训练,并评估了经过训练后的模型在测试数据集上的性能。这是一个入门级别的教程,如果你希望进一步学习深度学习的知识,推荐你阅读TensorFlow的官方文档,或者尝试从事相关领域的项目开发。祝你在机器学习和深度学习方面取得成功!
极客笔记