پیش بینی قیمت خودرو با کتابخانه 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 آموزش داده شد.
همچنین، مقدار هزینههای آموزش و آزمون محاسبه و پیشبینیها با استفاده از مدل شبکه عصبی انجام شد.
اگر نوشته بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- مجموعه آموزشهای هوش محاسباتی
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- ساخت شبکه عصبی (Neural Network) در پایتون — به زبان ساده
^^