از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
با Python و Scikit-Learn اهمیت ویژگیها را برای جنگل تصادفی دریافت کنید
سرفصلهای مطلب
معرفی
را جنگل تصادفی الگوریتم یک الگوریتم یادگیری نظارت شده مبتنی بر درخت است که از مجموعه ای از پیش بینی های بسیاری از درختان تصمیم استفاده می کند، یا برای طبقه بندی یک نقطه داده یا تعیین مقدار تقریبی آن. این بدان معنی است که می توان از آن برای طبقه بندی یا رگرسیون استفاده کرد.
هنگامی که برای طبقه بندی اعمال می شود، کلاس نقطه داده بر اساس انتخاب می شود روی طبقه ای که بیشترین رای را درختان دریافت کردند. و هنگامی که برای رگرسیون اعمال می شود، مقدار نقطه داده میانگین تمام مقادیر خروجی توسط درختان است.
نکته مهمی که هنگام استفاده از جنگل های تصادفی باید به خاطر داشته باشید این است که تعداد درخت ها یک فراپارامتر است و قبل از اجرای مدل تعریف می شود.
هنگام کار در علم داده، یکی از دلایلی که چرا یک مدل جنگل تصادفی برای یک پروژه خاص انتخاب شده است، ممکن است به توانایی نگاه کردن به درختان ترکیبی و درک آن مربوط باشد. چرا طبقه بندی انجام شد، یا چرا یک مقدار داده شد – این نامیده می شود توضیح پذیری.
با در نظر گرفتن الگوریتم های مبتنی بر درخت، تلاش برای توضیح یک مدل می تواند به روش های مختلفی انجام شود، با نمایش و مشاهده هر درخت (اگر مدل دارای 200 درخت یا بیشتر باشد، ممکن است سخت باشد)، با استفاده از مقادیر Shapley (یا SHAP).، با نگاهی به ویژگی هایی که بیشتر توسط مدل مورد توجه قرار گرفت، با استفاده از اهک برای بررسی روابط بین ورودی و خروجی مدل و غیره. معمولاً ترکیبی از همه روش ها استفاده می شود.
در این راهنمای سریع، ما تمرکز خواهیم کرد روی ایجاد نموداری از ویژگی هایی که برای تصمیم گیری مدل در هنگام طبقه بندی پنگوئن ها مهم در نظر گرفته شده است. این به عنوان تحقیق در مورد اهمیت ویژگی، و می تواند به سایر اعضای تیم (فنی و غیر فنی) منتقل شود تا نگاهی اجمالی به روش تصمیم گیری ارائه دهد.
برای انجام این کار، اجازه دهید import کتابخانه های لازم، مجموعه داده پالمر پنگوئن ها را بارگیری کنید، داده ها را تقسیم کنید، مدل را ایجاد کنید، اهمیت ویژگی ها را به دست آورید، و از 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)
به دست آوردن اهمیت ویژگی ها
در نهایت – ما می توانیم یک مدل و export اهمیت ویژگی با:
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
!
اهمیت نسبت به اندازه گیری میزان تفکیک داده ها در هر یک است node تقسیم – در این مورد، اندازه گیری توسط شاخص جینی – سپس مقدار Gini با تعداد ردیف هایی که هنگام استفاده از آن تقسیم شده اند وزن می شود 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
هدف – شی. این اطلاعات هر نوار را ذخیره می کند و مقادیر را به عنوان برچسب نوار ارسال می کند:
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)
این نتیجه نهایی نمودار اهمیت ویژگی است:
نتیجه
در این راهنما – ما یک طبقهبندی جنگل تصادفی ساختهایم – و اهمیت ویژگیهایی را که برای آموزش مدل مورد استفاده قرار گرفتهاند، بررسی کردهایم. توضیح آنچه یک مدل آموخته است و چه چیزی بر استدلال آن تأثیر می گذارد.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-02 23:09:09