परिचय
RSI बेतरतीब जंगल एल्गोरिथ्म एक ट्री-आधारित पर्यवेक्षित शिक्षण एल्गोरिथ्म है जो कई निर्णय पेड़ों की भविष्यवाणियों के एक समूह का उपयोग करता है, या तो डेटा बिंदु को वर्गीकृत करने के लिए या इसका अनुमानित मूल्य निर्धारित करने के लिए। इसका मतलब है कि इसे या तो वर्गीकरण या प्रतिगमन के लिए इस्तेमाल किया जा सकता है।
जब वर्गीकरण के लिए आवेदन किया जाता है, तो डेटा बिंदु का वर्ग उस वर्ग के आधार पर चुना जाता है जिसे पेड़ों द्वारा सबसे अधिक वोट दिया गया था; और जब प्रतिगमन के लिए आवेदन किया जाता है, तो डेटा बिंदु का मूल्य पेड़ों द्वारा आउटपुट सभी मूल्यों का औसत होता है।
रैंडम फ़ॉरेस्ट का उपयोग करते समय याद रखने वाली एक महत्वपूर्ण बात यह है कि पेड़ों की संख्या एक हाइपरपैरामीटर है और इसे मॉडल चलाने से पहले परिभाषित किया जाएगा।
डेटा विज्ञान में काम करते समय, एक विशिष्ट परियोजना के लिए रैंडम फ़ॉरेस्ट मॉडल को चुने जाने के कारणों में से एक का संबंध पेड़ों को देखने और समझने की क्षमता से हो सकता है। क्यों एक वर्गीकरण किया गया था, या क्यों एक मान दिया गया था - इसे कहा जाता है व्याख्या करने योग्य.
पेड़ आधारित एल्गोरिदम को ध्यान में रखते हुए, एक मॉडल को समझाने का प्रयास कई तरीकों से किया जा सकता है, प्रत्येक पेड़ को प्रदर्शित करके और देखकर (यदि मॉडल में 200 पेड़ या अधिक हैं तो कठिन हो सकता है), का उपयोग करके शेपली (या SHAP) मान, उन विशेषताओं को देखते हुए जिन्हें मॉडल द्वारा सबसे अधिक ध्यान में रखा गया था, का उपयोग कर चूने की मॉडल इनपुट और आउटपुट आदि के बीच संबंधों की जांच करने के लिए। आमतौर पर, सभी विधियों के संयोजन को नियोजित किया जाता है।
इस त्वरित मार्गदर्शिका में, हम उन विशेषताओं का एक चार्ट बनाने पर ध्यान केंद्रित करेंगे जिन्हें पेंगुइन को वर्गीकृत करते समय निर्णय लेने के लिए मॉडल के लिए महत्वपूर्ण माना गया था। इसे जांच के रूप में जाना जाता है विशेषता महत्व, और टीम के अन्य सदस्यों (तकनीकी और गैर-तकनीकी) को बताया जा सकता है कि निर्णय कैसे किए जाते हैं।
ऐसा करने के लिए, आइए आवश्यक पुस्तकालयों को आयात करें, पामर पेंगुइन डेटासेट लोड करें, डेटा विभाजित करें, मॉडल बनाएं, फीचर महत्व प्राप्त करें, और उन्हें प्लॉट करने के लिए सीबोर्न का उपयोग करें! हम डेटा, 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% से अधिक।
विज़ुअलाइज़िंग फ़ीचर महत्व
महत्व मूल्यों का प्रतिनिधित्व करने का एक सामान्य तरीका बार चैट का उपयोग करना है। आइए पहले फीचर नामों और उनके संबंधित महत्वों के साथ एक डेटाफ्रेम बनाएं, और फिर सीबॉर्न का उपयोग करके उनकी कल्पना करें 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's . तक पहुंच कर किया जा सकता है containers
वस्तु। यह प्रत्येक बार की जानकारी संग्रहीत करता है और मानों को बार लेबल के रूप में पास करता है:
सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling 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)
चार्ट पढ़ने में आसान लगता है, लेकिन एक्स-अक्ष पर टिक तैरते हुए प्रतीत होते हैं और हमारे पास पहले से ही बार के साथ मान हैं, इसलिए हम हटा सकते हैं 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 लेबल पढ़ने में थोड़े कठिन होते हैं। वाई-लेबल, 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)
यह सुविधा महत्व चार्ट का अंतिम परिणाम है:
निष्कर्ष
इस गाइड में - हमने एक रैंडम फ़ॉरेस्ट क्लासिफ़ायर बनाया है - और उन फ़ीचर महत्वों का निरीक्षण किया है जिनका उपयोग मॉडल को प्रशिक्षित करने के प्रयास में किया गया था समझाना एक मॉडल ने क्या सीखा है, और उसके तर्क को क्या प्रभावित करता है।