प्रस्तुत समस्या को हल करने का वास्तविक नुस्खा (एक संभावित समाधान)
यह मेरे पसंदीदा मशीन-लर्निंग टूल का उपयोग करके इस समस्या को हल करने के लिए सीधा-सीधा है, vowpal wabbit जो अपने -q विकल्प के माध्यम से द्विघात (क्रॉस) सुविधाओं का समर्थन करता है।
vowpal wabbit पृष्ठभूमि
उपयोग विवरण में कूदने से पहले। vowpal wabbit वर्गीकरण और प्रतिगमन दोनों के लिए एक तेज़ और स्केलेबल ऑनलाइन मशीन-लर्निंग सॉफ़्टवेयर है। मुझे अपने डेस्कटॉप पर प्रति सेकंड लगभग 5 मिलियन सुविधाओं के सीखने (प्रशिक्षण) की दर मिलती है, क्योंकि ऑनलाइन लर्निंग टूल के रूप में इसकी कोई सीमा नहीं है क्योंकि ऑनलाइन लर्निंग टूल के रूप में इसे पूरे डेटा को मेमोरी में लोड करने की आवश्यकता नहीं है। इसकी कई अन्य आकर्षक विशेषताएं हैं: विभिन्न शिक्षण एल्गोरिदम, कई नुकसान कार्यों, विरल सुविधाओं, मिश्रित सुविधा प्रकार, और अधिक के लिए समर्थन, जो इस प्रश्न के दायरे से परे हैं।
टिप्पणी के साथ समस्या को हल करने के लिए यहां 3 चरण दिए गए हैं:
चरण ०: गितुब से स्वर चौपाई डाउनलोड करें और बनाएँ (समर्थित वातावरण पर नीचे ध्यान दें)
चरण 1: एक प्रशिक्षण-सेट तैयार करें जहाँ प्रत्येक पंक्ति इस तरह दिखती है:
1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...
प्रशिक्षण-सेट प्रारूप की व्याख्या:
सबसे बाईं ओर, 1.0 , लेबल है (इंटरैक्शन स्ट्रेंथ, जो किसी भी संख्यात्मक मान हो सकता है), दूसरी स्ट्रिंग ' प्रोटीन 1 / प्रोटीन 2 ' लाइन को पहचान देने के लिए एक टैग है, आईओडब्ल्यू: "यह लाइन प्रोटीन 1 और के बीच बातचीत का प्रतिनिधित्व करती है। protein2 "; यह वैकल्पिक है, और आप इसे टिप्पणी के रूप में सोच सकते हैं। यह टैग-स्ट्रिंग मॉडल से भविष्यवाणियों में भी प्रतिध्वनित होता है कि कौन सी भविष्यवाणी किस उदाहरण से संबंधित है, यह पहचानने के लिए, लेकिन हम यहां भविष्यवाणी नहीं कर रहे हैं, हम सिर्फ मॉडलिंग कर रहे हैं और हमारे मॉडल का अध्ययन कर रहे हैं। इसके बाद प्रोटीन 1 के लिए इनपुट फीचर नाम का स्थान आता है |A
(हमें एक नाम-स्थान को परिभाषित करने की आवश्यकता है ताकि हम विभिन्न नाम-स्थानों के बीच पार कर सकें, यह नहीं हैA
, वास्तव में कोई भी शब्द हो सकता है, लेकिन पहले अक्षर में नाम रिक्त स्थान के बीच अंतर होना चाहिए ताकि हम उन्हें कमांड कॉल में पार कर सकें) प्रोटीन 1 के लिए इनपुट सुविधाओं की सूची के बाद p1_...
। अंतिम में प्रोटीन 2 के लिए नाम-स्थान आता है: प्रोटीन 2 |B
के फीचर-नामों के बाद p2_...
।
वॉवेल वॉबिट की सुंदरियों में से एक यह है कि आप फीचर नामों के लिए मनमाने तार का उपयोग कर सकते हैं (यह उन्हें आंतरिक रूप से हैश नहीं करेगा, लेकिन आप परवाह नहीं करते हैं)। प्रशिक्षण सेट में केवल विशेष वर्ण हैं:
- रिक्त स्थान (स्पष्ट रूप से)
|
, इनपुट सुविधाओं और नाम-स्थानों को उपसर्ग करने के लिए, और
:
सुविधा-नामों को उनके मूल्यों से अलग करने के लिए
यहां :
इसका उपयोग नहीं किया गया है, क्योंकि हम मानते हैं कि प्रत्येक प्रोटीन सुविधा नाम एक बूलियन (अस्तित्व) का प्रतिनिधित्व करता है, इसलिए उनके मान डिफ़ॉल्ट होते हैं 1
और उन्हें स्पष्ट मूल्यों की आवश्यकता नहीं होती है।
अब आप vowpal_wabbit (निष्पादन योग्य नाम है चला सकते हैं vw
) के साथ -q AB
सभी के बीच क्रॉस-सुविधाओं (बातचीत शर्तों उर्फ) जहां एक सुविधा से चयन किया जाता है सुविधाओं में से संभव जोड़े ऑटो बनाने के लिए protein1 (नाम अंतरिक्ष के साथ शुरू A
) और से अन्य protein2 ( नाम-स्थान के साथ शुरू B
)। vowpal_wabbit डेटा को पढ़ेगा, सीखेगा और प्रत्येक फीचर संयोजन के लिए वजन के साथ एक मॉडल तैयार करेगा, जिसके परिणामस्वरूप प्रोटीन की जोड़ी के बीच कुछ इंटरैक्शन होता है। यहां, vw
सीधे चलने के बजाय , हम इसे vw-varinfo
रैपर उपयोगिता के माध्यम से चलाएंगे , जो कि हमारे अंतिम चरण के रूप में, वॉवपाल वैबिट के साथ आता है। मॉडल बनाने के लिए vw-varinfo
चलाता vw
है, और मानव-पठनीय रूप में मॉडल को डंप करता है।
चरण 3: कॉल vw-varinfo इस तरह:
vw-varinfo -q AB -c --passes 20 your_data_set_file
vw-varinfo सभी विकल्पों ( -q ... -c --passes ...
) को पास करना है vw
। केवल -q AB
दो फीचर नाम-रिक्त स्थान को पार करने के लिए आवश्यक है। मैंने ऊपर एक और विकल्प जोड़ा (एकाधिक पास चलाएं), जो मुझे लगता है कि बेहतर परिणाम देगा।
यह कमांड vw
डेटा सेट पर प्रशिक्षण देने के लिए वॉवेल वैबबिट ( ) को कॉल करेगा , और आउटपुट को प्रिंट करेगा जो मुझे लगता है कि आप देख रहे हैं: ताकत और उनके सापेक्ष भार के क्रम में सभी फीचर इंटरैक्शन।
उदाहरण इनपुट और आउटपुट
मान लीजिए कि आपके इनपुट में, prot.dat
3 प्रोटीनों के बीच 3-तरफ़ा बातचीत शामिल है:
1.0 protein1/protein2|A a b |B k m
0.6 protein2/protein3|A k m |B b c d
2.2 protein1/protein3|A a b |B b c d
यह जानबूझकर बहुत ही न्यूनतर उदाहरण है। vw
बहुत बड़े डेटा-सेट्स (जैसे लाखों पंक्तियों, सैकड़ों विशेषताओं) के साथ कोई समस्या नहीं होनी चाहिए, साथ ही, मैं उदाहरणों में इंटरैक्शन-ताकत लेबल को विविध करता हूं। यदि आपके मामले में इंटरैक्शन एक बूलियन "हां" या "नहीं" है, तो बस प्रत्येक पंक्ति में 1 फ़ील्ड के रूप में उपयोग करें 0
(कोई इंटरैक्शन नहीं) या 1
(इंटरैक्शन मौजूद है)।
चल रहा है:
vw-varinfo -q AB -c --passes 20 prot.dat
सभी संभावित इंटरैक्शन (नाम-स्थान A
और B
आउटपुट को अनदेखा करें ) और उनके वजन को प्राप्त करेंगे:
FeatureName HashVal MinVal MaxVal Weight RelScore
A^k 220268 0.00 1.00 +0.3804 100.00%
A^k^B^k 254241 0.00 0.00 +0.3804 100.00%
A^k^B^m 93047 0.00 0.00 +0.3804 100.00%
B^k 178789 0.00 1.00 +0.1011 26.58%
B^m 17595 0.00 1.00 +0.1011 26.58%
[... trimmed for brevity ...]
A^m^B^m 141879 0.00 0.00 +0.0000 0.00%
Constant 116060 0.00 0.00 +0.1515 0.00%
A^b 139167 0.00 1.00 -0.0641 -16.86%
A^b^B^k 204424 0.00 0.00 -0.1233 -32.43%
A^b^B^m 43230 0.00 0.00 -0.1233 -32.43%
यह दिखाते हुए कि इस डेटा में सामान्य रूप से किसी भी इंटरैक्शन का सबसे मजबूत योगदानकर्ता हैं 1) सुविधा की मात्र उपस्थिति k
, 2) k
फीचर खुद के साथ इंटरैक्ट कर रहा है (यह मानते हुए कि दोनों प्रोटीन हैं), और 3) k
के साथ इंटरैक्ट कर रहा है m
। जबकि सबसे कमजोर (प्रोटीन बातचीत में नकारात्मक योगदान) b
सुविधा के साथ जोड़ा जाता m
है।
यहाँ vw-varinfo पर एक HOWTO पेज है
vowpal wabbit स्रोत से बनाता है (ऊपर लिंक देखें) और लिनक्स (और संभवतः अन्य यूनिक्स), मैक ओएस-एक्स और विंडोज पर चलता है।
HTH