時系列データ解析エンジンのQoreSDK使おうとして挫折中の話



## きっかけ

Qiitaのアドベントカレンダーで、スポンサーってなんだろう？とちょっと覗いてみたら、
「REST API」で「時系列データ解析エンジン」っていうキーワードに惹かれてQoreを使ってみました。



### 気になった背景
IoTをメインでやってる身として、時系列データは普段からたくさん取得しているので、それの解析にはもともと興味がありました。


なお、機械学習系は素人です。普段はJavaScript(node.js)使いなので、pythonもほとんど知りません。でも**APIになってるならきっと使える！**とおもってチャレンジします。


## 始める流れ

1. APIの利用がQiita書くなら２ヶ月無料とのことで、[利用申込み](https://forms.gle/M5wqqEc4RSZ2hrqP6)をします。

2. そこからメールのやり取りをして、利用規約とかに同意するとAPIキーが発行されます（この手順はそのうちメールからwebに変わるらしい）

3. APIキーと一緒にwhlファイルがつまったgoogle driveのURLがもらえます。
 
4. それらと[githubリポジトリ](https://github.com/qcore-info/advent-calendar-2019)をみてさぁ始めよう！


・・・・・さぁ始めよう？？？

**<font color="red">ここからが挫折の連続でした・・・・</font>**

AIバリバリ触ってるぜ！の猛者が使うことの想定なのか、最初はREADMEすら書いてある内容がわからず。。。。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">やばい、場所が変われば文化が変わるとは言うけれども、機械学習系のライブラリのreadmeの言ってることが全くわからない🤣<br><br>python普段使わないし、readme書いた人が前提と思ってる知識が全く自分にないことがよくわかる笑</p>&mdash; kido@IoTエンジニア (@9wick) <a href="https://twitter.com/9wick/status/1201469135093293056?ref_src=twsrc%5Etfw">2019年12月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

せっかくなので、自分のつまづきポイントを紹介したいとおもいます

## つまずいたポイント１：機械学習知識

APIキーを貰ったときに、注意としてこう言われました。

> 一度にAPIに投げられるデータサイズに制限がありまして、N*T*V < 150,000 && N*T < 10,000の大きさまでのデータとして頂きますようお願いいたします


Nってなに？T？V？　って状態でした。
APIなら簡単に使えるだろうって軽い目論見で申し込みましたが、ちょっと場所を間違えた感が出てきました・・・・。


<font color="red">この場違い感が結構他のつまずきにも影響を与えてきます・・・。</font>

## つまずいたポイント２：情報源

未知のものを試すときは何よりも情報源を見つけるのが大切です。
普段はtoBでやってるサービスっぽく情報が全然なくてなかなか難易度がたかい・・・。

今のところ見つけたのはこれらです。

- [アドベントカレンダー１日目の記事](https://qiita.com/ryoppippi/items/f607c8828238094eade0)
- [アドベントカレンダー２日目の記事](https://qiita.com/sk1010k/items/d8ca3332e6a1f1f939a1)
- [ドキュメント](https://qcore-info.github.io/advent-calendar-2019/)
- [使い方README](https://github.com/qcore-info/advent-calendar-2019)

※ドキュメントは12/3に公開されたようです。これからも追加情報とかあるかもしれないので注意が必要そうですね





## つまずいたポイント３：流れの理解

そもそも機械学習の初心者過ぎて、全体像の流れがよくわかりませんでした・・・。



1. 時系列データを収集する
2. データをクラウドに投げれる形に加工する<br/> `qore_sdk.utils`とか`qore_sdk.featurizer`を使うと便利らしい。使わなくても可
3. クラウドにデータを投げて学習させる。このときログインが必要<Br/>
メインは`qore_sdk.client.classifier_train`
3. 学習データと、比較したいデータを突合して推論をおこなう<br/> `qore_sdk.client.classifier_predict`関数


3,4のデータを投げて学習させては[１日目の記事](https://qiita.com/ryoppippi/items/f607c8828238094eade0)がわかりやすいです。

2の加工は[２日目の記事](https://qiita.com/sk1010k/items/d8ca3332e6a1f1f939a1)がしっかり書かれてるようです。
・・・が、<font color="red">「小時系列に分けて〜」とか「特徴抽出」とかそもそもの部分がよくわからなすぎて挫折しました・・・。</font>


[1日目の記事](https://qiita.com/ryoppippi/items/f607c8828238094eade0))を見る限り、とりあえずデータさえあればQoreを試せるようです。なので、<fonr color="red">データ加工のことはとりあえず放置して進めようと思います（後の後悔ポイント）</font>

## つまずいたポイント４：ライブラリインストール

公式ドキュメント通りにpip installをやろうとしました。



```

pip install -r requirements.txt
pip install qore_sdk-0.1.0-XXXXXXXXXXX.whl  #自分の環境に合ったSDK

```


SDKのリストがこちら

<img width="388" alt="スクリーンショット 2019-12-02 23.29.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/f38b4faa-3b0b-b6fa-745e-5352d89c8989.png">

自分の環境がこちら

<img width="577" alt="スクリーンショット 2019-12-02 23.35.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/51f6b971-c813-fe33-7cfb-3dcbc5423af0.png">


・・・mac os の10.13は古すぎてSDK提供していないようです・・・。

仕方ないのでアップデートしました。
<img width="698" alt="スクリーンショット 2019-12-05 21.56.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/cad70400-7115-01b4-7875-52df72f72fa3.png">


SDKの名前のcpXXがpythonのバージョンらしいです。python3.7を使っていたので`qore_sdk-0.1.0-cp37-cp37m-macosx_10_15_x86_64.whl`をインストールします




## つまずいたポイント５：ログイン

メールで貰ったendpoint,username,passwordでログインします。

```
from qore_sdk.client import WebQoreClient

username = 'xxxx'
password = 'xxxx'
endpoint = 'xxxx'

client = WebQoreClient(username, password, endpoint=endpoint)

```

ここはブログにも書いてあったし楽勝！って思ったらエラーが・・・・

```
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>

```

<details><summary>エラー全文</summary><div>

```
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1317, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1016, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 956, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1392, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 412, in wrap_socket
    session=session
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 853, in _create
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/kido/PycharmProjects/qore-qiita/index.py", line 6, in <module>
    endpoint='https://api-beta2.qcore.co.jp') #接続先エンドポイント
  File "qore_sdk/client.pyx", line 40, in qore_sdk.client.WebQoreClient.__init__
  File "qore_sdk/client.pyx", line 73, in qore_sdk.client.WebQoreClient._login
  File "qore_sdk/client.pyx", line 63, in qore_sdk.client.WebQoreClient._request
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 525, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 543, in _open
    '_open', req)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1360, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1319, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>

```


</div></details>

SSLの証明書が駄目だったらしい・・・。

調べてるとSSL認証を無視するという悪魔のコード👿を見つけたので追記して実行します

```

import ssl
ssl._create_default_https_context = ssl._create_unverified_context
```

無事ログインできました！

※なお、このエラーはQoreさんのサーバーの問題ではなく、完全に自分のPCの環境の問題です。googleさんにもアクセスできませんでした・・・。


### 躓いたポイント６：データフォーマット

データを学習させるためにどんなデータをサーバーに投げればよいか、ですが、ドキュメントのこちらに書いてあります
https://qcore-info.github.io/advent-calendar-2019/index.html#qore_sdk.client.WebQoreClient.classifier_train

![スクリーンショット 2019-12-05 23.27.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/e180c6aa-a29b-b36c-1126-d9cae278ffe2.png)

書いてはあるんですが、時間じゃなくて時間方向ってなんだ？？データ数が配列の１つとしてあるの？？　みたいに混乱状態に陥りました。


そしてここでアドベントカレンダーのタイムリミットでした。


## まとめ

社外の人の最初のアドベントカレンダーがこんなのでとても申し訳ないです・・・
まだ自分には機械学習は早かったようです・・・・。


ここらへんの部分がちゃちゃっとおわったら、距離センサつかってドアの開け方で個人判定できないかなとか、ミニ四駆チキンレースにAI搭載のせられないかとか思ってましたが、それ以前の問題でした。

アドベントカレンダーをみんなが書いて知見がたまってきたらまたチャレンジしようと思います。


## よくわからなかった単語集

acc : accuracy。正確さ。 1がより良くて0が駄目
f1  : f値。精度と再現率の調和平均。・・・ってなんだろう？1に近いとと良さそう
変量数 : ？？
特徴抽出 : ？？
小時系列：？？