Trong khi người ta không thể chứng minh một tiêu cực với một ví dụ. Tuy nhiên, tôi cảm thấy một ví dụ sẽ được gợi ý; và có lẽ hữu ích. Và nó cho thấy cách người ta (cố gắng) giải quyết các vấn đề tương tự.
Trong trường hợp
tôi muốn đưa ra dự đoán nhị phân, sử dụng các tính năng là vectơ nhị phân , Rừng ngẫu nhiên là một lựa chọn chắc chắn. Tôi đoán loại câu trả lời này phần thứ hai của câu hỏi của bạn: một thuật toán tốt là gì.
Chúng tôi cũng muốn tiền xử lý các chuỗi SHA256, thành các vectơ nhị phân (Boolean), vì mỗi bit là độc lập thống kê, do đó mỗi bit là một tính năng tốt. Vì vậy, điều đó sẽ làm cho đầu vào 256 vectơ boolean phần tử của chúng tôi.
Bản giới thiệu
Dưới đây là một minh chứng về cách toàn bộ điều có thể được thực hiện bằng cách sử dụng Julia DecisionTree.jl thư viện.
Bạn có thể sao chép dán bên dưới vào dấu nhắc 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)
Các kết quả
Khi tôi làm điều này, đào tạo trên 100.000 chuỗi ASCII ngẫu nhiên có độ dài lên tới 10.000. Đây là kết quả tôi thấy:
Đào tạo người mẫu
julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees: 10
Avg Leaves: 16124.7
Avg Depth: 17.9
Độ chính xác của bộ đào tạo:
julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162
Kiểm tra độ chính xác của bộ:
julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016
Thảo luận
Vì vậy, về cơ bản là không có gì. Chúng tôi đã đi từ 95% trên tập huấn luyện, đến gần 50% trên tập kiểm tra. Ai đó có thể áp dụng các bài kiểm tra giả thuyết phù hợp, để xem liệu chúng ta có thể từ chối
giả thuyết không, nhưng tôi khá chắc chắn rằng chúng ta không thể. Đó là một cải tiến nhỏ so với tỷ lệ đoán.
Điều đó cho thấy rằng nó không thể được học. Nếu là Rừng ngẫu nhiên, có thể chuyển từ trang bị tốt sang chỉ đạt tỷ lệ đoán. Rừng ngẫu nhiên khá có khả năng học các đầu vào khó khăn. Nếu có điều gì đó để học, tôi sẽ mong đợi ít nhất vài phần trăm.
Bạn có thể chơi xung quanh với các hàm băm khác nhau bằng cách thay đổi mã. Điều thú vị là tôi có kết quả cơ bản giống nhau khi sử dụng hàm julia trong hash
hàm dựng sẵn (không phải là một hsah bảo mật bằng mật mã, nhưng vẫn là một hàm băm tốt nên thực sự nên tách các chuỗi tương tự nhau). Tôi cũng đã nhận được kết quả tương tự cho CRC32c
.