«هوش مصنوعی» (Artificial Intelligence)، «یادگیری ماشین» (Machine Learning)، «علم داده» (Data Scientist) و «داده‌کاوی» (Data Mining) از جمله موضوعات داغ روز هستند. این روزها، کمتر صنعتی مشاهده می‌شود که در آن به طور مستقیم یا غیرمستقیم از یادگیری ماشین استفاده نشود. از جمله ابزارهای مهمی که برای پیاده‌سازی روش‌ها و الگوریتم‌های یادگیری ماشین از آن‌ها استفاده می‌شود، زبان‌های برنامه‌نویسی پایتون و R‌ هستند. در این مطلب، علاوه بر ارائه توضیحات پیرامون انواع روش‌های یادگیری ماشین، پیاده سازی الگوریتم های یادگیری ماشین با پایتون و R نیز انجام می‌شود.

«اریک اشمیت» (Eric Schmidt)، از اعضای هیئت مدیره گوگل، در این رابطه چنین می‌گوید:

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

بشر، احتمالا در حال حاضر در تاثیرگذارترین برهه از حیات انسانی قرار دارد. دورانی که در آن، محاسبات از «رایانه‌های بزرگ» (mainframe) به «رایانه‌های شخصی» (PC) و از رایانه‌های شخصی به «ابر» (Cloud) منتقل شده‌اند. اما، آنچه این دوران را به چنین برهه مهمی مبدل می‌کند، نه آنچه اتفاق افتاده، بلکه آنچه در سال‌های آتی به وقوع می‌پیوندد است. چیزی که این دوران را برای انسان‌ها جالب می‌سازد، دموکراتیزه کردن ابزارها و روش‌ها است که منجر به شتاب در محاسبات می‌شود. امروزه، «دانشمندان داده» (Data Scientists) می‌توانند ماشین‌های جالب توجه با الگوریتم‌های پیچیده را تنها به ازای چند دلار در ساعت بسازند. اما رسیدن به این نقطه کار ساده‌ای نبوده است. این دانشمندان داده، روزها و شب‌های سختی را گذرانده‌اند تا به اینجا رسیده‌اند.

این راهنما برای چه افرادی مناسب است؟

ایده نهفته در پس این راهنما آن است که سفر دانشمندان داده مشتاق و علاقمندان به یادگیری ماشین را آسان‌تر سازد. با بهره‌گیری از این راهنما، افراد قادر می‌شوند مسائل یادگیری ماشین را حل و ضمن آن تجربه کسب کنند. در ادامه، علاوه بر ارائه توضیحات مناسب و کافی که درک خوبی از الگوریتم‌های یادگیری ماشین متعدد مطرح شده در این مطلب ارائه می‌کنند، کدهای پایتون و R هر یک از الگوریتم‌ها نیز ارائه شده‌اند. اما از پرداختن به جزئیات مباحث آماری نهفته در پس این الگوریتم ها اجتناب شده است. زیرا افراد در آغاز راه، نیازی به دانستن حجم بالایی از مباحث ریاضیاتی ندارند. بنابراین، به افرادی که به دنبال یادگیری مفاهیم آماری نهفته در پس این الگوریتم‌ها هستند، استفاده از دیگر مطالب موجود در «مجله فرادرس» توصیه می‌شود.

الگوریتم‌های یادگیری ماشین

در حالت کلی، سه دسته از الگوریتم‌های یادگیری ماشین وجود دارند. این دسته‌ها عبارتند از «یادگیری نظارت شده» (Supervised Learning)، «یادگیری نظارت نشده» (Unsupervised Learning) و «یادگیری تقویتی» (Reinforcement Learning)، که هر یک در ادامه شرح داده شده‌اند.

یادگیری نظارت شده

این نوع از الگوریتم‌ها دارای یک متغیر «هدف» (Target)/«خروجی» (Outcome)/«متغیر وابسته» (Dependent Variable) هستند که باید برای یک مجموعه از «پیش‌بین‌ها» (Predictors)، پیش‌بینی شود. با استفاده از این مجموعه متغیرها، می‌توان تابعی ساخت که ورودی‌ها را به خروجی‌های موردنظر نگاشت کند. فرآیند آموزش تا هنگامی ادامه پیدا می‌کند که مدل به سطح مناسبی از «صحت» (Accuracy) روی داده‌های آموزش دست پیدا کند. از جمله الگوریتم‌های یادگیری نظارت شده می‌توان به «رگرسیون» (Regression)، «درخت تصمیم» (Decision Tree)، «جنگل تصادفی» (Random Forest)، «رگرسیون لوجستیک» (Logistic Regression) و «K-نزدیک‌ترین همسایگی» (K Nearest Neighbors) و دیگر موارد اشاره کرد.

یادگیری نظارت نشده

در الگوریتم‌های یادگیری نظارت نشده، هیچ متغیر هدف یا خروجی وجود ندارد که برای پیش‌بینی/«برآورد» (Estimate) مورد استفاده قرار بگیرد. این الگوریتم‌ها برای «خوشه‌بندی» (Clustering) جامعه در گروه‌های مختلف مورد استفاده قرار می‌گیرند و برای مثال به طور گسترده‌ای برای بخش‌بندی مشتریان در گروه‌های مختلف استفاده می‌شوند. از جمله الگوریتم‌های نظارت نشده می‌توان به «K-میانگین» (K-means) و «اَپریوری» (Apriori) اشاره کرد.

