آموزش پیاده سازی یادگیری عمیق

در این پیاده سازی یادگیری عمیق با پایتون، هدف ما پیش‌بینی داده‌های افت مشتری یا از دست دادن مشتری برای یک بانک خاص است. یعنی پیش‌بینی اینکه کدام مشتریان احتمالاً خدمات این بانک را ترک خواهند کرد. داده‌های استفاده‌شده نسبتاً کوچک هستند و شامل ۱۰,۰۰۰ ردیف و ۱۴ ستون هستند. ما از توزیع Anaconda استفاده می‌کنیم و از فریم‌ورک‌هایی مانند Theano، TensorFlow و Keras بهره می‌بریم. Keras بر اساس TensorFlow و Theano ساخته شده است که به‌عنوان backend های آن عمل می‌کنند.

گام ۱: پیش‌پردازش داده‌ها

گام ۲

ما ماتریس‌های ویژگی‌های داده‌ها و متغیر هدف را می‌سازیم که ستون ۱۴، با برچسب “Exited” است.

ظاهر اولیه داده‌ها به صورت زیر است:

خروجی

خروجی گام 2

گام ۳

خروجی

گام ۴

ما برای ساده‌تر کردن تحلیل، متغیرهای رشته‌ای را کدگذاری می‌کنیم. از تابع LabelEncoder از ScikitLearn برای کدگذاری خودکار برچسب‌های مختلف در ستون‌ها با مقادیری بین ۰ تا n_classes-1 استفاده می‌کنیم.

خروجی

خروجی گام 4

در خروجی بالا، نام کشورهای مختلف با مقادیر ۰، ۱ و ۲ جایگزین شده‌اند؛ در حالی که مرد و زن با ۰ و ۱ جایگزین شده‌اند.

گام ۵: برچسب‌گذاری داده‌های کدگذاری‌شده

ما از همان کتابخانه ScikitLearn و تابع دیگری به نام OneHotEncoder استفاده می‌کنیم تا فقط شماره ستون را ارسال کرده و یک متغیر dummy ایجاد کنیم.

حالا، دو ستون اول نمایانگر کشور و ستون چهارم نمایانگر جنسیت هستند.

خروجی

خروجی گام 5

ما همیشه داده‌های خود را به بخش‌های آموزشی و آزمایشی تقسیم می‌کنیم؛ مدل خود را روی داده‌های آموزشی آموزش داده و سپس دقت مدل را روی داده‌های آزمایشی بررسی می‌کنیم که به ارزیابی کارایی مدل کمک می‌کند.

گام ۶

ما از تابع train_test_split کتابخانه ScikitLearn برای تقسیم داده‌ها به مجموعه آموزشی و تست استفاده می‌کنیم. نسبت تقسیم داده‌ها به صورت ۸۰:۲۰ حفظ می‌شود.

برخی از متغیرها مقادیرشان در هزارها است، در حالی که برخی دیگر مقادیرشان در ده‌ها یا واحدها است. ما داده‌ها را مقیاس‌بندی می‌کنیم تا نماینده بهتری از آن‌ها داشته باشیم.

گام ۷

در این کد، ما داده‌های آموزشی را با استفاده از تابع StandardScaler فیت و تبدیل می‌کنیم. ما مقیاس‌بندی خود را استاندارد می‌کنیم تا از همان روش فیت‌شده برای تبدیل/مقیاس‌بندی داده‌های تست استفاده کنیم.

خروجی

خروجی گام 8

داده‌ها اکنون به درستی مقیاس‌بندی شده‌اند. در نهایت، ما با پیش‌پردازش داده‌ها تمام کرده‌ایم. حالا، شروع به ساخت مدل خود می‌کنیم.

گام ۸

ما ماژول‌های مورد نیاز را در اینجا وارد می‌کنیم. ما به ماژول Sequential برای راه‌اندازی شبکه عصبی و ماژول Dense برای افزودن لایه‌های پنهان نیاز داریم.

گام ۹

ما مدل را به نام “Classifier” می‌نامیم چون هدف ما طبقه‌بندی از دست دادن مشتریان است. سپس از ماژول Sequential برای راه‌اندازی استفاده می‌کنیم.

گام ۱۰

ما لایه‌های پنهان را یکی یکی با استفاده از تابع Dense اضافه می‌کنیم. در کد زیر، تعدادی آرگومان وجود دارد.

