Mahout を使って機械学習を行うための環境を構築します。
環境はCentOS7で行い、MahoutではHDFSが必要なため、同一環境でHadoopのインストールを行います。
事前準備
まず、必要なデベロッパーツールなどをインストールします。
1 2 3 4 |
# yum -y update # yum -y groupinstall base "Development tools" --setopt=group_package_types=mandatory,default,optional |
Apache Maven のインストール
CentOS への Mahout のインストールでは、Javaのパッケージ管理の Apache Maven を入れてのインストールが楽なのでこちらをインストールします。
1 2 3 4 5 6 7 8 9 10 11 |
# wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo # yum -y install apache-maven # mvn -version Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T16:58:13+09:00) Maven home: /usr/share/apache-maven Java version: 1.8.0_181, vendor: Oracle Corporation Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-327.36.3.el7.x86_64", arch: "amd64", family: "unix" |
Apache Mahout のインストール
次に Apache Mahout のインストールを実施します。
root以外のユーザーでインストール可能なので、今回は「mahout」というユーザーを作成しインストールします。
1 2 3 4 5 |
# groupadd -g 2000 mahout # useradd -u 2000 -g 2000 mahout # su - mahout |
まず、このユーザーでsshでパスワードなしのキーログインできる設定を行っておきます。
こちらは後にHDFSの環境を作るために必要な設定ですが、事前に実施しておきます。
1 2 3 4 5 |
$ ssh-keygen $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys |
また、環境変数の設定を実施します。
こちらも後にインストールされるパッケージのパスも設定しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ vi .bash_profile -----------------------------追加 export MAHOUT_HOME=$HOME/mahout export PATH=$MAHOUT_HOME/bin:$MAHOUT_HOME/examples/bin:$PATH export MAHOUT_LOCAL="" export HADOOP_HOME=$HOME/hadoop-2.8.4 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64 ----------------------------- $ source .bash_profile |
特に Java や Hadoop などはインストールするバージョンなど変わることが多いと思うので、必要でしたら変更してください。
そして、 Mahout のソースをgitから取得しインストールを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ git clone https://github.com/apache/mahout $ cd mahout $ mvn -DskipTests clean install ・ ・ ・ ・ [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Mahout Build Tools ................................. SUCCESS [01:46 min] [INFO] Apache Mahout ...................................... SUCCESS [ 0.047 s] [INFO] Mahout Math ........................................ SUCCESS [01:13 min] [INFO] Mahout HDFS ........................................ SUCCESS [02:30 min] [INFO] Mahout Map-Reduce .................................. SUCCESS [ 30.325 s] [INFO] Mahout Integration ................................. SUCCESS [02:26 min] [INFO] Mahout Examples .................................... SUCCESS [ 37.330 s] [INFO] Mahout Math Scala bindings ......................... SUCCESS [01:20 min] [INFO] Mahout Spark bindings .............................. SUCCESS [04:22 min] [INFO] Mahout H2O backend ................................. SUCCESS [ 59.029 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 15:50 min [INFO] Finished at: 2018-10-03T11:52:19+09:00 |
こちらで Mahout はインストールできました。
Apache Hadoop のインストール
次に Apache Hadoop のインストールを行います。
インストールは以下を参考にしています。
Mahout では HDFS が必要なため、今回は試験で単独環境で動く疑似分散モードでの構築を行います。
★ CentOS7 で Apache Hadoop の疑似分散モードを使ってみる
1 2 3 4 5 6 7 |
$ cd $ wget http://ftp.jaist.ac.jp/pub/apache/hadoop/common/hadoop-2.8.4/hadoop-2.8.4.tar.gz $ tar zxfv hadoop-2.8.4.tar.gz $ mkdir -p ~/var/lib/hdfs/{name,data} |
次に設定ファイルの変更を行います。
<configuration></configuration>タグを以下に書き換えます。
1 2 3 4 5 6 7 8 9 10 11 |
$ vi $HADOOP_HOME/etc/hadoop/core-site.xml -----------------------------追加 <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> ----------------------------- |
また、クラスタ関連の設定も行います。
「dfs.replication」が「1」となっているので、クラスタ一台で動かす設定となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml -----------------------------追加 <configuration> <property> <name>dfs.name.dir</name> <value>/home/mahout/var/lib/hdfs/name</value> </property> <property> <name>dfs.data.dir</name> <value>/home/mahout/var/lib/hdfs/data</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> ----------------------------- |
namenodeを初期化します。
1 2 3 |
$ $HADOOP_HOME/bin/hadoop namenode -format |
また、環境設定として以下の変更を行います。
1 2 3 4 5 6 |
$ vi hadoop-2.8.4/etc/hadoop/hadoop-env.sh -----------------------------変更 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64 ----------------------------- |
namenodeの起動を行います。
クラスタでは複数の台数に一括でコマンドを行うので、sshでの接続を行なって起動をします。
1 2 3 4 5 6 7 8 |
$ $HADOOP_HOME/sbin/start-dfs.sh Starting namenodes on [localhost] localhost: starting namenode, logging to /home/mahout/hadoop-2.8.4/logs/hadoop-mahout-namenode-ik1-310-15223.vs.sakura.ne.jp.out localhost: starting datanode, logging to /home/mahout/hadoop-2.8.4/logs/hadoop-mahout-datanode-ik1-310-15223.vs.sakura.ne.jp.out Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /home/mahout/hadoop-2.8.4/logs/hadoop-mahout-secondarynamenode-ik1-310-15223.vs.sakura.ne.jp.out |
最後に無事、HDFSが動いているのを確認するためファイルのリストを確認します。
1 2 3 |
$ $HADOOP_HOME/bin/hadoop fs -ls / |
こちらで、Hadoop のインストールなどは完了です。
Mahout のサンプルプログラムの起動
Mahout ではサンプルプログラムが複数入っているので、wikiのクラスタリングを行うプログラムを試してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$ cd mahout/examples/bin $ ./classify-wikipedia.sh Discovered Hadoop v2. Setting dfs command to /home/mahout/hadoop-2.8.4/bin/hdfs dfs, dfs rm to /home/mahout/hadoop-2.8.4/bin/hdfs dfs -rm -r -skipTrash. Please select a number to choose the corresponding task to run 1. CBayes (may require increased heap space on yarn) 2. BinaryCBayes 3. clean -- cleans up the work area in /tmp/mahout-work-wiki Enter your choice : 1 ok. You chose 1 and we'll use CBayes ======================================================= Summary ------------------------------------------------------- Correctly Classified Instances : 2032 87.1729% Incorrectly Classified Instances : 299 12.8271% Total Classified Instances : 2331 ======================================================= Confusion Matrix ------------------------------------------------------- a b c d e f g h i j <--Classified as 764 2 35 8 10 5 2 10 10 7 | 853 a = australia 0 105 2 0 2 3 0 0 2 4 | 118 b = austria 0 0 7 0 0 0 0 0 1 0 | 8 c = bahamas 8 4 12 451 9 3 2 5 12 1 | 507 d = canada 0 0 0 0 34 1 0 2 0 0 | 37 e = colombia 0 0 0 5 2 35 0 0 0 1 | 43 f = cuba 0 0 0 0 1 0 99 0 0 1 | 101 g = pakistan 0 0 0 2 7 1 0 9 0 0 | 19 h = panama 4 24 47 5 3 8 6 15 462 4 | 578 i = united kingdom 0 0 0 0 0 0 1 0 0 66 | 67 j = vietnam ======================================================= Statistics ------------------------------------------------------- Kappa 0.8115 Accuracy 87.1729% Reliability 77.4652% Reliability (standard deviation) 0.2918 Weighted precision 0.9262 Weighted recall 0.8717 Weighted F1 score 0.893 18/10/03 14:36:15 INFO MahoutDriver: Program took 10492 ms (Minutes: 0.17488333333333334) |
Wikiのデータを10カ国で分類した結果になります。
2331の統計データがあり、2032が正解で299が失敗という結果になりました。
映画データのレコメンドの実施
次に以下のような試験を実施してみます。
https://docs.microsoft.com/ja-jp/azure/hdinsight/hdinsight-mahout
1 2 3 4 5 6 7 8 9 10 11 12 |
$ cd $ wget http://files.grouplens.org/datasets/movielens/ml-100k.zip $ unzip ml-100k.zip $ cd ./ml-100k/ $ head -1 u.data 196 242 3 881250949 $ head -1 u.item 1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 |
u.dataの方は最初がユーザーIDで次が映画のID、そして評価とタイムスタンプが続きます。
こちらの10万件データを利用しレコメンドデータの作成を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
$ $HADOOP_HOME/bin/hdfs dfs -put u.data /user/mahout/ $ $HADOOP_HOME/bin/hadoop fs -ls /user/mahout/ Found 2 items drwxr-xr-x - mahout supergroup 0 2018-10-03 14:34 /user/mahout/temp -rw-r--r-- 1 mahout supergroup 1979173 2018-10-03 15:52 /user/mahout/u.data $ $HADOOP_HOME/bin/hdfs dfs -rm -R /user/mahout/temp $ mahout recommenditembased \ > --similarityClassname SIMILARITY_COOCCURRENCE \ > --input /user/mahout/u.data \ > --output /user/mahout/output01 \ > --tempDir /user/mahout/temp $ pwd /home/mahout/ml-100k $ $HADOOP_HOME/bin/hdfs dfs -getmerge /user/mahout/output01 ./output01.txt $ head -10 output01.txt 1 [527:5.0,199:5.0,660:5.0,529:5.0,200:5.0,134:5.0,66:5.0,132:5.0,265:5.0,133:5.0] 2 [200:5.0,135:5.0,197:5.0,527:5.0,134:5.0,196:5.0,132:5.0,98:5.0,265:5.0,300:5.0] 3 [137:5.0,508:4.8314605,14:4.8153844,285:4.80597,845:4.7647057,248:4.733333,124:4.706767,319:4.7027707,293:4.673077,311:4.651515] 4 [100:5.0,265:5.0,1022:5.0,263:5.0,98:5.0,197:5.0,132:5.0,264:5.0,330:5.0,990:5.0] 5 [527:5.0,230:5.0,98:5.0,265:5.0,231:5.0,229:5.0,99:5.0,132:5.0,197:5.0,200:5.0] 6 [526:5.0,196:5.0,660:5.0,527:5.0,230:5.0,200:5.0,99:5.0,659:5.0,265:5.0,300:5.0] 7 [465:5.0,70:5.0,134:5.0,201:5.0,462:5.0,268:5.0,66:5.0,197:5.0,129:5.0,260:5.0] 8 [265:5.0,231:5.0,100:5.0,197:5.0,527:5.0,230:5.0,99:5.0,132:5.0,98:5.0,200:5.0] 9 [197:5.0,230:5.0,660:5.0,98:5.0,265:5.0,527:5.0,99:5.0,132:5.0,100:5.0,231:5.0] 10 [265:5.0,526:5.0,659:5.0,98:5.0,230:5.0,527:5.0,198:5.0,528:5.0,660:5.0,229:5.0] $ wc output01.txt 943 1886 93675 output01.txt |
ユーザーごとにおすすめの映画の評価付けを非常に簡単に行うことができました。
一連の流れでしたが、色々なことが試せそうです。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。
お問い合わせやご依頼・ご相談など