あなたは
は類似の取引のほとんどは、私はそれが最初のトランザクションラベルであるかを把握することが理にかなって思っ
90%類似したテキストのように持っていることをあなたの質問で述べているので互いに類似してグループ化します。次に、限られた数のグループがあり、各ラベルが属するグループは、テキスト自体の代わりに名目属性として使用できます。同じクラスのトランザクションのラベルテキストが類似している場合は、分類アルゴリズムがラベルとクラス間の相関を簡単に引き出すことができれば幸いです。
が、私はこれらの依存関係を使用してソリューションを実装しようとした:
[[org.clojure/clojure "1.8.0"]
[clj-fuzzy "0.4.0"]
[cc.artifice/clj-ml "0.8.5"]
[rm-hull/clustering "0.1.3"]]
をラベルをクラスタリングした後、ナイーブベイズアプローチは私のために正常に動作するように見えた:
(require '[clj-fuzzy.metrics :as fm]
'[clj-ml.classifiers :as classify]
'[clj-ml.data :as data]
'[clustering.core.qt :as qt])
(def data
[{:label "5339134-17-CPR-FARMODISSEIA LD", :value -13271 :class :health}
{:label "PAG.SERV. 10297 779747511", :value -2889 :class :utilities}
{:label "5339134-14-CPR-GREEN PEPER", :value -1785 :class :restaurants}
{:label "5339134-03-LEV-Av Alm Kings", :value -4000 :class :atm}
{:label "5339134-02-LEV-Big Field, 1", :value -7000 :class :atm}
{:label "IMPOSTO DE SELO", :value -17 :class :banking}])
(def clusters
(into {}
(for [cluster (qt/cluster fm/levenshtein (map :label data) 13 1)
s cluster]
[s (keyword (str "cluster" (hash cluster)))])))
(def dataset
(-> (data/make-dataset "my-data"
[:value
{:label (seq (set (vals clusters)))}
{:class [:health :utilities :restaurants :atm :banking]}]
(map (juxt :value (comp clusters :label) :class) data))
(data/dataset-set-class :class)))
(def data-map
(let [m (into {} (map (juxt data/instance-to-map identity)
(data/dataset-seq dataset)))]
(into {} (for [x data]
[x (-> x (update :label clusters) (update :value double) m)]))))
(def classifier
(-> (classify/make-classifier :bayes :naive)
(classify/classifier-train dataset)))
(defn foo []
(for [x data]
(->> x
data-map
data/instance-set-class-missing
(classify/classifier-classify classifier)
(assoc x :predicted))))
(run! prn (foo))
;; {:label "5339134-17-CPR-FARMODISSEIA LD", :value -13271, :class :health, :predicted :health}
;; {:label "PAG.SERV. 10297 779747511", :value -2889, :class :utilities, :predicted :utilities}
;; {:label "5339134-14-CPR-GREEN PEPER", :value -1785, :class :restaurants, :predicted :restaurants}
;; {:label "5339134-03-LEV-Av Alm Kings", :value -4000, :class :atm, :predicted :atm}
;; {:label "5339134-02-LEV-Big Field, 1", :value -7000, :class :atm, :predicted :atm}
;; {:label "IMPOSTO DE SELO", :value -17, :class :banking, :predicted :banking}
私はMLに非常に新しいですしかし、もし私が見落としてしまったことがあるなら、私に知らせてください。
私の実装では、QTクラスタリングを使用して入力データセットのラベルの1回限りのパーティションを作成しますが、新しいデータを時間の経過とともに組み込むことを目標とする場合は、ストリーミング代わりにクラスタリングアルゴリズム。これはk-meansで可能かもしれませんが、それは "Levenshtein averaging"関数の実装を必要とします。さらに、私が使用しているクラスタリングライブラリが初期結果に反復をサポートしているかどうかはわかりません。したがって、さらに実装する必要があります。
大きなサンプルデータセットを教えてもらえますか? –