※1年前に試した時のログです
前提条件
- JDK1.7系インストール済
- Hadoop2系インストール済
注意点
- Mahout0.9系 - Hadoop2.2系で実行しましたがMahoutが動きませんでした。 MahoutはHadoopの2.2系にはまだ対応していないようです。 ClouderaリポジトリからインストールしたMahout0.7 - Hadoop2.0系で動作を確認してます。
下準備
- 学習データを用意します。 私はOK,NGのステータスがついたテキストを3500程用意してHBaseへ格納し、以下の処理を行うプログラムを書いて シーケンス化用データとしてHDFSに書き出しました。 ※ここではMahoutにフォーカスするのでさらっとだけ記述
①HBaseから値を取得
②日本語のテキストを処理しやすいよう加工(LuceneのJapaneseAnalyzerを使用しました)
・わかち分割処理
・不要な頻出語、助詞、助動詞、接続詞等の除外、大文字を小文字へ統一、全角を半角へ統一等
この処理を通したテキストは具体的には以下のようになります。
おはようございます!プログラマーの神様!(T_T)
おはよう プログラマー 代表 神様 t t
③HDFS上にステータス毎にテキストを設置。
↓こんな感じ。このディレクトリ以下に1ファイル-1テキストで保存
hadoop dfs -ls /monitoring/kerberos/
Found 2 items
drwxr-xr-x - hdfs hadoop 0 2014-03-13 15:39 /data/ng-text
drwxr-xr-x - hdfs hadoop 0 2014-03-13 15:40 /data/ok-text
ng-textとok-text以下はこの通り
$ hadoop dfs -ls /data/ok-data/ |more
Found 1897 items
-rw-r--r-- 3 matsukawa_tsubasa hadoop 24 2014-03-13 18:36 /data/ok-text/1311.txt
-rw-r--r-- 3 matsukawa_tsubasa hadoop 136 2014-03-13 18:36 /data/ok-text/1312.txt
-rw-r--r-- 3 matsukawa_tsubasa hadoop 115 2014-03-13 18:36 /data/ok-text/1313.txt
-rw-r--r-- 3 matsukawa_tsubasa hadoop 24 2014
・
・
・
※mahoutのサンプル分類器はデータ格納ディレクトリを目的変数(テキストの分類ステータス)として取るようです。
-区切りであれば先頭から最初の-までをとってくれました。上記例の場合だと目的変数はokとngになります。
データのシーケンス化
$ mahout seqdirectory -i /data/ -o /data-seq
Options
- --input (-i) ⇒ 入力データ
- --output (-o) ⇒ シーケンスファイルの出力先
- --chunkSize (-chunk) ⇒ ファイルの分割サイズ(デフォルトは64Mbytes)
- --keyPrefix (-prefix) ⇒ 指定した文字列がKeyのprefixに利用される
- --charset (-c) ⇒ 文字コードを指定(デフォルトはUTF-8)
どちらもデフォルトでHDFS上のデータを見に行きます。
-oで指定したディレクトリは存在しなくても生成してくれます。
シーケンスデータの確認
$ mahout seqdumper -i /data-seq/chunk-0
シーケンスデータのベクトル化
$ mahout seq2sparse -i /data-seq -o /data-vectors -a org.apache.lucene.analysis.core.WhitespaceAnalyzer
※luceneのバージョンによって微妙にパスが違うので注意
org.apache.lucene.analysis.core.WhitespaceAnalyzer
org.apache.lucene.analysis.WhitespaceAnalyzer
ベクトル以外にも,df値,辞書ファイル,単語の出現回数等が生成される
tf-vectorsとtfidf-vectors以外のファイルは,これまでと同様にseqdumperコマンドで内容を確認することができる
ベクターデータの確認
- 内容確認
$ mahout vectordump -i /monitoring/kerberos-vectors/tfidf-vectors
- 頻出語の確認
$ mahout seqdumper -i /monitoring/kerberos-vectors/wordcount | sort -nrk4
Model作成
$ mahout trainnb -i /monitoring/test-vectors/tfidf-vectors -o /monitoring/test-model -el -li /monitoring/labelindex
- --input (-i) ⇒ 学習データ
- --output (-o) ⇒ モデルの出力先
- --extractLabels (-el) ⇒ ラベルインデックスを作成
- --trainComplementary (-c) ⇒ complement naive bayesを利用
- --labelIndex (-li) ⇒ ラベルインデックスのパスを指定
ラベルインデックスの確認
$ mahout seqdumper -i /monitoring/labelindex
Running on hadoop, using /usr/lib/hadoop/bin/hadoop and HADOOP_CONF_DIR=/etc/hadoop/conf
MAHOUT-JOB: /usr/lib/mahout/mahout-examples-0.7-cdh4.5.0-job.jar
14/03/13 19:57:48 INFO common.AbstractJob: Command line arguments: {--endPhase=[2147483647], --input=[/monitoring/labelindex], --startPhase=[0], --tempDir=[temp]}
Input Path: /monitoring/labelindex
Key class: class org.apache.hadoop.io.Text Value Class: class org.apache.hadoop.io.IntWritable
Key: ng: Value: 0
Key: ok: Value: 1
Count: 2
14/03/13 19:57:49 INFO driver.MahoutDriver: Program took 1735 ms (Minutes: 0.028916666666666667)
Modelのテスト
$ mahout testnb -i /monitoring/test-vectors/tfidf-vectors -o /monitoring/test1 -m /monitoring/test-model -l /monitoring/labelindex
Summary
-------------------------------------------------------
Correctly Classified Instances : 3083 87.0167%
Incorrectly Classified Instances : 460 12.9833%
Total Classified Instances : 3543
=======================================================
Confusion Matrix
-------------------------------------------------------
a b <--Classified as
1215 442 | 1657 a = ng
18 1868 | 1886 b = ok
14/03/13 20:21:09 INFO driver.MahoutDriver: Program took 19632 ms (Minutes: 0.32721666666666666)