دسته بندی داده ها با شبکه عصبی مصنوعی | راهنمای کاربردی

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

در این مطلب، روش دسته بندی داده ها با شبکه عصبی مصنوعی مورد بررسی قرار گرفته است. همچنین، برای درک بهتر موضوع، یک بررسی موردی انجام و کلیه مراحل لازم برای این کار، با استفاده از «زبان برنامه‌نویسی پایتون» (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()‎ به صورت زیر استفاده می‌شود. در تصویر یک، بخش کوچکی از مجموعه داده به تصویر کشیده شده است.

1dataset = pd.read_csv(‘Churn_Modelling.csv’)
دسته بندی داده ها با شبکه عصبی مصنوعی -- راهنمای کاربردی
تصویر ۱: نمایی از مجموعه داده وارد شده

۱۳ ستون اول، متغیرهای مستقل «شناسه» (ID)، «نام» (Name)، «امتیاز اعتباری» (Credit Score)، «جغرافیا» (Geography)، «جنسیت» (Gender)، «سن» (Age) و دیگر موارد هستند. ستون آخر، متغیر «وابسته» (Dependent) است. این متغیر وابسته نشان می‌دهد که مشتریان بانک را ترک می‌کنند یا همراه آن می‌مانند. اکنون، کار پردازش داده‌ها آغاز می‌شود.

انتخاب ویژگی‌ها

اولین پرسشی که در این وهله مطرح می‌شود آن است که آیا نیاز به همه متغیرهای مستقل برای برازش مدل است؟ پاسخ «منفی» است. برای مثال، شماره سطرها (Row Number)، شماره مشتری (Customer ID) یا نام خانوادگی (Surname) هیچ تاثیری روی این موضوع ندارند که مشتری بانک را ترک می‌کند یا می‌ماند.

اما سن مشتریان ممکن است روی این موضوع اثرگذار باشد. مشتریان جوان احتمالا تمایلی به ترک بانک دارند. بنابراین، با این منطق، می‌توان گفت که کدام متغیر مستقل می‌تواند خروجی را تحت تاثیر قرار دهد. البته، باید به خاطر داشت که تنها شبکه عصبی می‌تواند بگوید که کدام ویژگی‌ها روی خروجی تاثیر دارند. بنابراین، متغیرهای مستقل X به صورت زیر هستند.

1X = dataset.iloc[:, 3: 13].values

متغیر وابسته Y به صورت زیر هستند.

1y = dataset.iloc[:, 13].values

رمزگذاری دسته‌ای

شبکه‌های عصبی تنها مقادیر عددی را به عنوان ورودی برای «یادگیری» (Learning) دریافت می‌کنند. بنابراین، متغیرهای دسته‌ای مانند «جغرافیا» و «جنسیت» (Gender) باید به متغیرهای عددی رمزگذاری شوند.

در اینجا، از متد fit_transform()‎ از LabelEncoder از کتابخانه پایتون «سایکیت‌لرن» (Scikit Learn | Sklearn) استفاده شده است. در ادامه و با استفاده از قطعه کدهای زیر، دو رمزگذار برچسب برای هر ستون ساخته شده است.

1from sklearn.preprocessing import LabelEncoder
2labelencoder_X_1 = LabelEncoder()
3X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])

شایان توجه است که در کد بالا، نظر به اینکه اندیس ستون جغرافیا (Geography) در X برابر با ۱ است، اندیس ۱ به عنوان ورودی داده شده است. پس از رمزگذاری، کشور آلمان ۱، فرانسه ۰ و اسپانیا ۲ خواهد شد. با روش مشابهی، رمزگذاری ستون جنسیت به صورت زیر انجام می‌شود.

1labelencoder_X_2 = LabelEncoder()
2X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])

اکنون، در ستون جنسیت مرد (Male) یک (۱) و زن (Female) صفر (۰) است.

کدبندی وان‌هات

در مثال‌های بالا، پس از انجام کدبندی (رمزگذاری)، آلمانی (German) یک (۱)، فرانسوی (صفر) و اسپانیایی دو (۲) می شود. با وجود ترتیبی بودن این ارقام، باید توجه داشت که هیچ رابطه ترتیبی بین کشورها وجود ندارد. در واقع، اسپانیا بالاتر از آلمان و فرانسه پایین‌تر از اسپانیا قرار نگرفته و ترتیبی وجود ندارد.

بنابراین، نیاز به ساخت «متغیر مجازی» (Dummy Variables) برای متغیرهای دسته‌ای به منظور حذف روابط عددی تعریف شده توسط کدبندی (رمزگذاری) دسته‌ای است. در اینجا، فقط نیاز به انجام این کار برای ستون «Geography» است، زیرا تنها دو دسته برای ستون جنسیت وجود دارد.