یادگیری تقویتی

با استفاده از این نوع الگوریتم‌ها، به ماشین آموزش داده می‌شود تا تصمیمات خاصی را اتخاذ کند. الگوریتم‌های «یادگیری تقویتی» (Reinforcement Learning) بدین شکل کار می‌کنند که ماشین در محیطی قرار می‌گیرد که در آن به طور پیوسته با انجام آزمون و خطا از خودش می‌آموزد. این ماشین از تجربه گذشته می‌آموزد و تلاش می‌کند تا بهترین دانش ممکن را برای تصمیم‌سازی‌های صحیح در کسب‌و‌کار به دست آورد. از جمله الگوریتم‌های یادگیری تقویتی می‌توان به «فرآیندهای تصمیم‌گیری مارکوف» (Markov Decision Process) اشاره کرد.

پیاده سازی الگوریتم های یادگیری ماشین با پایتون

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

۱. رگرسیون خطی (Linear Regression)

۲. رگرسیون لجستیک (Logistic Regression)

۳. درخت تصمیم (Decision Tree)

۴. ماشین بردار پشتیبان (Support Vector Machine)

۵. K نزدیک‌ترین همسایگی (K Nearest Neighbors)

۶. جنگل تصادفی (Random Forest)

۷. الگوریتم‌های کاهش ابعاد (Dimensionality Reduction)

۸. الگوریتم‌های گرادیان تقویتی (Gradient Boosting)

  • GBM
  • XGBoost
  • LightGBM
  • CatBoost

۱. رگرسیون خطی

از رگرسیون خطی برای برآورد مقادیر واقعی (قیمت خانه‌ها، تعداد تماس‌ها، کل فروش‌ها) بر اساس «متغیرهای پیوسته» (Continuous Variable) استفاده می‌شود. در اینجا، رابطه‌ای بین متغیرهای مستقل و وابسته با «برازش» (Fitting) بهترین خط ایجاد می‌شود. این بهترین خط برازش با عنوان خط رگرسیون شناخته می‌شود و به وسیله یک معادله خطی Y= a *X + b نمایش داده می‌شود.

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

  • Y:‌ متغییر وابسته است.
  • a: شیب خط است.
  • X: متغیر مستقل است.
  • b: عرض از مبدا است.

ضریب a بر اساس کمینه کردن مجموع مربعات تفاوت بین فواصل میان نقاط داده و خط رگرسیون به دست می‌آید. مثال زیر در این رابطه قابل توجه است. در اینجا بهترین خط برازش با معادله خطی y=0.2811x+13.9 شناسایی شده است. اکنون و با استفاده از این معادله، می‌توان با دانستن قد افراد وزن آن‌ها را پیدا کرد.

رگرسیون خطی

رگرسیون خطی در حالت کلی دو نوع است. این دو نوع عبارتند از «رگرسیون خطی ساده» (Simple Linear Regression) و «رگرسیون خطی چندگانه» (Multiple Linear Regression). رگرسیون خطی ساده به وسیله یک متغیر مستقل مشخصه‌سازی می‌شود. رگرسیون خطی چندگانه (Multiple Linear Regression)، همانطور که نام آن مشخص است با چندتا (بیش از یک) متغیر مستقل مشخصه‌سازی می‌شود. برای پیدا کردن بهترین خط برازش، می‌توان یک «چندجمله‌ای» (polynomial) یا «رگرسیون خمیده‌خط» (curvilinear regression) را برازش داد. به این موارد رگرسیون چندجمله‌ای یا رگرسیون خمیده‌خط گفته می‌شود.

کد پایتون

#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import linear_model
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train=input_variables_values_training_datasets
y_train=target_variables_values_training_datasets
x_test=input_variables_values_test_datasets
# Create linear regression object
linear = linear_model.LinearRegression()
# Train the model using the training sets and check score
linear.fit(x_train, y_train)
linear.score(x_train, y_train)
#Equation coefficient and Intercept
print('Coefficient: \n', linear.coef_)
print('Intercept: \n', linear.intercept_)
#Predict Output
predicted= linear.predict(x_test)

کد R

#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train <- input_variables_values_training_datasets
y_train <- target_variables_values_training_datasets
x_test <- input_variables_values_test_datasets
x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
linear <- lm(y_train ~ ., data = x)
summary(linear)
#Predict Output
predicted= predict(linear,x_test)

۲. رگرسیون لجستیک

نام این الگوریتم کمی گمراه کننده است. زیرا یک الگوریتم رگرسیون نیست، بلکه یک الگوریتم دسته‌بندی محسوب می‌شود. این الگوریتم برای برآورد «مقادیر گسسته» (Discrete Values)  (مقادیر دودویی مانند ۰/۱، درست/غلط و بلی/خیر) و بر پایه یک مجموعه داده شده از متغیرهای مستقل مورد استفاده قرار می‌گیرد. به بیان ساده، این الگوریتم احتمال وقوع یک رویداد را با برازش داده‌ها در تابع logit پیش‌بینی می‌کند. از این رو، الگوریتم مذکور با عنوان «رگرسیون لوجیت» (Logit Regression) نیز شناخته شده است. از آنجا که الگوریتم رگرسیون لجستیک احتمال را پیش‌بینی می‌کند، مقادیر خروجی آن بین ۰ و ۱ هستند.

