با سلام خدمت دوستان عزیز ویرگول مشتاق یادگیری ماشین و برنامهنویسی، امروز قرار است قطعه کد پیادهسازی شده در سایت geeksforgeeks را معرفی کنیم. بعبارتی این مقاله ترجمهای از مطلب geeksforgeeks است. در این مطلب قرار است درخت تصمیم را در پایتون پیادهسازی کنیم و بفهمیم. امیدوارم در کل این مطلب مفید باشد.
درخت تصمیم یکی از قویترین و محبوبترین الگوریتمهاست. الگوریتم درخت تصمیم در حوزهی الگوریتمهای یادگیری با نظارت قرار دارد. این الگوریتم بخوبی برای مسائل با متغییرهای خروجی گسسته و پیوسته کار میکند. در این مقاله، ما قصد پیادهسازی یک الگوریتم درخت تصمیم رو روی مجموعهدادهی « Balance Scale Weight & Distance Database» ارائه شده توسط UCI را داریم.
شرح مجموعهداده (Data-set Description)
Title : Balance Scale Weight & Distance Database
Number of Instances : 625 (49 balanced, 288 left, 288 right)
Number of Attributes : 4 (numeric) + class name = 5
Attribute 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
شما میتوانید جزییات بیشتری از مجموعهداده را از اینجا بدست آورید.
۲. پکیج NumPy :
۳. پکیج Pandas:
در مقالهی وب سایت طریقهی نصب این پکیجها آورده شده است که از آن در این مقاله عبور میشود. به عبارتی فرض بر آن است که خوانندهی گرامی پکیجهای یاد شده در بالا یعنی sklearn ، Numpy و Pandas را بروی ماشین خود نصب دارد و میتواند با آنها کد بزند. در غیر اینصورت لطفا به مقالهی اصلی رجوع نمایید.
( On the basis of attribute values records are distributed recursively.)
۱. در گام اول- بهترین ویژگی را بیابید و آن را در ریشه قرار دهید.
۲. حال، مجموعهی آموزشی را به زیر مجموعههایی جدا کنید. زمانیکه دارید زیرمجموعهها را تشکیل میدهید مطمئن شوید هر مجموعه آموزشی باید دارای مقادیر مشابه برای آن ویژگی (نود پدر)/یک ویژگی باشند.
۳. با تکرار گام ۱ و ۲ روی هر زیر مجموعه، همهی نودهای برگ را برای همهی شاخهای پیدا کنید.
در طی زمان ساخت درخت تصمیم و پیادهسازی آن از دو فاز عبور میکنیم. فاز ساختن و فاز عملیاتی.
۲. فاز عملیاتی (Operational Phase):
ورود داده :
جداسازی داده:
X = balance_data.values[:, 1:5] Y = balance_data.values[:,0]
X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size = 0.3, random_state = 100)
شاخص Gini و Information Gain هر دو این روشها برای انتخاب ویژگیهایی که باید در نود ریشه و یا نودهای داخلی درخت تصمیم قرار گیرند استفاده میشود. این ویژگیها از n ویژگی موجود در مجموعهداده بدست میآید.
شاخص Gini
آنتروپی-Entropy
آنتروپی معیار عدم ثبات یک متغییر تصادفی است؛ این معیار ناخالصی یک مجموعه از نمونههای دلخواه را مشخص میکند. هر چه آنتروپی بیشتر باشد محتویات اطلاعاتی بیشتر است.
اطلاعات حاصله-Information Gain
مقدار دقت 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 ("Dataset Length: ", len(balance_data)) print ("Dataset Shape: ", balance_data.shape) # Printing the dataset obseravtions print ("Dataset: ",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 = "gini", 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 = "entropy", 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("Predicted values:") print(y_pred) return y_pred # Function to calculate accuracy def cal_accuracy(y_test, y_pred): print("Confusion Matrix: ", confusion_matrix(y_test, y_pred)) print ("Accuracy : ", accuracy_score(y_test,y_pred)*100) print("Report : ", 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("Results Using Gini Index:") # Prediction using gini y_pred_gini = prediction(X_test, clf_gini) cal_accuracy(y_test, y_pred_gini) print("Results Using Entropy:") # Prediction using entropy y_pred_entropy = prediction(X_test, clf_entropy) cal_accuracy(y_test, y_pred_entropy) # Calling main function if __name__=="__main__": main()
منبع : https://www.geeksforgeeks.org/decision-tree-implementation-python/