フリーランチ食べたい

機械学習、Python、ソフトウェアエンジニアリング、プロダクティビティなど

Pythonに関するオススメの書籍/サイト/サービス/Podcast/イベントの情報をシェア

Pythonをこれから勉強したい or 最新情報のキャッチアップがわからない、という方に

tskubapy.connpass.com

  • つくばPythonもくもく会 No.2を開催しました!
    • 参加者の方の中にはこれからPythonを始めたい、という方もいらっしゃったので、今まで自分が勉強してきた中で役に立ったものをリストアップして、LTしました。
    • 自分は機械学習系のエンジニアをしていて、そっちの方向で学んでいることも多いので、「言語について」と「機械学習/データ解析」という分け方をして紹介したいと思います。
  • 機械学習/データ解析」に関してはPythonに関係するものだけに絞っています。
  • 書籍に関してはたくさん挙げられても迷ってしまうと思ったので、本当は他にもたくさん素晴らしい書籍があるのは理解しつつ、「あえて選ぶなら」を載せています。

学習する上で注意すること

勉強する教材を選ぶ上で個人的に気にした方がいいと思っていることは↓です。

  • 最新の情報かどうか
    • Pythonに関わらずWeb技術はOutdatedになるのが早いです。常にその情報が最新に更新されているか確認する必要があります。
    • そういう意味で公式のチュートリアルなどは(ある程度)安心してできると思います。
  • 誰が書いているか
    • 書籍、インターネットには大量の情報が存在して玉石混交だと思います。その中でいい情報を選択するには「著者がどんな人か」を調べるのは非常に有用です。
    • 例えば自分が勉強したいライブラリがあったとき、その作者が書いている本はとても良いと思います。
    • pandasを学びたいときには作者のWes McKinneyが書いた「Pythonによるデータ分析入門」を読みましょう
    • kerasを学びたいときには作者のFrancois Cholletが書いた「PythonとKerasによるディープラーニング」を読みましょう

書籍

言語について

初級の方が読むのに良い本

入門 Python 3 という選択肢もありますが、自分はこちらの方が実践的で楽しく学べると思います。

中級から上級になりたい方が読むのに良い本

Fluent Python ―Pythonicな思考とコーディング手法

Fluent Python ―Pythonicな思考とコーディング手法

さらに実践的なTipsを学びたい人向け

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

包括的に学ぶというよりは、細かい実践的なTipsがたくさん載っています。FluentPythonを読み終えた後にExtensionとして読むのがオススメ。

機械学習

理論と実践を包括的に学びたい

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

現時点での決定版だと思います。Scikit-learn/Tensorflowの使い方とその裏側にある理論がバランスよく網羅的に記載されています。

↑が出る前の自分の中では決定版でした。ページ数的にはこちらの方が少し手っ取り早いと思います。 ただしDeepLearningについては記載なし 第二版からはDeepLearningの章も追加されています。(追記: ブコメで指摘いだきました。ありがとうございます。)

PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニング

Kerasについて学びたい方はKeras作者のFrancois Cholletが書いたこちらの本がオススメです。

前処理、データ解析について学びたい

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

pandasの作者Wes McKinneyの著書。第一版を間違って買わないように注意。(Python2系なので)

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

Jupyterだけでなくpandasやmatplotlibについても詳しく書いてあります。

ベイズの勉強をしたい

Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド

Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド

現時点でのPythonでのベイズ統計を学ぶ決定版だと思います。もう少し詳しい感想はこちらに書きました。

blog.ikedaosushi.com

Pythonで体験するベイズ推論 PyMCによるMCMC入門

Pythonで体験するベイズ推論 PyMCによるMCMC入門

↑が出る前は自分の中で決定版でした。↑より少しとっつきやすいと思います。 また、英語版はGitHub上でJupyterNotebook形式で全て読めます。 github.com

サービス/サイト

言語を学びたい

