Enquanto não se pode provar um negativo com um exemplo. Ainda sinto que um exemplo seria sugestivo; e talvez útil. E mostra como alguém (tentaria) resolver problemas semelhantes.
No caso de
eu querer fazer previsões binárias, usando recursos que são vetores binários , uma Floresta Aleatória é uma escolha sólida. Acho que esse tipo de resposta responde à segunda parte da sua pergunta: o que é um bom algoritmo.
Bem, queremos pré-processar as seqüências SHA256, em vetores binários (booleanos), pois cada bit é estatisticamente independente, portanto, cada bit é um bom recurso. Então, isso fará com que nossas entradas sejam 256 vetores booleanos.
Demo
Aqui está uma demonstração de como tudo pode ser feito usando a biblioteca Julia DecisionTree.jl .
Você pode copiar e colar o texto abaixo no prompt 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)
Resultados
Quando fiz isso, treinei 100.000 seqüências ASCII aleatórias de até 10.000. Aqui estão os resultados que eu vi:
Treine o modelo
julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees: 10
Avg Leaves: 16124.7
Avg Depth: 17.9
Precisão do conjunto de treinamento:
julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162
Precisão do conjunto de teste:
julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016
Discussão
Então isso é basicamente nada. Passamos de 95% no conjunto de treinamento para pouco mais de 50% no conjunto de teste. Alguém poderia aplicar testes de hipóteses adequados, para ver se podemos rejeitar a
hipótese nula , mas tenho certeza de que não podemos. É uma pequena melhoria em relação à taxa de estimativa.
Isso sugere que não pode ser aprendido. Se uma floresta aleatória, pode ir de bem ajustada a atingir apenas a taxa de estimativa. Florestas aleatórias são bastante capazes de aprender insumos difíceis. Se houvesse algo a aprender, eu esperaria pelo menos alguns por cento.
Você pode brincar com diferentes funções de hash alterando o código. O que poderia ser interessante: obtive basicamente os mesmos resultados ao usar a julia na hash
função built-in (que não é um hsah criptograficamente seguro, mas ainda é um bom hash, portanto, de fato, é necessário enviar sequências semelhantes). Eu também obtive basicamente os mesmos resultados para CRC32c
.