数理的手法を使いやすくするためのソフトウェア開発

科学技術計算とデータサイエンスについて

メモ:VMwareとVirtualBoxの仮想マシンを引っ越し

自宅のデスクトップPCでブルースクリーンが頻発するようなりました。 そこで、仮想マシンを外部HDDへコピーして、新しいPCへ引っ越そうと思います。 その方法をメモしておきます。

VMware

仮想マシンディレクトリごとコピーして、新しいPCでVMwareからコピーしたディレクトリを開いて、仮想マシンを立ち上げます。

簡単。

VirtualBox

すこし面倒。 なぜなら、VirtualBoxで使用する仮想マシンはvmdk形式(拡張子.vmdk)であるが、このファイルをそのまま別環境にコピーしても残念ながら仮想マシンの移行はできないから。 vmdk形式のファイルを一旦ova形式(拡張子.ova)に変換(エキスポート)してから、このovaファイルを別環境のVirtualBoxでインポートせねばなりません。 インポートが終われば、あとは別環境でその仮想マシンを使うことができます。(確認できるのは、新しいPCが届いてから。しかし、それまで古いPCがもつのか心配です。)

VirtualBoxで仮想マシンを別環境や別フォルダに移動する方法

VirtualBox仮想マシンを別環境や別フォルダに移動するためには、仮想アプライアンスのエキスポート → 仮想アプラインアンスのインポートという手順を踏む。

(1) VirtualBoxのメニューバーから[ファイル(F)] → [仮想アプライアンスのエクスポート(E)…]をクリック

(2) エクスポートする仮想マシンを選択し → [次へ(N)]をクリック

(3) 出力ファイル名を指定し、[次へ(N)]をクリック

(4) [エクスポート]をクリック

(5) 数十秒~数分、以下の画面に何の変化もないが、待っているとプログレスバーが動き始める。

すごいプログラミング言語Formura で、たのしく科学シミュレーション?

科学シミュレーションのプログラミングは、 しばしば、退屈でめんどうなことがあります。

まず、退屈なのは、 ひとそろいの偏微分方程式で記述できるようなシミュレーションであっても、 長大で冗長なソースプログラムを書かねばならないことです。 そして、めんどうなのは、 微分方程式の意味とハードウェアアーキテクチャから どのように高速化すれば良いのかが明らかなときでも、 その機械的なチューニング作業をコンパイラではなく 人間がせねばならないことです。

新しいプログラミング言語

しかし、こうした冗長性と機械的作業を解消するための 研究も行われています ^1 ^2 ^3 ^4 ^6 ^7 。 こうした研究は理化学研究所でも進められおり ^5 、 その論文 ^7 は、 スーパーコンピューティングの国際会議"SC16"において、 ゴードンベル賞のファイナリストに選ばれました ^9

論文 ^6 ^7 は、新しいプログラミング言語 Formura について書かれています。 この言語は、 Fortran が初等的数式を実行形式のコードへと変換するように、 偏微分方程式をCのコードへと変換します。 そして、偏微分方程式で、例えば、菌類の地下ネットワークをシミュレートしようとすれば、 FortranやCでは長大なソースプログラムを書かねばなりませんが、 Formuraならたった20ステップ!ですみます。 また、そのチューニング作業を人間が行わずとも、 コンパイラによる自動チューニングだけで、 理研スパコンから1.2ペタプロップスの性能を引き出せるのです。

楽しいプログラミングだけですごいのか?

さて、こうした研究は科学シミュレーション分野を変えていくのでしょうか? たしかに、プログラミングから冗長性と機械的作業が減れば、 それだけプログラミングは楽しくなります。 しかし、楽しさに現実を変える力はあるのでしょうか? ちなみに、Formura論文の筆頭著者の村主さんは、 「すごいHaskell、たのしく学ぼう」 ^8 の訳者のひとりでもあり、 私はこの本を途中まで読んでみて、 関数型プログラミングには、シミュレーションプログラミングにつきものの冗長性と機械的作業を 解消し、プログラミングを楽しくできる可能性があると知りました。 ただ、Haskellのような関数型プログラミング言語やその楽しいプログラミングスタイルを、 自分の仕事である数理的手法のソフトウェア開発に使える可能性は小さいと判断し、 このすごい本を途中で読むのをやめてしまいました。

関数型プログラミングと領域特化言語はすごい