Python チュートリアル — Python 3.6.5 ドキュメント 公式チュートリアルです。基本的に間違った内容が書いていない、かつ常に最新版にアップデートされていくので、信頼性が高いです。

Python Boot Camp(初心者向けPythonチュートリアル) — PyCon JP

PyConJP が主催しているPython BootCampのチュートリアルです。こちらも定期的に全国で開催されながらアップデートされていくので、Outdatedな内容は少ないと思います。

有名ライブラリの情報を包括的に知りたい

github.com Webアプリケーション, Desktopアプリケーション、音声解析...などジャンルごとに有名なPythonライブラリがまとめてあります。 Pythonで何か作りたいものがあるけど、どのライブラリを使って良いかわからないときは始めにここを見て、Star数を見て判断するのが良いでしょう。

GitHubじゃ!Pythonじゃ! – GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

Python(など)の有名GitHubリポジトリを翻訳してくれているサイトです。RSSで購読しておくのがオススメです。

最新動向を追いたい

メーリス

www.pythonweekly.com

python.libhunt.com

メーリスに登録していると毎週木曜/金曜日あたりに、「今週あったPython界隈での主な動き」を配信してくれます。 このメーリスを購読していれば基本的に大きな動きは見逃さないでしょう。

github-trending-repos

github.com

github-trending-reposは面白いリポジトリで、各言語ごとにIssueが切られていて、最近ホットなライブラリがそのIssueに書き込まれるシステムになっています。 自分が気になるカテゴリをGitHubの機能でWatchしておくのが良いです。自分が購読しているのが↓のPythonとjupyterです。

Python New weekly trending repos in Python · Issue #11 · vitalets/github-trending-repos · GitHub

Jupyter https://github.com/vitalets/github-trending-repos/issues/110

機械学習を勉強したい

オンラインコース

オンラインコースはfast.aiとCourseraがオススメです。 シラバスを見ることができるので最初にチェックして自分に合っているものを受講するのが良いでしょう。

course.fast.ai

www.coursera.org

www.coursera.org

www.coursera.org こちらはPythonではなくMatlab/Octaveなのですが、とてもオススメなので例外的に入れさせてもらいました。

ドキュメント

scikit-learnのドキュメントは単なるライブラリの説明を超えて機械学習に関するエッセンスがてんこ盛りです。

scikit-learn: machine learning in Python — scikit-learn 0.20.0 documentation

記事

参考になりそうな記事です。

employment.en-japan.com

qiita.com

qiita.com

Podcast

言語について

talkpython.fm

www.kennethreitz.org requests, pipenvのKenneth ReitzがやっているPodcastです。

機械学習

softwareengineeringdaily.com

twimlai.com GoogleBrainのJeff Deanや、fast.aiのJeremy Howardなど機械学習のトップエンジニアが出演しているPodcastです。

イベント

言語について

pyconjp.connpass.com

PyCon JPは日本で一番大きなPythonのイベントです。毎年一回9月に開催されています。

Python Boot Camp(初心者向けPythonチュートリアル) — PyCon JP

Python BootCampはPyCon JPが定期的に全国各地で開催しているイベントです。 熟練されたPythonistaが直接Pythonを教えてくれるのでおすすめです。

機械学習

pydatatokyo.connpass.com

機械学習やデータサイエンスに限定したPythonの勉強会です。

machine-learning15minutes.connpass.com

最後に

  • 「これもあるよ!」「こっちの方がいいよ!」というものがあれば、是非コメントで教えてください
  • それではよいPythonLifeを!

scikit-learnのRandomForest.feature_importances_のコードを追う

feature_importances_をちゃんと理解する

  • feature_importances_ とは sklearn.ensemble.RandomForestClassifiersklearn.ensemble.RandomForestRegressor (など)で特徴量の重要度を出力するメソッドです。
  • とても便利で、EDAやモデルの精度向上のためのアイディアを得るためによく使用しますが、「この重要度って何を表しているの?」と聞かれたときにパッと説明できなかったので調べてみました。
  • ちなみにドキュメントには↓の1行だけ説明があります。

    The importance of a feature is computed as the (normalized) total reduction of the criterion brought by that feature. It is also known as the Gini importance.

