پیش بینی قیمت خودرو با کتابخانه Keras و شبکه عصبی — راهنمای کاربردی

۱۳۸ بازدید
آخرین به‌روزرسانی: ۱۳ تیر ۱۴۰۲
زمان مطالعه: ۵ دقیقه
پیش بینی قیمت خودرو با کتابخانه Keras و شبکه عصبی — راهنمای کاربردی

«Keras» (کرس) یک کتابخانه سطح بالای استفاده شده برای «شبکه‌های عصبی» (Neural Networks) است. کرس بر فراز کتابخانه «تنسورفلو» (TensorFlow) اجرا و توسط گوگل توسعه داده می‌شود. در این مطلب، یک شبکه عصبی در کرس برای حل مساله رگرسیون استفاده می‌شود. در این جنس مسائل، معمولا متغیر وابسته (Y) در قالب بازه‌ای است. در اینجا سعی می‌شود مقدار Y با حداکثر «صحت» (accuracy) ممکن اندازه‌گیری شود. پیش‌تر، چگونگی ساخت «شبکه عصبی» (Neural Network) با پایتون آموزش داده شد. از آنجا که زبان برنامه‌نویسی R نیز دارای رابط Keras است، امکان انجام تحلیل‌ها با استفاده از این زبان وجود دارد. در ادامه با استفاده از کتابخانه کرس، پیش بینی قیمت خودرو با استفاده از شبکه عصبی در R انجام می‌شود.

شبکه عصبی چیست؟

شبکه عصبی، یک سیستم محاسباتی است که بر اساس داده‌های موجود پیش‌بینی می‌کند. در ادامه، یک شبکه عصبی با استفاده از کتابخانه neuralnet در R «آموزش» (Train) داده می‌شود و مورد «آزمون» (Test) قرار می‌گیرد.

یک شبکه عصبی شامل موارد زیر است:

  • «لایه ورودی» (Input layer): لایه‌ای است که ورودی‌ها را بر اساس داده‌های موجود دریافت می‌کند.
  • «لایه پنهان» (Hidden layer): لایه‌ای که از «بازگشت به عقب» (Backpropagation) برای بهینه کردن وزن‌های متغیرهای ورودی به منظور بهبود قدرت پیش‌بینی مدل استفاده می‌کند.
  • لایه خروجی: خروجی، پیش‌بینی بر اساس لایه‌های ورودی و پنهان است.

شبکه عصبی

پیش‌ بینی قیمت خودرو

در این مثال، از «تابع فعال‌سازی خطی» (Linear Activation Function) در کتابخانه Keras برای ساخت یک شبکه عصبی مبتنی بر رگرسیون استفاده خواهد شد. بدین منظور، از مجموعه داده «thecars» استفاده می‌شود.

اساسا، در اینجا تلاش می‌شود تا مقدار بالقوه فروش یک خودرو برای مشتریان بر پایه مشخصه‌های زیر، پیش‌بینی شود (به عبارت دیگر، یک شخص چقدر برای خرید یک خودرو هزینه خواهد کرد).

  • سن
  • جنسیت
  • میانگین مایل‌ها به ازای روز
  • اعتبار کارت بانکی فرد (در واقع اعتبار کارت اعتباری)
  • درآمد ماهانه

ابتدا، کتابخانه ایمپورت و دایرکتوری تنظیم می‌شود.

کتابخانه‌ها و تنظیم دایرکتوری

1library(keras)
2
3setwd("/home/michaeljgrogan/Documents/a_documents/computing/data science/datasets")
4
5cars<-read.csv("cars.csv")

از آنجا که یک شبکه عصبی پیاده‌سازی خواهد شد، متغیرها باید نرمال شوند تا شبکه عصبی آن‌ها را به شکل مناسبی تفسیر کند. بنابراین، متغیرهابا استفاده از max-min normalization تبدیل می‌شوند.

1#Max-Min Normalization
2normalize <- function(x) {
3  return ((x - min(x)) / (max(x) - min(x)))
4}
5
6maxmindf <- as.data.frame(lapply(cars, normalize))
7attach(maxmindf)

سپس، داده‌ها به دو بخش آموزش و آزمون تقسیم می‌شوند.

