Bir örnek ile olumsuz bir kanıtlamak olamaz iken. Yine de bir örneğin düşündürücü olacağını düşünüyorum; ve belki de faydalıdır. Ve bu, benzer problemleri nasıl çözeceğini (denediğini) gösterir.
Durumunda
İkili vektörler olan özelliklerini kullanarak, ikili tahminler yapmak istiyorum , bir Rastgele Orman sağlam bir seçimdir. Sanırım bu tür soruların ikinci kısmına cevap veriyor: iyi bir algoritma nedir.
Her bit istatistiksel olarak bağımsız olduğu için SHA256 dizgilerini ikili (Boolean) vektörlere önceden işlemek istiyoruz, bu nedenle her bit iyi bir özelliktir. Bu da girdilerimizi 256 element boolean vektör yapacaktır.
gösteri
Julia DecisionTree.jl kütüphanesi kullanılarak her şeyin nasıl yapılabileceğinin bir gösterimi .
Aşağıdakileri julia komut istemine yapıştırabilirsiniz.
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)
Sonuçlar
Bunu yaptığımda, 10.000'e kadar uzunluktaki 100.000 rastgele ASCII dizisi üzerinde eğitim aldım. İşte gördüğüm sonuçlar:
Modeli eğitmek
julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees: 10
Avg Leaves: 16124.7
Avg Depth: 17.9
Eğitim Seti doğruluğu:
julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162
Test Seti doğruluğu:
julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016
Tartışma
Yani bu temelde bir şey değil. Eğitim setinde% 95'ten, test setinde ise% 50'nin üzerine çıktık. Birileri boş
hipotezi reddedebilir miyiz diye görmek için uygun hipotez testleri uygulayabilir , ancak yapamayacağımızdan eminim. Tahmin oranı üzerinde küçük bir gelişmedir.
Bu öğrenilemeyeceğini gösteriyor. Eğer bir Rastgele Orman, tam tahminden sadece tahmin oranına vurarak geçebilir. Rastgele Ormanlar oldukça zor girdileri öğrenebiliyor. Öğrenecek bir şey olsaydı, en azından yüzde birkaç beklerdim.
Kodu değiştirerek farklı karma işlevleriyle uğraşabilirsiniz. hash
Asıl ilginç olan, julia'yı yerleşik işlevde kullanırken temelde aynı sonuçları aldım (ki bu kriptografik olarak güvenli bir hsah değil, ama yine de iyi bir karma. Ayrıca temelde aynı sonuçları aldım CRC32c
.