जबकि कोई एक उदाहरण के साथ नकारात्मक साबित नहीं कर सकता। फिर भी मुझे लगता है कि एक उदाहरण विचारोत्तेजक होगा; और शायद उपयोगी है। और यह दिखाता है कि कोई व्यक्ति ऐसी ही समस्याओं को कैसे हल करेगा (करने का)।
मामले की में
मैं विशेषताएं है कि द्विआधारी वैक्टर हैं का उपयोग कर बाइनरी अनुमान लगाने के लिए, चाहते हैं , एक यादृच्छिक वन एक ठोस विकल्प है। मुझे लगता है कि इस तरह के जवाब आपके सवाल का दूसरा हिस्सा है: एक अच्छा एल्गोरिथ्म क्या है।
हम SHA256 स्ट्रिंग्स को बाइनरी (बुलियन) वैक्टर में प्रीप्रोसेस करना चाहते हैं, क्योंकि प्रत्येक बिट सांख्यिकीय रूप से स्वतंत्र है, इस प्रकार प्रत्येक बिट एक अच्छी विशेषता है। तो यह हमारे इनपुट को 256 एलिमेंट बूलियन वैक्टर बना देगा।
डेमो
यहाँ यह प्रदर्शित किया गया है कि कैसे जूलिया डिसिजनट्री.ज्ल लाइब्रेरी का उपयोग करके पूरे काम को किया जा सकता है ।
आप नीचे दिए गए पेस्ट को जूलिया प्रॉम्प्ट में कॉपी कर सकते हैं।
using SHA
using DecisionTree
using Statistics: mean
using Random: randstring
const maxlen=10_000 # longest string (document) to be hashed.
gen_plaintext(x) = gen_plaintext(Val{x}())
gen_plaintext(::Val{true}) = "1" * randstring(rand(0:maxlen-1))
gen_plaintext(::Val{false}) = randstring(rand(1:maxlen))
bitvector(x) = BitVector(digits(x, base=2, pad=8sizeof(x)))
bitvector(x::AbstractVector) = reduce(vcat, bitvector.(x))
function gen_observation(class)
plaintext = gen_plaintext(class)
obs = bitvector(sha256(plaintext))
obs
end
function feature_mat(obs)
convert(Array, reduce(hcat, obs)')
end
########################################
const train_labels = rand(Bool, 100_000)
const train_obs = gen_observation.(train_labels)
const train_feature_mat = feature_mat(train_obs)
const test_labels = rand(Bool, 100_000)
const test_obs = gen_observation.(test_labels)
const test_feature_mat = feature_mat(test_obs)
# Train the model
const model = build_forest(train_labels, train_feature_mat)
@show model
#Training Set accuracy:
@show mean(apply_forest(model, train_feature_mat) .== train_labels)
#Test Set accuracy:
@show mean(apply_forest(model, test_feature_mat) .== test_labels)
परिणाम
जब मैंने यह किया, तो 10,000 तक की लंबाई के 100,000 यादृच्छिक ASCII तार पर प्रशिक्षण। ये परिणाम मैंने देखे:
मॉडल को प्रशिक्षित करें
julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees: 10
Avg Leaves: 16124.7
Avg Depth: 17.9
प्रशिक्षण सेट सटीकता:
julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162
टेस्ट सेट सटीकता:
julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016
विचार-विमर्श
तो वह मूल रूप से कुछ भी नहीं है। हम प्रशिक्षण सेट पर 95% से चले गए, परीक्षण सेट पर मुश्किल से 50% से अधिक। कोई उचित परिकल्पना परीक्षण लागू कर सकता है, यह देखने के लिए कि क्या हम अशक्त
परिकल्पना को अस्वीकार कर सकते हैं , लेकिन मुझे पूरा यकीन है कि हम नहीं कर सकते। यह अनुमान दर पर थोड़ा सुधार है।
इससे पता चलता है कि यह सीखा नहीं जा सकता। यदि एक रैंडम फ़ॉरेस्ट, केवल अनुमानित दर से टकराने के लिए अच्छी तरह से फिट हो सकता है। रैंडम फॉरेस्ट मुश्किल इनपुट्स सीखने में काफी सक्षम हैं। अगर कुछ सीखने को मिलता, तो मैं कम से कम कुछ प्रतिशत की उम्मीद करता।
आप कोड को बदलकर विभिन्न हैश कार्यों के साथ खेल सकते हैं। यह दिलचस्प हो सकता है कि अंतर्निहित hash
फ़ंक्शन में जूलिया का उपयोग करते समय मुझे मूल रूप से समान परिणाम मिले (जो कि क्रिप्टोग्राफिक रूप से सुरक्षित hsah नहीं है, लेकिन फिर भी एक अच्छा हैश है इसलिए वास्तव में इसी तरह के तार भेजना चाहिए)। मैं भी मूल रूप से के लिए एक ही परिणाम मिला है CRC32c
।