1from sklearn.preprocessing import OneHotEncoder
2onehotencoder = OneHotEncoder(categorical_features = [1])
3X = onehotencoder.fit_transform(X).toarray()

تصویر دو داده‌های کدبندی (رمزگذاری) شده هستند. شایان توجه است که سه ستون اول با استفاده از روش کدبندی «وان‌هات» (One-Hot)، برای متغیرهای مجازی، برای کشورهای آلمان، فرانسه و اسپانیا، کدبندی شده‌اند.

دسته بندی داده ها با شبکه عصبی مصنوعی -- راهنمای کاربردی
تصویر ۲: داده‌های کدبندی شده با روش One-Hot

در نهایت، برای اجتناب از تله داده (Data Trap)، اولین ستون حذف می‌شود، زیرا دو ستون با ۰ و ۱ برای کدبندی (رمزگذاری) سه کشور کافی محسوب می‌شود.

1X = X[:, 1:]

تقسیم داده‌ها

در گام بعدی، داده‌ها به دو دسته آموزش (Train) و تست (Test) تقسیم می‌شوند که در آن‌ها، مجموعه تست ۲۰ درصد از داده‌ها را به خود اختصاص می‌دهد.

در اینجا، از random_state برای حصول اطمینان از این موضوع استفاده می‌شود که تقسیم‌بندی در هر بار ثابت می‌ماند.

1from sklearn.model_selection import train_test_split
2X_train, X_test, y_train, y_test = train_test_split(X, y,test_size = 0.2, random_state = 0)

مقیاس کردن ویژگی‌ها

مقیاس کردن ویژگی‌ها (Scaling) برای اجتناب از محاسبات زیاد و همچنین، ممانعت از تسلط یک متغیر بر دیگر متغیرها انجام می‌شود. برای مسئله دسته‌بندی دودویی، نیازی به مقیاس کردن متغیرهای وابسته نیست.

اما برای «رگرسیون» (Regression)، نیاز به مقیاس کردن متغیرهای وابسته است. روش‌های متداول مقیاس کردن داده‌ها شامل «استانداردسازی» (Standardization) و «نرمال‌سازی» (Normalization) در تصویر زیر نمایش داده شده‌اند.

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

در این مطلب و برای بررسی موردی بیان شده در اینجا، از استانداردسازی استفاده می‌شود.

1from sklearn.preprocessing import StandardScaler
2sc = StandardScaler()
3X_train = sc.fit_transform(X_train)
4X_test = sc.transform(X_test)

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

دسته بندی داده ها با شبکه عصبی مصنوعی -- راهنمای کاربردی
تصویر ۴: داده‌های تست نهایی

ساخت مدل

در این مرحله، با استفاده از کتابخانه «کرس» (Keras) یک مدل ترتیبی ساخته می‌شود. اولین گام، مقداردهی اولیه به مدل ترتیبی است.

قطعه کد لازم برای انجام این کار، در ادامه آمده است.

1classifier = Sequential()

برای این مسئله، مدل با دو لایه چگال ساخته می‌شود.

1#add input layer and first hidden layer
2classifier.add(Dense(output_dim = 6, init = ‘uniform’, activation = ‘relu’, input_dim = 11))
3#add 2nd hidden layer
4classifier.add(Dense(output_dim = 6, init = ‘uniform’, activation = ‘relu’))

شایان توجه است که Output_dim برای لایه پنهان، بسته به تجربه کاری پژوهشگر انجام می‌شود و یک کار مهم است. به عنوان یک نکته، بر مبنای آزمایشات انجام شده، انتخاب این مورد برای مسئله بیان شده در این مطلب، میانگین بین تعداد گره‌ها (Nodes)، لایه ورودی و تعداد گره‌های لایه خروجی است.

یک روش بهتر، استفاده از تنظیم پارامترها است که طی آن مدل‌های مختلف با استفاده از روشی مانند «اعتبارسنجی متقاطع» (K-Fold Cross Validation) تست می‌شوند. در اینجا، ابعاد ورودی ۱۱ ویژگی و برای خروجی ۱ است، بنابراین ابعاد خروجی ۶ خواهد بود.

در ادامه، از «توزیع یکنواخت» (Uniform Distributions) برای تصادفی‌سازی وزن‌ها بین ۰ و ۱ استفاده می‌شود. تابع ReLU برای فعال‌سازی «لایه پنهان» (Hidden Layer)، استفاده می‌شود. با توجه به تجربیات نویسنده و بررسی‌هایی که روی این مسئله مشخص داشته است، این تابع برای این مسئله، احتمالا بهترین گزینه است. قطعه کد زیر، برای افزودن لایه خروجی است.

