非IT企業に転職した機械学習素人がAIプロジェクトにアサインされてからの奮闘記

# はじめに
本記事は [機械学習をどう学んだか by 日経 xTECH ビジネスAI② Advent Calendar 2019](https://qiita.com/advent-calendar/2019/machine-learning-01) の8日目になります。
これから市場に漕ぎ出していく初学者の方々の参考になれば幸いです。

## プログラミング経験
* 学生時代 (ロボット工学、流体力学) :
    * :new: C/C++; 組み込み、数値流体計算、研究ツール
    * :new: Matlab; 現代制御理論の授業で少々
* 前職 (ADAS) :
    * C/C++; 組み込み、社内ツール
    * :new: Python; アルゴリズムのプロトタイピングやデータ整理 　 ※AI関係ではない
* 現職 (建築・土木の施工管理) :
    * C++; 組み込み
    * Python; 機械学習・Deep Learning
    * :new: JavaScript (Node.js, GoogleAppsScript)・HTML・CSS; 社内ツール
    * :new: Julia; 興味本位で触れてみている

C/C++, Matlabは大学の授業で学び、Pythonは [Sololearnさん](https://www.sololearn.com/) で勉強しました。
JavaScriptやHTMLは定番の [Progateさん](https://prog-8.com/languages) で文法を一通りやって、あとは言語リファレンスを読みつつやってみました。

## 機械学習を学び始めた経緯
現職採用面接の際にプログラミング経験を尋ねられ、Pythonを話を軽くしたところ、
「ほな、えぇあいやな！(原文)」
となりました。この反応で嫌な予感を胸に秘めつつ入社し、その後AIを活用した業務開発ということで新規プロジェクトにアサインされました。Python = AIという嘘のような方程式に踊らされています。Pythonは書いたことがあっても機械学習は素人だったので、これを機に勉強を開始しました。
※ Deep Learningを用いることで一般物体認識のスコアが大幅に更新された！と学生時代に話題になったので技術に対する興味はずっと持っていました。

【2019/12/09 編集】
マス○ドア○ライズさんの記事を見かけたような、という曖昧な記憶ベースでネタを仕込んでしまいましたが、完全に私の記憶違いでした。申し訳ございません。

# 学習方法
手を出した順に列挙していきます。

* 有料セミナーに参加
* 勉強会に参加
* 書籍購入
* KaggleのKernel検索
* SIGNATEでコンペに挑戦

(特に新しいものを学ぶ場合、) 書籍を読んで知識を身に着けるのが苦手だと自分を評価しているので、セミナーや勉強会に参加することをまず考えていました。また内容も、アサインされたプロジェクトが時系列データの回帰予測だったということもあり、画像処理関係ではなく時系列データ関係に絞りました。

## 参加したセミナー
* [エンジニアのための機械学習・深層学習入門](https://www.nikkeibp.co.jp/seminar/atcl/dk/ne190311/)
* [エンジニアのための統計的機械学習・深層学習活用術（全4回）](https://www.nikkeibp.co.jp/seminar/atcl/dk/ne190422s/)  
※ リンクは2019年のものですが、私が参加したのは2018年です。  

***日経さんに媚を売る訳では全くなく***、この頃はAI=画像処理という概念が世の中を覆い尽くしている時期で、時系列データを中心に組まれているセミナーは本当に貴重でした。本当にどれもこれもMNISTだのSemantic Segmentationだの・・・ (私は完全にタスクありきでの学習だったので事情が異なるだけで、初学者に向けたテーマとしては良いと思っています。)

セミナーの内容としては、ここで機械学習・Deep Learningの基礎 (それこそ回帰と分類は別物だよ、とか) から学ぶことができました。画像系ではCNN、回帰系ではRNNが基本形をとっていて、生成系など新しい形のものも出てきている、と言うようなことはここで知りました。実際に手を動かして計算したのも、処理の中身を知る上ではよい経験になると思います。~~参加者の多くが行列計算できていないのは驚きましたが~~

当初の目的であった時系列関係のお話は工作機械の異常検知がメインでした。私の内容に完全にマッチする訳ではありませんでしたが、講義終了後に先生がお時間をとってくださり貴重なアドバイスを多くいただくことができました。

他に感じたこととしては、みなさんあまり質問をしないですね。既に知っていることばかりだったのか、わからなすぎてわからないのかは不明ですが、ほとんどの質問時間を私の疑問解消に費やせたので美味しい思いができました。せっかくお金を払って参加するので、知識を得たもの勝ちです。

## 参加した勉強会
* [Python時系列入門 - 全人類がわかる統計学](https://to-kei.connpass.com/)

そもそもの時系列データの取り扱い (トレンドや季節など) に関する知見が無いこともあってこちらに参加。勉強会の検索には [connpassさん](https://connpass.com/) と [TECH PLAYさん](https://techplay.jp/) を使用しています。理論学習の他にも、 [LeapMindさん](https://leapmind.io/) 主催の [Edge Deep Learning Summit 2019](https://edls.leapmind.io/) で話を聞きに行ったりにも活用しました。

まだ参加した経験はないですが、データ前処理研究会やもくもく会など面白そうな会が多いので、これから参加件数を増やしていきたいです。

## 購入した/したい書籍
* [ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_ZcZ5DbDDZEJZ8)
    * セミナーで学んだことの復習や深掘りのために購入
* [詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~](https://www.amazon.co.jp/dp/4839962510/ref=cm_sw_r_tw_dp_U_x_BbZ5DbXN0PMR5)
    * 時系列関係であることとTensorFlowの使い方を勉強するために購入
* [経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)](https://www.amazon.co.jp/dp/4254127928/ref=cm_sw_r_tw_dp_U_x_lfZ5Db4PRG4FA)
    * 勉強会と同じで、地盤となる統計学を学ぶために購入
* [Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/dp/4297108437/ref=cm_sw_r_tw_dp_U_x_QeZ5Db4WXJCJB)
    * 次に買おうと思っています
    * またKaggleで有名な [u++さんとcurrypurinさんが共著で本を出されるそう](https://twitter.com/upura0/status/1202067008445014016) なので合わせて買う予定です 

## KaggleのKernel検索
コンペティションの存在は知っていましたが、勉強中の時分はまだまだ自分で挑戦してみようとは思っておらず、**Kernelを読む**ことに注力していました。読むポイントとしては、コンペのテーマとして時系列・回帰予測関係のものをピックアップして、他の人たちのデータをこねくり回す術やタスクに面した時にまずどういうプロセスを踏んでいるのかを見ていました。アルゴリズムと言うよりもっとプリミティブなところです。データと向き合った時にまずどういう手順を踏む (どこを見る？どういう処理をする?) のか常套手段などを知ろうとしてました。ここで感じたのは、**手持ちの変数に対する統計量の解釈**など、勉強会に参加したり本を読んだりしたものの、まだまだ知らないことが多いなぁということです。**機械学習やDeep Learningだの言う前に土台が無い**なと感じました。後述のコンペでも述べますが今でも感じてます。

## SIGNATEでコンペに挑戦
コンペ自体はKaggleではなく国産の [SIGNATEさん](https://signate.jp/) で挑戦しました。これは結構最近で、武田薬品さんの [AI創薬： 薬物動態パラメータ予測](https://signate.jp/competitions/168) です。画像分類や画像生成系のコンペが多い中で、創薬コンペや[土地コンペ](https://signate.jp/competitions/162)は貴重な回帰問題でした。

記念すべき人生初コンペの初サブミットはCSVファイルのフォーマットミスで計測不能となり出鼻を挫かれたスタートとなりました...w その後にフォーマットだけ直して再提出し、鳴かず飛ばずなスコアになりました。最終的には下図のような順位に落ち着いています。

<img width="991" alt="スクリーンショット 2019-12-04 22.12.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131278/0d10b106-fe3e-659a-42f4-6a099a8b9aa9.png">

結果は大してよくは無いですが、得たものは大きかったと思います。
このコンペで強く感じたのはデータの前処理の引き出しが少ないことでした。カテゴリ変数をone-hotエンコーディングして〜など必須のものは実装しましたが、「この変数同士は何かあるぞ！」とか「こう言う特徴量に変換すればもっとスコアが上がるのでは？」など、特徴量生成に関してが特に弱かったですね。投稿数が4件となっていますが、**「これからどうすれば良いだろう」**で詰まってしまいました。購入したい書籍欄にも記載していますが、Kaggleで勝つデータ分析の技術なんて完全に私に必要なものだと思います。

またプログラミング自体にも言えることですが、**明確な指針があって勉強するのが一番身に付く**ように思います。私のようにアサインされたプロジェクトを前提に持たない人で、これから勉強し始めますって人は、指針 (タスク) が用意されている**コンペティションは非常に有意義な環境**だと思います。注力しようとすると、必然、タスクに関する知識を集め始めるので知識を広げていく取っ掛かりになるのでオススメです。

## 現在とこれから
入社後にアサインされた回帰問題のプロジェクトですが、変数を無次元化・匿名化し、タイムスタンプの振り直しをして [記事](https://qiita.com/nyanko-box/items/a6f50e28383a5bd0a432) にしています。良ければ読んでみてください。2層のLSTM+全結合というモデルとXGBoostの2種類でこれまで計算をしてきましたが，モデルの出力が入力の後出しになる問題 [(LSTM for time series prediction - keras issues)](https://github.com/keras-team/keras/issues/2856) になっていて苦戦しています・・・。知見のある人はアドバイスをいただけるととても嬉しいです。

またちょこちょこ前述していますが、データの前処理・特徴量生成のノウハウが非常に重要で、現在の私には足りていません。なので有名なKagglerの方々がブログや本を出してくださったり、Kernelで活発に活動してくださるのは非常に助かります。これまでに経験してきたことを提供してくださるわけですからね。

他にも、お仕事が回帰問題だったこともあって勉強してきた内容が回帰に特化しています。そのため画像関係の手法や前処理などはほとんど皆無と言っても差し支えない状況です。CNNで組んでおけばなんとかなるんでしょう？って感じです。画像関係 (異常検知や分類) は、現在プロジェクトを抱えているわけではないですが、これからの業務に活用できそうですし学んでいきたいなと考えています。今まではスルーしていた画像テーマのコンペにも挑戦します。

何はともあれまずはKaggle本。

# これから勉強を始める人達へ

**せっかくのQiitaなので、ポエム以外のプログラミング環境の勧め的な話をします**

弊社のPython環境はオンプレに ~~Anacondaで構成しています~~ [vanila python](https://www.python.org/) から入れています。[環境を壊してから](http://onoz000.hatenablog.com/entry/2018/02/11/142347)vanila派になりました。[去年のアドベントカレンダー記事](https://qiita.com/yniji/items/b1b20211846a5a9f189b) が更新されていますが、管理に気をつけられる人のほうが良いですね、Anacondaは。

## Jupyter Notebook/Lab
[**Jupyter Notebookが便利**](https://jupyter.org/)すぎて一生出ていけないです。これから機械学習 (もしくはPythonから) 勉強し始めようって人にはJupyter Notebook上でプログラムを動かすのを本当に勧めます。私もそうでしたがPython初心者の場合、今実装した処理でデータが所望の変形を遂げているかわかりません (特にNumpy周りの `Axis` とか) 。その点、Jupyterではセルが分かれていることもあり、前処理実装とデータ整形のPDCAを早く回せます (REPLでもやれますけれどNotebookの方がハードルが低い印象; 完全に定性的なお話) 。また機能拡張した **Jupyter Lab** が発表され、今後はこちらの開発に移行していくそうです ([参考](https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c)) 。こちらもぜひ使ってみて下さい。

Jupyter Notebookのインストール

```
py -m pip install jupyter
```

Jupyter Labのインストール

```
py -m pip install jupyterlab
```

## Google Colaboratory

そもそも計算リソース準備できねえよって人には [Google Colaboratory](https://colab.research.google.com/) がオススメです。 これはGoogle様のサーバ上で動くJupyter Notebook環境のようなものです。「[Google Colaboratory概要と使用手順(TensorFlowもGPUも使える)](https://qiita.com/FukuharaYohei/items/18bc4465923bdda81826)」でも解説されていますが、Googleアカウントとインターネット接続があれば誰でも無料で使用できます。最近ではGPUの他にTPUも選択できるようになりました。すでに機械学習やDeep Learningに必要なライブラリは導入されているので、[Googleドライブと連携](https://qiita.com/shoji9x9/items/0ff0f6f603df18d631ab#google-drive%E3%82%92%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)して手持ちのデータからすぐに分析・予測が可能です。[時間制限](https://qiita.com/shoji9x9/items/0ff0f6f603df18d631ab#90%E5%88%86%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%A812%E6%99%82%E9%96%93%E3%83%AB%E3%83%BC%E3%83%AB)だけ気をつけてあげれば快適な計算環境が手に入ります。


# 終わりに
ここまで読んでくださった方々ありがとうございます。
ほぼほぼ文章でかつ長文になってしまい申し訳ないです。

巷ではAIは幻滅期に突入だと言われていますが、技術者のニーズは増える一方だと思います。また、我々人類は**加齢と共に市場価値をどんどん失っていく**ので、そう言った意味でもできることを増やすのは良いことだと思っています。

本記事がこれから市場に漕ぎ出していく初学者の方々の参考になれば幸いです。 (冒頭ぶり2回目)

# 参考文献/リンク
* セミナー
    * [エンジニアのための機械学習・深層学習入門](https://www.nikkeibp.co.jp/seminar/atcl/dk/ne190311/)
    * [エンジニアのための統計的機械学習・深層学習活用術（全4回）](https://www.nikkeibp.co.jp/seminar/atcl/dk/ne190422s/)  
* 勉強会
    * [Python時系列入門 - 全人類がわかる統計学](https://to-kei.connpass.com/)
* 書籍
    * [ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_ZcZ5DbDDZEJZ8)
    * [詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~](https://www.amazon.co.jp/dp/4839962510/ref=cm_sw_r_tw_dp_U_x_BbZ5DbXN0PMR5)
    * [経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)](https://www.amazon.co.jp/dp/4254127928/ref=cm_sw_r_tw_dp_U_x_lfZ5Db4PRG4FA)
    * [Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/dp/4297108437/ref=cm_sw_r_tw_dp_U_x_QeZ5Db4WXJCJB)
    * [u++さんの共著本ツィート](https://twitter.com/upura0/status/1202067008445014016)
* [SIGNATE](https://signate.jp/)
    * [土地コンペ](https://signate.jp/competitions/162)
    * [創薬コンペ](https://signate.jp/competitions/168)
* [LSTM for time series prediction - keras issues](https://github.com/keras-team/keras/issues/2856)
* [jupyter.org](https://jupyter.org/)
* [condaとpip：混ぜるな危険 - onoz000’s blog](http://onoz000.hatenablog.com/entry/2018/02/11/142347)
* [JupyterLabのすゝめ - Qiita](https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c)
* [Google Colaboratory](https://colab.research.google.com/)
* [Google Colaboratory概要と使用手順(TensorFlowもGPUも使える) - Qiita](https://qiita.com/FukuharaYohei/items/18bc4465923bdda81826)
* [Google Colabの使い方まとめ - Qiita](https://qiita.com/shoji9x9/items/0ff0f6f603df18d631ab)