2014-05-09 7 views
14

मुझे विज्ञान-सीखने से निर्णय पेड़ के परिणाम को समझने में दो समस्याएं हैं। उदाहरण के लिए, यह मेरे निर्णय पेड़ों में से एक है:विज्ञान से सीखने के पेड़ को कैसे समझाएं- सीखें

enter image description here मेरा सवाल यह है कि मैं पेड़ का उपयोग कैसे कर सकता हूं? अन्यथा यह जाता है सही, एक नमूना हालत संतुष्ट हैं, तो यह वाम शाखा को जाता है (अगर मौजूद है):

पहला सवाल है कि है। मेरे मामले में, यदि एक्स [7]> 63521.3984 के साथ नमूना है। फिर नमूना हरे रंग के बॉक्स में जाएगा। सही बात?

दूसरा सवाल यह है कि: जब नमूना पत्ती नोड तक पहुंचता है, तो मैं कैसे जान सकता हूं कि यह किस श्रेणी से संबंधित है? इस उदाहरण में, मेरे पास वर्गीकृत करने के लिए तीन श्रेणियां हैं। लाल बक्से में, 91, 212, और 113 नमूने क्रमशः स्थिति से संतुष्ट हैं। लेकिन मैं इस श्रेणी का फैसला कैसे कर सकता हूं? मुझे पता है कि श्रेणी को बताने के लिए clf.predict (नमूना) है। क्या मैं ग्राफ से ऐसा कर सकता हूं ??? बहुत धन्यवाद।

+1

जिज्ञासा से, आपने निर्णय पेड़ को कैसे प्लॉट किया? – Matt

+4

सबसे पहले जेएसओएन प्रारूप में पेड़ निर्यात करें (यह [लिंक] देखें (http://www.garysieling.com/blog/rending-scikit-decision-trees-d3-js)) और फिर d3.js का उपयोग करके पेड़ को प्लॉट करें । या आप सीधे एम्बेडेड फ़ंक्शन का उपयोग कर सकते हैं: 'tree.export_graphviz (clf, out_file = your_out_file, feature_names = your_feature_names) 'आशा है कि यह काम करता है, @Matt –

उत्तर

21

प्रत्येक बॉक्स में value लाइन आपको बता रही है कि उस नोड में कितने नमूने प्रत्येक श्रेणी में आते हैं। यही कारण है कि, प्रत्येक बॉक्स में, value में संख्या sample में दिखाए गए नंबर तक जोड़ें। उदाहरण के लिए, आपके लाल बॉक्स में, 91 + 212 + 113 = 416। तो इसका मतलब है कि यदि आप इस नोड तक पहुँचते हैं, वहाँ श्रेणी में 1 91 डेटा बिंदुओं श्रेणी में 2 212, और श्रेणी में 113 थे 3.

आप एक नया डेटा मुद्दा यह है कि है कि पत्ती में पहुँच के लिए परिणाम की भविष्यवाणी करने के लिए जा रहे थे तो निर्णय पेड़ में, आप श्रेणी 2 की भविष्यवाणी करेंगे, क्योंकि उस नोड पर नमूने के लिए यह सबसे आम श्रेणी है।

+0

मुझे यह जानने में रूचि थी कि कौन सा मूल्य किस वर्ग से संबंधित है। 'DecisionTreeClassifier.classes' में यह जानकारी है। – ezdazuzena

+0

(उपयोगी उत्तर। यद्यपि पायथन इंडेक्सिंग का उपयोग करके स्पष्टीकरण के लिए: लाल बॉक्स में नमूना लैंडिंग की भविष्यवाणी की जाएगी (श्रेणी 212) श्रेणी 0 (9 1) या श्रेणी 2 (113) :-) के बजाय श्रेणी 1 के रूप में) –

0

"सीखना विज्ञान-सीखना: मशीन लर्निंग इन पायथन" पुस्तक के अनुसार, निर्णय पेड़ प्रशिक्षण डेटा के आधार पर निर्णयों की एक श्रृंखला का प्रतिनिधित्व करता है।

! (http://i.imgur.com/vM9fJLy.png)

एक उदाहरण वर्गीकृत करने के लिए, हम प्रत्येक नोड पर सवाल का जवाब चाहिए। उदाहरण के लिए, सेक्स < = 0.5 है? (क्या हम एक औरत के बारे में बात कर रहे हैं?)। यदि उत्तर हाँ है, तो आप पेड़ में बाएं बच्चे नोड पर जाते हैं; अन्यथा आप सही बच्चे नोड पर जाते हैं। जब तक आप एक पत्ते तक नहीं पहुंच जाते, तब तक आप जवाब देने वाले प्रश्न (क्या वह तीसरी कक्षा में थी ?, क्या वह पहली कक्षा में थी? और वह 13 वर्ष से कम थी?) जब आप वहां हों, भविष्यवाणी उस लक्ष्य वर्ग से मेल खाती है जिसमें अधिकांश उदाहरण हैं।

2

पहला प्रश्न: हां, आपका तर्क सही है। बायां नोड सही है और दायां नोड झूठा है। यह प्रतिद्वंद्वी है; सच्चाई का मतलब आम तौर पर एक छोटा सा मूल्य होगा।

दूसरा प्रश्न: इस समस्या को पेडोटप्लस के साथ एक ग्राफ के रूप में पेड़ को देखकर सबसे अच्छा हल किया जाता है। tree.export_graphviz() की 'class_names' विशेषता प्रत्येक नोड के बहुमत वर्ग में एक कक्षा घोषणा जोड़ देगा। आईपीथन में कोड निष्पादित किया गया है।

from sklearn.datasets import load_iris 
from sklearn import tree 
iris = load_iris() 
clf2 = tree.DecisionTreeClassifier() 
clf2 = clf2.fit(iris.data, iris.target) 

with open("iris.dot", 'w') as f: 
    f = tree.export_graphviz(clf, out_file=f) 

import os 
os.unlink('iris.dot') 

import pydotplus 
dot_data = tree.export_graphviz(clf2, out_file=None) 
graph2 = pydotplus.graph_from_dot_data(dot_data) 
graph2.write_pdf("iris.pdf") 

from IPython.display import Image 
dot_data = tree.export_graphviz(clf2, out_file=None, 
        feature_names=iris.feature_names, 
        class_names=iris.target_names, 
        filled=True, rounded=True, # leaves_parallel=True, 
        special_characters=True) 
graph2 = pydotplus.graph_from_dot_data(dot_data) 

## Color of nodes 
nodes = graph2.get_node_list() 

for node in nodes: 
    if node.get_label(): 
     values = [int(ii) for ii in node.get_label().split('value = [')[1].split(']')[0].split(',')]; 
     color = {0: [255,255,224], 1: [255,224,255], 2: [224,255,255],} 
     values = color[values.index(max(values))]; # print(values) 
     color = '#{:02x}{:02x}{:02x}'.format(values[0], values[1], values[2]); # print(color) 
     node.set_fillcolor(color) 
# 

Image(graph2.create_png()) 

enter image description here

पत्ती में वर्ग का निर्धारण करने, अपने उदाहरण एक भी वर्ग के साथ पत्ते नहीं है का सवाल है, आईरिस डेटा सेट करता है। यह आम है और इस तरह के परिणाम प्राप्त करने के लिए मॉडल को अधिक उपयुक्त बनाने की आवश्यकता हो सकती है। कक्षाओं का एक अलग वितरण कई क्रॉस-मान्य मॉडलों के लिए सबसे अच्छा परिणाम है।

कोड का आनंद लें!

संबंधित मुद्दे