برای درک بهتر مفهوم یک مثال ساده بیان می‌شود. فرض می‌شود که شخص «الف» یک پازل به شخص «ب» می‌دهد تا آن را حل کند. تنها دو سناریو خروجی وجود دارد؛ فرد «ب» یا می‌تواند این پازل را حل کند یا نمی‌تواند. اکنون، فرض می‌شود که طیفی وسیعی از پازل‌ها/آزمون‌ها به فرد داده شده است تا طی یک تلاش، فرد متوجه شود که در چه زمینه‌هایی بهتر عمل می‌کند. خروجی این مطالعات چیزی شبیه این خواهد بود: اگر یک مساله مثلثات پایه دهم به فرد داده شود، ۷۰ درصد احتمال دارد که آن را حل کند. از سوی دیگر، اگر یک پرسش تاریخ پایه پنجم از او پرسیده شود، احتمال دریافت پاسخ صحیح از فرد ٪۳۰ است. این همان چیزی است که رگرسیون لجستیک برای فرد فراهم می‌کند. به بیان ریاضی، نتایج حاصل از لگاریتم «نسبت بخت» (Odds ratio) به وسیله یک ترکیب خطی از متغیرهای پیشگو مدل‌بندی می‌شود.

odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
ln(odds) = ln(p/(1-p))
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk

در کد بالا، p احتمال حضور مشخصه مورد نظر است. در این کد، پارامترهایی که «درست‌نمایی» (Likelihood) مشاهده مقادیر نمونه را بیشینه می‌کنند انتخاب می‌شود و به جای آن، مجموع مربعات خطا کمینه می‌شود (مانند آنچه در رگرسیون معمولی اتفاق می‌افتد). اکنون ممکن است این پرسش مطرح شود که چرا «بَخت» (log) گرفته شود؟ برای سادگی، به بیان این جمله اکتفا می‌شود که این یکی از بهترین‌ها روش‌های ریاضیاتی برای تکرار یک تابع گام است. می‌توان به بیان توضیحات بیشتری در این رابطه پرداخت، اما از هدف این مطلب دور است.

رگرسیون لجستیک

کد پایتون

#Import Library
from sklearn.linear_model import LogisticRegression
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create logistic regression object
model = LogisticRegression()
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Equation coefficient and Intercept
print('Coefficient: \n', model.coef_)
print('Intercept: \n', model.intercept_)
#Predict Output
predicted= model.predict(x_test)

کد R

x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
logistic <- glm(y_train ~ ., data = x,family='binomial')
summary(logistic)
#Predict Output
predicted= predict(logistic,x_test)

گام‌های زیادی وجود دارد که می‌توان از آن‌ها برای بهبود مدل استفاده کرد. از این جمله می‌توان به موارد زیر اشاره کرد:

  • شامل شدن اثرات متقابل
  • حذف ویژگی‌ها
  • روش‌های با قاعده‌سازی
  • استفاده از مدل غیر خطی

۳. درخت تصمیم

«درخت تصمیم» (Decision Tree)، یکی از الگوریتم‌های محبوب است و توسط بسیاری از افراد در مسائل گوناگون مورد استفاده قرار می‌گیرد. این الگوریتم، یکی از الگوریتم‌های یادگیری ماشین نظارت شده است که اغلب برای مسائل دسته‌بندی مورد استفاده قرار می‌گیرد.  درخت تصمیم، هم برای متغیرهای وابسته «طبقه‌ای»‌ (Categorical) و هم «پیوسته» (Continuous) قابل استفاده است. در این الگوریتم، جامعه به دو یا تعداد بیشتری بخش همگن تقسیم می‌شود. این کار بر مبنای اثرگذارترین مشخصه‌ها/متغیرهای مستقل به منظور ایجاد گروه‌های متمایز تا جای ممکن صورت می‌پذیرد.

درخت تصمیم

در تصویر بالا، می‌توان مشاهده کرد که جمعیت به چهار گروه مختلف بر مبنای چندین ویژگی به منظور شناسایی اینکه «آیا آن‌ها اقساط خود را خواهند داد یا نه» تقسیم شده است. برای تقسیم جمعیت به گروه‌های همگن مختلف، از چندین روش مانند «جینی» (Gini)، «نسبت دریافت اطلاعات» (Information Gain)، «آزمون خی‌دوی پیرسون» (Chi-square) و «بی‌نظمی» (Entropy) استفاده می‌شود. بهترین راهکار برای درک اینکه درخت تصمیم چگونه کار می‌کند، مثالی از بازی «جِزبال» (Jezball)، که یک بازی کلاسیک محصول مایکروسافت است ارائه می‌شود. در این بازی، اتاقی با دیوارهای متحرک وجود دارد و فرد باید دیوارها را به گونه‌ای بسازد که بیشترین ناحیه پاکسازی و خالی از توپ‌ها شود.

درخت تصمیم

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

کد پایتون