開発者が回答しているStackOverflow

もう少し細かい説明としてはscikit-learnの開発者 Gilles Louppe がstackoverflowで↓のように質問に回答しています。

stackoverflow.com

There are indeed several ways to get feature "importances". As often, there is no strict consensus about what this word means.

In scikit-learn, we implement the importance as described in [1] (often cited, but unfortunately rarely read...). It is sometimes called "gini importance" or "mean decrease impurity" and is defined as the total decrease in node impurity (weighted by the probability of reaching that node (which is approximated by the proportion of samples reaching that node)) averaged over all trees of the ensemble.

記載されている通り、gini importance あるいは mean decrease impurity と呼ばれ、ノードの不純度(impurity)をアンサンブル木で平均したものになります。 これが簡潔で正しい回答なのですが、一応コードベースでも見てみたいと思います。

該当コード

順番に見ていきます。まず大元の sklearn.ensemble.forest.BaseForest クラスのメソッドです。

https://github.com/scikit-learn/scikit-learn/blob/1128094271923c66f9e602372ba7ee8b7f565e52/sklearn/ensemble/forest.py#L365 ※ 該当部分以外を省略しています

    def feature_importances_(self):
        all_importances = Parallel(n_jobs=self.n_jobs,
                                   **_joblib_parallel_args(prefer='threads'))(
            delayed(getattr)(tree, 'feature_importances_')
            for tree in self.estimators_)

        return sum(all_importances) / len(self.estimators_)

わかりやすいコードで、ここで各アンサンブル木のall_importancesを平均していることがわかります。

呼ばれているのは、 sklearn.tree.tree.BaseDecisionTree のメソッドで、単純に compute_feature_importances を呼び出しているだけです。

https://github.com/scikit-learn/scikit-learn/blob/a80bbd9403fea9cf4aa46dfef26a4b31a608957b/sklearn/tree/tree.py#L513 ※ 該当部分以外を省略しています

    def feature_importances_(self):
        return self.tree_.compute_feature_importances()

ここからはCythonで書かれた sklearn.tree._tree.Tree クラスのメソッドを呼び出しています。

https://github.com/scikit-learn/scikit-learn/blob/a80bbd9403fea9cf4aa46dfef26a4b31a608957b/sklearn/tree/_tree.pyx#L1062 ※ 該当部分以外を省略しています

    cpdef compute_feature_importances(self, normalize=True):
        cdef np.ndarray[np.float64_t, ndim=1] importances
        importances = np.zeros((self.n_features,))
        cdef DOUBLE_t* importance_data = <DOUBLE_t*>importances.data

        with nogil:
            while node != end_node:
                if node.left_child != _TREE_LEAF:
                    # ... and node.right_child != _TREE_LEAF:
                    left = &nodes[node.left_child]
                    right = &nodes[node.right_child]

                    importance_data[node.feature] += (
                        node.weighted_n_node_samples * node.impurity -
                        left.weighted_n_node_samples * left.impurity -
                        right.weighted_n_node_samples * right.impurity)
                node += 1

        importances /= nodes[0].weighted_n_node_samples
        return importances

こちらが特に重要な部分でnodeの不純度(impurity)から左右のnodeの不純度を引いたもの(それぞれ重みをかけている)をその特徴量の不純度にしています。

importance_data[node.feature] += (
  node.weighted_n_node_samples * node.impurity -
  left.weighted_n_node_samples * left.impurity -
  right.weighted_n_node_samples * right.impurity)

この不純度を各アンサンブル木で平均したものが feature_importances_ になります。

さいごに

  • ざっくりとですが、コードを追って、 RandomForestfeature_importances_ を理解しました。
  • ちなみに他の指標としては mean decrease accuracy があります。
  • これはOOBを用いて測る指標で、該当変数をモデルから除いた際の予測精度の低下を計算します。RのRandomForestにはこの指標も実装されています。

