そもそも何が違うのか
「機械学習を専門に仕事をする人たち」をなんと呼ぶか問題に終止符を打ちたいと思います。
業務を通じて情報収拾をしていると、頻出する職業名としては概ねこんなところでしょうか。
- 機械学習エンジニア
- データサイエンティスト
- AIエンジニア etc...
「AIエンジニア」は、日本語としてそもそもコミュ力ぐらいざっくりとして曖昧な言葉だと個人的に思うので、除外したいと思います。
残るは、
- 機械学習エンジニア
- データサイエンティスト
の二つです。
一体全体何が違うのか、という議論はよく行われていますが、自分としてひとまず腹落ちする答えが出たので、その経緯をこちらにまとめます。
答えが出た瞬間
N2i に今参加してくれている、あるいはしてくれていたインターンの学生さんは、いわゆるエリートで秀才肌の方が多いです。
彼らと話していると、頭のメモリーがリークすることがしばしばあります。複雑な数式や論文をいとも簡単に理解して、その場で分かりやすく説明をしてくれます。
自分と頭のできが違うとよくショックを受けます。
このような人たちと同じフィールドにいるのがしんどいと思う一方で、 ある時意外なことに気づきました。
あれ...?
それは、完成した作品のコードを見た時のことです。
Python3で書かれたコードを見て、あることを思いました。
「(なんでそこ関数にしてないねん)」
「(どんだけifを書いとるねん)」
#外部ライブラリは使わずサンプル human_info = [ {"height": 185, "weight": 75, "age": 22}, {"height": 178, "weight": 62, "age": 37}, {"height": 143, "weight": 54, "age": 44}, {"height": 167, "weight": 87, "age": 61}, ] #168cm以上の身長の平均を算出 total = 0 counter = 0 for row in human_info: value = row.get("height", 0) if value >= 168: total += value counter += 1 average = total / counter #181.5 #70kg以下の体重の平均を算出 total = 0 counter = 0 for row in human_info: value = row.get("weight", 0) if value <= 70: total += value counter += 1 average = total / counter #58.0 #こうすればいいかも def cal_average(human_info, target_key, option_func, default=0): total = 0 counter = 0 for row in human_info: value = row.get(target_key, default) if option_func: if option_func(value): total += value counter += 1 else: total += value counter += 1 return total / counter cal_average(human_info, "height", lambda x: x >= 168) #181.5 res = cal_average(human_info, "weight", lambda x: x <= 70) #58.0 #こうすればいいかも2 def conditional_average(dic, column, max_value, min_value): data = [f.get(column, 0) for f in dic if min_value <= f.get(column, 0) <= max_value] length = len(data) return sum(data) / length if length else 0 conditional_average(human_info, "height", 200, 168) conditional_average(human_info, "weight", 70, 0)
#ifをわーってやるのやめたい label = "banana" if label == "apple": label_num = 0 elif label == "banana": label_num = 1 elif label == "peach": label_num = 2 else: label_num = None #こうすればいいかも label = "banana" labels = { "apple": 0, "banana": 1, "peach": 2 } labels.get(label)
数学的な理解やロジック的な思考において、彼らはまさにエリートです。
一方で、いわゆる綺麗なコードを書く能力というのは、決して最初から備わったものではないと感じました。
コードを書く力は、基本的には経験則が物をいいます。いきなり整ったものを作ることができるようになるわけではないと確信しました。
そういった意味で、彼らは「データに対する研究者」であるからデータサイエンティストという言葉がふさわしいと思います。
すると、機械学習エンジニアの定義が自然と決まってきます
先ほどの話を踏まえると、自頭でデータをゴリゴリやる人をデータサイエンティストと呼び、
- コンピューティングの知識がある
- 綺麗なコードが書ける
- 速く動作するコードが書ける
- モデルをAPI化して外部公開できる
- 機械学習の環境構築ができる
- DjangoやらFlaskが使える
といった人たちを機械学習エンジニアと呼べばいいのかと思います。
もちろん、データサイエンスに精通しつつ、このレイヤーの知識がある人もいるので、そういう人はスーパーマンと呼ばせていただきます…。
とはいいつつも、やはり境界線ははっきりしない...。
まとめ
個人的に、
数学能力が高く、データに対して熱狂的な人を「データサイエンティスト」と呼び、
パソコン好きです系の機械学習好きマンを「機械学習エンジニア」と呼ぶことにしたいと思います。
僕は全部できるのもかっこいいと思うんですが、アプリもデータクレンジングもモデル作成もデプロイも!となるとしんどいので、何かひとつ、尖ったものがあればいいのでは、と思います。