ভূমিকা
সার্জারির এলোমেলো বন অ্যালগরিদম হল একটি গাছ-ভিত্তিক তত্ত্বাবধানে শেখার অ্যালগরিদম যা অনেক সিদ্ধান্ত গাছের ভবিষ্যদ্বাণীগুলির একটি সমষ্টি ব্যবহার করে, হয় একটি ডেটা পয়েন্টকে শ্রেণীবদ্ধ করতে বা এটির আনুমানিক মান নির্ধারণ করতে। এর মানে হল এটি শ্রেণীবিভাগ বা রিগ্রেশনের জন্য ব্যবহার করা যেতে পারে।
যখন শ্রেণীবিভাগের জন্য আবেদন করা হয়, তখন গাছের দ্বারা সবচেয়ে বেশি ভোট দেওয়া ক্লাসের উপর ভিত্তি করে ডেটা পয়েন্টের শ্রেণী নির্বাচন করা হয়; এবং যখন রিগ্রেশনের জন্য আবেদন করা হয়, ডাটা পয়েন্টের মান হল গাছের সমস্ত মানের আউটপুটের গড়।
র্যান্ডম ফরেস্ট ব্যবহার করার সময় মনে রাখা একটি গুরুত্বপূর্ণ বিষয় হল গাছের সংখ্যা একটি হাইপারপ্যারামিটার এবং মডেলটি চালানোর আগে এটি সংজ্ঞায়িত করা হবে।
ডেটা সায়েন্সে কাজ করার সময়, একটি নির্দিষ্ট প্রকল্পের জন্য র্যান্ডম ফরেস্ট মডেল কেন বেছে নেওয়া হয়েছিল তার একটি কারণ হতে পারে সংযুক্ত গাছগুলি দেখার এবং বোঝার ক্ষমতার সাথে কেন একটি শ্রেণীবিভাগ করা হয়েছে, বা কেন একটি মান দেওয়া হয়েছিল - এটিকে বলা হয় ব্যাখ্যাযোগ্যতা.
ট্রি ভিত্তিক অ্যালগরিদম বিবেচনা করে, একটি মডেল ব্যাখ্যা করার চেষ্টা করা বিভিন্ন উপায়ে করা যেতে পারে, প্রতিটি গাছ প্রদর্শন এবং দেখে (মডেলটিতে 200 বা তার বেশি গাছ থাকলে কঠিন হতে পারে), ব্যবহার করে Shapley (বা SHAP) মান, ব্যবহার করে মডেল দ্বারা সবচেয়ে বেশি বিবেচনা করা হয়েছে যে বৈশিষ্ট্যের দিকে তাকিয়ে LIME মডেল ইনপুট এবং আউটপুট, ইত্যাদির মধ্যে সম্পর্ক অনুসন্ধান করার জন্য, সাধারণত, সমস্ত পদ্ধতির সংমিশ্রণ নিযুক্ত করা হয়।
এই দ্রুত নির্দেশিকায়, আমরা সেই বৈশিষ্ট্যগুলির একটি চার্ট তৈরি করার উপর ফোকাস করব যা মডেলের জন্য পেঙ্গুইন শ্রেণীবদ্ধ করার সময় সিদ্ধান্ত নেওয়ার জন্য গুরুত্বপূর্ণ বলে বিবেচিত হয়েছিল। এটি তদন্ত হিসাবে পরিচিত বৈশিষ্ট্য গুরুত্ব, এবং কীভাবে সিদ্ধান্ত নেওয়া হয় তার একটি আভাস দেওয়ার জন্য দলের অন্যান্য সদস্যদের (প্রযুক্তিগত এবং অ-প্রযুক্তিগত) জানানো যেতে পারে।
এটি করার জন্য, আসুন প্রয়োজনীয় লাইব্রেরি আমদানি করি, পামার পেঙ্গুইন ডেটাসেট লোড করি, ডেটা বিভক্ত করি, মডেল তৈরি করি, বৈশিষ্ট্যের গুরুত্ব প্রাপ্ত করি এবং সেগুলি প্লট করতে 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 টিরও বেশি গাছ ensemble মধ্যে. এই পদক্ষেপগুলির ফলাফলের জন্য অ্যাকাউন্ট 0.41267633
, বা এই ক্ষেত্রে 40% এর বেশি।
ভিজ্যুয়ালাইজিং বৈশিষ্ট্য গুরুত্ব
গুরুত্ব মান উপস্থাপনের একটি সাধারণ উপায় বার চ্যাট ব্যবহার করে। আসুন প্রথমে বৈশিষ্ট্যের নাম এবং তাদের সংশ্লিষ্ট গুরুত্ব সহ একটি ডেটাফ্রেম তৈরি করি এবং তারপরে Seaborn's ব্যবহার করে সেগুলিকে কল্পনা করি 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)
এটি বৈশিষ্ট্য গুরুত্ব চার্টের চূড়ান্ত ফলাফল:
উপসংহার
এই নির্দেশিকায় - আমরা একটি র্যান্ডম ফরেস্ট ক্লাসিফায়ার তৈরি করেছি - এবং মডেলটিকে প্রশিক্ষণ দেওয়ার জন্য ব্যবহৃত বৈশিষ্ট্যের গুরুত্বগুলি পরিদর্শন করেছি ব্যাখ্যা করা একটি মডেল কি শিখেছে, এবং কি তার যুক্তি প্রভাবিত করে।