例では否定を証明することはできませんが。それでも、例は示唆に富むものだと感じています。おそらく便利です。また、同様の問題をどのように解決しようとするかを示しています。
バイナリベクトルである機能を使用して、バイナリ予測を作成する場合
、ランダムフォレストは確実な選択です。この種の質問は、あなたの質問の2番目の部分、つまり優れたアルゴリズムとは何かに答えると思います。
各ビットは統計的に独立しているため、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%をわずかに超えました。帰無
仮説を棄却できるかどうかを確認するために、誰かが適切な仮説検定を適用できますが、できないことは確かです。これは、推測率に対するわずかな改善です。
それは学ぶことができないことを示唆しています。ランダムフォレストの場合、適切な当てはめから推測だけでヒットすることができます。ランダムフォレストは、困難な入力を学習することができます。学ぶべきことがあれば、少なくとも数パーセントは期待しています。
コードを変更することで、さまざまなハッシュ関数を試すことができます。興味深いことに、組み込みhash
関数でジュリアを使用した場合、基本的に同じ結果が得られました(これは暗号的に安全なhsahではありませんが、それでも良いハッシュなので、実際に同様の文字列をばらばらに送信する必要があります)。私も基本的に同じ結果を得ました CRC32c
。