دسته بندی داده ها با شبکه عصبی مصنوعی | راهنمای کاربردی
در این مطلب، روش دسته بندی داده ها با شبکه عصبی مصنوعی مورد بررسی قرار گرفته است. همچنین، برای درک بهتر موضوع، یک بررسی موردی انجام و کلیه مراحل لازم برای این کار، با استفاده از «زبان برنامهنویسی پایتون» (Python Programming Language) پیادهسازی شده است.
دسته بندی داده ها با شبکه عصبی مصنوعی
مسائل «دادهکاوی» (Data Mining) و «یادگیری ماشین» (Machine Learning) در حالت کلی به سه دسته «یادگیری نظارت شده» (Supervised Learning)، «یادگیری نظارت نشده» (Unsupervised Learning) و «یادگیری نیمه نظارت شده» (Semi-Supervised Learning) تقسیم میشوند.
به نوع اول و دوم، به ترتیب «دستهبندی» (Classification) و «خوشهبندی» (Clustering) نیز گفته میشود. همچنین، باید توجه داشت که پیرامون وجود نوع سومی به نام یادگیری نیمه نظارت شده، بین پژوهشگران اختلاف نظرهایی وجود دارد.
برای هر یک از انواع مسائل بیان شده، از الگوریتمهای گوناگونی استفاده میشود. یکی از روشهایی که کاربردهای گستردهای در حل مسائل دادهکاوی و یادگیری ماشین و به ویژه مسائل دستهبندی دارد، «شبکههای عصبی مصنوعی» (Artificial Neural Networks | ANN) است.
شبکههای عصبی خود انواع گوناگونی دارند؛ پرداختن به این انواع از حوصله این بحث خارج است و توصیه میشود علاقهمندان به آشنایی بیشتر با آنها، مطالب «انواع شبکه های عصبی مصنوعی — راهنمای جامع» و «انواع سلول ها و لایه ها در شبکه های عصبی — راهنمای جامع» را مطالعه کنند.
در این مطلب، از شبکه عصبی مصنوعی برای حل یک مسئله دستهبندی استفاده شده و در واقع، روش ساخت یک شبکه عصبی مصنوعی (ANN) برای حل این مسئله به طور گام به گام و به طور کامل تشریح شده است. کلیه کدهای لازم برای پیادهسازی این شبکه با «زبان برنامهنویسی پایتون» (Python Programming Language) نوشته شدهاند.
«علم داده» (Data Science) و «هوش مصنوعی» (Artificial Intelligence) در زمینههای گوناگونی کاربرد دارند. یکی از این حوزهها، بانکداری و امور مالی است. مسئلهای که در اینجا به آن پرداخته میشود، یک مسئله دستهبندی در حوزه بانکداری است. هدف از این مسئله که در ادامه و در بخشهای بعدی به طور دقیقتر به آن پرداخته میشود، پاسخگویی به یک پرسش اساسی است؛ مشتریان بانک مورد بررسی در مسئله، در بانک میمانند یا آن را ترک میکنند (به دلایل گوناگون مثلا پیوستن به دیگر بانکها)؟
این مطلب به طور کلی به شش بخش تقسیم شده و هر بخش به طور کامل تشریح شده است تا در نهایت مسئله دستهبندی دادههای بانکی با استفاده از شبکههای عصبی مصنوعی حل شود. این شش بخش در ادامه بیان شدهاند.
- بیان مسئله
- پردازش دادهها
- ساخت مدل
- کامپایل کردن مدل
- برازش مدل
- پیشبینی مدل
شایان توجه است که مطالعه این مطلب، به افراد کمک میکند تا چگونگی حل یک مسئله دستهبندی را بیاموزند و با مراحل آن از صفر تا صد آشنا شوند.
بیان مسئله
یک بانک خیالی، دادههای مشتریان خود را برای شش ماه گردآوری کرده است. اکنون، هدف آن است که پیشبینی شود آیا احتمال دارد یک مشتری بانک را ترک کند یا خیر. بنابراین، یک مسئله «دستهبندی دودویی» (Binary Classification) مطرح است که در آن، ترک کردن بانک معادل با ۱ و باقی ماندن مشتری معادل با ۰ است.
پردازش دادهها
ابتدا، باید دادههای بانکی مشتریان را که طی شش ماه گردآوری شدهاند، با استفاده از کتابخانه پایتون «پانداس» (Pandas) «وارد» (Import) کرد.
در این راستا، از read_csv() به صورت زیر استفاده میشود. در تصویر یک، بخش کوچکی از مجموعه داده به تصویر کشیده شده است.
۱۳ ستون اول، متغیرهای مستقل «شناسه» (ID)، «نام» (Name)، «امتیاز اعتباری» (Credit Score)، «جغرافیا» (Geography)، «جنسیت» (Gender)، «سن» (Age) و دیگر موارد هستند. ستون آخر، متغیر «وابسته» (Dependent) است. این متغیر وابسته نشان میدهد که مشتریان بانک را ترک میکنند یا همراه آن میمانند. اکنون، کار پردازش دادهها آغاز میشود.
انتخاب ویژگیها
اولین پرسشی که در این وهله مطرح میشود آن است که آیا نیاز به همه متغیرهای مستقل برای برازش مدل است؟ پاسخ «منفی» است. برای مثال، شماره سطرها (Row Number)، شماره مشتری (Customer ID) یا نام خانوادگی (Surname) هیچ تاثیری روی این موضوع ندارند که مشتری بانک را ترک میکند یا میماند.
اما سن مشتریان ممکن است روی این موضوع اثرگذار باشد. مشتریان جوان احتمالا تمایلی به ترک بانک دارند. بنابراین، با این منطق، میتوان گفت که کدام متغیر مستقل میتواند خروجی را تحت تاثیر قرار دهد. البته، باید به خاطر داشت که تنها شبکه عصبی میتواند بگوید که کدام ویژگیها روی خروجی تاثیر دارند. بنابراین، متغیرهای مستقل X به صورت زیر هستند.
متغیر وابسته Y به صورت زیر هستند.
رمزگذاری دستهای
شبکههای عصبی تنها مقادیر عددی را به عنوان ورودی برای «یادگیری» (Learning) دریافت میکنند. بنابراین، متغیرهای دستهای مانند «جغرافیا» و «جنسیت» (Gender) باید به متغیرهای عددی رمزگذاری شوند.
در اینجا، از متد fit_transform() از LabelEncoder از کتابخانه پایتون «سایکیتلرن» (Scikit Learn | Sklearn) استفاده شده است. در ادامه و با استفاده از قطعه کدهای زیر، دو رمزگذار برچسب برای هر ستون ساخته شده است.
شایان توجه است که در کد بالا، نظر به اینکه اندیس ستون جغرافیا (Geography) در X برابر با ۱ است، اندیس ۱ به عنوان ورودی داده شده است. پس از رمزگذاری، کشور آلمان ۱، فرانسه ۰ و اسپانیا ۲ خواهد شد. با روش مشابهی، رمزگذاری ستون جنسیت به صورت زیر انجام میشود.
اکنون، در ستون جنسیت مرد (Male) یک (۱) و زن (Female) صفر (۰) است.
کدبندی وانهات
در مثالهای بالا، پس از انجام کدبندی (رمزگذاری)، آلمانی (German) یک (۱)، فرانسوی (صفر) و اسپانیایی دو (۲) می شود. با وجود ترتیبی بودن این ارقام، باید توجه داشت که هیچ رابطه ترتیبی بین کشورها وجود ندارد. در واقع، اسپانیا بالاتر از آلمان و فرانسه پایینتر از اسپانیا قرار نگرفته و ترتیبی وجود ندارد.
بنابراین، نیاز به ساخت «متغیر مجازی» (Dummy Variables) برای متغیرهای دستهای به منظور حذف روابط عددی تعریف شده توسط کدبندی (رمزگذاری) دستهای است. در اینجا، فقط نیاز به انجام این کار برای ستون «Geography» است، زیرا تنها دو دسته برای ستون جنسیت وجود دارد.
تصویر دو دادههای کدبندی (رمزگذاری) شده هستند. شایان توجه است که سه ستون اول با استفاده از روش کدبندی «وانهات» (One-Hot)، برای متغیرهای مجازی، برای کشورهای آلمان، فرانسه و اسپانیا، کدبندی شدهاند.
در نهایت، برای اجتناب از تله داده (Data Trap)، اولین ستون حذف میشود، زیرا دو ستون با ۰ و ۱ برای کدبندی (رمزگذاری) سه کشور کافی محسوب میشود.
تقسیم دادهها
در گام بعدی، دادهها به دو دسته آموزش (Train) و تست (Test) تقسیم میشوند که در آنها، مجموعه تست ۲۰ درصد از دادهها را به خود اختصاص میدهد.
در اینجا، از random_state برای حصول اطمینان از این موضوع استفاده میشود که تقسیمبندی در هر بار ثابت میماند.
مقیاس کردن ویژگیها
مقیاس کردن ویژگیها (Scaling) برای اجتناب از محاسبات زیاد و همچنین، ممانعت از تسلط یک متغیر بر دیگر متغیرها انجام میشود. برای مسئله دستهبندی دودویی، نیازی به مقیاس کردن متغیرهای وابسته نیست.
اما برای «رگرسیون» (Regression)، نیاز به مقیاس کردن متغیرهای وابسته است. روشهای متداول مقیاس کردن دادهها شامل «استانداردسازی» (Standardization) و «نرمالسازی» (Normalization) در تصویر زیر نمایش داده شدهاند.
در این مطلب و برای بررسی موردی بیان شده در اینجا، از استانداردسازی استفاده میشود.
شایان توجه است که در اینجا، مجموعه از مجموعه آموزش مقیاس میشود تا مجموعه آزمون تبدیل شود. در این گام، پردازش به پایان میرسد. تصویر زیر، دادههای تستی را نشان میدهد که کاربر باید در این مرحله به دست بیاورد.
ساخت مدل
در این مرحله، با استفاده از کتابخانه «کرس» (Keras) یک مدل ترتیبی ساخته میشود. اولین گام، مقداردهی اولیه به مدل ترتیبی است.
قطعه کد لازم برای انجام این کار، در ادامه آمده است.
برای این مسئله، مدل با دو لایه چگال ساخته میشود.
شایان توجه است که Output_dim برای لایه پنهان، بسته به تجربه کاری پژوهشگر انجام میشود و یک کار مهم است. به عنوان یک نکته، بر مبنای آزمایشات انجام شده، انتخاب این مورد برای مسئله بیان شده در این مطلب، میانگین بین تعداد گرهها (Nodes)، لایه ورودی و تعداد گرههای لایه خروجی است.
یک روش بهتر، استفاده از تنظیم پارامترها است که طی آن مدلهای مختلف با استفاده از روشی مانند «اعتبارسنجی متقاطع» (K-Fold Cross Validation) تست میشوند. در اینجا، ابعاد ورودی ۱۱ ویژگی و برای خروجی ۱ است، بنابراین ابعاد خروجی ۶ خواهد بود.
در ادامه، از «توزیع یکنواخت» (Uniform Distributions) برای تصادفیسازی وزنها بین ۰ و ۱ استفاده میشود. تابع ReLU برای فعالسازی «لایه پنهان» (Hidden Layer)، استفاده میشود. با توجه به تجربیات نویسنده و بررسیهایی که روی این مسئله مشخص داشته است، این تابع برای این مسئله، احتمالا بهترین گزینه است. قطعه کد زیر، برای افزودن لایه خروجی است.
برای لایه خروجی، از تابع «سیگموئید» (Sigmoeid) به منظور به دست آوردن احتمال آنکه مشتریان در بانک میمانند یا آن را ترک میکنند، استفاده میشود. در مسائلی که در آنها دستهبندی چندتایی (Multi-Classification) انجام میشود، احتمالا تابع «سافتمکس» (Softmax) گزینه خوبی است.
کامپایل کردن مدل
از کامپایل کردن مدل برای اعمال «گرادیان کاهشی تصادفی» (Stochastic Gradient Descent | SGD) روی شبکه استفاده میشود.
در اینجا، از «آدام» (Adam) که نوعی از گرادیان کاهشی تصادفی است، به عنوان بهینهسازی برای پیدا کردن وزنهای بهینهای که موجب قدرتمندتر شدن شبکه عصبی میشوند استفاده شده است. «تابع زیانی» (Loss Function) که بهینهساز بر پایه آن است، «آنتروپی متقاطع دودویی» (Binary Cross Entropy) نام دارد. سنجهای که در اینجا برای ارزیابی مدل مورد استفاده قرار میگیرد، «صحت» (Accuracy) است.
برازش مدل
با مدل برازش شده، مدل روی دادههای تست ارزیابی میشود. در اینجا از آستانه ۰/۵ برای تبدیل دادهها به اطلاعات «درست» (True که در اینجا به معنای ترک کردن بانک توسط مشتری است) و «غلط» (False که در اینجا به معنای ماندن مشتری در بانک است) استفاده میشود.
قطعه کد زیر برای پیادهسازی آنچه بیان شد مورد استفاده قرار میگیرد.
سپس، از confusion_matrix برای بررسی کارایی مدل روی مجموعه داده آزمون (Test) استفاده میشود.
صحت در اینجا برابر با ۰.۸۵۹ و این میزان، بالاتر از صحت آموزش است که نشان میدهد «بیشبرازش» (Overfitting) وجود دارد. با استفاده از مدل بالا، بانک میتواند مشتریان جدید را ارزیابی و احتمال آنکه در بانک میمانند یا آن را ترک میکنند را محاسبه کند. سپس، بانک میتواند ۱۰ درصدد از مشتریان با بالاترین احتمال ترک بانک را دریافت و روی دادههای آنها «کاوش عمیق» (Deep Mining) انجام دهد تا از چرایی این موضوع به خوبی آگاه شود. این، هدف یک شبکه عصبی مصنوعی است.
اکنون، تنها یک پرسش نهایی باقی میماند. چطور میتوان روی دادههای مشتریان جدید پیشبینی انجام داد. برای مثال، نمونه دادههای یک مشتری جدید در تصویر زیر نمایش داده شده است.
در اینجا، نیاز به دنبال کردن پردازشهای داده مشابهی است. ابتدا، رمزگذاری متغیرها انجام میشود. برای مثال، Geography France در متغیرهای مجازی به (0,0) رمزگذاری میشود، همچنین، Gender Male برابر با یک قرار داده میشود. با استفاده از روشی که در ادامه ارائه شده است، آرایه زیر تولید میشود.
گام بعدی، مقیاس کردن متغیرها در مقیاسی مشابه با مجموعه آموزش است. این کار، با استفاده از قطعه کد زیر انجام میشود.
با استفاده از دادههای آماده شده، پیشبینی با استفاده از قطعه کد زیر انجام میشود.
نتیجه پیشبینی، با احتمال به دست آمده 0.418 برابر با False است و این یعنی این مشتری بانک را ترک نخواهد کرد که قطعا خبر خوبی برای بانک محسوب میشود.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
سلام وقتتون بخیر
من دانشجوی ارشد کامپیوتر هستم، و با توجه به فیلد کاری شما، چندتا سوال میخواستم ازتون بپرسم در مورد انتخاب موضوع پایان نامم.. باعث خوشحالیه اگه بهم کمک کنید
ممنونم