Sementara seseorang tidak dapat membuktikan negatif dengan sebuah contoh. Namun saya merasa sebuah contoh akan memberi kesan; dan mungkin bermanfaat. Dan itu menunjukkan bagaimana seseorang akan (berusaha) memecahkan masalah yang sama.
Dalam kasus
saya ingin membuat prediksi biner, menggunakan fitur yang merupakan vektor biner , Hutan Acak adalah pilihan yang solid. Saya kira jawaban semacam ini bagian kedua dari pertanyaan Anda: apa itu algoritma yang baik.
Kami juga ingin memproses ulang string SHA256, menjadi vektor biner (Boolean), karena setiap bit secara statistik independen, sehingga setiap bit adalah fitur yang baik. Sehingga akan membuat input kita 256 elemen boolean vektor.
Demo
Berikut ini adalah demonstrasi tentang bagaimana semuanya dapat dilakukan menggunakan perpustakaan Julia DecisionTree.jl .
Anda dapat menyalin tempel di bawah ini ke dalam julia prompt.
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)
Hasil
Ketika saya melakukan ini, melatih 100.000 string ASCII acak hingga 10.000. Inilah hasil yang saya lihat:
Latih modelnya
julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees: 10
Avg Leaves: 16124.7
Avg Depth: 17.9
Ketepatan Pelatihan Set:
julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162
Akurasi Set Tes:
julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016
Diskusi
Jadi pada dasarnya itu bukan apa-apa. Kami naik dari 95% pada set pelatihan, menjadi hampir tidak lebih dari 50% pada set tes. Seseorang dapat menerapkan tes hipotesis yang tepat, untuk melihat apakah kita dapat menolak
hipotesis nol , tetapi saya cukup yakin kita tidak bisa. Ini adalah peningkatan kecil dari tingkat perkiraan.
Itu menunjukkan bahwa itu tidak dapat dipelajari. Jika Acak Hutan, bisa berubah dari pas untuk memukul hanya tingkat tebakan. Hutan Acak cukup mampu mempelajari input yang sulit. Jika ada sesuatu untuk dipelajari, saya harapkan setidaknya beberapa persen.
Anda dapat bermain-main dengan berbagai fungsi hash dengan mengubah kode. Yang bisa menarik, pada dasarnya saya mendapatkan hasil yang sama ketika menggunakan julia dalam hash
fungsi bawaan (yang bukan hsah yang aman secara kriptografis, tetapi masih merupakan hash yang baik sehingga memang harus mengirim string yang sama terpisah). Saya juga mendapat hasil yang sama pada dasarnya CRC32c
.