フリーランチ食べたい

Python/機械学習/データ解析/ソフトウェア開発などなど

機械学習関係の主要人物20人を調査

先日のイベントで調べよう!と思うきっかけがありました

  • 下のTweetのように先週は「MachineLearning15Minitues」というイベントに参加してきました。
  • 株式会社バクフーの柏野さんの発表が個人的にとても好きな内容で是非皆さんにも見てもらいたいのですが、本筋の内容以外で一点気になる内容がありました。

  • それは下のスライド群で、実は柏野さんは「この辺りの方々は皆さんご存知だと思います。今回はなしません」と仰っていたのですが、恥ずかしながら半分くらいしかわかりませんでした。。

f:id:mergyi:20181104012727p:plain

  • そこで自分の勉強の兼ねてそれぞれの方々を調べてみることにしました!
  • ちなみに調べていて自分が追加した方がいいかなと思った方を一部追加しています。
続きを読む

%macro/%store を組み合わせてJupyterでのライブラリ読み込みを劇的に効率化する

Jupyterで読み込むライブラリを毎回書いてませんか?

  • 機械学習やデータ解析をJupyterで行うときに読み込むライブラリって大体決まっていますよね。
  • 毎回1、2つ目のセルにライブラリ読み込み処理をズラッと書いてないですか?
  • 人によってはスニペットアプリなどで管理している方もいるかもしれませんが、Jupyterの %macro%store を使うことでもっと短く、シンプルに、効率的にライブラリの読み込みを行うことができるので紹介したいと思います。
続きを読む

アンサンブル手法のStackingを実装と図で理解する

Stackingとは何か

  • 機械学習モデルの精度を向上させる手法の1つで、モデルを積み重ねる(Stackする)ことで精度を高めます。
  • ポピュラーかつ、強力な手法なKaggleのKernelで見ることも多いですね。
  • アンサンブル学習の一種で、他のアンサンブル学習にはAveraging/Bagging/Boostingがあります。
  • Stackingは他のアンサンブル学習の手法と比べると文章だけ読んでも理解し辛いので、直感的に理解できるように図と簡単な実装で説明してみたいと思います。

注意: この記事で書かないこと

今回は概念の理解にフォーカスしたいので、バリデーションの手法については触れません。特にSecondLevelでのバリデーションについてはいくつか選択肢があり、データの性質によって使い分けが必要なので次回以降書きたいと思います。

続きを読む

matsumotoryさん、kwappaさんの公開ポートフォリオレビューを受けました/自分なりにアウトプットすることのメリットを整理してみた

「エンジニアの日々のアウトプット」に関するForkwellさんのイベントに参加してきました。

  • ForkwellのポートフォリオのぼりーさんのクラウドPodcastのmatsumotoryさんゲスト回を聞いて興味を持ち使い始めました。
  • ただ、埋めやすいところを埋めてGithubを連携させただけで、ちゃんと使いこなせていたかは疑問でした
  • そんなときに、このイベントを前職の同期から聞き、開催場所も前職のオフィスだったので久々に遊びに行きたい気持ちもあって応募しました。

forkwell.connpass.com

ポートフォリオを(強制的に)ちゃんと埋めました

イベントページに

ゲストのお二人が参加者のポートフォリオを抽選で3名レビューいたします!

との記載があったので、せっかくなので…ということで応募したら、なんと選ばれました! 85人の前でレビューされる、というプレッシャーもあり、週末の半日くらいを使って必死に埋めました。ときには追い込まれることも必要だと思いました。

続きを読む

10月8日(月)につくばPythonもくもく会 No.1を開催します!

Pythonを使っている方&Pythonを勉強したい方一緒にもくもくしませんか?

  • 宣伝です。
  • これから、つくばでPythonもくもく会を定期的に開いていきます!
  • 第1回は10月8日(月)11:00~@筑波大学内体バチで行います。
  • 将来的にはPythonの情報共有ができたり、交流の輪を広げられるコミュニティにしていけたらいいなと妄想しています。
  • 参加費や条件などは無料なのでぜひぜひお気軽にお申し込みください。

