Mahout インストール
Mahout とは 機械学習に関するライブラリのセット・・・
難しい事が色々書いてあるが割愛
レコメンドができると言う事で導入する感じ。
前、HadoopをインストールしたのはこのMahoutが
使いたいがための設定。
Hadoop自体も結構面白そうだけど。
(Hadoop プログラムは後で学習)
必要なもの
apache-maven-2.2.1-bin.tar.gz
jdk-6u20-linux-i586-rpm.bin
mahout-0.3-src.tar.gz
jdkのインストールは割愛
Maven
(Java用プロジェクト管理ツール Mahoutをビルドするために必要)
http://maven.apache.org/download.html ここから最新版をダウンロード
apache-maven-2.2.1-bin.tar.gz
mkdir -p /home/maven
mv apache-maven-2.2.1-bin.tar.gz
tar xvzf apache-maven-2.2.1-bin.tar.gz
vi ~/.bashrc
MAVEN_HOME=/home/maven/apache-maven-2.2.1/
JAVA_HOME=/usr/java/jdk1.6.0_20/
export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
を追加して保存
次 Mahoutのダウンロード
http://ftp.kddilabs.jp/infosystems/apache/lucene/mahout/0.3/mahout-0.3-src.tar.gz
tar xvzf mahout-0.3-src.tar.gz
cd mahout-0.3
mvn install
Warning: JAVA_HOME environment variable is not set.
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] Mahout Common Maven Parent
[INFO] Maven Mojo to generate code for collections
[INFO] Mahout Collections
[INFO] Mahout Math
[INFO] Mahout Core
[INFO] Mahout Taste Webapp
[INFO] Mahout Utilities
[INFO] Mahout Examples
[INFO] Apache Lucene Mahout ・・・
とずらずらとビルドログが出てる・・・・
なんとなく1行目のWarningが気になる。。。
ビルド中にテストしてるらしくちょっと時間がかかる。
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Mahout Common Maven Parent ............................ SUCCESS [2:10.181s]
[INFO] Maven Mojo to generate code for collections ........... SUCCESS [3:00.867s]
[INFO] Mahout Collections .................................... SUCCESS [35.321s]
[INFO] Mahout Math ........................................... SUCCESS [40.775s]
[INFO] Mahout Core ........................................... SUCCESS [12:22.625s]
[INFO] Mahout Taste Webapp ................................... SUCCESS [45.399s]
[INFO] Mahout Utilities ...................................... SUCCESS [17.021s]
[INFO] Mahout Examples ....................................... SUCCESS [52.285s]
[INFO] Apache Lucene Mahout .................................. SUCCESS [5.169s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20 minutes 50 seconds
[INFO] Finished at: Wed Apr 21 16:45:53 JST 2010
[INFO] Final Memory: 68M/162M
[INFO] ------------------------------------------------------------------------
と出てビルド終了。
でー動かす。
https://cwiki.apache.org/MAHOUT/syntheticcontroldata.html
データを
http://kdd.ics.uci.edu/databases/synthetic_control/synthetic_control.data
ここからダウンロードして
(数値の羅列・・・・)
hadoop fs -put synthetic_control.data testdata
(なぜtestdataと言う名前かと言うとquickstartに
All example jobs use testdata as input and output to directory output
と書かれていたからw
意味は上の簡単な英文ですら意味をわかっていないw)
kmeans
canopy
dirichlet
meanshift
分類方法があるみたい。
kmeans法は
hadoop jar mahout-examples-0.3.job org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
とすると分類が始まる。
ログがずらずら出て処理が終わる
kmeans法なのでoutput/pointsの下に出力があるはず。
hadoop fs -get output output でログを持ってくる。
次はレコメンドを動かしたいけど~
Tasteってもしかして自分で実装する感じなのか?w
mahout/レコメンドサーブレットの作り方というページを
そのまま作業してみる。
http://www.pwv.co.jp/~take/TakeWiki/index.php?mahout%2F%E3%83%AC%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%89%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9
なんの事だかさっぱりわからないが以下コマンドを打つ。
mvn archetype:create -DgroupId=sample.recommendWeb -Dartifac
tId=recommendWeb -DarchetypeArtifactId=maven-archetype-webapp -D=Version=0.0.1
必要なものを作ってくれてる感じ?
tree recommendWeb
recommendWeb/
|-- pom.xml
`-- src
`-- main
|-- resources
`-- webapp
|-- WEB-INF
| `-- web.xml
`-- index.jsp
5 directories, 3 files
ここまではOKだな。
pom.xmlに追加する。 pom.xmlは以下のようになった。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<modelVersion>4.0.0</modelVersion>
<groupId>sample.recommendWeb</groupId>
<artifactId>recommendWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>recommendWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.5.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>recommendWeb</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
</plugin>
</plugins>
</build>
</project>
recommendWebのディレクトリで
mkdir -p mkdir src/main/java
今回はeclipse使わないのだけれど、書いてあるのでやります。
mvn eclipse:eclipse -DdownloadSources=true
参考のwikiに従うと次はjavaファイルの追加
でもどこに追加するのだろう?w
mvnがわかってないので不明だな。
mvn compileとすると
デフォルトではsrc/main/javaの下の.javaをコンパイルするらしい。
ということでsrc/main/javaに配置だな。
mvn compileエラー続出w
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
先頭にインポート文を追加したら
ビルドが通ったw
mvn jetty:run ・・・ エラー
でもjettyのエラーで悩んでてもしょうがない。
tomcatに変更w
(頭古いから知っているものでしか動かせないのよねぇ)
$TOMCAT_HOME/webapps/で
mkdir -p recommendWeb/WEB-INF/classes
mkdir -p recommendWeb/WEB-INF/lib
で
$TOMCAT_HOME/webapps/recommendWeb/で
vi web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Recommend Web</display-name>
<servlet>
<servlet-name>web-recommender</servlet-name>
<servlet-class>RecommenderServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>web-recommender</servlet-name>
<url-pattern>/RecommenderServlet</url-pattern>
</servlet-mapping>
</web-app>
として保存
recommendWeb/WEB-INF/libの中には必要なjarを放り込む
mahout-0.3/examples/target/dependency/の配下のjar
わからないので上記を全部放り込んだ
recommendWeb/WEB-INF/classesには
mvn compileして出来上がったRecommenderServlet.class
を入れますの。
WEB-INFディレクトリ直下に
critics.csvに入れるのだけど、これは
http://www.grouplens.org/node/73の
100k Ratings Data Set (.tar.gz)ってリンクから拾って解凍して
解凍するとずらずら出てくるから
awk '{printf("%s,%s,%sn",$1,$2,$3);}' ua.base > critics.csv
として作る。
ちなみに
http://lucene.apache.org/mahout/taste.html#examplesをみると
データの並びは
First, create a DataModel of some kind. Here, we'll use a simple on based on data in a file. The file should be in CSV format, with lines of the form userID,itemID,prefValue (e.g. "39505,290002,3.5"):
とかいてあるので
ユーザID,アイテムID,評価値(なのか?)の
並びとしてるんだろうな、多分、読めないけど。
tomcatを起動して
http://hadoop:8080/recommendWeb/RecommenderServlet?userID=7
5.0 345
5.0 313
5.0 328
と表示されてOKだな。
u.itemの中を見ると
345=Deconstructing Harry
313=Titanic
328=Conspiracy Theory
って言う感じのお勧めなんだろうな。
http://hadoop:8080/recommendWeb/RecommenderServlet?userID=7&howMany=10
とhowManyパラメータもつけられるらしい。
5.0 328
5.0 313
5.0 302
5.0 345
4.0 295
4.0 751
4.0 315
4.0 321
4.0 340
4.0 319
サンプルなのでアレだが
問題が二つ
・起動時にデータを読み込む事
・データに評価値がついてる
(大抵の場合評価値はあまりついていないのではないかと・・・)
しかしgooブログ 10000文字の制限もう少し多くならないかい?
かなり編集苦労するんだけど。
作業を全部書きたいんだよね。わからなくなったことがわからなくなるから。
関係ないけど easyrec(http://easyrec.org/)
っていうレコメンドシステムを知った。
ボスに言われてからかなり長い時間がかかったケド
Mahout動かせて良かった。
レコメンドの種類
http://lucene.apache.org/mahout/javadoc/core/org/apache/mahout/cf/taste/impl/similarity/package-summary.html
Mahout とは 機械学習に関するライブラリのセット・・・
難しい事が色々書いてあるが割愛
レコメンドができると言う事で導入する感じ。
前、HadoopをインストールしたのはこのMahoutが
使いたいがための設定。
Hadoop自体も結構面白そうだけど。
(Hadoop プログラムは後で学習)
必要なもの
apache-maven-2.2.1-bin.tar.gz
jdk-6u20-linux-i586-rpm.bin
mahout-0.3-src.tar.gz
jdkのインストールは割愛
Maven
(Java用プロジェクト管理ツール Mahoutをビルドするために必要)
http://maven.apache.org/download.html ここから最新版をダウンロード
apache-maven-2.2.1-bin.tar.gz
mkdir -p /home/maven
mv apache-maven-2.2.1-bin.tar.gz
tar xvzf apache-maven-2.2.1-bin.tar.gz
vi ~/.bashrc
MAVEN_HOME=/home/maven/apache-maven-2.2.1/
JAVA_HOME=/usr/java/jdk1.6.0_20/
export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
を追加して保存
次 Mahoutのダウンロード
http://ftp.kddilabs.jp/infosystems/apache/lucene/mahout/0.3/mahout-0.3-src.tar.gz
tar xvzf mahout-0.3-src.tar.gz
cd mahout-0.3
mvn install
Warning: JAVA_HOME environment variable is not set.
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] Mahout Common Maven Parent
[INFO] Maven Mojo to generate code for collections
[INFO] Mahout Collections
[INFO] Mahout Math
[INFO] Mahout Core
[INFO] Mahout Taste Webapp
[INFO] Mahout Utilities
[INFO] Mahout Examples
[INFO] Apache Lucene Mahout ・・・
とずらずらとビルドログが出てる・・・・
なんとなく1行目のWarningが気になる。。。
ビルド中にテストしてるらしくちょっと時間がかかる。
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Mahout Common Maven Parent ............................ SUCCESS [2:10.181s]
[INFO] Maven Mojo to generate code for collections ........... SUCCESS [3:00.867s]
[INFO] Mahout Collections .................................... SUCCESS [35.321s]
[INFO] Mahout Math ........................................... SUCCESS [40.775s]
[INFO] Mahout Core ........................................... SUCCESS [12:22.625s]
[INFO] Mahout Taste Webapp ................................... SUCCESS [45.399s]
[INFO] Mahout Utilities ...................................... SUCCESS [17.021s]
[INFO] Mahout Examples ....................................... SUCCESS [52.285s]
[INFO] Apache Lucene Mahout .................................. SUCCESS [5.169s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20 minutes 50 seconds
[INFO] Finished at: Wed Apr 21 16:45:53 JST 2010
[INFO] Final Memory: 68M/162M
[INFO] ------------------------------------------------------------------------
と出てビルド終了。
でー動かす。
https://cwiki.apache.org/MAHOUT/syntheticcontroldata.html
データを
http://kdd.ics.uci.edu/databases/synthetic_control/synthetic_control.data
ここからダウンロードして
(数値の羅列・・・・)
hadoop fs -put synthetic_control.data testdata
(なぜtestdataと言う名前かと言うとquickstartに
All example jobs use testdata as input and output to directory output
と書かれていたからw
意味は上の簡単な英文ですら意味をわかっていないw)
kmeans
canopy
dirichlet
meanshift
分類方法があるみたい。
kmeans法は
hadoop jar mahout-examples-0.3.job org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
とすると分類が始まる。
ログがずらずら出て処理が終わる
kmeans法なのでoutput/pointsの下に出力があるはず。
hadoop fs -get output output でログを持ってくる。
次はレコメンドを動かしたいけど~
Tasteってもしかして自分で実装する感じなのか?w
mahout/レコメンドサーブレットの作り方というページを
そのまま作業してみる。
http://www.pwv.co.jp/~take/TakeWiki/index.php?mahout%2F%E3%83%AC%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%89%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9
なんの事だかさっぱりわからないが以下コマンドを打つ。
mvn archetype:create -DgroupId=sample.recommendWeb -Dartifac
tId=recommendWeb -DarchetypeArtifactId=maven-archetype-webapp -D=Version=0.0.1
必要なものを作ってくれてる感じ?
tree recommendWeb
recommendWeb/
|-- pom.xml
`-- src
`-- main
|-- resources
`-- webapp
|-- WEB-INF
| `-- web.xml
`-- index.jsp
5 directories, 3 files
ここまではOKだな。
pom.xmlに追加する。 pom.xmlは以下のようになった。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<modelVersion>4.0.0</modelVersion>
<groupId>sample.recommendWeb</groupId>
<artifactId>recommendWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>recommendWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.5.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>recommendWeb</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
</plugin>
</plugins>
</build>
</project>
recommendWebのディレクトリで
mkdir -p mkdir src/main/java
今回はeclipse使わないのだけれど、書いてあるのでやります。
mvn eclipse:eclipse -DdownloadSources=true
参考のwikiに従うと次はjavaファイルの追加
でもどこに追加するのだろう?w
mvnがわかってないので不明だな。
mvn compileとすると
デフォルトではsrc/main/javaの下の.javaをコンパイルするらしい。
ということでsrc/main/javaに配置だな。
mvn compileエラー続出w
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
先頭にインポート文を追加したら
ビルドが通ったw
mvn jetty:run ・・・ エラー
でもjettyのエラーで悩んでてもしょうがない。
tomcatに変更w
(頭古いから知っているものでしか動かせないのよねぇ)
$TOMCAT_HOME/webapps/で
mkdir -p recommendWeb/WEB-INF/classes
mkdir -p recommendWeb/WEB-INF/lib
で
$TOMCAT_HOME/webapps/recommendWeb/で
vi web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Recommend Web</display-name>
<servlet>
<servlet-name>web-recommender</servlet-name>
<servlet-class>RecommenderServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>web-recommender</servlet-name>
<url-pattern>/RecommenderServlet</url-pattern>
</servlet-mapping>
</web-app>
として保存
recommendWeb/WEB-INF/libの中には必要なjarを放り込む
mahout-0.3/examples/target/dependency/の配下のjar
わからないので上記を全部放り込んだ
recommendWeb/WEB-INF/classesには
mvn compileして出来上がったRecommenderServlet.class
を入れますの。
WEB-INFディレクトリ直下に
critics.csvに入れるのだけど、これは
http://www.grouplens.org/node/73の
100k Ratings Data Set (.tar.gz)ってリンクから拾って解凍して
解凍するとずらずら出てくるから
awk '{printf("%s,%s,%sn",$1,$2,$3);}' ua.base > critics.csv
として作る。
ちなみに
http://lucene.apache.org/mahout/taste.html#examplesをみると
データの並びは
First, create a DataModel of some kind. Here, we'll use a simple on based on data in a file. The file should be in CSV format, with lines of the form userID,itemID,prefValue (e.g. "39505,290002,3.5"):
とかいてあるので
ユーザID,アイテムID,評価値(なのか?)の
並びとしてるんだろうな、多分、読めないけど。
tomcatを起動して
http://hadoop:8080/recommendWeb/RecommenderServlet?userID=7
5.0 345
5.0 313
5.0 328
と表示されてOKだな。
u.itemの中を見ると
345=Deconstructing Harry
313=Titanic
328=Conspiracy Theory
って言う感じのお勧めなんだろうな。
http://hadoop:8080/recommendWeb/RecommenderServlet?userID=7&howMany=10
とhowManyパラメータもつけられるらしい。
5.0 328
5.0 313
5.0 302
5.0 345
4.0 295
4.0 751
4.0 315
4.0 321
4.0 340
4.0 319
サンプルなのでアレだが
問題が二つ
・起動時にデータを読み込む事
・データに評価値がついてる
(大抵の場合評価値はあまりついていないのではないかと・・・)
しかしgooブログ 10000文字の制限もう少し多くならないかい?
かなり編集苦労するんだけど。
作業を全部書きたいんだよね。わからなくなったことがわからなくなるから。
関係ないけど easyrec(http://easyrec.org/)
っていうレコメンドシステムを知った。
ボスに言われてからかなり長い時間がかかったケド
Mahout動かせて良かった。
レコメンドの種類
http://lucene.apache.org/mahout/javadoc/core/org/apache/mahout/cf/taste/impl/similarity/package-summary.html
勉強させていただきます!