機械学習関係の主要人物20人を調べてみました

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

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

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

f:id:mergyi:20181104012727p:plain

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

紹介方法

下記のような形式で紹介していきたいと思います。 f:id:mergyi:20181104013035p:plain それぞれ、人物ごとに調べられるように参考リンクも貼りました。

創造主

まず創造主は3人です。

f:id:mergyi:20181104012926p:plain

イノベーター

イノベーターは6人います。

f:id:mergyi:20181104013155p:plain f:id:mergyi:20181104013209p:plain

ボス

f:id:mergyi:20181104013304p:plain f:id:mergyi:20181104013334p:plain

アンファン・テリブル

アンファン・テリブルジャン・コクトーの小説から生まれた言葉で「恐るべき子供たち(ここでは若者たち)」という意味ですね。5人のアンファン・テリブルを紹介します。

f:id:mergyi:20181104013410p:plain f:id:mergyi:20181104013431p:plain

最後に

というわけでまとめて見ました。全体を通して印象としては、主要人物がGoogle(とDeepMind)に本当に多いです。Googleという会社は改めてモンスターだなと思いました。 ちなみに、柏野さんのスライドの中だと下の三人を見つけることができませんでした…特に左右の2人は絶対見たことがあるので、思い出せなくて悔しいです。どなたかご存知の方がいたら教えてください。 f:id:mergyi:20181104014933p:plain

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

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

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

Notebookの最初のセルはこんな風になっていませんか?

これは自分がいつも読み込むライブラリ群で、自分はAlfredのsnipetを使って呼び出せるようにしていました。

%load_ext autoreload
%autoreload 2
%matplotlib inline
from IPython.display import Image

import os, sys, re, datetime
from pathlib import Path

pj_dir = Path(os.getcwd()).parents[1]
data_dir = pj_dir/'data'
img_dir = pj_dir/'images'
src_dir = pj_dir/'src'
sys.path.append(str(src_dir))

import numpy as np
import pandas as pd
import dask.dataframe as dd
from scipy import stats 

from tqdm import tqdm_notebook
from dotenv import load_dotenv

from matplotlib import pyplot as plt
from cycler import cycler

ちなみにmatplotlibの初期設定は %matplotlib inline と一緒に呼び出すとリセットされてしまう という既知のバグがあるので、セルを分けてmatplotlibの設定をしています。

Changing rcParams in same Jupyter notebook cell as %matplotlib inline has no effect · Issue #11815 · matplotlib/matplotlib · GitHub

plt.style.use("bmh")
plt.rcParams['axes.prop_cycle'] = cycler(color=plt.get_cmap('Set1').colors)
plt.rcParams["figure.figsize"] = (16, 4)
plt.rcParams["font.family"] = "YuGothic"

また、scikit-learnで複数モデルを比較したいときは、↓のような読み込みが必要になりますし、

import sklearn
from sklearn.model_selection import KFold

from sklearn import feature_extraction
from sklearn import preprocessing

from sklearn.linear_model import Ridge
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn import metrics
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor

さらにDeepLearningしたいときは↓のような読み込みも追加されます。(これは大分少ないほうだと思います。RNNするときはこの3倍くらいはインポートしてる気がします。)

from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers.advanced_activations import LeakyReLU
from keras import initializers

非常に長いですね。 上記を全部入力するとこんな感じです。

f:id:mergyi:20181025170010p:plain

全然メインロジックに集中できない! ですね。

%macro で解決しよう

そこで %macro を使います。 %macro はiPythonのMagicCommandの1つでJupyterからも使うことができます。

Built-in magic commands — IPython 7.0.1 documentation

使い方は簡単です。まず保存から

保存

ソースはこちら👇

はてなブログでJupyterNotebookのいい共有方法がわからないので良い方法ご存知の方がいたら教えてください。