しかし、私の判断は間違っていたのかもしれません。 プログラミング言語Formura は、Haskellで実装された独立型の領域特化言語 ^10 ^12 であり、 関数型プログラミングの楽しさが科学シミュレーション開発のやり方を変えうることを示している と思います。 また、Formuraの研究の前に、Haskellで実装された埋込み型の領域特化言語 Paraiso ^4 も、 関数型プログラミングが、シミュレーションをプログラミングしやすくするだけでなく、 その計算速度をも向上させられることを 示しています。

やはり、関数型プログラミング、それによるメタ言語的抽象 ^11 と領域特化言語は素晴らしいです。


参考

^1:Klaus Iglberger, Georg Hager, Jan Treibig, and Ulrich Rüde, "Expression Templates Revisited: A Performance Analysis of Current Methodologies", SIAM J. Sci. Comput., 34(2), C42–C69.

^2:Pierre Esterie, Joel Falcou, Mathias Gaunard, Jean-Thierry Lapresté, Lionel Lacassagne, "The Numerical Template toolbox: A Modern C++ Design for Scientific Computing", Journal of Parallel and Distributed Computing, Elsevier, 2014, 74 (12), pp. 3240-3253.

^3:Christophe Prud'Homme, Vincent Chabannes, Vincent Doyeux, Mourad Ismail, Abdoulaye Samake, Gonçalo Pena, Cécile Daversin, Christophe Trophime, "Advances in Feel++: a domain specific embedded language in C++ for partial differential equations",Eccomas'12 - European Congress on Computational Methods in Applied Sciences and Engineering, Sep 2012, Vienna, Austria

^4: T. Muranushi, “Paraiso: an automated tuning framework for explicit solvers of partial differential equations,” Computational Science & Discovery, vol. 5, no. 1, p. 015003, 2012.

^5:理化学研究所プレスリリース「式が書ければ「京」が使える-高度なプログラムを自動生成できる新言語「Formura」を開発-」

^6:Takayuki Muranushi, Seiya Nishizawa, Hirofumi Tomita, Keigo Nitadori, Masaki Iwasawa, Yutaka Maruyama, Hisashi Yashiro, Yoshifumi Nakamura, Hideyuki Hotta, Junichiro Makino, Natsuki Hosono, Hikaru Inoue, "Automatic generation of efficient codes from mathematical descriptions of stencil computation", FHPC 2016: Proceedings of the 5th International Workshop on Functional High-Performance Computing

^7:Takayuki Muranushi, Seiya Nishizawa, Hirofumi Tomita, Keigo Nitadori, Masaki Iwasawa, Yutaka Maruyama, Hisashi Yashiro, Yoshifumi Nakamura, Hideyuki Hotta, Junichiro Makino, Natsuki Hosono, Hikaru Inoue, "Simulations of below-ground dynamics of fungi: 1.184 pflops attained by automated generation and autotuning of temporal blocking codes", SC '16 Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis Article No. 3

^8:「すごいHaskell、たのしく学ぼう」Miran Lipovaca (著), 田中 英行 (翻訳), 村主崇行 (翻訳)

^9:Finalists Compete for Prestigious ACM Gordon Bell Prize in High Performance Computing

^10:M.Fowler and R.Parsons, "Domain-Specific Languages", Addison-Wesley, 2011.

^11:Structure and Interpretation of Computer Programs 2nd edition

^12:"Functional Programming for Domain-Specific Languages", Central European Functional Programming School Volume 8606 of the series Lecture Notes in Computer Science pp 1-28.

データ分析入門としてのKaggleコンペ「タイタニック乗客の生存予測」

これまで、Kaggleコンペティション ^1 ,^13 ,^14 は初心者には関係のない場所だと思っていましたが、 そうではありませんでした。 もちろん、賞金付きのコンペでは専門家がデータ解析で競い合っているのですが、 その他の賞金なしのコンペのなかには初心者が楽しめるものがあるのです。 特に、"Titanic: Machine Learning from Disaster"^2というコンペは入門レベルであり、 予備知識としてpython機械学習の基本を理解していれば、 kaggleコンペのプロセスをひととおり体験できます (ただ、賞金獲得だけは体験できません)。

以下で、その体験の内容をかいつまんで紹介します。

"Titanic: Machine Learning from Disaster"とは

このコンペは、1912年4月15日の大惨事にちなんでいます。 タイタニック号は氷山に衝突して沈没し、 2224人の乗員乗客のうち1502人が亡くなりました。 彼らの生死を分けたのは何だったのでしょうか? 幸運でしょうか?それだけではありません。 実は、ある種の属性を持つ人々はそうでない人々よりも生き延びやすかったのです。 例えば、女性、子供、一等船室の人々は生存確率が高かったことが知られています。

