Während man mit einem Beispiel kein Negativ beweisen kann. Dennoch denke ich, dass ein Beispiel andeutend sein würde; und vielleicht nützlich. Und es zeigt, wie man ähnliche Probleme lösen würde (versucht).
Für den Fall, dass
ich binäre Vorhersagen machen möchte, indem ich Features verwende, die binäre Vektoren sind , ist ein Random Forest eine gute Wahl. Ich denke, diese Art von Antworten ist der zweite Teil Ihrer Frage: Was ist ein guter Algorithmus?
Wir möchten die SHA256-Zeichenfolgen unbedingt in binäre (Boolesche) Vektoren vorverarbeiten, da jedes Bit statistisch unabhängig ist und somit jedes Bit ein gutes Merkmal darstellt. Das macht unsere Eingaben also zu 256-Element-Booleschen Vektoren.
Demo
Hier ist eine Demonstration, wie das Ganze mit der Bibliothek Julia DecisionTree.jl gemacht werden kann .
Du kannst folgendes kopieren und in die julia-Eingabeaufforderung einfügen.
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)
Ergebnisse
Dabei trainierte ich an 100.000 zufälligen ASCII-Zeichenfolgen mit einer Länge von bis zu 10.000. Hier sind die Ergebnisse, die ich gesehen habe:
Trainiere das Modell
julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees: 10
Avg Leaves: 16124.7
Avg Depth: 17.9
Genauigkeit des Trainingssatzes:
julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162
Test Set Genauigkeit:
julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016
Diskussion
Das ist also im Grunde nichts. Wir sind von 95% beim Training auf knapp über 50% beim Test gestiegen. Jemand könnte geeignete Hypothesentests anwenden, um zu sehen, ob wir die Null zurückweisen können
, aber ich bin ziemlich sicher, dass wir das nicht können. Es ist eine winzige Verbesserung gegenüber der Rate.
Das deutet darauf hin, dass es nicht gelernt werden kann. Wenn ein zufälliger Wald, kann von gut gepasst bis nur die Rate geschlagen werden. Zufällige Wälder sind ziemlich fähig, schwierige Eingaben zu lernen. Wenn es etwas zu lernen gäbe, würde ich mindestens ein paar Prozent erwarten.
Sie können mit verschiedenen Hash-Funktionen herumspielen, indem Sie den Code ändern. Was interessant sein könnte Ich habe im Grunde die gleichen Ergebnisse erzielt, als ich die julia in built hash
function verwendet habe (die keine kryptografisch sichere hsah ist, aber immer noch ein guter Hash, sollte also in der Tat ähnliche Strings auseinander schicken). Ich habe auch im Grunde die gleichen Ergebnisse für CRC32c
.