پیاده‌سازی درخت تصمیم در پایتون | ترجمه + کد

با سلام خدمت دوستان عزیز ویرگول مشتاق یادگیری ماشین و برنامه‌نویسی، امروز قرار است قطعه کد پیاده‌سازی شده در سایت geeksforgeeks را معرفی کنیم. بعبارتی این مقاله ترجمه‌ای از مطلب geeksforgeeks است. در این مطلب قرار است درخت تصمیم را در پایتون پیاده‌سازی کنیم و بفهمیم. امیدوارم در کل این مطلب مفید باشد.سطح دشواری متن : دشوار - سخت | آخرین بروز رسانی ۲۶ آپریل ۲۰۲۲پیش‌نیازها: Decision Tree, DecisionTreeClassifier, sklearn, numpy, pandasدرخت تصمیم یکی از قوی‌ترین و محبوب‌ترین‌ الگوریتم‌هاست. الگوریتم درخت تصمیم در حوزه‌ی الگوریتم‌های یادگیری با نظارت قرار دارد. این الگوریتم بخوبی برای مسائل با متغییرهای خروجی گسسته و پیوسته کار می‌کند. در این مقاله، ما قصد پیاده‌سازی یک الگوریتم درخت تصمیم رو روی مجموعه‌داده‌ی « Balance Scale Weight &amp;amp;amp;amp;amp; Distance Database» ارائه شده توسط UCI را داریم.شرح مجموعه‌داده (Data-set Description)Title : Balance Scale Weight & Distance DatabaseNumber of Instances : 625 (49 balanced, 288 left, 288 right)Number of Attributes : 4 (numeric) + class name = 5Attribute Information : 1.Class Name (Target variable): 3 L [balance scale tip to the left] B [balance scale be balanced] R [balance scale tip to the right] 2.Left-Weight: 5 (1, 2, 3, 4, 5) 3.Left-Distance: 5 (1, 2, 3, 4, 5) 4.Right-Weight: 5 (1, 2, 3, 4, 5) 5.Right-Distance: 5 (1, 2, 3, 4, 5) Missing Attribute Values: None Class Distribution: 1. 46.08 percent are L 2. 07.84 percent are B 3. 46.08 percent are Rشما می‌توانید جزییات بیش‌تری از مجموعه‌داده را از اینجا بدست آورید.استفاده از پکیج‌های پایتون:پکیج sklearn : در پایتون، sklearn یک پکیج یادگیری ماشین است که شامل تعداد بسیار زیادی الگوریتم یادگیری ماشین می‌شود. در اینجا، ما از برخی از ماژول‌های آن مثل train_test_split ، DecisionTreeClassifier و accuracy_score استفاده می‌کنیم.۲. پکیج NumPy :این یک ماژول عددی «numeric» در پایتون هست که توابع ریاضی سریع برای محاسبات فراهم می‌کند. این کتابخانه برای خواندن داده‌ها در قالب آرایه‌های numpy و برای هدف دستکاری-manipulation داده، مورد استفاده قرار می‌گیرد.۳. پکیج Pandas: این کتابخانه برای خواندن و نوشتن در فایل‌های مختلف استفاده می‌شود. دستکاری داده می‌تواند به سادگی با کمک dataframe ها صورت بگیرد.در مقاله‌ی وب سایت طریقه‌ی نصب این پکیج‌ها آورده شده است که از آن در این مقاله عبور می‌شود. به عبارتی فرض بر آن است که خواننده‌ی گرامی پکیج‌های یاد شده در بالا یعنی sklearn ، Numpy و Pandas را بروی ماشین خود نصب دارد و می‌تواند با آن‌ها کد بزند. در غیر اینصورت لطفا به مقاله‌ی اصلی رجوع نمایید.مفروضاتی که هنگام استفاده از درخت تصمیم می گیریم:در ابتدا، ما کل «مجموعه‌ی آموزش» را بعنوان گره ریشه در نظر می‌گیریم.ویژگ‌ها برای information gain گسسته فرض می‌شود. همچنین ویژگی‌ها برای شاخص Gini پیوسته در نظر گرفته می‌شود.بر اساس مقادیر ویژگی، رکوردها به صورت بازگشتی توزیع می شوند. ( On the basis of attribute values records are distributed recursively.)ما از روش‌های آماری برای مرتب کردن و اولویت دادن به گره ریشه و گره‌های داخلیدرخت تصمیم، بهره می‌بریم.شبه کد:۱. در گام اول- بهترین ویژگی را بیابید و آن را در ریشه قرار دهید. ۲. حال، مجموعه‌ی آموزشی را به زیر مجموعه‌هایی جدا کنید. زمانیکه دارید زیرمجموعه‌ها را تشکیل می‌دهید مطمئن شوید هر مجموعه آموزشی باید دارای مقادیر مشابه برای آن ویژگی (نود پدر)/یک ویژگی باشند. ۳. با تکرار گام ۱ و ۲ روی هر زیر مجموعه، همه‌ی نودهای برگ را برای همه‌ی شاخه‌ای پیدا کنید.در طی زمان ساخت درخت تصمیم و پیاده‌سازی آن از دو فاز عبور می‌کنیم. فاز ساختن و فاز عملیاتی.فاز ساختن:پیش‌پردازش مجموعه‌دادهجداسازی مجموعه‌داده به تست و آموزش با استفاده از پکیج sklearnآموزش طبقه‌بند۲. فاز عملیاتی (Operational Phase):پیش‌بینی کردن.محاسبه‌ی دقت.ورود داده : برای وارد کردن داده و دستکاری آن ما از پکیج Pandas که در پایتون فراهم شده است استفاده می‌کنیم.اینجا، ما از URL استفاده می‌کنیم تا بطور مستقیم مجموعه‌داده را از سایت UCI واکشی (fetch) کنیم در این حالت نیازی به دانلود مجموعه‌داده نیست. زمانیکه شما در تلاش برای اجرای این کد روی سیستم خود هستید مطمئن شوید تا سیستم به اینترنت متصل باشد.از آنجاییکه با نماد کاما "," جداسازی در مجموعه‌داده انجام شده است؛ بنابرین ما مجبور هستیم پارامتر جدا کننده را در کد مشخص کنیم و مقدار "," قرار دهیم.مورد قابل ذکر دیگر آنست که مجموعه‌داده شامل هدر نمیشود بنابراین ما باید مقدار پارامتر هدر را برابر با none قرار دهیم. اگر ما پارامتر هدر را مقداردهی نکنیم آنگاه این اولین خط از مجموعه‌داده را بعنوان هدر درنظر می‌گیرد.جداسازی داده:قبل از آموزش مدل ما باید مجموعه‌داده را به مجموعه‌داده‌های تست و آموزش جدا کنیم.برای جداسازی مجموعه‌داده برای تست‌کردن و آموزش دادن ما از ماژول train_test_split که در پکیج sklearn هست استفاده می‌کنیم.اول از همه ما مجبوریم متغییر هدف (target) از ویژگی‌ها در مجموعه‌داده جدا کنیم.X = balance_data.values[:, 1:5] Y = balance_data.values[:,0]در بالا خطوطی از کد هستند که مجموعه‌داده را جدا می‌کند. متغییر X شامل ویژگی‌ها است در حالیکه متغییر Y شامل متغییر target است.گام بعد آنست که مجموعه‌داده را برای اهداف تست کردن و آموزش دادن تقسیم کنیم.X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size = 0.3, random_state = 100)خط بالا مجموعه‌داده را برای تست‌کردن و آموزش دادن جدا می‌کند. همچنین ما مجموعه‌داده را به نسبت ۷۰:۳۰ بین مجموعه‌داده تست و آموزش جدا می‌کنیم. بنابراین مقدار پارامتر test_size را با مقدار 0.3 مقداردهی می‌کنیم.متغییر random_state برای تعیین حالت سطح تصادفی بودن اعداد تولیدی(pseudo-random number generator state) برای نمونه‌گیری تصادفی مورد استفاده قرار می‌گیرد.اصطلاحاتی که در کد استفاده شده:شاخص Gini و Information Gain هر دو این روش‌ها برای انتخاب ویژگی‌هایی که باید در نود ریشه و یا نودهای داخلی درخت تصمیم قرار گیرند استفاده می‌شود. این ویژگی‌ها از n ویژگی موجود در مجموعه‌داده بدست می‌آید.شاخص Giniشاخص Gini یک معیار برای اندازه‌گیری آنست که چه مقدار انتخاب یک عنصر تصادفی به نادرست شناسایی می‌شود.این بدان معنی است که یک ویژگی با شاخص جینی پایین تر باید ترجیح داده شود.پکیج Sklearn معیار "gini" را برای شاخص Gini پشتیبانی می‌کند و بطور پیشفرض مقدار "gini" را دریافت می‌کند.آنتروپی-Entropyآنتروپی معیار عدم ثبات یک متغییر تصادفی است؛ این معیار ناخالصی یک مجموعه از نمونه‌های دلخواه را مشخص می‌کند. هر چه آنتروپی بیشتر باشد محتویات اطلاعاتی بیشتر است.اطلاعات حاصله-Information Gainآنتروپی معمولاً زمانی تغییر می‌کند که از یک گره در درخت تصمیم استفاده می‌کنیم تا نمونه‌های آموزشی را به زیر مجموعه‌های کوچک‌تر تقسیم کنیم. information gain یک معیار تغییر در آنتروپی هست.پکیج Sklearn از معیار "entropy" برای information gain پشتیبانی می‌کند. و اگر ما بخواهیم از روش information Gain در sklearn استفاده کنیم آنگاه ما باید به وضوح در کدمان به این موضوع اشاره کنیم.مقدار دقت Accuracyمعیار دقت در محاسبه‌ی دقت طبقه‌بند آموزش دیده مورد استفاده قرار می‌گیرد.ماتریس Confusionماتریس Confusion برای فهم رفتار طبقه‌بند آموزش دیده روی مجموعه‌داده تست یا مجموعه داده‌ی ارزیابی بکار می‌رود.کد درخت تصمیم در زیر آمده است اما اگر indent/تورفتگی ها به شما خطا داد می‌توانید به سایت اصلی مراجع بفرمایید:# Run this program on your local python # interpreter, provided you have installed # the required libraries. # Importing the required packages import numpy as np import pandas as pd from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score from sklearn.metrics import classification_report # Function importing Dataset def importdata(): balance_data = pd.read_csv( 'https://archive.ics.uci.edu/ml/machine-learning-'+ 'databases/balance-scale/balance-scale.data', sep= ',', header = None) # Printing the dataswet shape print (&quotDataset Length: &quot, len(balance_data)) print (&quotDataset Shape: &quot, balance_data.shape) # Printing the dataset obseravtions print (&quotDataset: &quot,balance_data.head()) return balance_data # Function to split the dataset def splitdataset(balance_data): # Separating the target variable X = balance_data.values[:, 1:5] Y = balance_data.values[:, 0] # Splitting the dataset into train and test X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size = 0.3, random_state = 100) return X, Y, X_train, X_test, y_train, y_test # Function to perform training with giniIndex. def train_using_gini(X_train, X_test, y_train): # Creating the classifier object clf_gini = DecisionTreeClassifier(criterion = &quotgini&quot, random_state = 100,max_depth=3, min_samples_leaf=5) # Performing training clf_gini.fit(X_train, y_train) return clf_gini # Function to perform training with entropy. def tarin_using_entropy(X_train, X_test, y_train): # Decision tree with entropy clf_entropy = DecisionTreeClassifier( criterion = &quotentropy&quot, random_state = 100, max_depth = 3, min_samples_leaf = 5) # Performing training clf_entropy.fit(X_train, y_train) return clf_entropy # Function to make predictions def prediction(X_test, clf_object): # Predicton on test with giniIndex y_pred = clf_object.predict(X_test) print(&quotPredicted values:&quot) print(y_pred) return y_pred # Function to calculate accuracy def cal_accuracy(y_test, y_pred): print(&quotConfusion Matrix: &quot, confusion_matrix(y_test, y_pred)) print (&quotAccuracy : &quot, accuracy_score(y_test,y_pred)*100) print(&quotReport : &quot, classification_report(y_test, y_pred)) # Driver code def main(): # Building Phase data = importdata() X, Y, X_train, X_test, y_train, y_test = splitdataset(data) clf_gini = train_using_gini(X_train, X_test, y_train) clf_entropy = tarin_using_entropy(X_train, X_test, y_train) # Operational Phase print(&quotResults Using Gini Index:&quot) # Prediction using gini y_pred_gini = prediction(X_test, clf_gini) cal_accuracy(y_test, y_pred_gini) print(&quotResults Using Entropy:&quot) # Prediction using entropy y_pred_entropy = prediction(X_test, clf_entropy) cal_accuracy(y_test, y_pred_entropy) # Calling main function if __name__==&quot__main__&quot: main()منبع : https://www.geeksforgeeks.org/decision-tree-implementation-python/