python-sandbox/20181025_record_macros.ipynb at master · ikedaosushi/python-sandbox · GitHub

f:id:mergyi:20181025170413p:plain

%macro を使っているのは下記の部分です。

%macro -q __imp 1
%macro -q __mpl 2

このように

%macro -q __imp [保存したいセルの実行番号]

と書くことで保存することができます。使うときは

__imp

でさきほど保存したセルが呼び出されます。

これだけでは、同じNotebook内で使えるだけなので、さらに %store を使って保存します。

%store __imp
%store __mpl

これで保存されたので、KernelやProcessを再起動しても使うことができるようになります。

完全に余談なのですが、 %store で保存された変数は↓にあるようです。これを書いていて初めて知りました。

Where are %stored Jupyter files located? - Stack Overflow

%IPYTHONDIR/<profile_name>/db/autorestore/<variable_name>

読み込み

ソースはこちら👇

python-sandbox/20181025_use_macros.ipynb at master · ikedaosushi/python-sandbox · GitHub

f:id:mergyi:20181025171858p:plain

読み込みも簡単で、

%store -r __imp
%store -r __mpl

のように書いて、

__imp
__mpl

と呼び出すだけです。これでライブラリのインポートとmatplotlibの設定を読み込むことができました。ちゃんとnumpyの読み込みとmatplotlibの設定も読み込めています。

さらに踏み込んで

さらに毎回保存された変数を取り出すのがめんどくさい!という方は .ipython_profile に下記のように記載することで、自動で %store された変数を呼び出すこともできます。

c.StoreMagics.autorestore = True

最後に

  • Jupyter MagicCommand %macro%store を組みわせて簡単にライブラリを読み込む方法を紹介しました
  • Jupyterに関するTipsは最近だとPyConJP 2018で発表されていた「Jupyterで広がるPythonの可能性」やリクルートテクノロジーズさんのブログ記事「あなたの生産性を向上させるJupyter notebook Tips」にもかなりまとめられていたのでおすすめです。

github.com

recruit-tech.co.jp

それでは良きJupyterLifeを!

Stackingでモデルの精度UP 実装と直感的な解説

Stackingとは何か

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

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

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

Stackingの概念

まず直感的な説明から始めたいと思います。「ある物件の価格を過去のデータから予測するタスク」を考えます。

基本のモデル

基本のモデルは1つのモデルがあって、そのモデルが予測を出力します。 ここではゾウがモデルだと思ってください。

f:id:mergyi:20181021184007p:plain

Stacking

それではStackingはどうなるかというと、図で表すと下記のようになります。

f:id:mergyi:20181021183745p:plain

先ほどと違う点として

  • 複数のモデルが存在する
  • モデルの出力を統括する meta_model (メタモデル) が存在する

があります。

ここで動物たちが表している各モデルをベースモデル、先生が表す統括するモデルをメタモデルと呼びます。ポイントは メタモデル「ベースモデルの出力」を入力として学習し、結果を出力すること です。メタモデルで使われるアルゴリズムは特に制限はないのですが、回帰問題であればLinearRegressionを分類であればLogisticRegressionを使うのが一般的です。

メタモデルは何を学習するか

メタモデルの入力は、「ベースモデルの出力」なので、学習データ内の特徴量を知りません。それではメタモデルは何を学習しているのでしょうか。それは、「ベースモデルがどのくらい信頼できるか」です。図の例でいうと動物たち(ベースモデル)の予測を何度も聞いて「ぞう(LR)はあまり当てにならないな、さる(LGBM)はかなり正確だな」という感覚を学習していっているようなイメージです。最終的にはベースモデルごとに重み(パラメーター)を割り当てて最終結果を出力します。(※「重み」という書き方は線形モデルに限定しているような書き方になってしまうのですが、わかりやすさのためにこの表現を使っています。)

なぜStackingで精度を向上できるのか