1# Random sample indexes
2train_index <- sample(1:nrow(maxmindf), 0.8 * nrow(maxmindf))
3test_index <- setdiff(1:nrow(maxmindf), train_index)
4
5# Build X_train, y_train, X_test, y_test
6X_train <- as.matrix(maxmindf[train_index, -15])
7y_train <- as.matrix(maxmindf[train_index, "sales"])
8
9X_test <- as.matrix(maxmindf[test_index, -15])
10y_test <- as.matrix(maxmindf[test_index, "sales"])

پیکربندی مدل کرس: رابط برنامه‌نویسی کاربردی شبکه عصبی

اکنون، شبکه عصبی آموزش داده می‌شود. در این راستا، از پنج متغیر ورودی (سن، جنسیت، مایل، اعتبار و درآمد) همراه با دو لایه پنهان، به ترتیب از ۱۲ و ۸ نورون و در نهایت تابع فعال‌سازی خطی برای پردازش خروجی استفاده می‌شود.

1model <- keras_model_sequential() 
2
3model %>% 
4  layer_dense(units = 12, activation = 'relu', kernel_initializer='RandomNormal', input_shape = c(6)) %>% 
5  layer_dense(units = 8, activation = 'relu') %>%
6  layer_dense(units = 1, activation = 'linear')
7
8summary(model)

mean_squared_error (خطای میانگین مربعات | MSE) و (میانگین خطای مطلق | MAE) تابع‌های هزینه‌ای هستند که میزان صحت شبکه عصبی را در پیش‌بینی داده‌های تست محاسبه می‌کند. می‌توان مشاهده کرد که validation_split روی ۰.۲ تنظیم شده و ۸۰ درصد از داده‌های آموزش برای تست مدل مورد استفاده قرار گرفته‌اند، در حالیکه ۲۰٪ باقیمانده به منظور تست استفاده می‌شوند.

1model %>% compile(
2  loss = 'mean_squared_error',
3  optimizer = 'adam',
4  metrics = c('mae')
5)

خروجی شبکه عصبی

اکنون باید مدل را برازش کرد.

1history <- model %>% fit(
2  X_train, y_train, 
3  epochs = 150, batch_size = 50, 
4  validation_split = 0.2
5)

خروجی به صورت زیر است.

Train on 616 samples, validate on 154 samples
Epoch 1/150
2018-12-15 20:37:30.173521: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
616/616 [==============================] - 1s 2ms/step - loss: 0.1673 - mean_absolute_error: 0.3181 - val_loss: 0.1276 - val_mean_absolute_error: 0.2660
Epoch 2/150
616/616 [==============================] - 0s 82us/step - loss: 0.1014 - mean_absolute_error: 0.2360 - val_loss: 0.0786 - val_mean_absolute_error: 0.2119
Epoch 3/150
616/616 [==============================] - 0s 100us/step - loss: 0.0607 - mean_absolute_error: 0.1902 - val_loss: 0.0486 - val_mean_absolute_error: 0.1812
Epoch 4/150
616/616 [==============================] - 0s 94us/step - loss: 0.0396 - mean_absolute_error: 0.1698 - val_loss: 0.0350 - val_mean_absolute_error: 0.1653
Epoch 5/150
616/616 [==============================] - 0s 101us/step - loss: 0.0306 - mean_absolute_error: 0.1546 - val_loss: 0.0286 - val_mean_absolute_error: 0.1516
Epoch 6/150
616/616 [==============================] - 0s 82us/step - loss: 0.0250 - mean_absolute_error: 0.1402 - val_loss: 0.0231 - val_mean_absolute_error: 0.1355
......
Epoch 145/150
616/616 [==============================] - 0s 91us/step - loss: 2.5544e-07 - mean_absolute_error: 1.8456e-04 - val_loss: 5.7741e-06 - val_mean_absolute_error: 5.6603e-04
Epoch 146/150
616/616 [==============================] - 0s 101us/step - loss: 2.3567e-07 - mean_absolute_error: 1.6128e-04 - val_loss: 5.7590e-06 - val_mean_absolute_error: 5.4604e-04
Epoch 147/150
616/616 [==============================] - 0s 83us/step - loss: 2.2469e-07 - mean_absolute_error: 1.2962e-04 - val_loss: 5.7538e-06 - val_mean_absolute_error: 5.2605e-04
Epoch 148/150
616/616 [==============================] - 0s 94us/step - loss: 2.1616e-07 - mean_absolute_error: 1.2723e-04 - val_loss: 5.6361e-06 - val_mean_absolute_error: 5.6658e-04
Epoch 149/150
616/616 [==============================] - 0s 106us/step - loss: 2.1198e-07 - mean_absolute_error: 1.5137e-04 - val_loss: 5.5534e-06 - val_mean_absolute_error: 5.4657e-04
Epoch 150/150
616/616 [==============================] - 0s 80us/step - loss: 2.1450e-07 - mean_absolute_error: 1.8006e-04 - val_loss: 5.6074e-06 - val_mean_absolute_error: 5.6903e-04

