मशीन लर्निंग - डिसीजन ट्री
निर्णय वृक्ष
इस अध्याय में हम आपको दिखाएंगे कि "निर्णय वृक्ष" कैसे बनाया जाता है। डिसीजन ट्री एक फ्लो चार्ट है, और पिछले अनुभव के आधार पर निर्णय लेने में आपकी मदद कर सकता है।
उदाहरण में, एक व्यक्ति यह तय करने का प्रयास करेगा कि उसे कॉमेडी शो में जाना चाहिए या नहीं।
सौभाग्य से हमारे उदाहरण के व्यक्ति ने हर बार शहर में एक कॉमेडी शो के लिए पंजीकरण किया है, और कॉमेडियन के बारे में कुछ जानकारी दर्ज की है, और यह भी पंजीकृत किया है कि वह गया या नहीं।
उम्र | अनुभव | पद | राष्ट्रीयता | जाओ |
36 | 10 | 9 | यूके | नहीं |
42 | 12 | 4 | अमेरीका | नहीं |
23 | 4 | 6 | एन | नहीं |
52 | 4 | 4 | अमेरीका | नहीं |
43 | 21 | 8 | अमेरीका | हां |
44 | 14 | 5 | यूके | नहीं |
66 | 3 | 7 | एन | हां |
35 | 14 | 9 | यूके | हां |
52 | 13 | 7 | एन | हां |
35 | 5 | 9 | एन | हां |
24 | 3 | 5 | अमेरीका | नहीं |
18 | 3 | 7 | यूके | हां |
45 | 9 | 9 | यूके | हां |
अब, इस डेटा सेट के आधार पर, पायथन एक निर्णय वृक्ष बना सकता है जिसका उपयोग यह तय करने के लिए किया जा सकता है कि क्या कोई नया शो देखने लायक है।
यह कैसे काम करता है?
सबसे पहले, आपको आवश्यक मॉड्यूल आयात करें, और पंडों के साथ डेटासेट पढ़ें:
उदाहरण
डेटा सेट पढ़ें और प्रिंट करें:
import pandas
from sklearn import tree
import pydotplus
from
sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)
निर्णय वृक्ष बनाने के लिए, सभी डेटा को संख्यात्मक होना चाहिए।
हमें गैर-संख्यात्मक कॉलम 'राष्ट्रीयता' और 'गो' को संख्यात्मक मानों में बदलना होगा।
पंडों के पास एक map()
तरीका है जो मूल्यों को परिवर्तित करने के तरीके के बारे में जानकारी के साथ एक शब्दकोश लेता है।
{'UK': 0, 'USA': 1, 'N': 2}
मतलब 'यूके' को 0, 'यूएसए' को 1 और 'एन' को 2 में बदलें।
उदाहरण
स्ट्रिंग मानों को संख्यात्मक मानों में बदलें:
d = {'UK': 0,
'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d =
{'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
फिर हमें फीचर कॉलम को टारगेट कॉलम से अलग करना होगा।
फीचर कॉलम वे कॉलम हैं जिनसे हम भविष्यवाणी करने का प्रयास करते हैं , और लक्ष्य कॉलम उन मूल्यों के साथ कॉलम है जिन्हें हम भविष्यवाणी करने का प्रयास करते हैं।
उदाहरण
X
सुविधा स्तंभ
y
है, लक्ष्य स्तंभ है:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
अब हम वास्तविक निर्णय वृक्ष बना सकते हैं, इसे अपने विवरण के साथ फिट कर सकते हैं, और कंप्यूटर पर एक .png फ़ाइल सहेज सकते हैं:
उदाहरण
एक निर्णय वृक्ष बनाएं, इसे एक छवि के रूप में सहेजें, और छवि दिखाएं:
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data =
tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph =
pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()
परिणाम समझाया
डिसीजन ट्री आपके पहले के निर्णयों का उपयोग उन बाधाओं की गणना करने के लिए करता है जिनके लिए आप किसी कॉमेडियन को देखने जाना चाहते हैं या नहीं।
आइए हम निर्णय वृक्ष के विभिन्न पहलुओं को पढ़ें:
पद
Rank <= 6.5
इसका मतलब है कि 6.5 या उससे कम रैंक वाला हर कॉमेडियन
True
तीर (बाईं ओर) का अनुसरण करेगा, और बाकी False
तीर (दाईं ओर) का अनुसरण करेगा।
gini = 0.497
विभाजन की गुणवत्ता को संदर्भित करता है, और हमेशा 0.0 और 0.5 के बीच की एक संख्या होती है, जहां 0.0 का मतलब होगा कि सभी नमूनों का एक ही परिणाम है, और 0.5 का मतलब होगा कि विभाजन बिल्कुल बीच में किया गया है।
samples = 13
इसका मतलब है कि इस बिंदु पर निर्णय में 13 कॉमेडियन बचे हैं, जो उन सभी के लिए है क्योंकि यह पहला कदम है।
value = [6, 7]
इसका मतलब है कि इन 13 कॉमेडियन में से 6 को "NO" मिलेगा और 7 को "GO" मिलेगा।
गिनी
नमूनों को विभाजित करने के कई तरीके हैं, हम इस ट्यूटोरियल में GINI पद्धति का उपयोग करते हैं।
गिनी विधि इस सूत्र का उपयोग करती है:
Gini = 1 - (x/n)2 - (y/n)2
x
सकारात्मक उत्तरों की संख्या ("जाओ")
कहां है n
, नमूनों की संख्या है, और
y
नकारात्मक उत्तरों की संख्या ("नहीं") है, जो हमें यह गणना देता है:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
अगले चरण में दो बॉक्स होते हैं, एक बॉक्स कॉमेडियन के लिए 6.5 या उससे कम के 'रैंक' के साथ, और एक बॉक्स बाकी के साथ।
सच - 5 हास्य कलाकार यहाँ समाप्त होते हैं:
gini = 0.0
इसका मतलब है कि सभी नमूनों का परिणाम एक जैसा है।
samples = 5
इसका मतलब है कि इस शाखा में 5 कॉमेडियन बचे हैं (6.5 या उससे कम रैंक वाले 5 कॉमेडियन)।
value = [5, 0]
इसका मतलब है कि 5 को "NO" मिलेगा और 0 को "GO" मिलेगा।
असत्य - 8 हास्य कलाकार जारी रखें:
राष्ट्रीयता
Nationality <= 0.5
इसका मतलब है कि 0.5 से कम राष्ट्रीयता वाले कॉमेडियन बाईं ओर के तीर का अनुसरण करेंगे (जिसका अर्थ है यूके से सभी,), और बाकी लोग दाईं ओर वाले तीर का अनुसरण करेंगे।
gini = 0.219
यानी करीब 22 फीसदी सैंपल एक ही दिशा में जाएंगे।
samples = 8
इसका मतलब है कि इस शाखा में 8 कॉमेडियन बचे हैं (8 कॉमेडियन जिनकी रैंक 6.5 से अधिक है)।
value = [1, 7]
इसका मतलब है कि इन 8 कॉमेडियन में से 1 को "NO" और 7 को "GO" मिलेगा।
सच - 4 कॉमेडियन जारी रखें:
उम्र
Age <= 35.5
इसका मतलब है कि 35.5 या उससे कम उम्र के कॉमेडियन बाईं ओर तीर का अनुसरण करेंगे, और बाकी लोग दाईं ओर वाले तीर का अनुसरण करेंगे।
gini = 0.375
इसका मतलब है कि लगभग 37,5% नमूने एक दिशा में जाएंगे।
samples = 4
यानी इस ब्रांच में 4 कॉमेडियन बचे हैं (यूके से 4 कॉमेडियन)।
value = [1, 3]
यानी इन 4 कॉमेडियन में से 1 को "NO" और 3 को "GO" मिलेगा।
असत्य - 4 हास्य कलाकार यहाँ समाप्त होते हैं:
gini = 0.0
इसका मतलब है कि सभी नमूनों का परिणाम एक जैसा है।
samples = 4
इसका मतलब है कि इस ब्रांच में 4 कॉमेडियन बचे हैं (यूके से नहीं 4 कॉमेडियन)।
value = [0, 4]
इसका मतलब है कि इन 4 कॉमेडियन में से 0 को "NO" और 4 को "GO" मिलेगा।
सच - 2 हास्य कलाकार यहाँ समाप्त होते हैं:
gini = 0.0
इसका मतलब है कि सभी नमूनों का परिणाम एक जैसा है।
samples = 2
इसका मतलब है कि इस ब्रांच में 2 कॉमेडियन बचे हैं (2 कॉमेडियन जिनकी उम्र 35.5 या उससे कम है)।
value = [0, 2]
इसका मतलब है कि इन 2 कॉमेडियन में से 0 को "NO" और 2 को "GO" मिलेगा।
असत्य - 2 हास्य कलाकार जारी रखें:
अनुभव
Experience <= 9.5
इसका मतलब है कि 9.5 साल या उससे कम के अनुभव वाले कॉमेडियन बाईं ओर वाले तीर का अनुसरण करेंगे, और बाकी लोग दाईं ओर वाले तीर का अनुसरण करेंगे।
gini = 0.5
इसका मतलब है कि 50% नमूने एक दिशा में जाएंगे।
samples = 2
इसका मतलब है कि इस ब्रांच में 2 कॉमेडियन बचे हैं (2 कॉमेडियन 35.5 से पुराने)।
value = [1, 1]
इसका मतलब है कि इन 2 कॉमेडियन में से 1 को "NO" और 1 को "GO" मिलेगा।
सच - 1 कॉमेडियन यहाँ समाप्त होता है:
gini = 0.0
इसका मतलब है कि सभी नमूनों का परिणाम एक जैसा है।
samples = 1
यानी इस ब्रांच में 1 कॉमेडियन बचा है (9.5 साल या उससे कम के अनुभव वाले 1 कॉमेडियन)।
value = [0, 1]
इसका मतलब है कि 0 को "NO" मिलेगा और 1 को "GO" मिलेगा।
असत्य - 1 हास्य कलाकार यहाँ समाप्त होता है:
gini = 0.0
इसका मतलब है कि सभी नमूनों का परिणाम एक जैसा है।
samples = 1
इसका मतलब है कि इस ब्रांच में 1 कॉमेडियन बचे हैं (9.5 साल से अधिक के अनुभव वाले 1 कॉमेडियन)।
value = [1, 0]
इसका मतलब है कि 1 को "NO" मिलेगा और 0 को "GO" मिलेगा।
मूल्यों की भविष्यवाणी करें
हम नए मूल्यों की भविष्यवाणी करने के लिए निर्णय वृक्ष का उपयोग कर सकते हैं।
उदाहरण: क्या मुझे एक 40 वर्षीय अमेरिकी कॉमेडियन अभिनीत शो देखने जाना चाहिए, जिसके पास 10 साल का अनुभव है, और एक कॉमेडी रैंकिंग 7 की है?
उदाहरण
नए मूल्यों की भविष्यवाणी करने के लिए भविष्यवाणी () विधि का उपयोग करें:
print(dtree.predict([[40, 10, 7, 1]]))
उदाहरण
अगर कॉमेडी रैंक 6 होती तो क्या जवाब होता?
print(dtree.predict([[40, 10, 6, 1]]))
अलग परिणाम
यदि आप इसे पर्याप्त समय तक चलाते हैं, तो भी आप देखेंगे कि निर्णय ट्री आपको अलग-अलग परिणाम देता है, भले ही आप इसे समान डेटा से भर दें।
ऐसा इसलिए है क्योंकि डिसीजन ट्री हमें 100% निश्चित उत्तर नहीं देता है। यह एक परिणाम की संभावना पर आधारित है, और उत्तर अलग-अलग होंगे।