介绍
燃油效率是汽车制造商和消费者所关注的一个关键因素。在汽车制造商中,燃油经济性是一项影响公司利润和环境可持续性的因素。而在消费者中,燃油经济性是购买汽车时所关注的重要因素之一。在这篇文章中,我们将使用Python中的Tensorflow库来预测汽车的燃油效率。
数据集
我们将使用Auto MPG数据集,该数据集包含了来自1983年以前的汽车信息,其中包含每个汽车的一些基本属性,如发动机大小,气缸数量,重量等,并且该数据集还包含了每个汽车的燃油效率。
首先,我们需要下载数据集并将其加载到Pandas数据帧中:
import pandas as pd
import tensorflow as tf
dataset_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'
column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight',
'Acceleration', 'Model Year', 'Origin']
raw_dataset = pd.read_csv(dataset_url, names=column_names,
na_values='?', comment='\t',
sep=' ', skipinitialspace=True)
dataset = raw_dataset.copy()
dataset.tail()
我们可以看到数据帧的最后5行:
MPG Cylinders Displacement Horsepower Weight Acceleration Model Year Origin
393 27.0 4 140.0 86.00 2790.0 15.6 82 1
394 44.0 4 97.0 52.00 2130.0 24.6 82 2
395 32.0 4 135.0 84.00 2295.0 11.6 82 1
396 28.0 4 120.0 79.00 2625.0 18.6 82 1
397 31.0 4 119.0 82.00 2720.0 19.4 82 1
我们可以看到其中的'Horsepower'列中有一些缺失值。为了保持简单,我们将删除这些行:
dataset = dataset.dropna()
数据预处理
One-hot Encoding
该数据集包含一些分类数据,如“Origin”。我们将使用One-hot Encoding将该分类数据转换为数字。此外,我们还将在此步骤中将数据集分为训练集和测试集:
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
origin = train_dataset.pop('Origin')
train_dataset['USA'] = (origin == 1)*1.0
train_dataset['Europe'] = (origin == 2)*1.0
train_dataset['Japan'] = (origin == 3)*1.0
origin = test_dataset.pop('Origin')
test_dataset['USA'] = (origin == 1)*1.0
test_dataset['Europe'] = (origin == 2)*1.0
test_dataset['Japan'] = (origin == 3)*1.0
归一化
我们可以查看一下训练数据的统计信息:
train_stats = train_dataset.describe()
train_stats.pop("USA")
train_stats.pop("Europe")
train_stats.pop("Japan")
train_stats = train_stats.transpose()
train_stats
我们可以看到每个特征的范围和平均值。由于特征的范围差异很大,我们需要对其进行归一化。在训练模型时,归一化数据是一种好习惯。
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
构建模型
我们将使用tf.keras来构建我们的模型。在这里,我们将使用一个密集的神经网络,该网络由两个隐藏层和一个输出层组成(我们将使用一个单一输出,因为我们试图预测一个值:汽车的燃油效率)。模型的隐藏层具有64个神经元。在每个隐藏层之后,我们使用激活函数“relu”来引入非线性性。模型的输出层为单一线性神经元。使用线性激活函数,该模型可以输出任意范围内的值。
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()
训练模型
我们将训练模型并将训练损失和验证损失存储在history对象中:
EPOCHS = 1000
history = model.fit(
normed_train_data, train_labels,
epochs=EPOCHS, validation_split = 0.2, verbose=0)
我们可以在训练和验证数据上绘制训练损失和验证损失,以了解我们的模型是否过拟合。
import matplotlib.pyplot as plt
def plot_history(history):
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
plt.figure(figsize=(8,12))
plt.subplot(2,1,1)
plt.xlabel('Epoch')
plt.ylabel('Mean Abs Error [MPG]')
plt.plot(hist['epoch'], hist['mae'],
label='Train Error')
plt.plot(hist['epoch'], hist['val_mae'],
label = 'Val Error')
plt.ylim([0,5])
plt.legend()
plt.subplot(2,1,2)
plt.xlabel('Epoch')
plt.ylabel('Mean Square Error [$MPG^2$]')
plt.plot(hist['epoch'], hist['mse'],
label='Train Error')
plt.plot(hist['epoch'], hist['val_mse'],
label = 'Val Error')
plt.ylim([0,20])
plt.legend()
plt.show()
plot_history(history)
我们可以看到训练损失持续减少,而验证损失在约100个左右的时候开始停止改善。虽然训练损失和验证损失之间出现差距,但在该数据集上仅训练1000个时代的情况下,我们仍然能够防止过度拟合,该模型的性能令人满意。
模型评估
接下来,我们将使用测试集来评估模型的总体性能:
loss, mae, mse = model.evaluate(normed_test_data, test_labels, verbose=2)
print("Testing set Mean Abs Error: {:5.2f} MPG".format(mae))
最终我们的模型将在测试集上预测误差约为2.91美元/加仑。
预测
最后,我们将使用训练的模型来预测几个与测试集中未见过的汽车的燃油效率:
example_batch = normed_test_data[:10]
example_result = model.predict(example_batch)
example_result
我们的模型可以输出MPG的结果:
array([[15.165491 ],
[11.876895 ],
[12.887469 ],
[26.23985 ],
[28.815712 ],
[20.899382 ],
[24.816155 ],
[20.16168 ],
[13.964909 ],
[14.861661 ]], dtype=float32)
总结
在本文中,我们使用Python中的Tensorflow库进行了燃油效率预测。我们使用Auto MPG数据集进行了一些简单的预处理,并构建了一个密集的神经网络来预测输出(汽车的燃油效率)。该模型在测试集上的表现令人满意,并可以用来预测新汽车的燃油效率。