اکنون، می‌توان هزینه (خطای میانگین مربعات) را همچون میانگین خطای مطلق محاسبه کرد.

1> model %>% evaluate(X_test, y_test)
2
3193/193 [==============================] - 0s 23us/step
4$loss
5[1] 9.17802e-07
6
7$mean_absolute_error
8[1] 0.0002379419

پیکربندی مدل به صورت زیر است:

1> model
2Model
3__________________________________________________________________
4Layer (type)                 Output Shape               Param #   
5==================================================================
6dense_1 (Dense)              (None, 12)                 84        
7__________________________________________________________________
8dense_2 (Dense)              (None, 8)                  104       
9__________________________________________________________________
10dense_3 (Dense)              (None, 1)                  9         
11==================================================================
12Total params: 197
13Trainable params: 197
14Non-trainable params: 0
15__________________________________________________________________

قابل مشاهده است که Keras «هزینه آموزش» (Training Loss) و «هزینه اعتبارسنجی» (Validation Loss) یا به بیان دیگر انحراف بین y پیش‌بینی شده و y واقعی اندازه‌گیری شده با خطای میانگین مربعات را محاسبه می‌کند. همانطور که در کد می‌توان دید، ۱۵۰ «دوره» (epoch) برای مدل تعیین شده است.

این یعنی، مدل با ۱۵۰ پاس رو به جلو و رو به عقب و با این انتظار که هزینه در هر دوره کاهش پیدا می‌کند آموزش داده شده است، بدین معنا که هر چه مدل بیشتر آموزش داده ‌می‌شود، مقدار Y را به طور صحیح‌تری محاسبه می‌کند. اکنون، می‌توان مشاهده کرد آنچه بیان شده در صورت ترسیم نمودارهای هزینه چگونه به نظر می‌رسد.

پیش‌بینی قیمت خودرو

هم هزینه آموزش و هم اعتبارسنجی با افزایش تعداد دوره‌ها به صورت نمایی کاهش پیدا می‌کند و این بیانگر این امر است که صحت مدل با افزایش تعداد دوره‌ها (یا تعداد پاس‌های رو به عقب و جلو) افزایش پیدا می‌کند.

کارایی

در بخش‌های پیشین، چگونگی آموزش یک مدل شبکه عصبی بیان شد و سپس، داده‌های آموزش در مقابل داده‌های آزمون به منظور تعیین صحت مدل اعتبارسنجی شدند. برخلاف زمانی که با داده‌های دسته‌بندی کار می‌شود، خواندن صحت کمک قابل توجهی در این مثال نمی‌کند.

قیمت‌های فروش خودرو پیش‌بینی شده، ممکن است در حدود ۱٪ فروش واقعی خودروها باشد، اما مقادیر پیش‌بینی شده با وجود دقیق بودن صحیح نیستند. بنابراین، باید صحت را به عنوان درجه انحراف بین مقادیر واقعی و پیش‌بینی شده تنظیم کرد. در ادامه چگونگی محاسبه این مورد نشان داده شده است.

1> pred <- data.frame(y = predict(model, as.matrix(X_test)))
2> df<-data.frame(pred,X_test)
3> attach(df)
4The following objects are masked from maxmindf:
5
6    age, debt, gender, income, miles, sales
7
8> deviation=((pred-sales)/sales)
9> mean(deviation$y)*100
10[1] 0.02819805

می‌توان مشاهده کرد که انحراف میانگین بین قیمت‌های فروش واقعی و پیش‌بینی شده خودروها برابر با 2.819% است.

نتیجه‌گیری

در این راهنما، چگونگی ساخت یک شبکه عصبی در کرس و مقیاس کردن داده‌ها به طور مناسب با استفاده از MinMaxScaler آموزش داده شد.

همچنین، مقدار هزینه‌های آموزش و آزمون محاسبه و پیش‌بینی‌ها با استفاده از مدل شبکه عصبی انجام شد.

اگر نوشته بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *