18

स्थिति:प्रशिक्षण TensorFlow

मैं बेहतर TensorFlow का उपयोग कैसे करें जब मेरे प्रशिक्षण डेटा 2 लेबल के बीच लेबल वितरण में असंतुलित है सोच रहा हूँ। उदाहरण के लिए, मान लें कि MNIST tutorial केवल 1 और 0 के बीच अंतर करने के लिए सरलीकृत है, जहां हमारे लिए उपलब्ध सभी छवियां या तो 1 या 0 है। यह उपलब्ध टेंसरफ्लो ट्यूटोरियल का उपयोग करके ट्रेन करने के लिए सीधा है जब हमारे पास प्रशिक्षित करने और परीक्षण करने के लिए प्रत्येक प्रकार की छवि का लगभग 50% हिस्सा होता है। लेकिन इस मामले के बारे में क्या है जहां हमारे डेटा में उपलब्ध 90% छवियां 0 हैं और केवल 10% 1 हैं? मैं देखता हूं कि इस मामले में, टेंसरफ्लो नियमित रूप से मेरे पूरे टेस्ट सेट को 0 के होने की भविष्यवाणी करता है, जो अर्थहीन 90% की सटीकता प्राप्त करता है।

एक ऐसी रणनीति जिसे मैंने कुछ सफलता के लिए उपयोग किया है वह प्रशिक्षण के लिए यादृच्छिक बैच चुनना है जिसमें 0 और 1 का वितरण भी हो। यह दृष्टिकोण सुनिश्चित करता है कि मैं अभी भी अपने सभी प्रशिक्षण डेटा का उपयोग कर सकता हूं और 9 0% से कम सटीकता के साथ सभ्य परिणाम उत्पन्न कर सकता हूं, लेकिन एक और अधिक उपयोगी वर्गीकरणकर्ता। चूंकि इस मामले में सटीकता मेरे लिए कुछ हद तक बेकार है, इसलिए मेरी पसंद का मीट्रिक आम तौर पर आरओसी वक्र (एयूआरओसी) के तहत क्षेत्र होता है, और यह परिणाम 50 से अधिक सम्मानित करता है।

सवाल:

(1) रणनीति मैं असंतुलित डेटा पर प्रशिक्षण का एक स्वीकार किए जाते हैं या इष्टतम तरीका का वर्णन किया है, या वहाँ एक है कि बेहतर काम कर सकते हैं है?

(2) चूंकि सटीकता मीट्रिक असंतुलित डेटा के मामले में उतना उपयोगी नहीं है, क्या कोई और मीट्रिक है जिसे लागत कार्य को बदलकर अधिकतम किया जा सकता है? मैं निश्चित रूप से AUROC पोस्ट-ट्रेनिंग की गणना कर सकता हूं, लेकिन क्या मैं AUROC को अधिकतम करने के लिए इस तरह से ट्रेन कर सकता हूं?

(3) क्या असंतुलित डेटा के लिए मेरे परिणामों को बेहतर बनाने के लिए मैं अपने लागत समारोह में कुछ और बदलाव कर सकता हूं? वर्तमान में, मैं एक डिफ़ॉल्ट सुझाव TensorFlow ट्यूटोरियल में दी गई उपयोग कर रहा हूँ:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

मैं इस अप-भार छोटे लेबल वर्ग miscategorizing की लागत से संभव हो सकता है सुना है, लेकिन मैं ऐसा करने के तरीके को लेकर अनिश्चित हूं।

+0

आप अपनी समस्या हल है? मुझे एक समान समस्या है और मैं वर्तमान में प्रयोग कर रहा हूं ए) छुपा 1 पर ड्रॉपआउट 50%, बी) हानि पर एल 2 नियमितकरण और सी) सबसे प्रमुख 90% वर्ग को हटाकर और 10% समान रूप से वितरित कक्षाओं के साथ गणना करना। – Frank

+0

मुझे यादृच्छिक बैचों लेने से बेहतर समाधान नहीं मिला। व्यावहारिकता के लिए, मैंने विज्ञान-सीखने में लागू पेड़-आधारित तरीकों के पक्ष में पूरी तरह से तंत्रिका जाल छोड़ दिया। यहां, अंतर्निहित क्रॉस-सत्यापन विधियां हैं जो AUROC पर अनुकूलित कर सकती हैं जो असंतुलन समस्या को खूबसूरती से हल करती है। वे टेंसरफ्लो से भी तेज़ी से दौड़ते हैं क्योंकि मेरे पास बहुत सी सीपीयू हैं लेकिन कोई GPU नहीं है। – MJoseph

