でーたさいえんすって何それ食えるの?

RとかPythonとかと戯れていたい

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
12       いろいろ
3         やる
45         みる
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でも躊躇わずループ書いても良さそうですね。

f:id:masato_613:20170425063949p:plain f:id:masato_613:20170425063943p:plain

ついでなので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翻訳の中身とほぼ同じやつ

research.googleblog.com

Overview - seq2seq

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が使われてたそうなので、
さらに興味が湧いて触ってみたという感じです。

www.kaggle.com

そもそもGBMって何?

GBMとは、Gradient Boosting Machineの略で、勾配ブースティング機のコトです。 機械学習コンペでは精度上げやすいのと、ディープラーニングほどリソースバカ食いしないためかよく使われているそうです。

詳しい事は、私が説明するよりここらへんのリンクを見ると良いです。

smrmkt.hatenablog.jp

要は損失関数の最小化って最適化をしていてて、損失関数を最小化するパラメータを見つける方法は勾配降下法(最急降下法ニュートン法e.t.c.)ってことです。

ここで取上げるLightGBMの他にはRのxgboostやscikit-learnに入ってるGradientBoostingClassifierでも使うことができます。 xgboostに関してはTJOさんのこの記事辺りを見ると良さげです。

tjo.hatenablog.com

で、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にもあるかなーと思ってたら、ありました!

www.yhat.com

yhatが開発しているRodeoというIDEです。 数日使ってみた感覚として、RStudioとかなり近い使い勝手の環境だと感じました。 ただ、プロセスをターミネートしたり、ヘルプをどうのこうのという部分は、まだまだ発展途上な感じです。

他のpythonIDEとして、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を無効化する

手順

  1. macを再起動させ、起動音が鳴った辺りでCommand + R
    これで起動すると、リカバリ等が出来るモードで立ち上がるハズ
  2. 上のメニューのUtility -> terminalでターミナルを立ち上げて以下のコマンドを打つ
csrutil disable

後は普通に再起動
3. 起動後、SIPが無効になってるか確認するため、ターミナルで

$ csrutil status
System Integrity Protection status: disabled.
  1. あとは、インストール手順通りに pip を打てばOK

R import multiple packages at once

モチベーション

Rでlibrary()を打つ行数減らしたいよねー

e.g. ふつーなら

library(magrittr)
library(dplyr)
library(igraph)
library(data.frame)

一気にやりたいんで

libs <- c("magrittr", "dplyr", "igraph", "data.frame")
apply(libs, require, character.only = T)

User Input has better way

We know better and simple way.

list_options <- c("add an item",
                  "Delete an item",
                  "Print the list",
                  "Quit")

select.list(list_options)

source article

www.r-bloggers.com