xgboostをpython3環境にインストールする

kaggleで有名なGradient Boostingモジュールxgboostをpython3環境にインストールする。

python2環境ならpip install xgboostでインストールできる。python3環境は下記の手順でGithubからインストールする必要がある。

 

1. ダウンロード

公式のGithubからclone。

$ git clone https://github.com/dmlc/xgboost.git
$ cd xgboost

 

2. ビルド

マルチプロセス用にビルドするため、OpenMPを先にインストールする。

$ brew install clang-omp

src/utils/omp.h を開き、11行目の#include <omp.h>を以下に置換。

#include <libiomp/omp.h>

Makefileのexport CC, export CXX行を下記に置換。

export CC = clang-omp
export CXX = clang-omp++

マニュアルに従ってビルドする。ただし、マニュアル通りだとライブラリがpythonディレクトリにコピーされないため手動でwrapperを正しい位置に移動する。

$ ./build.sh
$ cd python-package/
$ cp -R ../wrapper ./xgboost/
$ python3 setup.py install

clang-omp++のinclude pathが正しく設定されずビルド時にstring.h not foundなどのincludeエラーがでる場合は、~/.bash_profileに下記を追加する。

export CPLUS_INCLUDE_PATH=/Applications/Xcode.app/Contents/Developer//Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/:$CPLUS_INCLUDE_PATH

再読み込み。

$ source ~/.bash_profile

上記CPLUS_INCLUDE_PATHは環境によって若干異なる可能性があるが、$ g++ -v hoge.cppなど適当なコードを標準g++でコンパイルし、その時の詳細情報から取得可能。

 

3. 実行

scikit-learnのラッパークラスが用意されているため、scikit-learnの他識別器同様にfit, predictできる。

from xgboost import XGBClassifier
​
from sklearn import datasets
from sklearn.cross_validation import cross_val_predict
from sklearn.metrics import confusion_matrix
​
iris = datasets.load_iris()
X = iris.data
y = iris.target
​
clf = XGBClassifier()
pred = cross_val_predict(clf, X, y)
cm = confusion_matrix(y, pred)
print(cm)

結果。

[[50 0 0]
[ 0 47 3]
[ 0 2 48]]

 

■参考

NumbaでPython3を高速化する

JIT(just-in-time compile)でPython3の処理を高速化する。環境はUbuntu 14.04 + Python3 + no Anaconda。

公式サイトでは、C, C++, Fortran同様に高速化とあるが、Cythonの方が1.5倍くらい速いらしい。

ただし、Numbaの方が素のPythonのまま高速化できる。

1. インストール

Numbaを利用するにはllvmliteが必要

Anacondaを利用している場合公式マニュアルがあるのでそちらを参照。今回はlivmliteを公式サイトに従ってビルドしてインストールする。

# apt-get install llvm-3.6-dev

このままだとllvm-configがないエラーに遭遇するため、リンクをはる。

# ln -s /usr/bin/llvm-config-3.6 /usr/bin/llvm-config

llvmliteをビルド、インストール

$ python3 setup.py build
$ python3 runtests.py → ビルドが成功していることの確認。
# python3 setup.py install

Numbaをインストール

# pip3 install numba

 

2. ベンチマーク

下記コードを実行すると、以下の結果となり80倍程度速くなっている。

cnt=4999999950000000, time=7.7s → 通常
cnt=4999999950000000, time=0.1s → Numba

コード。

import time
from numba import jit

def func():
  t = time.time()

  cnt = 0
  for i in range(int(1e8)):
    cnt += i
  print('cnt={}, time={:.1f}s'.format(cnt, time.time() - t))

@jit
def func_numba():
  t = time.time()

  cnt = 0
  for i in range(int(1e8)):
    cnt += i
  print('cnt={}, time={:.1f}s'.format(cnt, time.time() - t))

func()
func_numba()

■参考文献

形態素解析システムJUMANをpython3で使う

公式のpythonバインディングは、python2 onlyのためpython3用に若干修正して利用する。環境はUbuntu 14.04LTS。

 

1. JUMANのインストール

$ sudo apt-get install juman

動作確認。

$ juman

libjumanのエラーが出る場合は追加でインストールする。

$ sudo apt-get install libjuman

 

2. pythonバインディングの修正

黒橋・河原研究室のKNPのサイトからpython2のバインディングをダウンロードして解凍。

$ curl -L -O http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/pyknp-0.1.zip&name=pyknp-0.1.zip
$ unzip pyknp-0.1.zip

2to3でpython3用にコンバート。

$ cd ku_nlp-pyknp-a32529dbce0d/
$ 2to3 -w ./

さらにpyknp/juman/juman.py, pyknp/juman/morpheme.pyを修正する必要がある。

差分をパッチ(git diff –no-prefix)にまとめたので、これダウンロードしてku_nlp-pyknp-a32529dbce0d/直下で適用。

