検索
特集

Apache Mahoutの使い方:テキスト分類のアルゴリズムを活用するMahoutによる機械学習の実際(3/3 ページ)

機械学習は古くからある情報処理のアルゴリズムの総称です。これをApache Hadoop上で実施する際のフレームワークの1つがApache Mahoutです。本稿ではApache Mahoutを使った機械学習の初歩を学んでいきます。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

分析作業のライフサイクル:分析結果の追跡と向上

分類実施後の作業

 さて、最初の分類実行の結果が得られたら、その結果に至るまでの途中過程を詳しく見て行きましょう。あなたの分析イメージと異なった計算の結果やロジックが見つかれば、それは分析精度向上のためのチューニングポイントとなります。

分類結果の追跡

 Mahoutでは処理の途中経過で用いたさまざまな中間ファイルを残しています。多くはシーケンスファイル形式であり、「seqdumper」を用いて処理を追跡していきます。

$MAHOUT_HOME/bin/mahout seqdumper \
-i (入力ファイル名、またはディレクトリ名) \
-o (出力ファイル名)

 例えば、ベクタ化した際の辞書ファイルと単語出現頻度を記したファイルが次のようになっていたとします。

<辞書ファイル>

・・・
Key: 技能: Value: 28084
Key: 技芸: Value: 28085
Key: 技術: Value: 28086
Key: 技量: Value: 28087
Key: 抄: Value: 28088
・・・

<単語出現頻度ファイル>

・・・
Key: 28084: Value: 23
Key: 28085: Value: 7
Key: 28086: Value: 160
Key: 28087: Value: 4
Key: 28088: Value: 13
・・・

 これにより、どういった単語が説明変数として抽出され、どの単語の出現頻度が高いかが確認できます。この例では「技術」という言葉が文書全体で「160」回出現していることが分かります。

 次の例では、各カテゴリに分類される結果に至った計算を見てみましょう。

<試験データファイル>

・・・
Key: /0_総記/00_総記/007_情報科学/青空のリスタート.txt.wkt: Value: {14422:4.140313625335693,1:14.17116641998291,・・・, 28083:4.491711616516113,28086:23.071706771850586,5373:9.521393775939941,
・・・}
・・・

<分類結果ファイル>

・・・
Key: 0_総記: Value: {0:-784954.0161302382,1:-859747.724310329,2:-843512.3958278076,3:-822030.776986705,4:-834769.9700328582,5:-738787.4069895325,6:-817871.0542238121,7:-837153.1700522929,8:-838085.0039735119,9:-841098.2224411338}
・・・

 試験データファイルからは、出現した単語と、その重み付け計算がなされた出現確率が分かります。分類結果ファイルでは、それぞれのカテゴリに属する確率の計算結果が記載されています。

 この例ではカテゴリ「0_総記」に属する「青空のリスタート」という文書について、カテゴリ「5」に属する確率が最も高く、不正解の「5_技術・工学」に分類されたことを示しています。実際、「青空のリスタート」の文章を見ると「技術」などの言葉が頻出しており、「5_技術・工学」に分類されそうであることがうかがえます。

チューニング例(1):表記揺れについて

 分析処理の過程を確認したところ、次のことに気付いたとします。

<辞書ファイル>

・・・
Key: 受けとら: Value: 19987
Key: 受けとり: Value: 19988
Key: 受けとる: Value: 19989
・・・

 「受けとら」「受けとり」「受けとる」は、全て原語「受けとる」の活用形です。活用形ごとに1つの要素として抽出されているのは、MeCabを用いて分かち書きした際に、表層形(原語を活用した形)のまま単純に空白で区切り、その後WhitespaceAnalyzerによって空白区切りで単語を抽出したためです。

 この単語の表層形を原語に置き換え、再度分析を実行してみましょう。

 MeCabによる分かち書きのオペレーションで、次のようにコマンドを変更します。

# 変更前のコマンド
mecab -b 81920 -O wakati ${f} -o ${f}.wkt
# 変更後のコマンド
mecab -b 81920 -F"%f[6] " -U"%m " -E"\n" ${f} -o ${f}.wkt

(例)分かち書き後のテキスト

  学界 という もの を ごく 狭い 理解 する て 、 研究 室 や 研究所 に 直接 関係 が ある 世界 の こと だ と する と 、 私 は 今日 で は 全く 学界 の 外 の 人 だ ある 。


 本稿における分類の実行結果は次のようになりました。