アンサンブル手法は複数のモデルを組み合わせて強力なモデルを作る、という手法ですが、その組み合わせ方として、単純な平均などで組み合わせるよりも、「それぞれのモデルの良さを知っているメタモデルが調整する」ことにより、より良い組み合わせが行われる、と理解できます。

Python実装

直感的な説明が終わったので、実際にどんな処理が行われているか実装を通して見てみたいと思います。

データ

KaggleのTurorial用Competitionを使います。

House Prices: Advanced Regression Techniques | Kaggle

コード

実装は下のGithubに上げてあります。

github.com

解説

1つ1つ解説していきたいと思います。まず前提として以下のデータを準備しています。

  • X_train/y_train: 学習データ
  • X_valid/y_valid: バリデーションデータ
  • X_meta_valid/y_meta_valid: メタモデルのバリデーションデータ

ベースモデルの学習、メタモデルの学習、というように2段階に分かれているので、バリデーションデータが2種類必要なことに注意してください。

ベースモデルの学習

まずはベースモデルの学習です。単純にモデルを3つ作って学習させているだけです。 base_pred_1~3はメタモデルの学習入力データになります。

# train base model
base_model_1 = LinearRegression()
base_model_2 = LGBMRegressor()
base_model_3 = KNeighborsRegressor()

base_model_1.fit(X_train, y_train)
base_model_2.fit(X_train, y_train)
base_model_3.fit(X_train, y_train)

# base predicts
base_pred_1 = base_model_1.predict(X_valid)
base_pred_2 = base_model_2.predict(X_valid)
base_pred_3 = base_model_3.predict(X_valid)

メタモデルの学習

ベースモデルの出力を使ってメタモデルの学習を行います。 そんなに難しいことはしておらず、「ベースモデルの出力を連結する」「それを入力として学習させる」だけです。

# stack base predicts for training meta model
stacked_predictions = np.column_stack((base_pred_1, base_pred_2, base_pred_3))

# train meta model 
meta_model = LinearRegression()
meta_model.fit(stacked_predictions, y_valid)

結果の検証

ベースモデル、メタモデルともに学習が終わったらメタモデルの出力を使って精度を検証してみます。この時に、必ず「ベースモデルで予測」->「予測結果をメタモデルに入力」という工程を踏むことを忘れないように注意してください。

# final result 
valid_pred_1 = base_model_1.predict(X_meta_valid)
valid_pred_2 = base_model_2.predict(X_meta_valid)
valid_pred_3 = base_model_3.predict(X_meta_valid)
stacked_valid_predictions = np.column_stack((valid_pred_1, valid_pred_2, valid_pred_3))
meta_valid_pred = meta_model.predict(stacked_valid_predictions)

print ("mean squared error of model 1: {:.4f}".format(mean_squared_error(y_meta_valid, valid_pred_1)) )
print ("mean squared error of model 2: {:.4f}".format(mean_squared_error(y_meta_valid, valid_pred_2)) )
print ("mean squared error of model 3: {:.4f}".format(mean_squared_error(y_meta_valid, valid_pred_3)) )
print ("mean squared error of meta model: {:.4f}".format(mean_squared_error(y_meta_valid, meta_valid_pred)) )

# => mean squared error of model 1: 0.0239
# => mean squared error of model 2: 0.0181
# => mean squared error of model 3: 0.0634
# => mean squared error of meta model: 0.0175

このように、メタモデルの結果が一つ一つのベースモデルよりも良い精度が得られたことを確認できました。一工程ずつ追っていくと難しいことは何もしていないことがわかっていただけたのではないでしょうか?

Stackingを使う上で大事なこと/まとめ

最後にStackingを使う上で気をつけることなどを記載しておきます。

  • アンサンブル手法全体に言えることですが、ベースモデルの多様性が高いほど良い結果を得られやすくなります。
    • 多様性、というのはモデルの種類(線形モデル/決定木モデル/KNNモデル)と特量量の2つの側面があります。
    • 今回はベースモデルはモデルの種類だけ変えましたが特量量自体を変えるという戦略も有効です。
  • その他のアンサンブル手法に比べてStackingが常に優れているわけではないので、データや特徴量によって手法を使い分ける必要があります。
  • 今回はメタモデルのバリデーションをシンプルなHoldOut法で行いましたが、適切でない場合もありDataLeakageが発生する可能性があります。特に時系列データを扱う際は気をつけてください。