なので、乗客の性別、年齢、船室等級が分かれば、 ある程度はその乗客の生死が予測できるのです。 そして、他の属性も考慮すれば、 その生存予測の正確さを更に向上させられるかもしれません。

コンペ参加者は、このように予測の正確さを向上させて、 他の参加者とその正確さを競います。

このコンペは学習用なので、この予測の仕方を様々なチュートリアル ^3 ,^4 ,^5 ,^6 ,^7 ,^8 が指南してくれます。 このなかで私はインタラクティブなチュートアル^8

A free interactive Machine Learning tutorial in Python

をやってみました。 インタラクティブの良いところは、ゲームでステージを次々にクリアしていくように、 チュートリアルを学んでいけるところです。 そのチュートリアルのwebサイトにアクセスすると、セクションごとに説明が現れて、 pythonスクリプトを書いて提出するように求められ、 スクリプトが間違っていればヒントが表示され、 正しければ次のセクションに進めます。 そして、このようにチュートリアルを進んでいくうちに、以下のデータ分析のプロセス

  1. データ加工
  2. モデリング、トレーニングデータによる学習
  3. テストデータによる検証
  4. 特徴エンジニアリング

を体験できます。

必要な予備知識と使用するライブラリ

チュートリアルをこなすためには、pythonについては基本的な構文を理解していて、 機械学習については何らかのモデルを訓練データから作った経験があれば、 問題ないと思います。

