Хоча не можна довести негатив на прикладі. І все-таки я відчуваю, що приклад був би сугестивним; і, можливо, корисно. І це показує, як можна було б (намагатися) вирішити подібні проблеми.
У випадку, коли
я хочу зробити двійкові прогнози, використовуючи функції, що є двійковими векторами , Random Forest - це вагомий вибір. Я думаю, цей тип відповідей на другу частину вашого питання: що таке хороший алгоритм.
Ми добре хочемо попередньо обробити рядки 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)
Результати
Коли я це зробив, тренувався на 100 000 випадкових рядків ASCII довжиною до 10 000. Ось результати, які я побачив:
Тренуйте модель
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
.