예를 들어 부정적인 것을 증명할 수는 없습니다. 여전히 나는 모범이 암시 적이라고 생각한다. 아마도 유용 할 것입니다. 그리고 비슷한 문제를 어떻게 해결하려고하는지 보여줍니다.
의 경우
내가 바이너리 벡터 수있는 기능을 사용하여, 바이너리 예측을하고자 하는 임의의 숲 고체 선택입니다. 나는 이런 종류의 질문에 대한 두 번째 부분 인 좋은 알고리즘이 무엇인지 대답합니다.
각 비트가 통계적으로 독립적이므로 각 비트가 좋은 기능이므로 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)
결과
내가 이것을했을 때, 최대 10,000 개의 길이의 100,000 개의 임의 ASCII 문자열에 대한 훈련. 내가 본 결과는 다음과 같습니다.
모델 훈련
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
.