ในขณะที่หนึ่งไม่สามารถพิสูจน์การลบด้วยตัวอย่าง แต่ถึงกระนั้นฉันก็รู้สึกว่าตัวอย่างจะมีการชี้นำ; และอาจมีประโยชน์ และมันแสดงให้เห็นว่าคน ๆ หนึ่งจะพยายามแก้ปัญหาที่คล้ายกันอย่างไร
ในกรณีที่
ฉันต้องการทำนายแบบไบนารี่โดยใช้คุณสมบัติที่เป็นเวกเตอร์ไบนารี่ Random Forest เป็นตัวเลือกที่ดี ฉันเดาคำตอบแบบนี้ในส่วนที่สองของคำถามของคุณ: อัลกอริทึมที่ดีคืออะไร
เราต้องการประมวลผลสตริง SHA256 ล่วงหน้าเป็นเวกเตอร์ไบนารี (บูลีน) เนื่องจากแต่ละบิตมีความเป็นอิสระทางสถิติดังนั้นแต่ละบิตจึงเป็นคุณสมบัติที่ดี นั่นจะทำให้อินพุตของเราเป็น 256 องค์ประกอบบูลีนเวกเตอร์
การสาธิต
นี่คือการสาธิตว่าสามารถทำสิ่งทั้งหมดได้อย่างไรโดยใช้ห้องสมุดJulia DecisionTree.jl
คุณสามารถคัดลอกวางด้านล่างลงในพรอมต์ julia
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)
ผล
เมื่อฉันทำสิ่งนี้การฝึกอบรมกับสตริง ASCII แบบสุ่มที่มีความยาวสูงสุด 10,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% ในชุดทดสอบ บางคนสามารถใช้การทดสอบสมมติฐานที่เหมาะสมเพื่อดูว่าเราสามารถปฏิเสธ
สมมติฐานว่างได้หรือไม่ แต่ฉันค่อนข้างมั่นใจว่าเราไม่สามารถทำได้ มันเป็นการปรับปรุงเล็กน้อยในเรื่องอัตราการคาดเดา
นั่นแสดงว่าไม่สามารถเรียนรู้ได้ หากสุ่มป่าสามารถไปได้ดีจากอัตราการคาดเดา ป่าสุ่มมีความสามารถในการเรียนรู้อินพุตยาก หากมีสิ่งที่ต้องเรียนรู้ฉันคาดหวังอย่างน้อยสองสามเปอร์เซ็นต์
คุณสามารถเล่นกับฟังก์ชั่นแฮชที่แตกต่างกันโดยการเปลี่ยนรหัส ซึ่งอาจเป็นที่น่าสนใจฉันได้ผลลัพธ์เดียวกันโดยทั่วไปเมื่อใช้ julia ในhash
ฟังก์ชันที่สร้างขึ้น(ซึ่งไม่ใช่ hsah ที่ปลอดภัยแบบเข้ารหัส แต่ยังคงเป็นแฮชที่ดีดังนั้นควรส่งสตริงที่คล้ายกันออกไปอย่างแน่นอน) CRC32c
ฉันยังมีพื้นผลเดียวกัน