معرفی
La جنگل تصادفی الگوریتم یک الگوریتم یادگیری نظارت شده مبتنی بر درخت است که از مجموعهای از پیشبینیهای بسیاری از درختهای تصمیم استفاده میکند، یا برای طبقهبندی یک نقطه داده یا تعیین مقدار تقریبی آن. این بدان معنی است که می توان از آن برای طبقه بندی یا رگرسیون استفاده کرد.
هنگامی که برای طبقهبندی درخواست میشود، کلاس نقطه داده بر اساس کلاسی انتخاب میشود که بیشترین رای را درختان داشتهاند. و هنگامی که برای رگرسیون اعمال می شود، مقدار نقطه داده میانگین تمام مقادیر خروجی توسط درختان است.
نکته مهمی که هنگام استفاده از جنگل های تصادفی باید به خاطر داشته باشید این است که تعداد درخت ها یک هایپرپارامتر است و قبل از اجرای مدل تعریف می شود.
هنگام کار در علم داده، یکی از دلایلی که چرا یک مدل جنگل تصادفی برای یک پروژه خاص انتخاب شده است، ممکن است به توانایی نگاه کردن به درختان ترکیبی و درک آن مربوط باشد. چرا یک طبقه بندی انجام شد، یا چرا یک مقدار داده شد - این نامیده می شود توضیح پذیری.
با در نظر گرفتن الگوریتم های مبتنی بر درخت، تلاش برای توضیح یک مدل می تواند به روش های مختلفی انجام شود، با نمایش و مشاهده هر درخت (اگر مدل دارای 200 درخت یا بیشتر باشد، ممکن است سخت باشد)، با استفاده از مقادیر Shapley (یا SHAP).، با نگاهی به ویژگی هایی که بیشتر توسط مدل مورد توجه قرار گرفت، با استفاده از LIME برای بررسی روابط بین ورودی و خروجی مدل و غیره. معمولاً ترکیبی از همه روش ها استفاده می شود.
در این راهنمای سریع، ما بر روی ایجاد نموداری از ویژگی هایی که برای تصمیم گیری مدل در طبقه بندی پنگوئن ها مهم در نظر گرفته شده اند، تمرکز خواهیم کرد. این به عنوان تحقیق در مورد اهمیت ویژگی، و می تواند به سایر اعضای تیم (فنی و غیر فنی) منتقل شود تا نگاهی اجمالی به نحوه تصمیم گیری ارائه دهد.
برای انجام این کار، بیایید کتابخانههای لازم را وارد کنیم، مجموعه دادههای Palmer Penguins را بارگذاری کنیم، دادهها را تقسیم کنیم، مدل را ایجاد کنیم، اهمیت ویژگیها را بدست آوریم و از Seaborn برای رسم آنها استفاده کنیم! ما در مورد دادهها، EDA یا خود مدل زیاد کاوش نخواهیم کرد - اینها موضوع راهنمای اختصاصی است.
توجه داشته باشید: می توانید مجموعه داده را از اینجا دانلود کنید GitHub یا مستقیماً از کد.
وارد کردن کتابخانه ها
بیایید با وارد کردن چند کتابخانه که از آنها استفاده خواهیم کرد شروع کنیم:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)
تقسیم داده ها
بیایید داده ها را برای آموزش و آزمایش تقسیم کنیم:
df = df.dropna().drop("rowid", axis=1)
y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
به دست آوردن اهمیت ویژگی ها
در نهایت - ما می توانیم یک مدل را آموزش دهیم و اهمیت ویژگی ها را با استفاده از:
rf = RandomForestClassifier()
rf.fit(X_train, y_train)
rf.feature_importances_
این خروجی:
array([0.41267633, 0.30107056, 0.28625311])
این مقادیر ویژگی هستند، برای دیدن نام ویژگی ها، اجرا کنید:
rf.feature_names_in_
این منجر به نام مربوط به هر ویژگی می شود:
array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
dtype=object)
این بدان معنی است که مهم ترین ویژگی برای تصمیم گیری کلاس های پگوین برای این مدل خاص بود bill_length_mm
!
اهمیت نسبت به اندازه گیری میزان خوب تفکیک داده ها در هر تقسیم گره است - در این مورد، اندازه گیری توسط فهرست جینی - سپس مقدار جینی با تعداد ردیف هایی که هنگام استفاده از آن تقسیم شده اند وزن می شود bill_length_mm
ویژگی و میانگین بیش از 100 درخت در گروه است. نتیجه آن مراحل به حساب می آید 0.41267633
، یا در این مورد بیش از 40٪ است.
تجسم اهمیت ویژگی
یک راه متداول برای نمایش مقادیر اهمیت، استفاده از چت نواری است. بیایید ابتدا یک دیتافریم با نام ویژگی ها و اهمیت مربوط به آنها ایجاد کنیم و سپس آنها را با استفاده از Seaborn تجسم کنیم. barplot()
:
importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_,
"importances" : rf.feature_importances_})
g = sns.barplot(x=importances_df["feature_names"],
y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);
مشاوره: یک روش خوب هنگام ارائه اطلاعات این است که مقادیر را به ترتیب صعودی یا نزولی مرتب کنید. در این مورد، داده ها از قبل مرتب شده اند، با اولین مقداری که می خواهیم بدانیم. وقتی اینطور نیست، می توانید دیتافریم را با آن سفارش دهید sort_values
. این را می توان بر روی هر ستونی به ترتیب صعودی یا نزولی انجام داد: importances_df.sort_values(by="importances", ascending=False)
.
وقتی به اولین نمودار نگاه می کنیم، تفسیر ارزش اهمیت هر ویژگی دشوارتر است. واضح است که طول صورتحساب بزرگتر از دو میله دیگر است، اما نه دقیقاً bill_depth_mm
برابر است با 0.30107056
و آن flipper_length_mm
0.28625311 است. بنابراین، این نمودار اول را می توان با نمایش مقدار هر نوار بهبود بخشید. این را می توان با دسترسی به Seaborn انجام داد containers
هدف - شی. این اطلاعات هر نوار را ذخیره می کند و مقادیر را به عنوان برچسب نوار ارسال می کند:
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
g = sns.barplot(data=importances_df,
x="importances",
y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
g.bar_label(value)
اکنون، ما می توانیم هر مقدار اهمیت را به وضوح یا تقریباً واضح ببینیم، زیرا bill_length_mm
مقدار توسط یک خط عمودی که بخشی از مرز بیرونی نمودار است بریده می شود. مرزها برای محصور کردن یک منطقه به عنوان وسیله ای برای تمرکز بیشتر روی آن استفاده می شود، اما در این مورد، ما نیازی به محصور کردن نداریم، زیرا تنها یک نمودار وجود دارد. بیایید حاشیه را حذف کنیم و خوانایی اعداد را بهبود ببخشیم:
g = sns.barplot(data=importances_df,
x="importances",
y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
g.bar_label(value)
به نظر می رسد نمودار راحت تر خوانده شود، اما تیک های روی محور X به نظر می رسد شناور هستند و ما از قبل مقادیر را همراه با میله ها داریم، بنابراین می توانیم تیک ها را حذف کنیم. xticks
:
g = sns.barplot(data=importances_df,
x="importances",
y="feature_names")
sns.despine(bottom=True, left=True)
g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
g.bar_label(value)
توجه کنید که چگونه پس از حذف تیک ها، خواندن برچسب های Y و X کمی سخت است. برچسب Y، feature_names
، عمودی است و در محور X فقط وجود دارد importances
. از آنجایی که عنوان قبلاً بیان می کند که نمودار از اهمیت ویژگی ها، همچنین می توانیم برچسب های محور را حذف کنیم:
g = sns.barplot(data=importances_df,
x="importances",
y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
g.bar_label(value)
می توانید ببینید که چگونه این نمودار در مقایسه با نمودار اول تمیزتر، قابل خواندن و درک است. هنوز کارهایی هست که می توانیم انجام دهیم. توجه داشته باشید که اعداد واقعاً به میلهها نزدیک هستند، اگر کمی فاصله بین آنها وجود داشته باشد، خواندن راحتتر خواهد بود.
عنصر دیگر در این طرح رنگ ها هستند، زمانی که از رنگ های متضاد استفاده می شود، تصوری از جدایی را منتقل می کند، برعکس، زمانی که رنگ های مشابه استفاده می شود، تصوری از وحدت یا بخش هایی از یک کل را منتقل می کند. از آنجایی که ویژگیها همه بخشی از پنگوئنها هستند، میتوانیم از رنگهایی استفاده کنیم که در عین حفظ وحدت، هر نوار را متمایز کند:
g = sns.barplot(data=importances_df,
x="importances",
y="feature_names",
palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
g.bar_label(value,
padding=2)
اگر میخواهید نتایج را مستقیمتر نشان دهید، میتوانید عنوان را تغییر دهید و نتیجهگیری را اضافه کنید. آنچه مشخص است این است که طول قبض با توجه به معیارهایی که قبلاً مطرح کردیم مهمترین ویژگی در نظر گرفته شد. این می تواند اولین اطلاعات برای کسی باشد که به طرح نگاه می کند، می توانیم بگوییم طول قبض پنگوئن مهمترین ویژگی برای طبقه بندی گونه ها در مدل پایه جنگل تصادفی (RF) بود. :
g = sns.barplot(data=importances_df,
x="importances",
y="feature_names",
palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
g.bar_label(value, padding=2)
این نتیجه نهایی نمودار اهمیت ویژگی است:
نتیجه
در این راهنما - ما یک طبقهبندی جنگل تصادفی ساختهایم - و اهمیت ویژگیهایی را که برای آموزش مدل استفاده میشد، بررسی کردیم. توضیح دادن آنچه یک مدل آموخته است و چه چیزی بر استدلال آن تأثیر می گذارد.