در این مقاله، خواهیم دید چگونه یک طبقهبندیکننده یا کلاسیفایر جنگل تصادفی (Random Forest Classifier) با استفاده از کتابخانه Scikit-Learn زبان برنامهنویسی پایتون بسازیم و به منظور انجام این کار، از مجموعه داده IRIS استفاده خواهیم کرد که یک مجموعه داده متداول و مشهور است. جنگل تصادفی یا جنگل تصمیم تصادفی الگوریتم یادگیری ماشین نظارت شده ای است که برای طبقهبندی، رگرسیون و سایر وظایف با استفاده از درختهای تصمیم استفاده میشود.
طبقهبندیکننده جنگل تصادفی یک مجموعه از درخت های تصمیم از یک زیرمجموعه تصادفی از مجموعه آموزشی ایجاد میکند. اصولاً این الگوریتم یک مجموعه از درختهای تصمیم از یک زیرمجموعه تصادفی از مجموعه آموزشی است و سپس آراء از درختهای تصمیم مختلف جمعآوری میشود تا تصمیم نهایی انجام شود.
در این الگوریتم طبقهبندی، از مجموعه دادههای گل آیریس برای آموزش و آزمون مدل استفاده خواهیم کرد. ما یک مدل برای طبقهبندی نوع گل خواهیم ساخت.
کد: بارگیری مجموعه داده
# importing required libraries # importing Scikit-learn library and datasets package from sklearn import datasets # Loading the iris plants dataset (classification) iris = datasets.load_iris()
کد: بررسی محتوا و نام ویژگیهای موجود در مجموعه داده
print(iris.target_names)
خروجی:
[‘setosa’ ‘versicolor’ ‘virginica’]
کد:
print(iris.feature_names)
خروجی:
[‘sepal length (cm)’, ’sepal width (cm)’, ’petal length (cm)’, ’petal width (cm)’]
کد:
# dividing the datasets into two parts i.e. training datasets and test datasets X, y = datasets.load_iris( return_X_y = True) # Splitting arrays or matrices into random train and test subsets from sklearn.model_selection import train_test_split # i.e. 70 % training dataset and 30 % test datasets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30)
کد: وارد کردن کتابخانههای مورد نیاز و ماژول طبقهبندیکننده جنگل تصادفی
# importing random forest classifier from assemble module from sklearn.ensemble import RandomForestClassifier import pandas as pd # creating dataframe of IRIS dataset data = pd.DataFrame({‘sepallength’: iris.data[:, 0], ’sepalwidth’: iris.data[:, 1], ’petallength’: iris.data[:, 2], ’petalwidth’: iris.data[:, 3], ’species’: iris.target})
کد: نمایش یک نگاه به مجموعه داده
# printing the top 5 datasets in iris dataset print(data.head())
خروجی:
sepallength sepalwidth petallength petalwidth species 0 5.1 3.5 1.4 0.2 0 1 4.9 3.0 1.4 0.2 0 2 4.7 3.2 1.3 0.2 0 3 4.6 3.1 1.5 0.2 0 4 5.0 3.6 1.4 0.2 0
کد:
# creating a RF classifier clf = RandomForestClassifier(n_estimators = 100) # Training the model on the training dataset # fit function is used to train the model using the training sets as parameters clf.fit(X_train, y_train) # performing predictions on the test dataset y_pred = clf.predict(X_test) # metrics are used to find accuracy or error from sklearn import metrics print() # using metrics module for accuracy calculation print("ACCURACY OF THE MODEL: ", metrics.accuracy_score(y_test, y_pred))
خروجی:
ACCURACY OF THE MODEL: 0.9238095238095239
کد: پیشبینی نوع گل از مجموعه داده
# predicting which type of flower it is. clf.predict([[3, 3, 2, 2]])
خروجی:
array([0])
این به این معناست که نوع گل ستوسا است، زیرا در مجموعه داده ما سه گونه یا کلاس وجود دارد: ستوسا، ورسیکالر و ویرجینیا. حالا با استفاده از خطوط کد زیر نیز ویژگیهای مهم یا انتخاب ویژگیها در مجموعه داده IRIS را محاسبه خواهیم کرد.
# importing random forest classifier from assemble module from sklearn.ensemble import RandomForestClassifier # Create a Random forest Classifier clf = RandomForestClassifier(n_estimators = 100) # Train the model using the training sets clf.fit(X_train, y_train)
کد: محاسبه اهمیت ویژگی
# using the feature importance variable import pandas as pd feature_imp = pd.Series(clf.feature_importances_, index = iris.feature_names).sort_values(ascending = False) feature_imp
خروجی:
petal width (cm) 0.458607 petal length (cm) 0.413859 sepal length (cm) 0.103600 sepal width (cm) 0.023933 dtype: float64
ویژگیهای هایپرپارامتری کلاسیفایر جنگل تصادفی
حالا می خواهیم در مورد ویژگیهای مختلف هایپرپارامتری که در یک کلاسیفایر جنگل تصادفی وجود دارند، آموزش ببینیم.
ویژگیهای هایپرپارامتری، تنظیماتی هستند که نمیتوان از دادههای معمولی که به الگوریتم ارائه میدهیم، یاد گرفت؛ این ویژگیها به طور داخلی در الگوریتم وجود دارند و هر الگوریتم دارای یک مجموعه پیشفرض از ویژگیهای هایپرپارامتری خود است. اغلب این ویژگیها برای افزایش دقت مدل تنظیم میشوند، و ما میتوانیم از روشهای مختلفی مانند GridSearchCV و RandomizedSearchCV استفاده کنیم.
آشنایی عمیق با هایپرپارامترها اهمیت دارد چرا که این هایپرپارامترها مسئول تعیین سرعتی هستند که یک مدل میتواند با داده سازگار شود و نتایج دقیقی تولید کند. از سوی دیگر، عدم یافتن مقادیر بهینه برای هایپرپارامترها میتواند به دلیل مشکلات بیشبرازش منجر به کاهش دقت گردد. بنابراین، ما قصد داریم به طور دقیقتر به هایپرپارامترهای کلاسیفایر جنگل تصادفی نگاه کنیم تا درک بهتری از هایپرپارامترهای داخلی پیدا کنیم:
n_estimators
ما میدانیم که یک جنگل تصادفی در واقع یک گروه از درختان تصمیم است، و پارامتر n_estimators تعداد درختان درون کلاسیفایر را کنترل میکند. ممکن است فکر کنیم که استفاده از تعداد زیادی از درختان برای سازگاری مدل میتواند به ما کمک کند تا نتایجی کلی تر به دست آوریم، اما این همیشه درست نیست. با این وجود، این باعث بیشبرازش نمیشود، اما ممکن است پیچیدگی زمانی مدل را افزایش دهد. تعداد پیشفرض درختان در scikit-learn مقدار ۱۰۰ است.
max_depth
این پارامتر، حداکثر ارتفاعی را که درختان داخل جنگل میتوانند داشته باشند، کنترل میکند. این یکی از مهمترین هایپرپارامترهاست زمانی که به افزایش دقت مدل میپردازیم؛ چرا که با افزایش عمق درخت، دقت مدل به حد معینی افزایش پیدا میکند، اما سپس به تدریج کاهش مییابد به دلیل مشکل بیشبرازش در مدل. تنظیم مناسب مقدار این پارامتر از اهمیت زیادی برخوردار است تا از بیشبرازش جلوگیری شود. مقدار پیشفرض آن None است؛ به این معنا که گرههای درون درخت تا زمانی که همه برگها خالص شوند یا همه برگها حاوی مقدار کمتر از min_samples_split (یک هایپرپارامتر دیگر) باشند، ادامه مییابد.
min_samples_split
این پارامتر، حداقل تعداد نمونهها را که یک گره داخلی باید داشته باشد تا بتواند به گرههای بعدی تقسیم شود، مشخص میکند. اگر مقدار min_samples_split خیلی کم باشد، در این صورت درخت به رشد ادامه میدهد و ابتدا از اندازهگیری خارج میشود. با افزایش مقدار min_samples_split، تعداد کل تقسیمها را میتوان کاهش داد و این به محدود کردن تعداد پارامترها در مدل و در نتیجه کاهش بیشبرازش کمک میکند. با این حال، مقدار نباید خیلی بزرگ باشد تا تعداد پارامترها بهطور قابلتوجهی کاهش یابد و مدل اندرفیت شود. معمولاً مقدار min_samples_split را بین 2 و 6 نگه میداریم. با این حال، مقدار پیشفرض آن 2 است.
min_samples_leaf
این پارامتر، حداقل تعداد نمونهها را که یک گره باید بعد از تقسیم داشته باشد، مشخص میکند. همچنین به کاهش بیشبرازش کمک میکند زمانی که تعداد زیادی از پارامترها موجود است. تعداد کمی از پارامترها هم میتواند به بیشبرازش منجر شود. باید بهیاد داشت که افزایش این مقدار به یک عدد بزرگ میتواند به کاهش تعداد پارامترها منجر شود و در این حالت، مدل ممکن است اندرفیت شود. مقدار پیشفرض برابر با 1 است.
max_features
جنگل تصادفی، نمونههای تصادفی از ویژگیها را انتخاب کرده و سعی میکند بهترین تقسیم را پیدا کند. max_features به تعداد ویژگیهایی که در نظر گرفته میشود برای انجام بهترین تقسیم کمک میکند. این پارامتر میتواند چهار مقدار “auto”، “sqrt”، “log2” و None را بپذیرد.
– در حالت auto:
considers max_features = sqrt(n_features)
– در حالت sqrt:
max_features = sqrt(n_features
– در حالت log2:
max_features = log2(n_features)
– در حالت None:
max_features = n_features
- max_leaf_nodes: این حداکثر تعداد برگهایی را که یک گره میتواند داشته باشد، مشخص میکند و در نتیجه به کاهش عمق درخت کمک میکند و به طور موثر در کاهش بیشبرازش نقش دارد. اگر مقدار به None تنظیم شود، درخت به طور نامحدود ادامه مییابد.
- max_samples: این هایپرپارامتر به انتخاب حداکثر تعداد نمونهها از مجموعه داده آموزش برای آموزش هر درخت فردی کمک میکند.
اینها هایپرپارامترهای اصلی هستند که به طور ضمنی در کلاسیفایر جنگل تصادفی وجود دارند و باید تنظیم شوند تا دقت مدل آموزشی ما افزایش یابد.