وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

با Python و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

0 2
زمان لازم برای مطالعه: 5 دقیقه


معرفی

را جنگل تصادفی الگوریتم یک الگوریتم یادگیری نظارت شده مبتنی بر درخت است که از مجموعه ای از پیش بینی های بسیاری از درختان تصمیم استفاده می کند، یا برای طبقه بندی یک نقطه داده یا تعیین مقدار تقریبی آن. این بدان معنی است که می توان از آن برای طبقه بندی یا رگرسیون استفاده کرد.

هنگامی که برای طبقه بندی اعمال می شود، کلاس نقطه داده بر اساس انتخاب می شود روی طبقه ای که بیشترین رای را درختان دریافت کردند. و هنگامی که برای رگرسیون اعمال می شود، مقدار نقطه داده میانگین تمام مقادیر خروجی توسط درختان است.

نکته مهمی که هنگام استفاده از جنگل های تصادفی باید به خاطر داشته باشید این است که تعداد درخت ها یک فراپارامتر است و قبل از اجرای مدل تعریف می شود.

هنگام کار در علم داده، یکی از دلایلی که چرا یک مدل جنگل تصادفی برای یک پروژه خاص انتخاب شده است، ممکن است به توانایی نگاه کردن به درختان ترکیبی و درک آن مربوط باشد. چرا طبقه بندی انجام شد، یا چرا یک مقدار داده شد – این نامیده می شود توضیح پذیری.

با در نظر گرفتن الگوریتم های مبتنی بر درخت، تلاش برای توضیح یک مدل می تواند به روش های مختلفی انجام شود، با نمایش و مشاهده هر درخت (اگر مدل دارای 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);                          

با Python و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

توصیه: یک روش خوب هنگام ارائه اطلاعات این است که مقادیر را به ترتیب صعودی یا نزولی مرتب کنید. در این مورد، داده ها از قبل مرتب شده اند، با اولین مقداری که می خواهیم بدانیم. وقتی اینطور نیست، می توانید دیتافریم را با آن سفارش دهید 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)

با Python و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

اکنون، می‌توانیم هر مقدار اهمیت را به وضوح یا تقریباً واضح ببینیم، زیرا 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)

با Python و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

به نظر می رسد نمودار راحت تر خوانده شود، اما تیک دارد روی به نظر می رسد که محور 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)

با Python و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

توجه کنید که چگونه پس از حذف تیک ها، خواندن برچسب های 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)

با Python و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

می‌توانید ببینید که چگونه این نمودار در مقایسه با نمودار اول تمیزتر، خواندن و درک آن آسان‌تر است. هنوز کارهایی هست که می توانیم انجام دهیم. توجه داشته باشید که اعداد واقعاً به میله‌ها نزدیک هستند، اگر کمی فاصله بین آنها وجود داشته باشد، خواندن راحت‌تر خواهد بود.

یکی دیگر از عناصر این طرح رنگ ها هستند، زمانی که از رنگ های متضاد استفاده می شود، ایده جدایی را منتقل می کند. روی برعکس، وقتی رنگ‌های مشابه استفاده می‌شود، ایده‌ای از وحدت یا بخش‌هایی از یک کل را منتقل می‌کنند. از آنجایی که ویژگی‌ها همه بخشی از پنگوئن‌ها هستند، می‌توانیم از رنگ‌هایی استفاده کنیم که در عین حفظ وحدت، هر نوار را متمایز کند:

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) 

با Python و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

اگر می‌خواهید نتایج را مستقیم‌تر نشان دهید، می‌توانید عنوان را تغییر دهید و نتیجه‌گیری را اضافه کنید. آنچه مشخص است این است که طول قبض با توجه به معیارهایی که قبلاً مطرح کردیم مهمترین ویژگی در نظر گرفته شد. این می تواند اولین اطلاعات برای کسی باشد که به طرح نگاه می کند، می توانیم بگوییم طول قبض پنگوئن مهمترین ویژگی برای طبقه بندی گونه ها در مدل پایه جنگل تصادفی (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 و Scikit-Learn اهمیت ویژگی‌ها را برای جنگل تصادفی دریافت کنید

نتیجه

در این راهنما – ما یک طبقه‌بندی جنگل تصادفی ساخته‌ایم – و اهمیت ویژگی‌هایی را که برای آموزش مدل مورد استفاده قرار گرفته‌اند، بررسی کرده‌ایم. توضیح آنچه یک مدل آموخته است و چه چیزی بر استدلال آن تأثیر می گذارد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-02 23:09:09

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید