- توقع كفاءة الوقود
- تسوية البيانات
- بناء النموذج
- تدريب النموذج للتنبؤ بكفاءة الوقود
في هذه الأنواع من مشاكل التعلم الآلي للتنبؤ بكفاءة الوقود، نهدف إلى التنبؤ بمخرجات القيمة المستمرة، مثل السعر أو الاحتمالية. في هذه المقالة، سأطلعك على كيفية التنبؤ بكفاءة استهلاك الوقود من خلال التعلم الآلي.
توقع كفاءة الوقود
سأستخدم هنا إحدى مجموعات البيانات الشهيرة بين ممارسي التعلم الآلي، مجموعة بيانات Auto MPG لإنشاء نموذج للتنبؤ بكفاءة استهلاك الوقود للمركبات في أواخر السبعينيات وأوائل الثمانينيات. للقيام بذلك، سنزود النموذج بوصف للعديد من السيارات من هذه الفترة. يتضمن هذا الوصف سمات مثل الأسطوانات cylinders والإزاحة displacement والقدرة الحصانية horsepower والوزن weight.
دعنا نستورد المكتبات الضرورية للبدء بهذه المهمة:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
الآن، الشيء التالي الذي يجب فعله هو تنزيل مجموعة البيانات. يمكنك بسهولة تنزيل مجموعة البيانات من هنا. الآن، دعنا نستورد البيانات باستخدام حزمة pandas:
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
'Acceleration', 'Model Year', 'Origin']
dataset = pd.read_csv("auto.csv", names=column_names,
na_values = "?", comment='\t',
sep=" ", skipinitialspace=True)
عمود “origin” في مجموعة البيانات فئوي categorical، لذا للمضي قدمًا نحتاج إلى استخدام بعض الترميز الساخن one-hot encoding:
origin = dataset.pop('Origin')
dataset['USA'] = (origin == 1)*1.0
dataset['Europe'] = (origin == 2)*1.0
dataset['Japan'] = (origin == 3)*1.0
الآن، دعنا نقسم البيانات إلى مجموعات تدريب واختبار:
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
قبل التدريب والاختبار للتنبؤ بكفاءة استهلاك الوقود من خلال التعلم الآلي، دعنا نتخيل البيانات باستخدام طريقة رسم ازواج seaborn:
sns.pairplot(train_dataset[["MPG", "Cylinders", "Displacement", "Weight"]], diag_kind="kde")
الآن، سأفصل القيم المستهدفة عن الميزات الموجودة في مجموعة البيانات. هذه التسمية هي تلك الميزة التي سأستخدمها لتدريب النموذج على التنبؤ بكفاءة الوقود:
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
تسوية البيانات
يوصى بتوحيد standardize الميزات التي تستخدم مقاييس ونطاقات مختلفة. على الرغم من أن النموذج يمكن أن يتقارب دون توحيد الميزات، إلا أن هذا يجعل التعلم أكثر صعوبة ويجعل النموذج الناتج يعتمد على اختيار الوحدات المستخدمة في الإدخال. نحتاج إلى القيام بذلك لعرض مجموعة بيانات الاختبار في نفس التوزيع الذي تم تدريب النموذج عليه:
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
ملاحظة: يجب تطبيق الإحصائيات المستخدمة لتسوية المدخلات هنا (المتوسط والانحراف المعياري) على جميع البيانات الأخرى المقدمة إلى النموذج، باستخدام الترميز الواحد الساخن الذي قمنا به سابقًا. يتضمن ذلك مجموعة الاختبار بالإضافة إلى البيانات المباشرة عند استخدام النموذج في الإنتاج.
بناء النموذج
دعونا نبني نموذجنا. هنا، سأستخدم API التسلسلي مع طبقتين مخفيتين وطبقة إخراج واحدة ستعيد قيمة واحدة. يتم تغليف خطوات إنشاء النموذج في دالة، build_model، نظرًا لأننا سننشئ نموذجًا ثانيًا لاحقًا:
def build_model():
model = keras.Sequential([
layers.Dense(64, activation=tf.nn.relu, input_shape=[len(train_dataset.keys())]),
layers.Dense(64, activation=tf.nn.relu),
layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mean_squared_error',
optimizer=optimizer,
metrics=['mean_absolute_error', 'mean_squared_error'])
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()])
الآن، دعونا نرسم تدريب النموذج:
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()
plt.figure()
plt.xlabel('Epoch')
plt.ylabel('Mean Square Error [$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)
يمثل هذا الرسم البياني أدناه تحسنًا طفيفًا أو حتى تدهورًا في خطأ التحقق بعد حوالي 100 حقبة. الآن، دعنا نحدِّث طريقة model.fit لإيقاف التدريب عندما لا تتحسن نتيجة التحقق. سنستخدم التوقف المبكر EarlyStopping الذي يختبر حالة التدريب لكل حقبة. إذا مر عدد محدد من الحقبات دون إظهار تحسن، فقم بإيقاف التدريب تلقائيًا:
model = build_model()
# The patience parameter is the amount of epochs to check for improvement
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)
يوضح الرسم البياني أنه في مجموعة التحقق، يكون متوسط الخطأ عادةً حوالي +/- 2 ميلا في الغالون. هل هذا جيد؟ سنترك هذا القرار لك.
دعونا نرى كيف يتم تعميم النموذج باستخدام مجموعة الاختبار، والتي لم نستخدمها عند تدريب النموذج. يوضح هذا إلى أي مدى يُتوقع من هذا النموذج أن يتنبأ عندما نستخدمه في العالم الحقيقي:
loss, mae, mse = model.evaluate(normed_test_data, test_labels, verbose=0)
print("Testing set Mean Abs Error: {:5.2f} MPG".format(mae))
Testing set Mean Abs Error: 1.97 MPG
الآن، دعنا نضع تنبؤات على النموذج للتنبؤ بكفاءة الوقود:
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])
يبدو أن النموذج تنبأ بشكل جيد. آمل أن تكون هذه المقالة قد أعجبتك، للتنبؤ بكفاءة استهلاك الوقود باستخدام التعلم العميق.