3つのPythonライブラリ

  • NumPy  数値計算 (インポートするときはnumpy と表記)
  • Pandas データ加工 (pandas
  • scikit-learn 機械学習 (sklearn) 

を使いますが、それらを使ったことがなくともチュートリアルの説明を読めば、 課題のpythonスクリプトを書くことができますので、 問題なく最後のセクションまで進めます。

また、課題のpythonスクリプトのなかで、3つのライブラリを

import pandas as pd
import numpy as np
from sklearn import tree

のようにインポートすることになりますが、 こうしたスクリプトはwebサイトのなかで実行されるので、 手元のPCにpythonやそのライブラリを用意する必要はありません。

データ加工

訓練データはコンペ主催者によって収集され、csvファイルとして提供されています。 チュートリアルでは、この訓練データを後でモデルの学習に使いますので、 ここではcsvファイルをpython に読み込ませて、 DataFrameオブジェクトを生成します。 DataFrameオブジェクトは表形式のデータ構造を持っていて、データ加工に使うことができます ^9 ,^10

train_url = "http://s3.amazonaws.com/assets.datacamp.com/course/Kaggle/train.csv"
train = pd.read_csv(train_url)

例えば、与えられた訓練データtrainのフィールド(列)"Embarked"には欠けているところがありますので、その欠損値を次のように穴埋めします。

train["Embarked"] = train["Embarked"].fillna("S")

また、trainのフィールド(列)"Embarked"には、はじめは文字型の値"S","C","Q"が入っていますので、それらを機械学習で扱える数値型の値に変換します。

train["Embarked"][train["Embarked"] == "S"] = 0
train["Embarked"][train["Embarked"] == "C"] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2

モデリング、トレーニングデータによる学習

モデリングには様々なやりかたがあるのですが、ここでは決定木を使います。 決定木は、scikit-learnライブラリではDecisionTreeClassifierクラスとして用意されていますので、 そのインスタンスを作成してmy_tree_oneに代入します。

my_tree_one = tree.DecisionTreeClassifier()

決定木モデルを学習させるためには、モデルへの入力となる特徴量ベクトルと、モデルからの出力と照合できるターゲットデータが必要です。 そこで、まず、特徴量として乗客属性"Pclass","Sex","Age","Fare"を使うことにして、それらを訓練データtrainから取り出して、feature_oneに代入します。

features_one = train[ ["Pclass", "Sex", "Age", "Fare"] ].values

次に、ターゲットデータとなる乗客の生死を訓練データtrainから取り出して、targetに代入します。

target = train["Survived"].values

こうして、ターゲットと特徴量ベクトルが揃ったので、 それらを使ってモデルを学習させます。

my_tree_one = my_tree_one.fit( features_one, target)

これで、機械学習によりモデルmy_tree_oneが出来上がりました。

テストデータによる検証

テストデータも訓練データと同様に主催者によってcsvファイルとして用意されています。 しかし、このcsvファイルには乗客の生死のデータは入っておらず、乗客の属性データだけが入っています。 なので、チュートリアルでは検証プロセスのうち、テストデータの乗客の属性データを上で作成したモデルに入力して、乗客の生存予測を出力させるところまでを行います。

実際の検証プロセスであれば、テストデータには乗客の生死データも含まれていて、 これらの生死データとモデルの出力を比較します。 しかし、コンペティションではこの比較をコンペ主催者が行うので、 csvファイルには生死のデータが入っていないのです。

コードは省略しますが、まず、 テストデータのcvsファイルを読み込んでDataFrameオブジェクトtestへと変換して、 欠損値を穴埋めしておきます。 そして、テストデータtestから特徴量ベクトルを取り出します。

test_features = test[ ["Pclass","Sex", "Age", "Fare"] ].values

そのテストデータの特徴量に基づいて、乗客の生死を予測させます。

my_prediction = my_tree_one.predict(test_features)

この予測結果をkaggleに提出するには、csvファイルでなければなりませんので、 予測結果my_predictionを所定のフォーマットのcsvファイルに変換します。

PassengerId =np.array(test["PassengerId"]).astype(int)
my_solution = pd.DataFrame(my_prediction, PassengerId, columns = ["Survived"])
my_solution.to_csv("my_solution_one.csv", index_label = ["PassengerId"])

この生存予測ファイルmy_solution_one.csvチュートリアルのwebサイトからダウンロードできますので、 それをkaggleに提出すると、 実際の乗客の生死データを比較して順位をつけてくれます。

私がやってみたところ、 順位は5,838チームのうちで5,692番目で、スコア(正確さ)は 0.569 でした。 順位が底辺に近いのは、何の工夫もしていないからです。 そこで、 次は特徴エンジニアリングを行います。

特徴エンジニアリング

これまでは、乗客の生死を左右するの属性は、 客室の等級"Pclass",性別"Sex",年齢"Age",運賃"Fare"だけであると 考えてきました。 しかし、他にも重要な属性があるかもしれません。 例えば、一緒に乗船している家族の人数もまた生死を左右していたと考えられます ^11 。 というのは、家族で一緒に旅をしていた人は、救命ボートに乗る順番が回ってきたとしても、 家族全員が揃っていなければ、ボートで脱出せずにタイタニック号に留まっていたのではないかと想像できるからです。 この仮説が正しければ、 大家族であればあるほど救命ボート乗り場に集合するまでに時間がかかるので、 それだけ生存確率が下がるはずです。

この仮説にそって、乗船している家族の人数を訓練データに加えます。

train_two = train.copy()
train_two["family_size"] = train_two["SibSp"] + train_two["Parch"] + 1

こうして更新した訓練データを使って、新たに決定木モデルを学習させます。

features_three = train_two[ ["Pclass", "Sex", "Age", "Fare", "SibSp", "Parch", "family_size"] ].values

my_tree_three = tree.DecisionTreeClassifier()
my_tree_three = my_tree_three.fit( features_three, target)

さて、この新しいモデルmy_tree_threeでは、どのくらい順位が上がるのでしょうか?

このmy_tree_threeにテストデータを入力して、 出力をkaggleに提出してみました。 順位は5,838チームのうちで4,760番目、スコア(正確さ)は 0.756 と、 すこし良くなりました。 しかし、順位はまだまだ悪いです。 それで、上位に入っている人の記事^12を読みますと、 非常に感心させられます。

まとめ

以上で紹介したように、コンペ"Titanic: Machine Learning from Disaster"チュートリアル^8で、主要なデータ解析のプロセス、データ解析、モデリング、学習、検証、特徴エンジニアリング、をひととおり体験できます。 ちなみに、モデリングとして、このブログ記事では、決定木を使う場合だけを書きましたが、 その他に、決定木で過学習を抑制するためのテクニックや、ランダムフォレストを使う場合についても体験できます。

私はやってみて、機械学習アプリ開発だけでなく、 データ解析もけっこう面白いのではないかと思いました。 おすすめです。


参考

^1:Kaggle Competitions

^2:"Titanic: Machine Learning from Disaster"

^3:Getting Started with Excel: Kaggle's Titanic Competition

^4:Getting Started with Python: ...

^5:Getting Started With Python II: ...

^6:Getting Started With Random Forests: ...

^7:Getting Started with R: ...

^8:A free interactive Machine Learning tutorial in Python

^9:Qiita pandasでよく使う文法まとめ

^10:pandas 0.19.1 documentation » API Reference » pandas.DataFrame

^11:Large families not good for Survival - Kaggle

^12:Kaggleのtitanic問題で上位10%に入るまでのデータ解析と所感

^13:賞金稼ぎから仕事探しまで、世界のデータサイエンティストが「Kaggle」に集まる理由

^14:世界のデータサイエンティストが集う「Kaggle」とは?ビッグデータ分析を競い合え!

機械学習エンジニアになるために学ぶべき5つのスキル(海外記事紹介)

機械学習エンジニアにはどのようなスキルが求められるのでしょうか?

あれこれと調べてみたのですが、どうもわかりづらいです。 というのは、ブームが盛り上がるうちに スキル要件の範囲が広くなり、また、レベルが高くなって、 「そのような人材はユニコーン(現実には存在しない生き物)」 ということが言われるほどになっているからです。 そして、このように求められるスキルが増えるのに呼応して、 学ぶべきとされる事柄と読むべきとされる書籍のリストも非常に長くなりつつあります。 これでは、何から学ぶかを決めるのも一苦労です。

そこで、 スキル要件をもっとコンパクトに書き表している記事^1

5 Skills You Need to Become a Machine Learning Engineer | Udacity

を、機械学習を学ぶときの参考にするべく、以下で紹介します。 この記事の著者、Chakrabortyさんは コンピュータービジョンの研究で学位を取得して、 Udacity^2(米国のオンライン学習サイト)で、 人工知能機械学習のオンラインコースを作っているという専門家です。 そして、 機械学習エンジニアに求められるスキルを整理して、具体的なリストとしてまとめています。

機械学習に関わるプロジェクトとは?

この記事ではスキル要件について説明するために、次のような機械学習プログジェクトを想定しています。

Let’s say you’re working for a grocery chain, and the company wants to start issuing targeted coupons based on things like the past purchase history of customers, with a goal of generating coupons that shoppers will actually use. ... The Machine Learning approach would be to write an automated coupon generation system.

生鮮食料品チェーン店の販売支援プロジェクト

  • 目標)顧客の過去の購入履歴に基づいて、(レジで)クーポンを発行できるようにする。
  • 手段)機械学習アプリを開発して、購入履歴の分析とクーポンの発行を自動的に行なわせる。