参考リンク

Stackingに関しての資料は他のアンサンブル手法に比べて少ないのですが、下記のリンクが参考になりました。

Stackingを簡単に行えるStackNetというフレームワークもあるので興味ある方はチェックしてみてください。

blog.kaggle.com

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

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

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

forkwell.connpass.com

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

イベントページに

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

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

発表: matsumotoryさん・kwappaさん

speakerdeck.com

最初はmatsumotoryの発表でした。

  • 自分自身の経験とアウトプットを続けていて得たもの
  • アウトプットの方法について挑戦を続けてきたこと
  • 様々な視点からアウトプットのメリット

などを伺いました。普段からmatsumotoryさんのBlogを拝読することがあるのですが、記事から伺える価値観や考え方をよりリアルに感じ、刺激になりました。

次はkwappaさんの発表でした。

  • 公開/非公開に関わらずアウトプットしていくことが大事
  • 技術メモや作業ログとして残していき、徐々にアウトプットの量や範囲を広げていく
  • 媒体はGithub・Qiita・はてなブログなんでも良いので自分に合っているものを使う

といった内容を伺いました。現実的でとても参考になるお話でした。

自分なりにアウトプットのメリットを整理してみる

お二人のお話を聞きながら、自分の頭の整理用にアウトプットすることのメリットをまとめていました。せっかくなのでここに書いておきたいと思います。それぞれの項目自体はお二人の発表にあったもので、自分は整理してみただけなのであしからず。

アウトプットすることのメリットは(もちろん色々な整理の仕方があると思いますが)「一時視点」「連続視点」で分けられるのではないかと考えました。

一時視点

f:id:mergyi:20181009232342p:plain

まず「一時視点」です。「一時視点」というのは、時間軸に関わらない、その時点時点でのメリットを指しています。この視点で見たときにはアウトプットすることには下記のメリットがあると思います。

1. 頭の中が整理される

「理解している」と思っていたことが、実際に書いてみるとわかっていなかったり、書いていく中で理解できてくることってたくさんありますよね。

2. 自己を客観的に見れる

1週間前に書いた記事や1年前に書いた文章を読み返すと、まるで他人の文章を読んでいるような気持ちになることがあり、そこで「自分はこういう考えの人間だったのか」ということに客観的に気づけた経験があります。

3. 他者を巻き込める

まだ自分はできていない気がしますが、matsumotoryさんの発表にあったので。 アウトプットから他人を巻き込んでアクションを起こして、そこからさらにアウトプットする、という流れができたら最高ですよね。

連続視点

f:id:mergyi:20181009232415p:plain

もう一つが「連続視点」です。「一時視点」と対象的に、時間が経過していくことで生まれるメリットを指していて、下記のような項目が当てはまると思いました。

1. 実績から未来が予想できる

今までの自分が書いた記事や発表を見返すことで、「自分がどのくらいのスピードで成長しているか」や「興味を持っている技術の方向性」が見えてきて、これから自分がどう進んでいくか、を客観的に予想することができます。

2. 自分の「ストーリー」がわかる

1.の発展形だと思いますが、過去から未来の自分の進捗を観察することで、「自分がどのような価値観で生きているのか」「何を目指して生きていくのか」がわかるようになるのではないでしょうか? 正直、自分はここまで達していないですが、アウトプットを続けていつか、それに気づけたら嬉しいです。

3. 実績を会社に評価してもらう

最後は一番現実的で馴染みがあるかもしれませんが、就職活動や転職活動で実績として認めてもらったり、会社内でも自分が挑戦したい案件があったときに、アウトプットをしていることで周りを説得しやすくなる、ということもあると思います。

