Rチートシート訳しました
いまのところ、次のRチートシートの和訳をやりました。
致命的な間違いとかあれば教えてほしいです。。。
mecab-pythonモジュールを使わずにpythonからmecabで処理する方法
mecab-pythonのインストールでエラー吐いて、インストール問題解決に時間がかかった。。。 簡単な関数をつくって回避したので備忘録がてら、残しておく
import os import codecs import pandas as pd import subprocess def extract_words(s, exclude_keys=['記号', '助詞', '助動詞', '数'], genkei=False): """ @type s: str @param x: mecabに処理をかけたい文字列 @param exclude_keys: 除外したい品詞を指定. 除外しない場合は空のリストを指定する @param genkei: 返す単語の活用を原形に戻す場合はTrueにする @return: MeCabで処理をかけた結果をDataFrameとして返却 """ # 一時的にファイルに書き出し dirname_tmp = './tmp_process' fn_tmp = os.path.join(dirname_tmp, 'mecab_tmp.txt') fp = codecs.open(fn_tmp, 'w', 'utf8') fp.write(s+"\n") fp.close() # 書き出したファイルをMeCabに食わせて結果を拾う cmd = 'mecab ' + fn_tmp + ' -b 10000000' mecab_result = subprocess.check_output(cmd, shell=True).decode() # MeCab処理結果をdataframeにするための前処理 mecab_result = mecab_result.replace('EOS', '') mecab_result = mecab_result.split('\n') mecab_result = [s.replace('\r', '') for s in mecab_result] mecab_result = [s for s in mecab_result if s != ''] mecab_result = [s.split('\t') for s in mecab_result ] # DataFrameに変換 df_mecab_result = pd.DataFrame( [ [s[0]] + s[1].split(',') for s in mecab_result] ) # Exclude_keysで指定した品詞を除外 df_mecab_result = df_mecab_result.loc[~df_mecab_result[1].isin(exclude_keys)] df_mecab_result = df_mecab_result.reset_index(drop=True) # genkeiフラグがTrueのときは7列目にある原形を返すようにする if genkei: df_words = df_mecab_result[7] else: df_words = df_mecab_result[0] for i in range(df_words.shape[0]): if df_words[i] == "*": df_words[i] = df_mecab_result[0][i] return(df_words)
例えば
extract_words("neologdでいろいろやってみたい", exclude_keys=[], genkei=True)
とやると、品詞で除外はせず動詞の活用は原形にした単語ベクトルが得られて次のようになる。
0 NEologd 1 で 2 いろいろ 3 やる 4 て 5 みる 6 たい
R 3.4.0 のJITバイトコンパイラってどんくらい早くなるの?
R3.4.0がリリースされましたね。
で、大きな変更点のひとつにJITバイトコンパイラがデフォルトでONになってるとのことです。
これによって、forループやfunctionは特に何もせずともバイトコンパイルが行われて高速化が行われることになります。
※ただしbrowser()が入れられた関数はバイトコンパイル対象外になります。
※コンパイルが不要なときは、compiler::enableJIT(0)または環境変数のR_ENABLE_JITを0にすればOKです
他にも色々アップデート情報の詳細はこちら
R: R News
で、RStudioもこのバイトコンパイル機能に対応したアップデートが行われたそうです。
cmpfun()使うとけっこう早くなるんだよなー。。。程度には覚えていたものの
具体的にどんだけ早いの?に対してはよく覚えてないので
このバイトコンパイラでどんだけ早くなったのか? を実際にやって記録を残しておきたいと思います。。
実行環境
MacbookAir macOS Sierra/2GHz Intel Core i7(2core 4thread)/8GB DDR3 Memory
チェック方法
forループを長めに回して、中で変数をインクリメントするだけの処理を走らせます。 この処理を100回走らせ平均を出してみました。 実際のスクリプトは次の通りです。
n_test <- 100 time_diff <- array(n_test) loop_end <- 10^7 buf_in_loop <- 1 for(j in 1:n_test){ time_start <- Sys.time() for(i in 1:loop_end){ buf_in_loop <- buf_in_loop + 1 } time_end <- Sys.time() time_diff[j] <- time_end - time_start } print(mean(time_diff)) hist(time_diff, breaks = seq(0,5,length.out = 30))
結果
R3.3.3 : 3.500181 sec on average
R3.4.0 : 0.366924 sec on average
※R3.4.0でcompiler::enableJIT(0)にして実行するとR3.3.3と同様でした
約10倍早い!
諸条件でここまでパフォーマンスが出ないケース(*1)もありそうですが
デフォでこんだけ高速化されるなら、Rでも躊躇わずループ書いても良さそうですね。
ついでなのでfor()で1:loop_endとしている所で、
配列を生成してメモリ食っちゃうハズだけど、コンパイラーが有効だとどうなるか?もチェック
これは、profiler()でメモリの最も消費の多かった所を平均しました。
R3.3.3 : 34.27 MB on average
R3.4.0 : 0.058 MB on average
メモリ消費もだいぶ抑えられてて良い感じですね!!
一番メモリを消費してたのは、どちらもfor()の部分でした。
*1 例えば、forの中で走査してくベクトルを生成しないようにwhile()にするなんてハックだと 同じコードで平均 0.88秒くらいになり、倍以上の処理時間がかかってしまいます。 多分、値の代入がインクリメントする変数の分増えるので、そこが原因かな?と想像できます。
tf-seq2seq
what’s this?
google翻訳の中身とほぼ同じやつ
GitHub - google/seq2seq: A general-purpose encoder-decoder framework for Tensorflow
KeyPoints
- 翻訳で実際に使用しているのはseq2seq
- tf-seq2seqはseq2seqのオープンソース版
- TensorFlowで実装
- google翻訳のモノとまったく同じではない
- いろいろパラメータを調整して実験できる
- Encoder/Decoderの深さ
- attention mechanism
- RNN cell type
- beam size
- カリカリにチューニングしてないが、そこまで処理は重くない
- 翻訳精度は他手法と同等かそれ以上(BLEUで評価 newstest2015では精度トップ)
memo
ある文章から何らかの文章を生成するタスクなら、翻訳以外にも使いみちがありそう
KeyPerson
- Eugene Brevdo
- Melody Guan
- Lukasz Kaiser
- Quoc V. Le
- Thang Luong
- Chris Olah
Related Papers
Sequence to Sequence Learning with Neural Networks
https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf
Author
- Ilya Sutskever
- Oriol Vinyals
- Quoc V. Le
Massive Exploration of Neural Machine Translation Architectures
https://arxiv.org/pdf/1703.03906.pdf
Author
- Denny Britz
- Anna Goldie
- Minh-Thang Luong
- Quoc Le ※ all from google brain
Neural Machine Translation by Jointly Learning to Align and Translate
[1409.0473] Neural Machine Translation by Jointly Learning to Align and Translate
Author
- Dzmitry Bahdanau
- Kyunghyun Cho
- Yoshua Bengio
Microsoft LightGBMをmacOSで触ってみた
モチベーション
普通なマシン(Macbook Air)で分析してるので、ライトウェイトかつ高速な勾配ブースティング環境って有難いわけですよね。
さらに、kaggleのBOSCHコンペで暫定3位の方のソリューションでもこのLightGBMが使われてたそうなので、
さらに興味が湧いて触ってみたという感じです。
そもそもGBMって何?
GBMとは、Gradient Boosting Machineの略で、勾配ブースティング機のコトです。 機械学習コンペでは精度上げやすいのと、ディープラーニングほどリソースバカ食いしないためかよく使われているそうです。
詳しい事は、私が説明するよりここらへんのリンクを見ると良いです。
要は損失関数の最小化って最適化をしていてて、損失関数を最小化するパラメータを見つける方法は勾配降下法(最急降下法、ニュートン法e.t.c.)ってことです。
ここで取上げるLightGBMの他にはRのxgboostやscikit-learnに入ってるGradientBoostingClassifierでも使うことができます。 xgboostに関してはTJOさんのこの記事辺りを見ると良さげです。
で、LightGBMとは?
Microsoftが公開した勾配ブースティング用パッケージです。
githubで公開されており、そこでの説明だと次のような特徴があるそうです。
- トレーニングが早くて効率的
- メモリ消費が少ない
- 精度が高い
- 並列に学習させられる
- 大規模なデータも対応可能
インストール
ここがちょっと詰まった…
ざっくり詰まりポイントをあげると2ポイントあって、
1. 私はmacport派なので、homebrewと同居させるのはコンフリクトの恐れもあるしで避けたかった
2. そもそもhomebrew + g++-6でうまくいかなかった
という残念な状況に。。。
で、結局はmacportのgcc6を使ってコンパイルして無事通りました。
gitとcmakeとgcc6のインストールが事前に必要なので、そこはよしなに入れておいてください。
LightGBM自体のインストール方法はgithubのインストール手順をすこーしだけ変えればOKで、
具体的には次のコマンドを打ち込めばOKです。
git clone --recursive https://github.com/Microsoft/LightGBM cd LightGBM mkdir build cd build cmake -DCMAKE_CXX_COMPILER=g++-mp-6 .. make -j
5行目だけ、オリジナルのやり方と違います。
macportでgcc6をインストールしている環境だとg++-mp-6があるはずなので、
コンパイラの指定をそいつに変えてやれば無事コンパイルできます。
cmakeでwarningが出て来るかもしれませんが、実行には特に差し支えないので気にせずやっちゃってOKです。
うまくビルドできると、LightGBM直下にlightgbmという実行ファイルが生成されているハズです。
使い方
実行ファイルのlightgbmを実行したいディレクトリにコピーして、
データとトレーニング/スコアリングのやり方を定義したconfファイルをそれぞれ用意し、
lightgbmの実行引数に渡して実行してあげればOKです。
実際にLightGBMのレポジトリをクローンした時にいっしょにオチてくるexamplesでやってみましょう。
どの例も、macbook Airで秒単位で終わるので、サクっと気軽にお試しできます。
このexamplesの中には必要なデータとconfファイルが既に入ってるので、
README.md通りにコマンドを打ち込めばlightGMBを試すことができます。
例えばexamples/binary_classificationで試すとすると、binary_classificationの中にlightgbmをコピーして
./lightgbm config=train.conf
で予測モデルを作成して
./lightgbm config=predict.conf
で予測値を吐き出させる
これだけでOKです!
実際に自分のデータとモデルで実行する場合は、このexamplesにあるconfファイルをテンプレとして編集していけば良さそうです。 データはヘッダ無しのタブ区切りであれば良いみたいです。
詳しくはまた時間をとって探ってみたいなーと思います。
ENJOY!!
Rodeo --RStudioっぽいPython開発環境
motivation
データ分析をする時、Rを使う場合は大抵RStudioを使ってます。
RStudioがあれば、コーディング、コードのお試し実行、ヘルプ参照、プロットの閲覧etc. が1画面でサクサク作業出来て便利なわけです。[1]
私の場合、ある程度コードの塊を書いたら、その部分をコンソールに投げて実行してみて、想定通りっぽい動作をしてたらまた次のコードの塊を書いて… というやり方をしているので、RStudioの環境がとーっても快適なわけなんです。
ただ、全ての事をRだけで行うなんてのは当然無理でして、その時はお気楽に組める言語 pythonを使いたくなるわけです。
例えば、機械学習をして、その結果をウェブアプリとして使いたいなー ついでにShinyとかShinyDashboardで出来る事より凝った事したいなーって時、先ずはpythonを選んでみたりしてます。
pythonでRStudioライクなIDEがあったらいいなーと前から思いつつ、暇な時に調べてたらどうやらあるので、その紹介をしてみようかなと思います。
[1] ちなみに、今書いている時点で出ているRStudio previewにはソースのアウトライン機能や、add-on、roxygen skeltonの挿入なんて便利機能がいっぱいついてて更に手放せなくなってきてはいます。
Rodeo
RStudioみたいな便利なものがpythonにもあるかなーと思ってたら、ありました!
yhatが開発しているRodeoというIDEです。 数日使ってみた感覚として、RStudioとかなり近い使い勝手の環境だと感じました。 ただ、プロセスをターミネートしたり、ヘルプをどうのこうのという部分は、まだまだ発展途上な感じです。
他のpython用IDEとして、JupyterやSpyderもありますが、Rodeoの方がpythonをデータ分析的な使い方をする時には使い勝手が良いと感じますね。
因みにインストール方法は、サイトにアクセスしてインストーラを使ってインストールするか
pip install rodeo
で完了です。
実行時は
rodeo .
で起動させればOK 必ずドットを忘れない様に。
Jupyter on Mac OS X El Capitan
El CapitanでJupyterの環境整備してたら途中で詰まったので、その時の備忘録
c.f.
http://jupyter.readthedocs.org/en/latest/install.html
前置き
上のリンクにある通りコマンドを打ってみる
sudo pip install jupyter
と、インストールがコケる
どうやらEl Capitanあたりから導入されたSystem Integrity Protection (SIP) が原因でpipできない。 (homebrewでpythonを入れてると、このpip問題は起きないらしい)
macportで色々入れてきたので、今更homebrewを入れるのもなぁ…という事でSIPを無効化する
手順
- macを再起動させ、起動音が鳴った辺りでCommand + R
これで起動すると、リカバリ等が出来るモードで立ち上がるハズ - 上のメニューのUtility -> terminalでターミナルを立ち上げて以下のコマンドを打つ
csrutil disable
後は普通に再起動
3. 起動後、SIPが無効になってるか確認するため、ターミナルで
$ csrutil status System Integrity Protection status: disabled.
- あとは、インストール手順通りに pip を打てばOK