But what does it take to write that system, and have it work? You have to understand the whole ecosystem—inventory, catalog, pricing, purchase orders, bill generation, Point of Sale software, CRM software, etc.

Ultimately, the process is less about understanding Machine Learning algorithms—or when and how to apply them—and more about understanding the systemic interrelationships, and writing working software that will successfully integrate and interface. ...

  • 必要な実務スキル)
    • チェーン店のビジネスに対する理解・洞察
      • 商品の在庫、カタログ、値付け、発注、レシート発行、POSシステム(レジ)での会計、顧客情報の管理など
    • 実用的なソフトウェアを開発

必要なスキル構成は担当パートによって異なる

上記のようなプロジェクトでは、メンバーは

というように、異なったタイプの仕事をこなすことになります。 そこで、担当する仕事ごとに、プロジェクトメンバに求められる基盤スキルの構成は、 次の表のように違ってきます。

データ解析 機械学習アルゴリズム 機械学習アプリ 情報システム
統計学 -
モデリング
機械学習アルゴリズム利用
計算機科学
ソフトウェア工学 -

表1 : 仕事のタイプに対して求められるスキルの構成。スキルの相対的な重みを、◎:上級,◯:中級, △:初級,-:入門者レベルのように示しています。(原文での表^3を日本語訳)

3種類の機械学習エンジニア

ちなみに、Chakrabortyさんが書いた表^3では、機械学習エンジニアとして3つのタイプ、core ML enginer、applied ML enginnerと、software engineer - MLが示されています。 しかし、それらのエンジニアの担当については詳しく書かれていなかったので、 私は、core ML enginer が機械学習アルゴリズムの研究開発を担当し、 applied ML enginner がアプリの試作を担当し、 software engineer - MLが情報システム全体へアプリを統合する担当である、 と解釈しています。

データ分析者と機械学習エンジニアの分業

すると、これら3種類の機械学習エンジニアとデータ分析者が 一緒のプロジェクトで仕事をするときには、 担当する仕事がデータの解析から情報システムへの統合へと変わっていくにつれて、 重点的に求められるスキルもまた統計学からソフトウェア工学へとシフトしていきます。

