2017-07-13 7 views
2

事前定義されたクラスのセット(例:clojureのマップ)に従って銀行取引の束にラベルを付ける必要があります。私は素朴なベイズアプローチを試みましたが、時にはそれが私に間違ったラベルを与えてしまいます。機械学習によるテキストラベリング

私の研究によれば、マルチクラス分類のためにチューニングされたリニアSVMのような監視付きMLアルゴリズムを使用する必要があります。問題は、私は本当にMLについて何も知らないのです。 2番目の問題は、ほとんどのclojureライブラリが古くなっていることです。類似の取引の大半は、(例えば参照::atm)を90%類似したテキストのように持って

{: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} 

だから、私は、これは簡単な問題であるべきと考えています。

私の質問:私はどのようなアルゴリズムを使用することができます

  • データの準備はどうすればよいですか?私は、tx labelとtx valueという2つの特徴しか持たないと信じています。私が見ているチュートリアルにはたくさんのベクトルがありますが、文字列データを適切なML形式に変換するかどうかはわかりません。

cljまたはjavaのいずれかのサンプルをお待ちしております。

+0

大きなサンプルデータセットを教えてもらえますか? –

答えて

1

あなたは

は類似の取引のほとんどは、私はそれが最初のトランザクションラベルであるかを把握することが理にかなって思っ

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"関数の実装を必要とします。さらに、私が使用しているクラスタリングライブラリが初期結果に反復をサポートしているかどうかはわかりません。したがって、さらに実装する必要があります。

+0

その見栄えは素晴らしいです。その根拠を説明できますか?なぜあなたはクラスタリングをしなければならないのですか?ありがとう! –

+0

@MiguelPing私は私の根拠とその他のコメントを私の答えに加えました。追加したいことが他にある場合はお知らせください。 –

+0

確かに、私はコードを実行していました。私は、例えば、もし私が提供すれば、私は新しいインスタンスをどのように分類できますか? '{:label" xxxx ":value -123}'予測クラスを取得するにはどうしたらいいですか?また、私はjaccardのためにlevenstheinを切り替えました、私はずっと速いと信じています。 –