$ patch -p0 < pyknp4python3.patch

インストール。

$ sudo python3 setup.py install

 

3. 動作確認

下記をtest.pyとして作成。

from pyknp import Juman 
 
juman = Juman() 
result = juman.analysis('今日はいい天気ですね。') 
 
for mrph in result.mrph_list(): 
    print("見出し:{}, 読み:{}, 原形:{}, 品詞:{}, 品詞細分類:{}, 活用型:{}, 活用形:{}, 意味情報:{}, 代表表記:{}".format(
    mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname))

動作確認。

$ python3 test.py

出力結果は以下。

見出し:今日, 読み:きょう, 原形:今日, 品詞:名詞, 品詞細分類:時相名詞, 活用型:*, 活用形:*, 意味情報:代表表記:今日/きょう カテゴリ:時間, 代表表記:今日/きょう
見出し:は, 読み:は, 原形:は, 品詞:助詞, 品詞細分類:副助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:いい, 読み:いい, 原形:いい, 品詞:形容詞, 品詞細分類:*, 活用型:イ形容詞イ段, 活用形:基本形, 意味情報:代表表記:良い/よい 反義:形容詞:悪い/わるい, 代表表記:良い/よい
見出し:天気, 読み:てんき, 原形:天気, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:天気/てんき カテゴリ:抽象物, 代表表記:天気/てんき
見出し:です, 読み:です, 原形:だ, 品詞:判定詞, 品詞細分類:*, 活用型:判定詞, 活用形:デス列基本形, 意味情報:NIL, 代表表記:
見出し:ね, 読み:ね, 原形:ね, 品詞:助詞, 品詞細分類:終助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:。, 読み:。, 原形:。, 品詞:特殊, 品詞細分類:句点, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:

 

■参考文献

Webサイトをselenium + Xvfb + sshでpythonから操作する

SeleniumのWebDriverを使って、webページをpythonプログラム内から操作する。

SSH先のサーバでディスプレイがない環境を想定。

1. Seleniumのインストール

公式サイトに従ってSeleniumをインストール。

$ pip3 install -U selenium

 

2. Xvfbのインストール

仮想ディスプレイのXvfbをインストールする。

$ sudo yum install xorg-x11-server-Xvfb
$ sudo yum -y groupinstall "X Window System"
$ sudo yum -y groupinstall "Japanese Support"

~/.bashrcに以下を追記。

export DISPLAY=:1

Xvfbを起動。nohubしなくてもssh終了時に強制終了しない。

$ Xvfb :1 -screen 0 1024x768x24 &

上記Xvfbコマンドでmachine-idなしエラーが発生する場合は下記。

$ su -
# dbus-uuidgen > /var/lib/dbus/machine-id

 

3. サンプル実行

# 日本語環境
fp = webdriver.FirefoxProfile()
fp.set_preference('intl.accept_languages', 'ja-JP, ja')
# ドライバ取得
browser = webdriver.Firefox(firefox_profile=fp)
# javascriptなどの動的ページで要素がない場合5秒待つ。
browser.implicitly_wait(5)
# Yahooを表示してから、天気のページへ。
browser.get('https://yahoo.co.jp/')
browser.find_element_by_xpath('//*[@id="yahooservice"]/ul/li[6]/a').click()
# 画面キャプチャー
browser.save_screenshot(file_name)
# 終了(ブラウザを閉じる)
browser.close()

 

参考

Mac, HomebrewでPL/Pythonを利用する

Mac OS 10 Yosemite + HomebrewでPostgreSQLを利用する。

Pythonは、python3をhomebrewでインストール済みとする。

1. PostgreSQLのインストール

$ brew install --with-python postgres

postgresでPL/Pythonを利用するために–with-pythonオプションを付加する。

以前の設定が残っている場合削除する。

$ rm -rf /usr/local/var/postgres

データベースの初期化。

-Uオプションでしていしたユーザ名がスーパーユーザとして追加される。

指定しない場合、ログインユーザ名が使われる。

$ initdb -U postgres /usr/local/var/postgres

起動。

$ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

psqlできることの確認とユーザが作られていることの確認。

$ psql -U postgres
postgres=# \du

以下のエラーがでてpsqlできない場合は、古いpostgresプロセスが生きている可能性があるのでkillしてから再トライ。

psql: FATAL:  could not open relation mapping file "global/pg_filenode.map": No such file or directory

データベースの作成。

$ createdb -U postgres -E utf-8 hoge_db

終了。

$ pg_ctl stop

 

2. PL/Pythonの設定

現在使えるPL一覧を確認。通常PL/PgSQLのみ。

$ createlang -U postgres --list hoge_db
 Name | Trusted?
 ---------+----------
 plpgsql | yes

PL/Pythonを追加する。