例えば、データ解析を担当するメンバは、 仕事として、顧客情報を統計的に分析してデータモデリングを行いますから、 スキルとしては、統計学モデリングの専門家であることを求められます。 そして、このメンバの仕事ではプログラミングはそれほど重要ではありませんから、 スキルとしてソフトウェア工学はそれほど求められてはいないわけです。 (ただ、データ収集のためのSQL文を書けるくらいのプログラミングスキルは必要でしょうから、要求レベルはゼロではないのでしょうが。) これに対して、機会学習アプリのプロトタイピングを担当するメンバは、 仕事として、機械学習のソフトウェア部品を使ってアプリの試作を繰り返すので、 スキルとしては、機械学習アルゴリズムの使用と計算機科学についての専門家であることを 求められます。 そして、このメンバの仕事では統計的分析はそれほどの重みはありませんので、 スキルとしては、データ分析者のように統計学の専門家であることを求められないのです。

このように、プロジェクトメンバが自分の専門に特化して、 それぞの強みと弱みを補いあうことで ^7 、 プロジェクトの生産性を上げることができるのだと思います。

基盤スキルの内訳

表1に掲げられた5つの基盤スキルの内訳を、Chakrabortyさんは以下のように説明しています。 (ただし、他のスキル要件についての記事 ^4,^5 を参考にして、私が追加したり書きなおした箇所があります。)

  1. 統計学
  2. データモデリングと評価
    • パターン、構造の発見(相関、クラスター、固有ベクトル(主成分解析)、...)
    • 予測(分類、回帰、異常検知などによる)
    • 精度、誤差の解析(log-loss for classification, 最小二乗法の誤差(sum-of-squared-errors for regression), ...)
    • 検証(標本データの分割(トレーニングデータ、テストデータ)、逐次(? = sequential cross-validation)/ ランダム化交差検証(? = randomized cross-validation)、...)
    • 誤差伝搬? (ニューラルネットワークでの逆伝搬計算)
  3. 機械学習アルゴリズム&ライブラリの利用
  4. 計算機科学
    • データ構造、アルゴリズム(検索、ソート、最適化問題(目的関数、制約条件の違いによるクラス分け(連続、離散))、動的計画法、...)
    • 計算量、計算複雑性(P vs NP, NP完全問題, big O-記法, ...)
    • ハードウェア アーキテクチャー(メモリ階層、キャッシュ、バンド幅、並列処理、マルチプロセス、マルチスレッド、ベクトル演算、...)
  5. ソフトウェア工学

まとめ

機械学習・データサイエンスの仕事に就くためのスキル要件について、ふたつの対照的な見解があるようです。

ひとつは、こうした分野で働くためには、あらゆるスキルを身につけて、プロジェクトで必要となるすべてのタイプの仕事をひとりでこなせるようなるべき、という見解です。 もうひとつは、上で紹介した記事のように、仕事のタイプに応じて、異なったスキルに専門化することが求められ、プロジェクトにおいては、メンバが互いに強みと弱みを補い合って分業する、という見解 ^1 ,^6 ,^7 です。

ただ、どちらが現実に近いのかは、まだ機械学習の仕事をしていないので分かりません。 しかし、私が機械学習について学ぼうとするとき、 何を優先して何を後回しにするかという指針になるのは、 後者の見解(Chakrabortyさんの記事)のほうです。


参考

^1:5 Skills You Need to Become a Machine Learning Engineer | Udacity

^2:Udacity - Free Online Classes & Nanodegrees(いわゆる、MOOCs(massive open online courses)のサイト。)

^3:Relative importance of core skills for different Machine Learning job roles

^4:From PhD to Data Scientist: 5 Tips for Making the Transition

^5:「未経験者はどうすればデータサイエンティストになれるか」

^6:データ分析のためのチームビルディング--情シスとマーケの重要スキルセット

^7:Tips for Beginner Machine Learning/Data Scientists Feeling Overwhelmed

Coursera機械学習コースは、仕事を得るための準備としてどれほどのものか?

Courseraの機械学習コースを完走した後、あるいは、始める前に、表題のようなことを知りたくなる人は少なくないと思います。 私もです。 そこで、質問サイトQuara^1を見てみると、その疑問に対して機械学習の仕事をしている人々が答えていたので、まとめてみました。

Andrew Ng教授の答え^2

Ng先生はそのコースの担当教官です。

Andrew Ng: What are the best ways to start a career in Machine Learning?

The Stanford machine learning on Coursera was designed to help a broad audience get started in machine learning. ...