#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import tree
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create tree object 
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
# model = tree.DecisionTreeRegressor() for regression
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)

کد R

library(rpart)
x <- cbind(x_train,y_train)
# grow tree 
fit <- rpart(y_train ~ ., data = x,method="class")
summary(fit)
#Predict Output 
predicted= predict(fit,x_test)

4. ماشین بردار پشتیبان

«ماشین بردار پشتیبان» (Support Vector Machine) یک روش دسته‌بندی است. در این الگوریتم، هر نمونه داده به عنوان نقطه‌ای در فضای n-بُعدی قرار می‌گیرد (که در آن n تعداد ویژگی‌های موجود است) و مقدار هر ویژگی مقدار یک مختصات خاص است. برای مثال، اگر تنها دو ویژگی، مانند قد و طول مو برای هر فرد وجود داشته باشد، باید ابتدا نمودار این دو متغیر در یک فضای دوبُعدی ترسیم شود که در آن هر نقطه دارای دو مختصات است (این مختصات‌ها با عنوان بردارهای پشتیبان شناخته می‌شوند).

ماشین بردار پشتیبان

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

ماشین بردار پشتیبان

در مثال نشان داده شده در بالا، خطی که داده‌ها را به دو گروه دسته‌بندی شده متفاوت تقسیم می‌کند، خط مشکی رنگ است. زیرا دو نقطه نزدیک‌تر از این خط بیشترین فاصله را دارند. این خط «دسته‌بند» (Classifier) است. بسته به اینکه داده‌های آزمون در دو سمت خط در کجا قرار می‌گیرند، دسته‌ای که داده‌های جدید در آن دسته‌بندی می‌شوند مشخص می‌شود.

  • فرض می‌شود که این الگوریتم بازی JezzBall را در یک فضای n-بُعدی انجام می‌دهد. پیچش‌های داخل بازی به صورت زیر خواهند بود.
  • می‌توان خطوط/صفحه‌ها را در هر زاویه‌ای ترسیم کرد (به جای آنکه خطوط فقط به صورت افقی و عمودی مانند آنچه در بازی‌های کلاسیک وجود دارد ترسیم شوند).
  • هدف بازی جدا کردن توپ‌ها از رنگ‌های گوناگون در اتاق‌های مختلف است.
  • توپ‌ها حرکت نمی‌کند.

کد پایتون

#Import Library
from sklearn import svm
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object 
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)

کد R

library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-svm(y_train ~ ., data = x)
summary(fit)
#Predict Output 
predicted= predict(fit,x_test)

5. نایو بیز

