如何使用TensorFlow拆分和检查数据以预测Auto MPG数据集的燃油效率?
Auto MPG数据集记录了不同汽车的各种特征,例如气缸数、排量、马力等,以及这些汽车的燃油效率。这个数据集是一个很好的机器学习和数据分析的例子,本文将介绍如何使用TensorFlow预测这个数据集中汽车的燃油效率。
阅读更多:Python 教程
准备数据集
首先需要从官方网站下载Auto MPG数据集,并将其导入到Python环境中。这里我们使用Pandas库进行数据读取和处理。
import pandas as pd
url = "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data"
cols = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'car name']
dataset = pd.read_csv(url, names=cols, na_values='?', comment='\t', sep=' ', skipinitialspace=True)
此时我们得到了一个Pandas的DataFrame对象,包含了Auto MPG数据集的所有样本和特征。
数据预处理
在进行机器学习之前,我们需要对数据进行预处理。我们首先需要去掉一些不必要的特征,例如汽车名字。然后,我们需要处理一下缺失的数据。
dataset = dataset.drop('car name', axis=1)
dataset = dataset.dropna()
这里我们采用了一种简单的方法来处理缺失的数据,即删除包含缺失值的样本。当然,更复杂的方法也可以用来处理缺失的数据,例如填充平均值或中位数等等。
接下来,我们需要将数据集拆分为训练集和测试集。这个步骤是很重要的,因为它可以检测我们的机器学习模型是否过拟合了训练集。
train_dataset = dataset.sample(frac=0.8, random_state=0)
test_dataset = dataset.drop(train_dataset.index)
这里我们采用了一种简单的方法来拆分数据集,即按照一定比例随机选择样本作为训练集,剩余的样本作为测试集。当然,更复杂的方法也可以用来拆分数据集,例如按时间序列拆分等等。
最后,我们需要将数据集中的特征进行归一化。这样做可以让不同特征之间的值具有可比性,从而更好地训练机器学习模型。
train_stats = train_dataset.describe()
train_stats.pop('mpg')
train_stats = train_stats.transpose()
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
train_labels = train_dataset.pop('mpg')
test_labels = test_dataset.pop('mpg')
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
这里我们采用了一种简单的方法来对特征进行归一化,即使用每个特征的均值和标准差进行归一化。当然,更复杂的方法也可以用来归一化特征,例如使用最小-最大缩放方法等等。
创建机器学习模型
现在我们已经准备好数据了,可以开始创建机器学习模型了。我们将使用TensorFlow的Keras API来构建一个包含两个隐藏层的神经网络模型。
import tensorflow as tf
from tensorflow import keras
def build_model():
model = keras.Sequential([
keras.layers.Dense(64, activation=tf.nn.relu, input_shape=[len(train_dataset.keys())]),
keras.layers.Dense(64, activation=tf.nn.relu),
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()
这里我们创建了一个包含两个隐藏层的神经网络模型。每个隐藏层包含64个神经元,并使用ReLU激活函数。输出层只有一个神经元,用于预测汽车的燃油效率。我们使用RMSprop优化器和均方误差损失函数对模型进行编译。我们还定义了两个指标,平均绝对误差和均方误差,用于评估模型性能。
训练模型
现在我们已经创建了机器学习模型,可以使用训练集来训练它了。我们将使用一个回调函数来在每个epoch之后检查模型的性能,并提前停止训练,以防止模型过拟合训练集。
checkpoint_path = "training/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, save_weights_only=True, verbose=1)
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(normed_train_data, train_labels, epochs=1000, validation_split=0.2, callbacks=[cp_callback, early_stop])
这里我们创建了一个回调函数,它会在每个epoch之后保存模型的权重文件。我们同时也创建了一个提前停止的回调函数,当模型在验证集上的损失没有进一步改善时,就停止训练。然后我们使用fit()函数对模型进行训练,指定训练集、训练轮数、验证集和回调函数。
评估模型
训练模型之后,我们可以使用测试集来评估模型的性能。我们将使用均方误差和平均绝对误差来评估模型在测试集上的性能。
loss, mae, mse = model.evaluate(normed_test_data, test_labels, verbose=0)
print("均方误差: {:5.2f} MPG".format(mse))
print("平均绝对误差: {:5.2f} MPG".format(mae))
使用模型进行预测
最后,我们可以使用训练好的模型来进行预测。这里我们将手动构建一个数据样本,并使用模型进行预测。
example_batch = normed_test_data[:10]
example_result = model.predict(example_batch)
print(example_result)
结论
本文介绍了如何使用TensorFlow进行机器学习和数据分析。我们使用了Auto MPG数据集作为例子,将数据集拆分为训练集和测试集,处理缺失值,归一化特征,并创建一个包含两个隐藏层的神经网络模型。我们使用回调函数来提前停止模型训练,然后使用测试集评估模型性能。最后,我们使用模型进行预测并输出预测结果。
这只是TensorFlow的一个简单示范,TensorFlow还有许多其他强大的功能和应用场景等待我们去探索。