اولین پارامتر ما output_dim است. این تعداد گره‌هایی است که به این لایه اضافه می‌کنیم. پارامتر init برای مقداردهی اولیه به روش کاهش تصادفی شیب (Stochastic Gradient Descent) استفاده می‌شود. در یک شبکه عصبی، به هر گره وزنی اختصاص می‌دهیم. در شروع، وزن‌ها باید نزدیک به صفر باشند و ما وزن‌ها را به طور تصادفی با استفاده از تابع uniform مقداردهی اولیه می‌کنیم. پارامتر input_dim فقط برای لایه اول نیاز است زیرا مدل از تعداد متغیرهای ورودی ما اطلاعی ندارد. در اینجا تعداد کل متغیرهای ورودی ۱۱ است. در لایه دوم، مدل به طور خودکار تعداد متغیرهای ورودی را از لایه اول پنهان می‌شناسد.

کد زیر را برای اضافه کردن لایه ورودی و اولین لایه پنهان اجرا کنید:

و کد زیر را برای اضافه کردن دومین لایه پنهان اجرا کنید:
کد زیر را برای اضافه کردن لایه خروجی اجرا کنید:

گام ۱۱

کامپایل کردن شبکه عصبی (ANN)

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

در اینجا یک توضیح مختصر در مورد آرگومان‌ها آمده است:

اولین آرگومان Optimizer است. این یک الگوریتم است که برای پیدا کردن مجموعه بهینه وزن‌ها استفاده می‌شود. این الگوریتم به نام Stochastic Gradient Descent (SGD) شناخته می‌شود. در اینجا، ما یکی از انواع آن به نام Adam optimizer را استفاده می‌کنیم. الگوریتم SGD وابسته به خطا است، بنابراین دومین پارامتر loss است. اگر متغیر وابسته ما دودویی باشد، از تابع خطای لگاریتمی به نام binary_crossentropy استفاده می‌کنیم، و اگر متغیر وابسته ما بیش از دو دسته در خروجی داشته باشد، از categorical_crossentropy استفاده می‌کنیم. ما می‌خواهیم عملکرد شبکه عصبی خود را بر اساس دقت بهبود دهیم، بنابراین metrics را به دقت (accuracy) اضافه می‌کنیم.

گام ۱۲

در این مرحله، چندین کد باید اجرا شوند.

آموزش شبکه عصبی با استفاده از مجموعه داده‌های آموزشی

حالا ما مدل خود را روی داده‌های آموزشی آموزش می‌دهیم. از متد fit برای آموزش مدل استفاده می‌کنیم. همچنین وزن‌ها را برای بهبود کارایی مدل بهینه می‌کنیم. برای این کار باید وزن‌ها را بروزرسانی کنیم. Batch size تعداد مشاهداتی است که پس از آن وزن‌ها بروزرسانی می‌شوند. Epoch تعداد کل تکرارها است. مقادیر batch size و epoch از طریق روش آزمون و خطا انتخاب می‌شوند.

پیش‌بینی‌ها و ارزیابی مدل
پیش‌بینی یک مشاهده جدید

هدف ما این است که پیش‌بینی کنیم آیا مشتری با داده‌های زیر بانک را ترک خواهد کرد یا خیر:

  • جغرافیا: اسپانیا

  • امتیاز اعتباری: ۵۰۰

  • جنسیت: زن

  • سن: ۴۰

  • مدت عضویت: ۳ سال

  • مانده حساب: ۵۰۰۰۰

  • تعداد محصولات: ۲

  • آیا کارت اعتباری دارد؟ بله

  • آیا عضو فعال است؟ بله

برای پیش‌بینی چنین مشاهده‌ای می‌توانیم از مدل استفاده کنیم.

گام ۱۳

پیش‌بینی نتایج مجموعه تست

نتیجه پیش‌بینی احتمال ترک مشتری از شرکت را به شما می‌دهد. ما این احتمال را به مقادیر دودویی ۰ و ۱ تبدیل خواهیم کرد.

گام ۱۴

این آخرین گام است که در آن عملکرد مدل خود را ارزیابی می‌کنیم. ما نتایج اصلی را داریم و به این ترتیب می‌توانیم ماتریس سردرگمی (Confusion Matrix) را بسازیم تا دقت مدل خود را بررسی کنیم.

ساخت ماتریس سردرگمی (Confusion Matrix)

خروجی

از ماتریس سردرگمی، دقت مدل ما به صورت زیر محاسبه می‌شود:
ما دقت ۸۵.۸٪ را به دست آوردیم که نتیجه خوبی است.

پیشنهاد ویژه : آموزش طراحی سایت با پایتون

الگوریتم پیشروی به جلو (Forward Propagation)

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

الگوریتم پیشروی به جلو

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

ورودی داده‌ها از پیش بارگذاری شده است و وزن‌ها در یک دیکشنری به نام weights قرار دارند. آرایه وزن‌ها برای اولین نود در لایه پنهان در weights['node_0'] و برای دومین نود در لایه پنهان در weights['node_1'] قرار دارند.

وزن‌های وارد شده به نود خروجی نیز در weights موجود هستند.