این یک روش دسته‌بندی بر پایه «نظریه بیزی» ( Bayes Theorem) با فرض استقلال بین پیش‌بین‌ها است. به بیان ساده، یک دسته‌بند نایو بیز فرض می‌کند که حضور یک ویژگی مشخص در کلاس، ارتباطی با حضور دیگر ویژگی‌ها ندارد. برای مثال، یک میوه ممکن است به عنوان سیب در نظر گرفته شود اگر قرمز و گرد باشد و حدود ۶ سانتی‌متر قطر داشته باشد. حتی اگر این ویژگی‌ها وابسته به یکدیگر یا دیگر ویژگی‌ها باشند، یک دسته‌بند نایو بیز همه این مشخصه‌ها را برای مشارکت مستقل در احتمال اینکه میوه سیب باشد در نظر می‌گیرد. ساخت مدل‌های نایو بیزی ساده و برای مجموعه داده‌های بزرگ بسیار مفید است. در عین سادگی، نایو بیز دارای عملکرد بسیار خوبی حتی در روش‌های دسته‌بندی بسیار پیچیده است. نظریه بیز راهکاری برای محاسبه احتمال خلفی  (P(c|x از (P(c)، P(x و (P(x|c فراهم می‌کند. معادله زیر در همین راستا قابل توجه است.

نایو بیز

در اینجا،

  • (P(c|x احتمال پسین پیش‌بین (خصیصه) ارائه شده دسته (هدف) است.
  • (P(c احتمال پیشین دسته است.
  • (P(x|c درست‌نمایی است که احتمال پیش‌بین داده شده کلاس است.
  • (P(x احتمال پیشین پیش‌بین است.

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

  • گام ۱: مجموعه داده به «جدول تکرار» (Frequency Table) تبدیل می‌شود.
  • گام ۲: جدول درست‌نمایی با کشف احتمال‌هایی مانند آنکه احتمال Overcast برابر با ۰.۲۹ و احتمال انجام شدن بازی برابر با ۰.۶۴ است، ساخته می‌شود.

نایو بیز

  • گام ۳: از معادله نایو بیز برای محاسبه احتمال توزیع پسین برای هر دسته استفاده می‌کند. دسته‌ای با بالاترین احتمال پسین خروجی پیش‌بینی است.
  • مساله: به بازیکنان در صورت آفتابی بودن هوا مبلغی پرداخت می‌شود، آیا این عبارت درست است؟

می‌توان این مساله را با استفاده از روش تشریح شده در بالا حل کرد، بنابراین (P(Yes | Sunny) = P( Sunny | Yes) * P(Yes) / P (Sunny.

در اینجا داریم: P (Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P( Yes)= 9/14 = 0.64.

اکنون، داریم P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60، که دارای احتمال بالاتری است.

نایو بیز از روش مشابهی برای پیش‌بینی احتمال کلاس‌های متفاوت بر اساس مشخصه‌های گوناگون استفاده می‌کند. این الگوریتم اغلب در دسته‌بندی متن و با مسائلی که دارای چندین کلاس هستند مورد استفاده قرار می‌گیرد.

کد پایتون

#Import Library
from sklearn.naive_bayes import GaussianNB
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

کد R

library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-naiveBayes(y_train ~ ., data = x)
summary(fit)
#Predict Output 
predicted= predict(fit,x_test)

۶. k نزدیک‌ترین همسایگی

این الگوریتم هم برای مسائل دسته‌بندی و هم رگرسیون قابل استفاده است. اگرچه، در صنعت به طور گسترده‌ای برای مسائل دسته‌بندی مورد استفاده قرار می‌گیرد. K-نزدیک‌ترین همسایگی یک الگوریتم ساده است که می‌تواند همه موارد را ذخیره‌سازی کند و موارد جدید را با آرای اکثریت k همسایه آن دسته‌بندی می‌کند. تابع فاصله می‌تواند «اقلیدسی» (Euclidean)، «منهتن» (Manhattan)، «مینکوفسکی» (Manhattan) و «همینگ» (Hamming) باشد. سه تابع اول برای توابع پیوسته و چهارمی برای متغیرهای طبقه‌ای مورد استفاده قرار می‌گیرد. اگر k = 1، نمونه به کلاس نزدیک‌ترین همسایگی آن اختصاص داده می‌شود. انتخاب K هنگام انجام مدل‌سازی KNN یک چالش محسوب می‌شود.

K نزدیک‌ترین همسایگی

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

  • KNN به لحاظ محاسباتی پرهزینه است.
  • متغیرها باید نرمال‌شوند، در غیر اینصورت متغیرهای دارای طیف بالاتر موجب سوگیری مدل می‌شوند.
  • پیش پردازش‌های زیادی پیش از رفتن به سراغ الگوریتم KNN نیاز است که از این جمله می‌توان به حذف «دورافتادگی‌ها» (Outli) و «نویز» (Noise) اشاره کرد.

کد پایتون

#Import Library
from sklearn.neighbors import KNeighborsClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create KNeighbors classifier object model 
KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

کد R

library(knn)
x <- cbind(x_train,y_train)
# Fitting model
fit <-knn(y_train ~ ., data = x,k=5)
summary(fit)
#Predict Output 
predicted= predict(fit,x_test)

7. K-Means

K-Means از جمله الگوریتم‌های یادگیری نظارت نشده است که مسائل خوشه‌بندی را حل می‌کند. روال این الگوریتم یک راهکار ساده و آسان برای دسته‌بندی یک مجموعه داده را از طریق تعداد مشخصی خوشه (فرض کنید K خوشه) دنبال می‌کند. تشخیص شکل از روی لکه‌های جوهر یکی از کارهایی است که برخی از افراد در کودکی آن را انجام داده‌اند. k به معنای چیزی شبیه به این فعالیت است. فرد به شکل و توزیع لکه‌ها نگاه می‌کند تا مشخص شود چه تعداد خوشه/جمعیت وجود دارند.

K-Means

چگونگی انجام خوشه‌بندی با K-Means

  1. k-means تعداد k نقطه را به عنوان «مرکزوار» (Centroid) خوشه‌ها انتخاب می‌کند.
  2. هر نقطه داده یک خوشه با نزدیک‌ترین مرکزوار به خودش را تشکیل می‌دهد و در واقع k خوشه وجود دارد.
  3. مرکزوارهای هر خوشه را بر اساس اعضای خوشه موجود پیدا می‌کند. در اینجا مرکزوارهای جدید پدید می‌آیند.
  4. از آنجا که مرکزوارهای جدیدی وجود دارند، گام ۲ و ۳ تکرار می‌شوند. نزدیک‌ترین فاصله برای هر نقطه داده از مرکزوارهای جدید محاسبه می‌شود و به k خوشه جدید تخصیص داده می‌شود. این فرآیند تا زمانی که همگرایی به وقوع بپیوندد انجام می‌شود. مرکزوارها تغییر نمی‌کنند.

چگونگی شناسایی مقدار K

در k-means خوشه‌هایی وجود دارند و هر خوشه دارای مرکزوار خودش است. مجموع مربعات فاصله بین مرکزوارها ونقاط داده درون یک خوشه با مجموع مربع مقدار برای آن خوشه محاسبه می‌شود. همچنین، هنگامی که مجموع مقادیر مربع برای همه خوشه‌ها اضافه شد، با مجموع مقدار مربع برای راهکار خوشه، مقدار کل می‌شود. با افزایش تعداد خوشه‌ها، این مقدار کاهش پیدا می‌کند. با رسم نمودار نتایج، می‌توان مشاهده کرد که مجموع فاصله مربعات برای برخی از K‌ها به شدت کاهش پیدا می‌کند و پس از آن با شیب ملایم‌تری کاهش می‌یابد. در اینجا، می‌توان تعداد بهینه خوشه‌ها را محاسبه کرد.

K-Means

کد پایتون

#Import Library
from sklearn.cluster import KMeans
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
# Create KNeighbors classifier object model 
k_means = KMeans(n_clusters=3, random_state=0)
# Train the model using the training sets and check score
model.fit(X)
#Predict Output
predicted= model.predict(x_test)

کد R

library(cluster)
fit <- kmeans(X, 3) # 5 cluster solution

۸. جنگل تصادفی

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

  1. اگر تعداد نمونه‌های موجود در مجموعه داده آموزش N باشد، نمونه‌ای از N مورد به صورت تصادفی اما با جایگزینی دریافت می‌شود. این نمونه، مجموعه آموزش برای رشد درخت است.
  2. اگر M متغیر ورودی وجود داشته باشد، یک عدد m>M برای هر گره تعیین می‌شود، M متغیر به صورت تصادفی از M انتخاب می‌شوند و بهترین بخش‌بندی روی این m برای تقسیم گره‌ها مورد استفاده قرار می‌گیرد. مقدار m در طول رشد درخت ثابت نگه داشته می‌شود.
  3. هر درخت تا بزرگترین مقدار ممکن رشد پیدا می‌کند. هیچ هرس کردنی در کار نیست.

کد پایتون

#Import Library
from sklearn.ensemble import RandomForestClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Random Forest object
model= RandomForestClassifier()
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

کد R

library(randomForest)
x <- cbind(x_train,y_train)
# Fitting model
fit <- randomForest(Species ~ ., x,ntree=500)
summary(fit)
#Predict Output 
predicted= predict(fit,x_test)

۹. الگوریتم‌های کاهش ابعاد

در ۴-۵ سال گذشته، رشد نمایی در ثبت و نگهداری داده‌ها در کلیه سطوح ممکن به وقوع پیوسته است. شرکت‌ها، سازمان‌های دولتی و سازمان‌های پژوهشی نه تنها منابع داده جدیدی پیدا کرده‌اند، بلکه داده‌ها را همراه با جزئیات بسیار زیادی ذخیره می‌کنند. برای مثال، شرکت‌های «تجارت الکترونیکی» (E-commerce) جزئیات بیشتری را پیرامون مشتریان گردآوری می‌کنند که از این جمله می توان به اطلاعات «جمعیت‌شناسی» (Demographic)، «تاریخچه خزش وب» (Web Crawling History)، آنچه دوست دارند یا ندارند، تاریخچه خرید، بازخورد و بسیاری از دیگر گزینه‌ها اشاره کرد. آن‌ها این داده‌ها را به این منظور گردآوری می‌کنند که با انجام تحلیل روی آن‌ها، به افراد به طور شخصی‌سازی شده‌ای توجه کنند و به ارائه خدمات بپردازند؛ حتی بیش از آنچه نزدیک‌ترین خواربارفروشی به محل زندگی مشتری درباره ایشان می‌داند.

همچنین، داده‌هایی که به دانشمندان داده می‌شود شامل ویژگی‌های زیادی است و این امر برای ساخت مدل‌های «مستحکم» (Robust) خوب به نظر می‌رسد، اما در عین حالش چالش‌های جدیدی را برای دانشمند داده می‌سازد. چه می‌شود اگر تعداد متغیرهای بسیار موثر بیش از ۱۰۰۰ یا ۲۰۰۰ باشد؟ در چنین مواردی، الگوریتم‌های کاهش ابعاد متنوع موجود، به دانشمندان داده در کاهش ویژگی‌ها کمک می‌کنند. از جمله این ویژگی‌ها می‌توان به «درخت تصمیم» (Decision Tree)، «جنگل تصادفی» (Random Forest)، «تحلیل مولفه اساسی» (Principal Component Analysis)، «تحلیل فاکتور» (Factor Analysis)، «شناسایی بر مبنای ماتریس همبستگی» (Identify based on correlation matrix)، «نسبت مقادیر ناموجود» (Missing Value Ratio) و دیگر موارد اشاره کرد.

کد پایتون

#Import Library
from sklearn import decomposition
#Assumed you have training and test data set as train and test
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
# For Factor analysis
#fa= decomposition.FactorAnalysis()
# Reduced the dimension of training dataset using PCA
train_reduced = pca.fit_transform(train)
#Reduced the dimension of test dataset
test_reduced = pca.transform(test)

کد R

library(stats)
pca <- princomp(train, cor = TRUE)
train_reduced  <- predict(pca,train)
test_reduced  <- predict(pca,test)

10. الگوریتم‌های گرادیان تقویتی

در ادامه، چهار مورد از محبوب‌ترین الگوریتم‌های گرادیان تقویتی معرفی شده‌اند.

10.1. ماشین گرادیان تقویتی

«ماشین گرادیان تقویتی» (Gradient Boosting Machine)، هنگام سر و کار داشتن با داده‌ها برای انجام پیش‌بینی با قدرت پیش‌بینی بالا مورد استفاده قرار می‌گیرد. الگوریتم «تقویتی» در واقع یک ترکیب از الگوریتم‌های یادگیری ماشین است که پیش‌بینی چندین برآوردگر پایه را به منظور بهبود استحکام در یک برآوردگر منفرد ترکیب می‌کند. این الگوریتم‌ها چندین پیش‌بین ضعیف یا متوسط را برای ساخت یک پیش‌بین قوی ترکیب می‌کنند. الگوریتم‌های تقویتی همیشه در مسابقه‌های داده‌کاوی مانند «کَگِل» (Kaggle)، «ای‌وی هَکاتون» (AV Hackathon) و CrowdAnalytix به خوبی عمل می‌کنند.

کد پایتون

#Import Library
from sklearn.ensemble import GradientBoostingClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Gradient Boosting Classifier object
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

کد R

library(caret)
x <- cbind(x_train,y_train)
# Fitting model
fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4)
fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE)
predicted= predict(fit,x_test,type= "prob")[,2]

شایان توجه است که «دسته‌بند گرادیان تقویتی» (GradientBoostingClassifier) و «جنگ تصادفی» (Random Forest) دو دسته‌بند درخت تقویتی متمایز هستند.

۱۰.۲. XGBoost

دیگر الگوریتم گرادیان تقویتی کلاسیکی که نقش تعیین کننده‌ای برای برنده و بازنده شدن در رقابت‌های Kaggle دارد، الگوریتم XGBoostاست. XGBoost قدرت پیش‌بینی فوق‌العاده بالایی دارد که آن را به بهترین انتخاب برای داشتن بالاترین صحت در مسابقات مبدل می‌سازد، زیرا هم از مدل‌های خطی و هم الگوریتم یادگیری درخت استفاده می‌کند و دستکم ۱۰ برابر سریع‌تر از روش‌های گرادیان تقویتی است. پشتیبانی شامل تابع‌های هدف متعدد از جمله رگرسیون، دسته‌بندی و رتبه‌دهی می‌شود.

یکی از جالب‌ترین موارد پیرامون الگوریتم XGBoost آن است که به آن «روش تقویتی با قاعده» (Regularized Boosting Technique) نیز گفته می‌شود. این روش به کاهش «بیش‌برازش» (Overfit) مدل کمک کرده و پشتیبانی وسیعی را برای طیف گسترده‌ای از زبان‌ها مانند «اسکالا» (Scala)، «جاوا» (Java)، «آر» (R)، «پایتون» (Python)، «جولیا» (Julia) و «سی‌پلاس‌پلاس» (++C) فراهم می‌کند. الگوریتم XGBoost، آموزش توزیع شده و گسترده‌ای را در بسیاری از ماشین‌ها فراهم می‌کند و شامل خوشه‌هایی مانند Azure، AWS، GCE و Yarm می‌شود. XGBoost قابل یکپارچه‌سازی با «اِسپارک» (Spark)، «فِلینک» (Flink) و دیگر سیستم‌های جریان داده با یک «اعتبارسنجی متقابل» (Cross Validation) در هر تکرار از فرآیند شتاب‌دهی است.

کد پایتون

from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
X = dataset[:,0:10]
Y = dataset[:,10:]
seed = 1

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)

model = XGBClassifier()

model.fit(X_train, y_train)

#Make predictions for test data
y_pred = model.predict(X_test)

کد R

require(caret)

x <- cbind(x_train,y_train)

# Fitting model

TrainControl <- trainControl( method = "repeatedcv", number = 10, repeats = 4)

model<- train(y ~ ., data = x, method = "xgbLinear", trControl = TrainControl,verbose = FALSE)

OR 

model<- train(y ~ ., data = x, method = "xgbTree", trControl = TrainControl,verbose = FALSE)

predicted <- predict(model, x_test)

10.3. LightGBM

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

  • سرعت آموزش سریع‌تر و کارایی بالاتر
  • استفاده کمتر از حافظه
  • صحت بهتر
  • پشتیبانی از «یادگیری موازی» (Parallel Learning) و «واحد پردازش گرافیکی» (Graphics Processing Unit)

این چارچوب یک گرادیان تقویتی با کارایی بالا برمبنای الگوریتم‌های درخت تصمیم است و برای رتبه‌بندی، دسته‌بندی و بسیاری از دیگر وظایف یادگیری ماشین مورد استفاده قرار می‌گیرد. الگوریتم LightGBM تحت «پروژه جعبه‌ابزار یادگیری ماشین توزیع شده مایکروسافت» (Distributed Machine Learning Toolkit Project of Microsoft) توسعه پیدا کرده است. از آنجا که LightGBM بر مبنای الگوریتم‌های درخت تصمیم است، بخش‌بندی مبتنی بر برگ‌های درخت را با بهترین برازش در حالی انجام می‌دهد که دیگر الگوریتم‌های تقویتی به صورت مبتنی بر عمق درخت یا مبتنی بر سطح این کار را انجام می‌دهند. بنابراین، هنگام رشد در برگ مشابهی در الگوریتم Light GBM، الگوریتم مبتنی بر برگ می‌تواند زیان بیشتری را نسبت به الگوریتم مبتنی بر سطح کاهش دهد و بنابراین نتایج دارای صحت بهتری می‌شوند که به ندرت قابل اکتساب به وسیله دیگر الگوریتم‌های تقویتی است. الگوریتم LightGBM در عین حال بسیار سریع محسوب می‌شود و به همین دلیل در نام آن از کلمه Light استفاده شده است.

کد پایتون

data = np.random.rand(500, 10) # 500 entities, each contains 10 features
label = np.random.randint(2, size=500) # binary target

train_data = lgb.Dataset(data, label=label)
test_data = train_data.create_valid('test.svm')

param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'}
param['metric'] = 'auc'

num_round = 10
bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])

bst.save_model('model.txt')

# 7 entities, each contains 10 features
data = np.random.rand(7, 10)
ypred = bst.predict(data)

کد R

library(RLightGBM)
data(example.binary)
#Parameters

num_iterations <- 100
config <- list(objective = "binary",  metric="binary_logloss,auc", learning_rate = 0.1, num_leaves = 63, tree_learner = "serial", feature_fraction = 0.8, bagging_freq = 5, bagging_fraction = 0.8, min_data_in_leaf = 50, min_sum_hessian_in_leaf = 5.0)

#Create data handle and booster
handle.data <- lgbm.data.create(x)

lgbm.data.setField(handle.data, "label", y)

handle.booster <- lgbm.booster.create(handle.data, lapply(config, as.character))

#Train for num_iterations iterations and eval every 5 steps

lgbm.booster.train(handle.booster, num_iterations, 5)

#Predict
pred <- lgbm.booster.predict(handle.booster, x.test)

#Test accuracy
sum(y.test == (y.pred > 0.5)) / length(y.test)

#Save model (can be loaded again via lgbm.booster.load(filename))
lgbm.booster.save(handle.booster, filename = "/tmp/model.txt")

افرادی که با بسته Caret در زبان برنامه‌نویسی R آشنایی دارند، می‌توانند از کد زیر نیز برای پیاده‌سازی LightGBM استفاده کنند.

require(caret)
require(RLightGBM)
data(iris)

model <-caretModel.LGBM()

fit <- train(Species ~ ., data = iris, method=model, verbosity = 0)
print(fit)
y.pred <- predict(fit, iris[,1:4])

library(Matrix)
model.sparse <- caretModel.LGBM.sparse()

#Generate a sparse matrix
mat <- Matrix(as.matrix(iris[,1:4]), sparse = T)
fit <- train(data.frame(idx = 1:nrow(iris)), iris$Species, method = model.sparse, matrix = mat, verbosity = 0)
print(fit)

۱۰.۴. Catboost

CatBoost یک الگوریتم یادگیری ماشین «متن‌باز» (Open Source) برای Yandex است. این الگوریتم می‌تواند به سادگی با چارچوب‌های یادگیری عمیق مانند «تنسورفلوی گوگل» (Google’s TensorFlow) و «کور ام‌ال اپل» (Apple’s Core ML) یکپارچه شود. یکی از بهترین ویژگی‌های CatBoost آن است که نیازی به آموزش داده گسترده مانند دیگر مدل‌های یادگیری ماشین ندارد و می‌تواند روی گستره‌ای از قالب‌های داده کار کند. پیش از انجام تحلیل با این الگوریتم، داده‌کاو باید اطمینان حاصل کند که داده‌های موجود را به خوبی مدیریت کرده است.

کد پایتون

import pandas as pd
import numpy as np

from catboost import CatBoostRegressor

#Read training and testing files
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

#Imputing missing values for both train and test
train.fillna(-999, inplace=True)
test.fillna(-999,inplace=True)

#Creating a training set for modeling and validation set to check model performance
X = train.drop(['Item_Outlet_Sales'], axis=1)
y = train.Item_Outlet_Sales

from sklearn.model_selection import train_test_split

X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)
categorical_features_indices = np.where(X.dtypes != np.float)[0]

#importing library and building model
from catboost import CatBoostRegressormodel=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE')

model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True)

submission = pd.DataFrame()

submission['Item_Identifier'] = test['Item_Identifier']
submission['Outlet_Identifier'] = test['Outlet_Identifier']
submission['Item_Outlet_Sales'] = model.predict(test)

کد R

set.seed(1)

require(titanic)

require(caret)

require(catboost)

tt <- titanic::titanic_train[complete.cases(titanic::titanic_train),]

data <- as.data.frame(as.matrix(tt), stringsAsFactors = TRUE)

drop_columns = c("PassengerId", "Survived", "Name", "Ticket", "Cabin")

x <- data[,!(names(data) %in% drop_columns)]y <- data[,c("Survived")]

fit_control <- trainControl(method = "cv", number = 4,classProbs = TRUE)

grid <- expand.grid(depth = c(4, 6, 8),learning_rate = 0.1,iterations = 100, l2_leaf_reg = 1e-3,            rsm = 0.95, border_count = 64)

report <- train(x, as.factor(make.names(y)),method = catboost.caret,verbose = TRUE, preProc = NULL,tuneGrid = grid, trControl = fit_control)

print(report)

importance <- varImp(report, scale = FALSE)

print(importance)

جمع‌بندی

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

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

^^

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

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

یک نظر ثبت شده در “پیاده سازی الگوریتم های یادگیری ماشین با پایتون و R — به زبان ساده

  • سلام وقت بخیر
    ممنون بابت مطالب مفیدتون
    برای یادگیری عمیق کد های پیاده سازی را در نرم افزار R برای نقشه برداری رقومی خاک ممکنه قرار بدید؟

نظر شما چیست؟

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