मुझे 100% सटीकता का निर्णय पेड़ क्यों मिलता है?


38

मुझे अपने निर्णय वृक्ष के लिए 100% सटीकता मिल रही है। मैं क्या गलत कर रहा हूं?

यह मेरा कोड है:

import pandas as pd
import json
import numpy as np
import sklearn
import matplotlib.pyplot as plt


data = np.loadtxt("/Users/Nadjla/Downloads/allInteractionsnum.csv", delimiter=',')


x = data[0:14]
y = data[-1]


from sklearn.cross_validation import train_test_split

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]


from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(x_train.astype(int), y_train.astype(int))


from sklearn.metrics import accuracy_score

y_predicted = tree.predict(x_test.astype(int))
accuracy_score(y_test.astype(int), y_predicted)

4
आपको क्यों लगता है कि आप कुछ गलत कर रहे हैं? शायद आपका डेटा ऐसा है कि आप एक उत्तम
वर्गीकरण

64
संयोग से, +1 यह सोचकर कि क्या 100% सटीकता के साथ कुछ गलत है। अभी तक बहुत से लोगों को लगता है कि उनका मॉडल बहुत अच्छा है ...
एस। कोलासा - मोनिका

1
R में एक डेटासेट को दो समूहों में विभाजित करने के लिए, एक प्रशिक्षण डेटा के लिए और दूसरा डेटा के परीक्षण के लिए स्वचालित रूप से विभाजित करने के लिए एक पैकेज (कैरेट) है। मैं डेटा विभाजन के रूप में प्रक्रिया को कॉल करता हूं। मेरा मानना ​​है कि पाइथन में एक समान पैकेज है ताकि डेटा विभाजन भी प्राप्त किया जा सके।
अनस्तासिया-रोमानोवा

उपयोगी पृष्ठभूमि पढ़ना: एमएल में आम नुकसान
3

3
@ अनास्तासिया-रोमनोवा much बहुत अधिक हर गंभीर एमएल लाइब्रेरी में यह कार्यक्षमता शामिल है, जिसमें ओपी द्वारा उपयोग किया जाता है (ओपी ने प्रासंगिक कार्यक्षमता भी आयात की है, और बस किसी कारण से इसका उपयोग नहीं किया है)।
कोनराड रुडोल्फ

जवाबों:


79

आपका परीक्षण नमूना आपके प्रशिक्षण नमूने का सबसेट है:

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]

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

सुनिश्चित करें कि आपका प्रशिक्षण और आपका परीक्षण डेटा, जैसे,

x_train = x[659:2635]
x_test = x[0:658]
y_train = y[659:2635]
y_test = y[0:658]

2
इसका उपयोग करना बेहतर होगा sklearn.model_selection.train_test_splitक्योंकि जुआन इग्नासियो गिल सुझाव देते हैं क्योंकि यह सेट को फेरबदल भी करता है और अगर ऑर्डर करने में डेटा गैर-यादृच्छिक है, तो चिंताओं से बचा जाता है। यह भी स्पष्ट है क्योंकि यह इरादा दिखाता है, और स्वचालित रूप से डेटासेट के आकार में परिवर्तन को संभालता है।
जैक एडले

1
@ जैकेअडली: मैं सहमत हूं (और कुछ दिन पहले जुआन के जवाब को गलत ठहराया )। रैंडम नंबर सीड सेट करके डिबगिंग के लिए स्प्लिट डिसेंट्रिस्टिक बनाना भी बेहतर होगा ।
एस। कोलासा - मोनिका

@StephanKolassa हाय, मैं आइरिस डेटासेट के साथ जुड़ रहा हूं, और GridSearchCVप्रशिक्षण डेटा के साथ उपयोग करने के बाद , सटीकता का परीक्षण करने के लिए मुझे 100% मिलता है KNeighborsClassifier। मैंने test_train_splitडेटासेट को विभाजित करने के लिए उपयोग किया है । मैं यहाँ क्या गलत कर सकता था?
Sndn

19

आप 100% सटीकता प्राप्त कर रहे हैं क्योंकि आप परीक्षण के लिए प्रशिक्षण डेटा के एक भाग का उपयोग कर रहे हैं। प्रशिक्षण के समय, निर्णय वृक्ष ने उस डेटा के बारे में ज्ञान प्राप्त किया, और अब यदि आप भविष्यवाणी करने के लिए समान डेटा देते हैं तो यह बिल्कुल वैसा ही मूल्य देगा। इसीलिए हर बार निर्णय लेने वाले पेड़ सही परिणाम देते हैं।