詳細はconnpassページをご参照ください。

申し込みもこちらからできます。途中参加退場なども自由です!

tskubapy.connpass.com

続きを読む

ISOに従っていないデータをpandas.to_datetime()すると500倍以上遅くなる可能性がある話とその対策

TL;DR

  • pandasの to_datetime メソッドはとても便利で、かなり乱暴にデータを突っ込んでもParseしてくれます
  • でもデータによってはparseに通常の30倍以上時間がかかる可能性があるので注意しましょう
  • ISO_8601の規格に従っていない場合はとりあえず format オプションをつけておくのが得策です。
  • コードはすべてGithubにあがってます

github.com

続きを読む

pathlibで見るPythonの演算子オーバーロード活用

pathlibって便利ですよね

最近pathlibの便利さが様々なところで語られています。

pathlibの様々な機能は上記の記事やドキュメントを読んでいただければわかるので、今日はその1つに、Pythonオーバーロードを説明するのに良い機能があるので紹介したいと思います。

pathlibはこんな風にパスを書けます。

from pathlib import Path

etc_dir = Path('/etc')
init_dir = 'init.d'
print(etc_dir/init_dir/'reboot')
# => /etc/init.d/reboot

最初に見ると、ちょっとギョッとするのではないでしょうか?
pathlibでは上記のように、1 / 2 #=> 0.5 のように 変数 / 変数 という書き方でパスを書くことができます。慣れてくるとLinuxのパスを普通に書いているような気持ちで書けるので気持ち良いです。本来は除算の演算子である / でどうしてこんな風に書けるのでしょうか?答えはソースを読むとわかります。

https://github.com/python/cpython/blob/3.6/Lib/pathlib.py#L898

    def __truediv__(self, key):
        return self._make_child((key,))

この __truediv__ メソッドが答えです。

Python演算子オーバーロードできる

公式ドキュメントの 「3. Data model」を読むとPython演算子オーバーロードできることがわかります。

3. Data model — Python 3.7.0 documentation

The following methods can be defined to emulate numeric objects. Methods corresponding to operations that are not supported by the particular kind of number implemented (e.g., bitwise operations for non-integral numbers) should be left undefined.

object.__add__(self, other)  
object.__sub__(self, other)  
object.__mul__(self, other)  
object.__matmul__(self, other)  
object.__truediv__(self, other)
...

これで +-/ といった演算子を再定義できます。それではこの機能を使って擬似的にpathlibを実装してみると次のようになります。

class myPath():
    def __init__(self, path):
        self._path = path
    
    def __truediv__(self, add_path):
        self._path = self._path + '/' + add_path
        return self

    def __str__(self):
        return self._path

etc_dir = myPath('/etc')
init_dir = 'init.d'
print(etc_dir / init_dir / 'reboot')
# => /etc/init.d/reboot

無事、pathlibと同様の挙動が実装できました。 pathlibは演算子オーバーロードをとても上手く使った実装だと思います

他にも演算子オーバーロードはこんなところでも

pathlib以外で自分が良く使う演算子オーバーロードはnumpyの @ です。これを使うと機械学習の実装では欠かすことのできないドット積(内積)の計算を行うことができます。元々は dot メソッドを呼び出さなければいけなかったのですが、途中で演算子オーバーロードとして実装されたので簡単に書けるようになりました。

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print(a * b)
# [[ 1  4  9]
#  [16 25 36]
#  [49 64 81]]

# 前は dot メソッドを呼び出す必要があった
print(a.dot(b))
# [[ 30  36  42]
#  [ 66  81  96]
#  [102 126 150]]

# 今は@演算子でdot積が計算できる
print(a @ b)
# [[ 30  36  42]
#  [ 66  81  96]
#  [102 126 150]]

演算子オーバーロード、とても便利ですね。

最後に