1classifier.add(Dense(output_dim = 1, init = ‘uniform’, activation = ‘sigmoid’))

برای لایه خروجی، از تابع «سیگموئید» (Sigmoeid) به منظور به دست آوردن احتمال آنکه مشتریان در بانک می‌مانند یا آن را ترک می‌کنند، استفاده می‌شود. در مسائلی که در آن‌ها دسته‌بندی چندتایی (Multi-Classification) انجام می‌شود، احتمالا تابع «سافت‌مکس» (Softmax) گزینه خوبی است.

کامپایل کردن مدل

از کامپایل کردن مدل برای اعمال «گرادیان کاهشی تصادفی» (Stochastic Gradient Descent | SGD) روی شبکه استفاده می‌شود.

1classifier.compile(optimizer = ‘Adam’, loss =’binary_crossentropy’, metrics = [‘accuracy’])

در اینجا، از «آدام» (Adam) که نوعی از گرادیان کاهشی تصادفی است، به عنوان بهینه‌سازی برای پیدا کردن وزن‌های بهینه‌ای که موجب قدرتمندتر شدن شبکه عصبی می‌شوند استفاده شده است. «تابع زیانی» (Loss Function) که بهینه‌ساز بر پایه آن است، «آنتروپی متقاطع دودویی» (Binary Cross Entropy) نام دارد. سنجه‌ای که در اینجا برای ارزیابی مدل مورد استفاده قرار می‌گیرد، «صحت» (Accuracy) است.

برازش مدل

با مدل برازش شده، مدل روی داده‌های تست ارزیابی می‌شود. در اینجا از آستانه ۰/۵ برای تبدیل داده‌ها به اطلاعات «درست» (True که در اینجا به معنای ترک کردن بانک توسط مشتری است) و «غلط» (False که در اینجا به معنای ماندن مشتری در بانک است) استفاده می‌شود.

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

1y_pred = classifier.predict(X_test)
2y_pred = (y_pred > 0.5)

سپس، از confusion_matrix برای بررسی کارایی مدل روی مجموعه داده آزمون (Test) استفاده می‌شود.

1from sklearn.metrics import confusion_matrix
2cm = confusion_matrix(y_test, y_pred

صحت در اینجا برابر با ۰.۸۵۹ و این میزان، بالاتر از صحت آموزش است که نشان می‌دهد «بیش‌برازش» (Overfitting) وجود دارد. با استفاده از مدل بالا، بانک می‌تواند مشتریان جدید را ارزیابی و احتمال آنکه در بانک می‌مانند یا آن را ترک می‌کنند را محاسبه کند. سپس، بانک می‌تواند ۱۰ درصدد از مشتریان با بالاترین احتمال ترک بانک را دریافت و روی داده‌های آن‌ها «کاوش عمیق» (Deep Mining) انجام دهد تا از چرایی این موضوع به خوبی آگاه شود. این، هدف یک شبکه عصبی مصنوعی است.

اکنون، تنها یک پرسش نهایی باقی می‌ماند. چطور می‌توان روی داده‌های مشتریان جدید پیش‌بینی انجام داد. برای مثال، نمونه داده‌های یک مشتری جدید در تصویر زیر نمایش داده شده است.

دسته بندی داده ها با شبکه عصبی مصنوعی -- راهنمای کاربردی
تصویر ۵: داده‌های یک مشتری جدید

در اینجا، نیاز به دنبال کردن پردازش‌های داده مشابهی است. ابتدا، رمزگذاری متغیرها انجام می‌شود. برای مثال، Geography France در متغیرهای مجازی به (0,0) رمزگذاری می‌شود، همچنین، Gender Male برابر با یک قرار داده می‌شود. با استفاده از روشی که در ادامه ارائه شده است، آرایه زیر تولید می‌شود.

1new_customer = [[0, 0, 600, 1, 40, 3, 60000, 2, 1, 1, 50000]]

گام بعدی، مقیاس کردن متغیرها در مقیاسی مشابه با مجموعه آموزش است. این کار، با استفاده از قطعه کد زیر انجام می‌شود.

1new_customer = sc.transform(sc.transform(new_customer))

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

1new_prediction = classifier.predict(new_customer)
2new_prediction = (new_prediction > 0.5)

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

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

بر اساس رای ۱۵ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Towards Data Science
۱ دیدگاه برای «دسته بندی داده ها با شبکه عصبی مصنوعی | راهنمای کاربردی»

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

نظر شما چیست؟

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