Mentre non si può dimostrare un negativo con un esempio. Tuttavia ritengo che un esempio sarebbe suggestivo; e forse utile. E mostra come si potrebbe (tentare di) risolvere problemi simili.
Nel caso in
cui voglio fare previsioni binarie, usando funzionalità che sono vettori binari , una foresta casuale è una scelta solida. Immagino che questo tipo di risposte risponda alla seconda parte della tua domanda: cos'è un buon algoritmo.
Vogliamo preelaborare le stringhe SHA256 in vettori binari (booleani), poiché ogni bit è statisticamente indipendente, quindi ogni bit è una buona caratteristica. Ciò renderà i nostri input 256 elementi booleani.
dimostrazione
Ecco una dimostrazione di come tutto può essere fatto usando la libreria Julia DecisionTree.jl .
È possibile copiare incollare quanto segue nel prompt di 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)
risultati
Quando l'ho fatto, mi sono allenato su 100.000 stringhe ASCII casuali di lunghezza fino a 10.000. Ecco i risultati che ho visto:
Allena il modello
julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees: 10
Avg Leaves: 16124.7
Avg Depth: 17.9
Precisione del set di allenamento:
julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162
Precisione del set di test:
julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016
Discussione
Quindi praticamente non è niente. Siamo passati dal 95% sul set di allenamento a poco più del 50% sul set di test. Qualcuno potrebbe applicare test di ipotesi adeguati, per vedere se possiamo respingere l'
ipotesi nulla , ma sono abbastanza certo che non possiamo. È un piccolo miglioramento rispetto al tasso di ipotesi.
Ciò suggerisce che non può essere appreso. Se una foresta casuale, può andare da ben equipaggiato a colpire solo il tasso di ipotesi. Le foreste casuali sono abbastanza capaci di imparare input difficili. Se ci fosse qualcosa da imparare, mi aspetterei almeno qualche percento.
Puoi giocare con diverse funzioni di hash cambiando il codice. Il che potrebbe essere interessante, ho praticamente ottenuto gli stessi risultati usando la funzione julia in built hash(che non è un hsah crittograficamente sicuro, ma è comunque un buon hash, quindi dovrei effettivamente separare stringhe simili). Ho anche ottenuto praticamente gli stessi risultati per CRC32c.