उत्तर

5

(1) अपनी रणनीति का उपयोग करना ठीक है। मैं असंतुलित डेटा के साथ भी काम कर रहा हूं, जिसे मैं प्रशिक्षण सेट को भी वितरित करने के लिए पहले डाउन-नमूनाकरण और अप-नमूनाकरण विधियों का उपयोग करने का प्रयास करता हूं। या एक वर्गीकृत सबसेट के साथ प्रत्येक वर्गीकृत को प्रशिक्षित करने के लिए ensemble विधि का उपयोग कर।

(2) मैंने AUROC को अधिकतम करने के लिए कोई विधि नहीं देखी है। मेरा विचार यह है कि एयूआरओसी सकारात्मक सकारात्मक दर और झूठी सकारात्मक दर पर आधारित है, जो यह नहीं बताता कि यह प्रत्येक उदाहरण पर कितनी अच्छी तरह से काम करता है। इस प्रकार, यह कक्षाओं को अलग करने की क्षमता को अधिकतम रूप से अधिकतम नहीं कर सकता है।

(3) कक्षा के उदाहरणों के अनुपात से लागत भारित करने के संबंध में, यह Loss function for class imbalanced binary classifier in Tensor flow और उत्तर के समान है।

2

1) हां। असंतुलित डेटा का सामना करने के लिए यह अच्छी तरह से प्राप्त रणनीति है। लेकिन अगर आप एसजीडी का उपयोग करते हैं तो यह रणनीति न्यूरल नेट्स में ही अच्छी है।

प्रशिक्षण डेटा को संतुलित करने का एक और आसान तरीका भारित उदाहरणों का उपयोग कर रहा है। असंतुलित उदाहरणों को देखते समय प्रति-बड़े पैमाने पर हानि को बड़े वजन/छोटे से बढ़ाएं। यदि आप ऑनलाइन ढाल वाले वंश का उपयोग करते हैं, तो असंतुलित उदाहरण देखते समय यह एक बड़ी/छोटी सीखने की दर का उपयोग करने जितना आसान हो सकता है।

सुनिश्चित नहीं हैं कि के बारे में 2.

4

मैं एक है जो असंतुलित डेटा के साथ संघर्ष कर रहा हूँ। असंतुलित डेटा का मुकाबला करने की मेरी रणनीति नीचे दी गई है।

1) नीचे की तरह एक ही समय में 0 और 1 लेबल की गणना करने वाले लागत फ़ंक्शन का उपयोग करें।

cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(_pred) + (1-y)*tf.log(1-_pred), reduction_indices=1)) 

2) SMOTE, oversampling विधि 0 और 1 लेबल समान बनाने की विधि का उपयोग करें। यहां देखें, http://comments.gmane.org/gmane.comp.python.scikit-learn/5278

जब मैंने क्रेडिट रेटिंग मॉडल बनाने की कोशिश की तो दोनों रणनीतियां काम करती थीं।

लॉजिस्टिक रिग्रेशन असंतुलित डेटा और बाइनरी वर्गीकरण को संभालने के लिए सामान्य विधि है जैसे डिफ़ॉल्ट दर की भविष्यवाणी करना। असुरक्षित डेटा का सामना करने के लिए AUROC सबसे अच्छा मीट्रिक है।

1

असंतुलित डेटासेट के संबंध में, दिमाग में आने वाली पहली दो विधियां हैं (सकारात्मक नमूने ऊपर उठाना, संतुलित बैच वितरण प्राप्त करने के लिए नमूनाकरण)।

Upweighting सकारात्मक नमूने यह misclassified सकारात्मक नमूने का घाटा बढ़ रही है जब डेटासेट कि बहुत कम सकारात्मक नमूने पर प्रशिक्षण को दर्शाता है। यह सकारात्मक नमूने के लिए बेहतर पैरामीटर सीखने के लिए एमएल एल्गोरिदम को प्रोत्साहित करता है। बाइनरी वर्गीकरण के लिए, tensorflow में एक साधारण एपीआई है जो इसे प्राप्त करती है। (Weighted_cross_entropy) देखें नीचे

बैच का नमूना लेना यह डेटासेट नमूने ताकि प्रशिक्षण डेटा के प्रत्येक बैच नकारात्मक नमूने के लिए एक और भी वितरण सकारात्मक नमूने है शामिल है संदर्भित किया है। यह tensorflow से प्रदान किए गए रिजेक्शन नमूना एपीआई का उपयोग करके किया जा सकता है।