Mahoutインストール〜Model作成まで


※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  
```
　

③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)
```




## 参考
+ [Hadoop 2.2.0 is compatible with Mahout 0.8?](http://stackoverflow.com/questions/20911821/hadoop-2-2-0-is-compatible-with-mahout-0-8
)
+ [Apache Mahoutの使い方：テキスト分類のアルゴリズムを活用する](http://www.atmarkit.co.jp/ait/articles/1312/04/news009.html)
+ [実践！ 「MapReduceでテキストマイニング」徹底解説](http://www.atmarkit.co.jp/ait/articles/1107/20/news115.html)
+ [ナイーブベイズを用いてテキスト分類を行う](http://gihyo.jp/dev/serial/01/mahout/0009) 
 →分類器実装