যদিও কেউ উদাহরণ সহ নেতিবাচক প্রমাণ করতে পারে না। তবুও আমি অনুভব করি যে একটি উদাহরণ উপকারী হবে; এবং সম্ভবত দরকারী। এবং এটি দেখায় যে কেউ কীভাবে অনুরূপ সমস্যাগুলি সমাধান করার চেষ্টা করবে।
মামলার সালে
আমি বৈশিষ্ট্য বাইনারি ভেক্টর হয় ব্যবহার বাইনারি ভবিষ্যৎবাণী করার চান , একটি র্যান্ডম বন একটি কঠিন পছন্দ। আমি এই ধরণের উত্তরগুলি আপনার প্রশ্নের দ্বিতীয় অংশে অনুমান করি: একটি ভাল অ্যালগরিদম কী।
আমরা ভালভাবে SHA256 স্ট্রিংগুলিকে বাইনারি (বুলিয়ান) ভেক্টরগুলিতে প্রিপ্রোসেস করতে চাই, কারণ প্রতিটি বিট পরিসংখ্যানগতভাবে স্বতন্ত্র, সুতরাং প্রতিটি বিট একটি ভাল বৈশিষ্ট্য। সুতরাং এটি আমাদের ইনপুটগুলিকে 256 উপাদান বুলিয়ান ভেক্টর তৈরি করবে।
ডেমো
জুলিয়া ডিসিশনট্রি.জেএল লাইব্রেরি ব্যবহার করে কীভাবে পুরো জিনিসটি করা যায় তা এখানে একটি বিক্ষোভ রয়েছে is
জুলিয়া প্রম্পটে নীচের পেস্টটি অনুলিপি করতে পারেন।
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,000 দৈর্ঘ্যের এএসসিআইআই স্ট্রিংয়ের উপর 10,000,000 এর প্রশিক্ষণ। আমি দেখেছি ফলাফল এখানে:
মডেল প্রশিক্ষণ
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
যা বিলিয়া ফাংশনটিতে জুলিয়া ব্যবহার করার সময় আমি মূলত একই ফলাফল পেয়েছি (এটি কোনও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত এইচএসএ নয়, তবে এটি এখনও একটি ভাল হ্যাশ তাই সত্যই একই ধরণের স্ট্রিংগুলি আলাদাভাবে পাঠানো উচিত)। আমিও মূলত একই ফলাফল পেয়েছি CRC32c
।