Many people have gotten jobs in machine learning just by completing that MOOC. There're other similar online courses ... Participating in Kaggle or other online machine learning competitions has also helped people gain experience. Kaggle has a community with online discussions from which you can learn practical skills. ...

But the most important thing is to keep on learning. Not just for a few months, but for years.

まず、このコースを受講しただけで仕事を得た人がいるというのは、良いニュースです。 ただ、他の人たちからの回答も考え合わせると、これから数年間(!)は学習を続けるようにと励ましているほうに、重点があるようです。 そうですか、がんばります。 なるほど、Kaggleコンペ^3に挑戦するというのは大変そうですが、他の参加者と議論するレベルまで行けば、実践的なスキルが身につきそうです。

他にも、次に何を学ぶかについては様々なアドバイスを見かけたのですが、上記のNg先生のアドバイスとは違っていました。 というより、皆、それぞれ違っています。 考えてみれば、それは当然です。 何を目指すか、どのような「機械学習の仕事」を得たいのかで、何を学ぶべきかは違ってくるのですから。

なかなか悩ましいです。

現実的な答えは「Coursera機械学習コースだけでは不十分」^4

Is it enough to complete a machine learning course by Andrew Ng from Coursera to get my first job/internship? If not, what more can be done for the same?

Well, in recent weeks two people I interviewed for the machine learning position at our company mentioned they've completed Andrew Ng's Coursera course. In the end, I didn't hire either of them. It was for other reasons (mainly they weren't so good in thinking about algorithms).

現実は厳しい。この答えの日付は Jul 29, 2014 とあるので、現在はもっと厳しいわけです。

See this is a perspective question. Andrew NG's course is a very good starting point for you to get your understanding but I would suggest you not to stop there. You can also check Abu Mostafa's course on Machine Learning and look for Andrew NG's actual class videos available in YouTube..

Coming back to the job availability, don't think of this as a pathbreaker for your job/internship like I always say... Think of it from a learning perspective only....

なるほど、Ng先生の基本コースで学んだことをもとにして、これからどのように機械学習を学ぶかの見通しを立てなさい、と。

次に何を学ぶか

そういうわけで、機械学習の仕事を得るには、Coursera機械学習コースの後も様々なことを学ぶ必要がありそうです。 ただ、どんな仕事を目指すかによって、学ぶべきことは違うので、自分が何をしたいのかを考える必要もあります。


参考リンク

^1:Quara

^2:Andrew Ng: What are the best ways to start a career in Machine Learning?