特に印象に残った点

どちらかというと、自分の認識ではアウトプットすることのメリットは「一時視点」が中心で、特に「連続視点」の「実績から未来が予想できる」「自分のストーリーがわかる」ことは全然頭になかったので、本当に目からウロコが落ちるような気持ちでした。

その後公開レビューを受けました。

休憩を挟んでいよいよ公開レビューを受けました。自分の前が来る前に、matsumotoryさん、kwappaさんのポートフォリオを見る、というイベントがあり、お二人のポートフォリオに比べると自分のポートフォリオがあまりにしょぼいので、レビューが始まる直前は逃げ出したいような気持ちでした。笑

f:id:mergyi:20181009231047p:plain

しかし、実際に公開レビューが始まるとお二人とForkwellのakagawaさんが、かなり丁寧に、優しく、レビューしてくださったので、比較的にリラックスして話すことができました。 また内容も的確でためになることばかりでした。イベント後、matsumotoryさんがTwitterでコメントしてくださっていてとても嬉しかったです。

自分から質問することもできたので「Blogに対して反応が少ないと、Blogを続けていくのが辛くなっていくと思いますがどう継続するのがおすすめですか?」というような質問をしたところ、 matsumotoryから、matzさんの『俺を踏み台にしてくれ』という言葉を引用しながら、「誰か共有/拡散してくれる人を見つけるといいかもしれない。自分は最初のころmrubyのアウトプットをしていて、matzさんに共有/拡散してもらって人脈と可能性が広がっていった」というような回答をいただきました。なるほど〜と唸りっぱなしでした。

ちなみに僕の次に公開レビューを受けていたsachinさんは若干21歳で僕よりも遥かにエンジニア経験があってOSS活動などもバリバリされていて本当にすごいと思いました。心から尊敬します。

Forkwell Portfolio - エンジニア向けのポートフォリオサービス

さいごに

その後の懇親会でも同年代のエンジニアと何人か情報交換やお互いの仕事内容等を共有にとても刺激になりました。また、Forkwellのakagawaさんが大学の先輩であったことを知り(さらに大学時代も話したことがありました)衝撃を受けました。世界って本当に狭いですね。そういったこともあり、イベントの本筋以外でも非常に実りの多いイベント参加になりました。

matsumotoryさん、kwappaさん、Forkwellの皆さん、本当にありがとうございました。

ちなみに

全然関係ない&完全に偶然ですが、今日誕生日です。笑 28歳になりました。今年もチャレンジをやめない一年にしたいなと思ってます。 また今年一年よろしくお願いします。

ほしいものリスト

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

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

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

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

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

tskubapy.connpass.com

動機など少しだけ

  • 一番直接的な動機はPyConJP 2018 に運営として参加したことです。
  • 今まで自分の会社以外でPythonエンジニアを触れ合う機会がほとんどなかったので、とても刺激的でした。
  • コミュニティがあると、インプットアウトプットの流れができやすく、1人で勉強しているのとは全く違う体験ができることを感じました。
  • つくばには、エンジニアのコミュニティは自分が知る限りそこまで多くなく、特にPythonのコミュニティは存在していない(と思う)ので、つくばでもそういう体験を作り出せたら嬉しいです。
  • また、PyCon JPの一部のPython BootCampにTAとして参加して、Pythonに興味を持っている/勉強したいと思っている人の多さに驚きました。そういった方々に勉強の場の提供や効率的な勉強法なども共有できたら良いなと思ってます。

blog.ikedaosushi.com

  • 最近、RのコミュニティであるTsukuba.R が復活したことも開催するきっかけになりました。 www.meetup.com

最後に

今回のもくもく会に参加したいけどできないという方、今後このもくもく会に参加してみたいという方、参加はするかわからないけどちょっと興味がある方、connpassに tsukuba.py というグループを作ったのでぜひぜひお気軽にご参加ください!Join us!

tskubapy.connpass.com