Hadoopをはじめ、Java言語を使って構築されることが多い「ビッグデータ」処理のためのフレームワーク/ライブラリを紹介しながら、大量データを活用するための技術の常識を身に付けていく連載
Apache Hadoop(以下、Hadoop)の登場で、今まで捨てていたデータ、貯めるだけで処理しきれなかったデータを活用できるようになりました。
活用手段として最近とみに注目されている技術が「機械学習」であり、Hadoopの強みを生かし簡単に機械学習を行うためのライブラリが、「Apache Mahout」(以下、Mahout)です。
本稿ではMahoutを動かしてみることで、機械学習の常識を身に付けます。
機械学習とは、一定のデータをコンピュータ・プログラムに「学習」させ(すなわち、そのデータに潜むパターンや規則性を表す「モデル」を自動的に構築させ)、他のデータにそのモデルを適用すれば、あたかも人間のように複雑で柔軟な判断が行えるようにするという試みです。
機械学習をビジネスに活用した例は、レコメンド(ユーザーや商品の類似度を学習)、迷惑メール判定(過去に迷惑メールとされたもののパターンを学習)、ユーザー行動分析(望ましい/望ましくない結果に至る行動パターンを学習)、画像処理などがよく見られます。
機械学習そのものは1960年代ころ、「人工知能」の研究に始まる長い歴史を持ち、ビジネスにも以前から利用されてきました。
それが、なぜ今注目を集めているのでしょうか。
機械学習のアルゴリズム(モデルを構築・適用するロジック)は星の数ほどありますが、一般に次の特徴を持ちます。
つまり、精度を追究するとメモリ容量の壁、処理時間の壁に突き当たるわけです。並列分散処理をうまく使えば、この壁を打破できますが、そのハードルは非常に高いものでした。
ところが、今やHadoopによって並列分散処理のハードルはグッと下がりました。これまであきらめていた大量のデータによる機械学習が現実的な選択肢になり、より実用的な精度の結果が期待できるので、あらためて機械学習が注目されているのです。
@ITでも「テキストマイニングで始める実践Hadoop活用」として、Hadoop/MapReduceによる機械学習プログラミングを紹介しています。しかし、さらに手軽に、MapReduceプログラムを書かなくても、ライブラリを使うことによって並列分散環境で機械学習を行えるようにしよう、というのが今回の目標です。
機械学習ライブラリは数多く存在しますが、本稿では例としてMahoutを使います。
「Mahout」は、Hadoopのスケーラビリティを生かし、ビッグデータを用いた機械学習を可能にするライブラリです。レコメンド、クラスタリングといった機械学習のアルゴリズムがMapReduceで実装されており、コマンド・ラインやAPIからパラメータを指定するだけで、それらを利用できます。
先日(2012年2月6日)リリースされた0.6版では20種ほどのアルゴリズムが提供されています。数でいえば、他の一般的な機械学習ライブラリやソフトウエアに見劣りしますが、プログラムを作らずとも100万件を超えるような大規模データを処理できるのは大きな強みです。また、次バージョンに向けて活発に開発が進められています。
ちなみに、Mahoutはヒンディー語由来の「象使い」という意味で「マハウト」と読みます。象(Hadoop)の上で、その巨体(データ)を操るイメージから命名されたのでしょう。
Mahoutについて、さらに詳しく知りたい方には、以下をお勧めします。
Mahoutのインストールは簡単です。Hadoopが必要ですが、逐次実行する分には同梱のjarを使うので、別段の準備は要りません。Java 1.6以上が環境変数「JAVA_HOME」に設定されている環境であれば、バイナリ配布版をダウンロード、展開するだけで動きます(Windowsではmahoutシェルスクリプトを実行するために、またHadoopがUNIXコマンドを利用するためにCygwinも必要です)。
並列実行するには、あらかじめHadoopをインストール(環境変数「HADOOP_HOME」、$HADOOP_HOME/confを設定)し、当然ですが参照先のHadoopクラスタを起動しておく必要があります。
コマンド・ラインからは以下のように、展開したbinディレクトリにあるmahoutシェルスクリプトにコマンド(ここでは、kmeans)、入出力ディレクトリやコマンド固有のパラメータを渡して実行します。
$MAHOUT_HOME/bin/mahout kmeans \ -i {入力ディレクトリ} \ -o {出力ディレクトリ} \ -dm {距離計算方法> \ -c {初期中心点} \ -cd {計算終了の閾値} \ -x {最大繰り返し回数} \ -cl {最後に各点の帰属クラスタを求める} \ -xm {実行方法(逐次|並列)}
Javaプログラムからも、各コマンドに対応して用意されているドライバを使って同じように実行できます。
KMeansDriver.run(Path input, Path clustersIn, Path output, DistanceMeasure measure, double convergenceDelta, int maxIterations, boolean runClustering, boolean runSequential)
このようにMahoutは、とても簡単に利用できます。私たち利用者は、データを用意し、適切なアルゴリズムを選び、試行を通じて適切なパラメータの値を探すことに注力できます。
次ページからは、Mahoutを利用して機械学習を行う流れを見ていきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.