^3:Your Home for Data Science (https://www.kaggle.com/)

^4:Is it enough to complete a machine learning course by Andrew Ng from Coursera to get my first job/internship? If not, what more can be done for the same?

計算科学からデータ集約型科学へのシフトで、数理的手法が使いやすくなっている

数理的手法とは、様々な現象を数学的モデルでシミュレートできることを仮定して、現象を理解したり利用するためのアプローチです^1

具体的に言うと、理論科学において自然現象を微分方程式でモデル化したり、計算科学においてモデル方程式を数値的に解いてシミュレーションを行ったり、データ集約型科学において、モデルのパラメーターを機械学習で決定したりするのは、すべて数理的手法です。

数理的手法の効用

これに対して、数理的手法で数学的にモデル化することよりも、現象を観測あるいは実験することによって、理解しようとするのが、実験科学です。 しかし、観測や実験には、それまでの観測や実験によって経験した現象や、それに似通った現象であれば、理解し利用できるが、それまでの経験からかけ離れた現象については、理解や利用が難しくなるという限界があります。 そこで、この限界を超えるために、現象を数学的にモデル化することで、未経験の現象をも理解し利用できるようになります。 これが、数理的手法の効用です。

科学でのパラダイムシフト

また、このように現象を理解するための枠組みをパラダイムと呼ぶことがあります。 最も伝統的な第1のパラダイムが実験科学で、第2が理論科学、第3が計算科学、そして、最も新しい第4のパラダイムがデータ集約型科学です^2

こうしたパラダイムシフトのたびに、数理的手法はより使いやすくなり、より広い範囲で使われるようになってきました。 理論科学には、数学的モデルが解析的に解ける現象でないと調べづらいという使いづらさや、利用範囲の狭さがありました。 しかし、この限界は、計算科学により、数学的モデルを数値的に解いてシミュレートすることで、乗り越えられました。 また、計算科学には、モデルを複雑な現実に近づけると、数値シミュレーションを行うために、ハード購入とソフト開発のコストが膨れ上がるという使いづらさがあります。

しかし、この問題は、データ集約型科学により、ビッグデータで統計的にモデルパラメーターを改善して、モデルを現実に近づけるというやり方で、回避できるのかもしれません。

まとめ

数理的手法の道具立てが進歩して、より使いやすくなるとともに、科学ではパラダイムシフトが起こっています。 まず、数学的モデルという道具により、実験から理論科学へのパラダイムシフトが、次に、計算機シミュレーションという道具により、計算科学へのシフトが、そして、ビッグデータと統計によって、データ集約型科学へシフトしつつあります。

私は計算科学分野で働いているので、計算科学が最新のパラダイムではなくなってしまったということに対しては複雑な気分です。 しかし、データ集約型科学へのシフトによって、数理的手法が使いやすくなっていくことは、喜ばしいと思っています。 そして、それがデータサイエンスと機械学習を学び始めた理由です。


参考リンク

^1:「数理的アプローチとは何か」

^2:“The Fourth Paradigm: Data-Intensive Scientific Discovery – Book Released”, eSciece@Microsoft

Coursera の機械学習コースを修了

Coursera のオンラインコース"Machine Learning^1" を完走できたので、記念に修了証を取得しました。

スタンフォード大学の Andrew Ng教授によるスライドと講義が、非常に分かりやすかったです。 世間では、機械学習を学ぶには高度な数学を理解する必要があるなどと言われることがありますが^2、Ng先生は、最小限の数学(行列・ベクトル演算と偏微分くらい)だけを使って機械学習アルゴリズムを説明してくれます。

所要時間は約70時間

ただし、このコースのボリュームは相当なもので、講義は11週間あり、毎週、試験をパスして、宿題を提出せねばなりません。 そのための所要時間は、レビューサイト^3 によれば、毎週 5〜7時間です。 この時間のなかには、宿題として、Octave(MATLAB互換のフリーウェア)で簡単なアルゴリズムを実装する時間も含まれます。 宿題の量は、日本の大学に比べると多めですが、米国の大学生はこのくらいは普通に勉強するものなのかもしれません。

機械学習アプリを作りたい

宿題のコーディングはそれなりに面白いのですが、機械学習アプリというほどのプログラムではなかったところが物足りないです。 こうなると、私もいずれは機械学習アプリ開発に参加したくなってきます。

しかし、このコースを修了しただけの私が力不足であることは否めません。 まず、実際の応用では、決定木、ランダムフォレスト、ナイーブベイズなどが使われているのを良く見かけるのですが、それらのアルゴリズムをまだ理解できていません。 また、ディープラーニングのアプリに登場する畳み込み型や再帰型のニューラブネットワークと、講義で扱われてい線型結合の多層型ネットワークの違いがよく分かりません。

そういうわけで、次に何に取り組むかを検討しています。


講義内容のまとめ

  • 基本

    • 機械学習とは
      • 予測 : 特徴ベクトル(入力) --> モデル --> 予測値(出力)
      • 学習 : モデルパラメーターをデータを使って最適化
    • 学習アルゴリズム
      • 教師あり学習 : {(特徴ベクトル1、実測値1)、 (特徴ベクトル2、実測値2)、 ... }のデータを使って最適化
      • 教師なし学習 : {特徴ベクトル1、特徴ベクトル2、 ... }のデータを使って最適化
        • K-平均法、PCA(principal component analysis 主成分解析)、異常検知(注:cross-validation のためにはラベル付きのデータを使うことがある。)
  • 実践に向けて

    • モデル作成のためのアドバイ
      • アルゴリズムやモデルが劣っていても、データ量を増やせば予測精度では優ることがある。
        • しかし、データ量を増やしても、過剰学習では精度は上がらない。
        • そこで、学習曲線、正規化、誤差解析、ceiling analysis などの技法を使って、データ量を増やすかモデルを改善するかを判断すべし。
          • データ量が少ない時には、それを倍増させるコストも小さい。
      • モデル関数形や特徴量を賢く選ぶほうが、力づくのパラメーター増加よりも効果的に予測精度を改善できる。
    • 応用事例の紹介
      • 推薦システム、OCR
      • 大規模計算、並列化

参考リンク

^1:Machine Learning - Stanford University | Coursera

^2:「文系エンジニアに「機械学習」は難しすぎる! ディープラーニングは難しい数式がいっぱい」東洋経済 2016年08月21日。

^3:CLASS CENTRAL