$ createlang -U postgres plpython2u hoge_db

あとは言語としてpythonが使える。

 

参考

PythonからRを利用

PythonからRを利用する。

ライブラリはPypeR(PYthon-piPE-R), RPy2がメジャーなようだが、Google Trendsによると下図の状態なのでPypeRを使う。

スクリーンショット 2014-12-13 21.57.23

 

1. インストール

公式サイトに従って行う。

$ pip3 install PypeR

公式サイトの記述はいたってシンプル。同梱のtest.pyを見ろとのこと。

 

2. 基本的な連携

準備

from pyper import *
r = R()

Rコード実行

r('a <- 1; b <- 2; a + b')

or

r(['a <- 1'], ['b <- 2'], ['a + b'])

値の設定

r['a'] = x

or

r.a = x

値の取得

x = r['a']

or

x = r.b

少し複雑なコードの実行。

val = r['(2*pi + 3:9)/5']

3. 実践

Rのnnet(ニューラルネットワーク)を使ってXOR問題を解く。

from pyper import *
import numpy
r = R()
r('library(nnet)')
data = [[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0]]
r['xor.data'] = numpy.array(data)
r('xor.data <- data.frame(xor.data)')
r('xor.nnet

XORの場合、過学習を考えるとsoftmaxの方がいい。

上記と同様のRコードは下記。

library(nnet)
xor.data = data.frame(matrix(c(0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0), 4, 3))
xor.nnet <- nnet(X3~., size = 2, decay = 0, data = xor.data)
xor.pred <- predict(xor.nnet, xor.data)
xor.pred

参考

Pylearn2でニューラルネットワーク(python3 + mac)

Pybrainのニューラルネットワークが遅すぎたので(Cで実装されたR nnetの100倍くらい?)、Deep learningで有名なPylearn2を使う。(CやGPU利用で高速化されている)

 

1. 依存ライブラリのインストール

Theano, Cythonをインストール。Theanoはpip3でインストールするとpython3かCコンライラ関連でエラーになるので、gitから直接インストール。

$ pip3 install --upgrade --no-deps git+git://github.com/Theano/Theano.git
$ pip3 install Cython

 

2. Pylearn2のインストール

公式ドキュメントに従って進める。

$ git clone git://github.com/lisa-lab/pylearn2.git
$ cd pylearn2
$ python setup.py develop

 

3. ニューラルネットワーク

Pylearn2は通常YAML形式で構造などを記述するが、慣れないのでここGist)を参考に普通のPythonコードっぽく構築する。

print文だけ、python3の形式に変更する必要がある。

 

参考

Vimのカラースキーマを変更する

画像

Vimのカラーを変更する。

 

1. カラースキーマのダウンロード

ここで紹介されている人気のmolokaiをダウンロード。

 

2. スキーマの設定

$ mkdir ~/.vim/colors
$ mv molokai.vim ~/.vim/colors/

~/.vimrcに以下を記載

colorscheme molokai

3. 設定後

スクリーンショット 2014-12-08 0.03.58

参考

Vimでpython開発環境を準備する

mac + vimでpython3の開発環境を準備する。(python3自体のインストールは$ brew install python3)

1. vimのインストール

macにデフォルトでインストールされているvimはクリップボード連携がサポートされていないため、homebrewでvimをインストールする。

この際、単純brew install vimだとpythonがサポートされていない(jedi-vimで必要な)ため、以下のオプションでインストール。すでにbrewでインストール済みの場合は事前にbrew remove vimする。

$ brew install vim install --enable-interp=python,python3

pythonをサポートしていることを確認。+pythonならサポート。-pythonだとサポートしていない。

$ vim --version | grep python
+python

 

2. プラグインのインストール

このエントリーのNeoBundleで下記のプラグインをインストールする。

  • quickrun → コードの簡易実行
  • jedi-vim → 入力補完
  • syntastic → 文法チェック
  • unite → unite-outlineに必要
  • unite-outline → アウトライン表示(originalの’h1mesukeha’はメンテナンスされていないためuniteのauthorのShougo/unite-outlineを使用)

3. quickrunの設定

.vimrcに下記を記載。実行時に縦分割でなく、横分割する。

let g:quickrun_config = {}
let g:quickrun_config = {'*': {'split': ''}}

4. jedi-vimの設定

mac + brewインストールのpython3を使用している場合、jedi-vimから呼び出されるpythonがdefaultのpython2.xを利用していることがあるのため、~/.vim/bundle/jedi-vim配下で以下を実行。

$ git submodule update --init

5. unite-outlineの設定

unite-outlineをctrl + oで実行できるようにする。.vimrcに以下を記載。

nnoremap <C-o> :Unite -vertical -no-quit -winwidth=32 outline<Esc>

6. 設定後

スクリーンショット 2014-12-08 0.06.58

参考