=======================================================
Summary
-------------------------------------------------------
Correctly Classified Instances   :  93  78.8136%
Incorrectly Classified Instances :  25  21.1864%
Total Classified Instances       : 118

 正解率は78.8%となり、12.7%の向上を図ることができました。

 分析処理の過程を確認すると、全ての文書の単語数が4万9123個から4万4329個へと、4794個減少していました。分析上、同じ要素として扱うべき単語の約1割が別々の要素となっており、それらを原語として同一とみなすことで性能が約1割向上したと考えることができます。

 一般に分類分析において、特徴を表す変数には分類にとってあまり有効でないもの、もしくは逆に分類の邪魔をしているものが含まれている場合があります。こういった変数を取り除くことで分析精度の向上が期待できます。不必要な変数は精度や処理速度の悪化を招き、この問題は「過学習」と呼ばれます。本稿では、テキストから単語を表層形として抽出することで過学習を起こし、対応として原語で抽出することで精度を向上する例を紹介しました。

チューニング例(2):変数選択について

 次に、単語を抽出してベクタ化するコマンド「seq2sparse」を見ていきます。

$MAHOUT_HOME/bin/mahout seq2sparse \
-i (入力ディレクトリ/ファイル名)
-o (出力ディレクトリ名)
-a (使用するアナライザのクラス名)
-wt (重み付け方法(tfidf))
-s (単語の最小出現回数(2))
-md (文書の最小頻度数(1))
-xs (文書頻度の標準偏差に対する閾値(-1.0※正規化なし))
-x (文書の最大頻度パーセント(99))
-ng (Nグラムの大きさ(1))
-ml (対数尤度比の最小値(1.0))
-n (正規化の値(0※正規化なし))
-ow (出力の上書き)

 ファイルの入出力ディレクトリに関するもの以外は、全て文章からの単語の抽出や重み付け、出現頻度の計算に関するパラメータです。

 パラメータ「a」で、WhitespaceAnalyzerを指定して空白区切りで単語を抽出していました。例えば、日本語文章に対して「org.apache.lucene.analysis.cjk.CJKAnalyzer」を使うことで、全角2文字ずつを単語として抽出(バイグラム抽出)するなどの手法を取ることができます。

 パラメータ「wt」では、単語の重み付けの手法をTF(TermFrequency)もしくはTFIDF(TermFrequency-InverseDocumentFrequency)より選択できます。デフォルトはカッコ書きで記載したTFIDFです。

 パラメータ「s」「md」「xs」「x」では、単語を変数として抽出するか否かを判定する閾値を設定します。例えば「s」では単語集合全体における最小の出現回数を設定しており、デフォルトでは2回より少ない出現回数の場合は無視されます。これらの設定により、高頻出過ぎる単語を無価値として排除したり、低頻出過ぎる単語を特異値として外したりします。

 パラメータ「ng」「ml」では単語の連結に関して設定しています。デフォルトではNグラムを1として単語1つずつを1変数として抽出しますが、デフォルト以上の値を設定することで、2つ以上の単語の連結を扱うことができます。

 パラメータ「n」はベクタの正規化に関する設定です。デフォルトでは正規化しません。正規化により、大きなベクトルの大きさを減少させ、小さなベクトルの大きさを増大させることで、文書ごとの文章の長さの違いに配慮することができます。

 これらは全て分析対象となる変数の抽出に関する設定であり、一般に変数の抽出方法は分析精度のチューニングにおいて極めて重要なものとなります


 本稿では文書分類を例として実際にMahoutによる分析オペレーションを紹介し、過学習といった分析の実作業において直面し得る課題の例を学びました。

 データ分析はトライアンドエラーです。まずは簡単に動かすことができるMahoutから、機械学習に近づいてみてはいかがでしょうか。

筆者紹介

阪本正樹(さかもとまさき)

2012年、現部門に移動しHadoop、ビッグデータ分析に取り組む。NTTソフトウェア ビッグデータ推進室では機械学習やサーチテクノロジ等の技術に基づきビッグデータの活用支援を拡大中


関連特集:「データ分析を支える技術」

大量データをサービス開発に生かす機運が高まっている今、多くのIT技術者はビジネスサイドの要請に、柔軟・迅速に応えられるデータ基盤整備を迫られている。本特集では、その基礎技術や理解しておくべき技術動向、新たな収益に結び付くデータ活用の在り方を紹介する。



Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る