किसी भी मशीन सीखने की समस्या के लिए, प्रशिक्षण और परीक्षण डेटासेट को अलग किया जाना चाहिए। मॉडल की सटीकता का निर्धारण केवल तभी किया जा सकता है जब हम जांचते हैं कि यह अज्ञात मूल्यों के लिए कैसे भविष्यवाणी कर रहा है।


17

जैसा कि अन्य उपयोगकर्ताओं ने आपको बताया है, आप परीक्षण सेट को ट्रेन सेट के सबसेट के रूप में उपयोग कर रहे हैं, और एक निर्णय पेड़ को ओवरफिटिंग होने का खतरा है।

जब आपने आयात किया था तब आपके पास लगभग था

from sklearn.cross_validation import train_test_split

लेकिन तब आप फ़ंक्शन का उपयोग नहीं करते हैं। आपको करना चाहिए था:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)

यादृच्छिक ट्रेन और परीक्षण सेट प्राप्त करने के लिए


2

जैसा कि @Stephan Kolassa और @Sanjay Chandlekar ने बताया, यह इस तथ्य के कारण है कि आपका परीक्षण नमूना आपके प्रशिक्षण नमूने का सबसेट है।

हालांकि, उन नमूनों के चयन के लिए, यादृच्छिक नमूनाकरण यह सुनिश्चित करने के लिए अधिक उपयुक्त होगा कि दोनों नमूने प्रतिनिधि हैं। आपकी डेटा संरचना के आधार पर, आप स्तरीकृत यादृच्छिक नमूने पर भी विचार कर सकते हैं।

मैं अजगर में धाराप्रवाह नहीं हूं, लेकिन किसी भी सांख्यिकीय सॉफ्टवेयर को यादृच्छिक नमूने की अनुमति देनी चाहिए; कुछ संकेत एसओ पर भी उपलब्ध हैं ।


0

बस अंतर्ज्ञान पर झंकार करना चाहते हैं कि आपको प्रशिक्षण और परीक्षण के नमूनों को स्पष्ट रूप से विभाजित करने की आवश्यकता क्यों है।

यदि आपके पास अवलोकन हैं और अपने डेटा पर (वास्तव में, , और संभवतः बहुत कम) विभाजित करते हैं, तो आप हर बिंदु को पूरी तरह से वर्गीकृत करेंगे (यदि यह तुरंत स्पष्ट नहीं है, तो कुछ छोटे पैमाने के उदाहरण लिखें, उदाहरण के लिए, जैसे) , और खुद को मनाओ)।nnn1n=2

इसे ओवरफिटिंग कहा जाता है क्योंकि यह विभाजन प्रक्रिया उन डेटा बिंदुओं की अनुमानित होने की संभावना नहीं है जो आपकी समस्या के लिए प्रासंगिक हैं, लेकिन जिन्हें आपने अभी तक नहीं देखा है

बेशक इन भविष्यवाणी प्लेटफार्मों के निर्माण का पूरा बिंदु ऐसे उपकरण बनाना है, जिन्हें कभी भी पहले नहीं देखा गया डेटा पर लागू किया जा सकता है; हमारे पास प्रशिक्षण और परीक्षण के नमूनों में मौजूद डेटा को विभाजित करते हुए इस सेल्फ-ब्लाइंडिंग का अनुकरण करने और हमारे मॉडलों को उपरोक्त फैशन में ओवरफिटिंग से बचाने का प्रयास है।


0

आपको ओवरफिटिंग करने के लिए 100% सटीकता की आवश्यकता नहीं है। पर्याप्त बाल्टी के साथ, आप अपूरणीय परिणाम प्राप्त कर सकते हैं (ऐसा कुछ जो भयानक आउट-ऑफ-सैंपल दिखाई देगा)।

लैंसेट के इस अंश लेख को देखें, एक नमूने को बाल्टियों में काटने की विधि का वर्णन करते हुए जो बहुत दूर हैं। मुनचूसन के सांख्यिकीय ग्रिड यह XKCD कार्टून महत्वपूर्ण के लिए भी आधार है

100% सटीकता हासिल करना एक क्लासिफायर खोजने से बस कुछ ही कदम दूर है जो भ्रामक रूप से अच्छी तरह से काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.