تابع فعال‌سازی ReLU (Rectified Linear Activation Function)

یک “تابع فعال‌سازی” تابعی است که در هر نود شبکه عصبی کار می‌کند. این تابع ورودی نود را به یک خروجی تبدیل می‌کند.

تابع فعال‌سازی ReLU (که به معنی Rectified Linear Unit) است، در شبکه‌های بسیار پرتوان استفاده می‌شود. این تابع یک عدد را به عنوان ورودی می‌گیرد و اگر ورودی منفی باشد، مقدار ۰ را بازمی‌گرداند، و اگر ورودی مثبت باشد، همان ورودی را به عنوان خروجی بازمی‌گرداند.

در اینجا چند مثال آورده شده است:

  • relu(4) = 4
  • relu(-2) = 0

در ادامه، تعریف تابع relu() را پر می‌کنیم:

  • ما از تابع max() برای محاسبه مقدار خروجی تابع ReLU استفاده می‌کنیم.
  • ما تابع relu() را روی node_0_input اعمال می‌کنیم تا مقدار node_0_output را محاسبه کنیم.
  • ما تابع relu() را روی node_1_input اعمال می‌کنیم تا مقدار node_1_output را محاسبه کنیم.

خروجی

اعمال شبکه به چندین مشاهده/ردیف داده

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

بیایید یک تابع به نام predict_with_network() تعریف کنیم که دو آرگومان – input_data_row و weights را می‌پذیرد و پیش‌بینی مدل را به عنوان خروجی برمی‌گرداند.

ما مقادیر ورودی و خروجی برای هر نود را محاسبه کرده و آن‌ها را در node_0_input, node_0_output, node_1_input, و node_1_output ذخیره می‌کنیم.

برای محاسبه مقدار ورودی یک نود، ما آرایه‌های مربوطه را با هم ضرب کرده و مجموع آن‌ها را محاسبه می‌کنیم.

برای محاسبه مقدار خروجی یک نود، ما تابع relu() را به مقدار ورودی نود اعمال می‌کنیم. از یک حلقه for برای تکرار روی input_data استفاده می‌کنیم.

ما همچنین از تابع predict_with_network() برای تولید پیش‌بینی‌ها برای هر ردیف از داده‌های ورودی – input_data_row استفاده می‌کنیم و پیش‌بینی‌ها را به results اضافه می‌کنیم.

خروجی

در اینجا از تابع relu() استفاده کرده‌ایم که relu(26) = 26 و relu(-13) = 0 است و همینطور برای سایر مقادیر.

شبکه عصبی با چند لایه پنهان عمیق

در این بخش، ما کدی می‌نویسیم تا پیشروی به جلو (forward propagation) را برای یک شبکه عصبی با دو لایه پنهان انجام دهیم. هر لایه پنهان شامل دو نود است. داده ورودی به عنوان input_data از قبل بارگذاری شده است. نودهای لایه پنهان اول به نام‌های node_0_0 و node_0_1 شناخته می‌شوند.

وزن‌های مربوط به این نودها از قبل بارگذاری شده‌اند و در weights['node_0_0'] و weights['node_0_1'] قرار دارند.

نودهای لایه پنهان دوم به نام‌های node_1_0 و node_1_1 هستند. وزن‌های مربوط به این نودها در weights['node_1_0'] و weights['node_1_1'] قرار دارند.

در نهایت، خروجی مدل با استفاده از وزن‌های weights['output'] و نودهای لایه پنهان دوم محاسبه می‌شود.

شبکه چند لایه عمیق

ما ورودی node_0_0_input را با استفاده از وزن‌های weights['node_0_0'] و داده ورودی input_data محاسبه می‌کنیم. سپس تابع ReLU را اعمال می‌کنیم تا node_0_0_output به دست آید.

ما همین کار را برای node_0_1_input انجام می‌دهیم تا node_0_1_output را به دست آوریم.

ما ورودی node_1_0_input را با استفاده از وزن‌های weights['node_1_0'] و خروجی‌های لایه پنهان اول (hidden_0_outputs) محاسبه می‌کنیم. سپس تابع ReLU را اعمال می‌کنیم تا node_1_0_output به دست آید.

ما همین کار را برای node_1_1_input انجام می‌دهیم تا node_1_1_output را به دست آوریم.

ما خروجی مدل model_output را با استفاده از وزن‌های weights['output'] و خروجی‌های لایه پنهان دوم (hidden_1_outputs) محاسبه می‌کنیم. در اینجا تابع ReLU را به خروجی مدل اعمال نمی‌کنیم.

چند لایه پنهان

خروجی

به این مطلب امتیاز دهید

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

آموزش گام به گام برنامه نویسی اندروید با B4A (پروژه محور)
  • انتشار: ۴ شهریور ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید