OpenAI CodexでMLコード自動生成 備忘録

#概要
8月、立て続けにOpenAIからCodexの発表が行われた。遅ればせながら[wait list](https://openai.com/blog/openai-codex/)の順番が回ってきたので少し試してみた。

https://www.youtube.com/watch?v=SGUCcjHTmGY&t=13s

結果からいうと期待以上の出来で、これがまだbetaなのでリリースの完成度が楽しみ。
beta版でも業務で必要で小生の苦手なPythonのlist内包型や少し複雑なSQL文の作成に重宝しそう。実際にそれらも試してみた。
間違いなくStack overflowの投稿回数も大幅に減るだろう。

- 実施期間: 2021年9月
- 環境：OpenAI beta Playground
- パケージ：scikit learn

##1. OpenAI Codex beta
ちゃちゃっと調べたことをまとめる。
GPT-3という言語モデルをベースに、Github上ののPythonやその他言語(JSやGoなど)で書かれた膨大できれいなソースを使用してtrainingされたモデルによるサービス。（GithubなのでMicrosoftが絡んでいるのが嫌な感じだが…）
使い方は、PythonのコードからAPIで結果(json)を取得する方法と、Playgroundで文章入力して結果を取得する(text-in, text-out)方法の２通りある感じ。
前者は実際に組み込みに使用できるが使用した文字数に比例するTokenに従い料金が発生するらしい。Codex以外の言語サービスはすでにAPIで提供されていて料金体制も記載あり。
今回お試しする後者のCodex betaについては料金は発生しない（アカウント作成時にカード情報入力なし）が、お試し期間は３ヶ月。小生のコーディング業務サポートであればPlaygroundだけで十分。
なお、OpenAIの利用規約からPlaygroudについては生テキストではなくキャプチャで掲載する。

##2. Kmeans + scatter plotコーディング
実力を測るため、みんな大好きアヤメちゃんのクラスタリングをやってもらう。
下図の反転以前が入力した文字で、反転しているのが自動生成されたコード（以降共通）。

![Screenshot from 2021-09-19 11-30-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/7a4a397b-cbb0-3031-0162-dad90501e4b7.png)

出力コードを読んでみると、まず指示通りにクラスタ数は変数n_clustersで渡せるように書かれている点に関心する。

```python
def clustering(data, n_clusters):
```

驚くべきところは、描画指示に対しクラスタ数を3と決め打ちしているところ。irisが３ラベルあることはML界の常識だが、それを"3"と指定している。
むしろgithubのコードにoverfitしているともいえる。

```python
kmeans = clustering(data, 3)
```

コード部分（一切編集なし）をColabで実行させた結果が下図。
指示しなかったのでfeaturesは４つある内、最初のsepal length, sepal widthが使用され描画させている。

![Screenshot from 2021-09-19 11-33-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/eccfa538-e732-f3ab-7aa0-ce3e8146edc6.png)

センターの星が黒色になったので、指示に"in yellow"を追加すると驚くべきことに下図となった。

![Screenshot from 2021-09-19 11-49-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/59f05ac8-7049-4b8a-3311-b5692207c50d.png)
![Screenshot from 2021-09-19 11-52-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/b1742974-4bf3-52ef-7ada-85033be93b95.png)

指示にないシルエットスコアを計算している！

【感想】
デフォルトのdavinci-codexでは所望のコードが得られないことが多く、cushman-codexに切り替えると安定した。うまく行かないときはいろいろパラメータを触ってみると良いだろう。

![Screenshot from 2021-09-19 12-05-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/a35eb4f8-340b-1960-ceb4-094b72ecf90d.png)

ちろん生成されたコードをそのまま鵜呑みにはできない。まずOverfitが気になるし、指示が長くなることでtrainingで使用される元コードのケースが限定されるので、その品質が問題となる。
それでもコードの全体像をsyntax errorが出ない程度に自動生成してくれるので、出力を手直ししながらコーディングすればかなりの時短になる。

##3. デンドログラムに変更
2.で味をしめ、デンドログラムが書けるか指示を変更してみた。
AgglomerativeClusteringを使うかどうか見てみたいのでClusterは指定しない。
人にお願いするときと同程度以上の情報は必要と思うので、先頭行でデンドロ描画が目的でありHierarchicalであることを明示した。

![Screenshot from 2021-09-19 12-28-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/727f5e5f-ca61-1867-ce8e-bd5df0fe3876.png)

残念ながらコードが足りてないので、手で追加修正したのが下記

```python
# 一箇所目
from scipy.cluster.hierarchy import dendrogram

# 二箇所目
    return label, ward

# 三箇所目
label, ward = clustering(3, 'euclidean', 'ward')
plot_dendrogram(ward)
```

修正し、Colabで確認
![Screenshot from 2021-09-19 12-38-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/f1da37e3-4dfc-f727-bdff-b437e11d9b43.png)

十分だと思うよ。本当に。



##4. Kmeans + scatter plotの説明
2.で得たコードを説明してもらう。コードから自然言語に変換する逆パターンもおちゃのこサイサイさぁ〜

![Screenshot from 2021-09-19 13-59-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/2b8ef91d-96d8-149b-615b-180b5aaaf76e.png)


1. アイリスデータセットの読み込み
2. データを3つのクラスターに分類する
3. データとクラスター中心をプロットする
4. シルエットスコアの算出

そのとおりです。

これらは[Examples](https://beta.openai.com/examples)を参照すれば、簡単に入力できると思う。


##5. listの内包型表記
他言語からPythonに移行した小生にとって内包型にはいつも苦労する（それと文字の正規表現も）。
未熟なオイラの代わりに内包型が出力できるか確認した。こういうやつをいつもStack overflowで教えてもらっている。
恥ずかしながら下記は先週内包型でかけなかったForループで、やっていることはlst1の要素においてlst2中の要素とかぶる要素を取り除くもの。

![Screenshot from 2021-09-19 14-21-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/ee2c7f10-a553-eb81-cc2b-c0cdca96b2cf.png)

自分の無知ぶりに恥じ入るばかり。pop()やdel()で取るイメージばかりだったけど、逆にかぶらないものを加えるのね。
書いてもらうと「あぁ、そうだよね。」ってことは多いけど、自分で書くのとは違うもの。
ついでにこの内包型の説明していただくと、

![Screenshot from 2021-09-19 14-29-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/508538db-1700-3db2-7ad0-89ee1457fd0e.png)

そのとおりです。

##5. SQL query
普段簡単なSELECTやINSERT INTO, UPDATE, JOINしか使わないので、先月苦労したのが下記。boss_idをどうやってEmployeeテーブルから取ってくるのかわからなかった。

![Screenshot from 2021-09-19 14-37-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/fab8b366-6e81-e73d-0923-13cd000de352.png)

ありがとうございます！

ちなみに下記ではすでにCodex betaを組み込んだベンダーが付加価値をつけたサービスの提供を開始している。

https://anteam.ml/

以上