Atrae Tech Blog

People Tech Companyの株式会社アトラエのテックブログです。

第1回 アトラエML / DL勉強会 最終課題 まとめ(1)

f:id:atrae_tech:20210627123347j:plain

どうも! アトラエのデータサイエンティスト杉山です。

アトラエでは、4月から機械学習(ML)、10月から深層学習(DL)のガチ勉強会をやっています。 それぞれ、約10週間分の教材と課題があり、 ML 勉強会では Python 未経験から機械学習まで、 DL 勉強会では Python 既知の人が深層学習を一通り体験するカリキュラムを組んでいます。 (昔やっていた某研究室の教材を参考に、うちの AI にいい感じのやつを生成してもらいました)

みんな忙しいはずなのに平気で完走 & 面白い分析をじゃんじゃんしてくれたので、ここに公開しようと思います! (ホントはもっとあるのですが、まだ出せないものもあるので一部だけ!)

ちなみに、現在は2021年版の ML 講座を実施中で、8人が頑張っています。 また100人に満たないアトラエですが、これが終われば一線級のML、DL技術を持つ人の割合が累計で2割近くになります。 しかも理系エンジニアだけじゃなくて文系ビジネスサイドもバンバン勉強しガンガン応用しているので、ほんとにすごいことになってきたなと思っています。 この会社の将来が楽しみです(謎の感想)。

どう? そんなへーしゃで働きたくない? そういう場合はこちらから!

内容見てから決めるぜって人はそのまま本編へ GO!!!

(1) TensorFlow RecommendersでGreenの求人推薦システムを作ってみた。

簡単な自己紹介

こんにちは! Greenのクライアントサポートをしている和田です。

社会人3年目で、1年目はGreenのセールス、2年目から現在のチームにいます。

文系出身かつ生粋のビジネス職ですが、社内のビジネス課題(= ビジネスチームのドメイン知識側)とデータサイエンスチームを上手く接続することで、いままでにない解決策や仕組みが生まれることを信じて、pythonと数学・統計を基礎から学んでこの講座に挑戦することにしました。

f:id:waddy_0901:20210617165357p:plain

ML講座とDL講座両方やったのですが、今回はML講座で行った最終課題について書いていこうと思います!

概要

Green掲載企業様の求人をGreenユーザー(求職者)にレコメンドする機能を作ることにTryしました。

Greenは四半期で5万人超のアクティブユーザーに対して約2万件の公開中求人があり、サイト内の検索経由、スカウト経由など複数の応募経路で日々マッチングが発生しています。 私はここにまだ非効率があり、改善余地がたくさん眠っていると日々感じております。

例えば私がGreenで転職活動したときに、仮にその2万件の求人の中にたったの10件だけ、自分の琴線に触れて、かつ、その求人企業が私を採用したいと思ってくれる求人があるとします。

それは検索じゃ見つからないかもしれないし、スカウトする該当企業も私に気づいてくれないかもしれません。これは普通に起こり得る事です。 この「本当はお互いに相性が良いのにすれ違ってしまったケース」は絶対にたくさんあると思っています。

これを解決するHowはいくつか考えられるのですが、勉強会のテーマに沿ってレコメンドを作ってみることにしました!

手法

基本的にはTensorFlow Recommendersというものを参考にして組み立てました。

▼TensorFlow Recommendersの公式チュートリアル https://www.tensorflow.org/recommenders/examples/basic_retrieval?hl=en

組み立てたのは一番基礎的な2-tower modelというもので、推薦タスクを以下の2つに分解してモデル化しています!

①2万件の候補の中から求人を絞り込むRetrieval(検索)タスク

②選んだ求人をより精度高く並び替えをするRanking(順位付け)タスク

f:id:waddy_0901:20210617163057p:plain
2 Tower-Model

①では基本的には求職者と求人の情報をk次元のベクトルで表し、その2つの内積から求職者が求人を閲覧・応募した組み合わせを1、そうでなかった組み合わせを0として出力して予測しています。

ただ、すべての組み合わせについて内積を計算しようとすると処理が遅くなってしまい、実用に適うレコメンドが作れないため、ANN(近似近傍探索)を用いて効率的に計算できるようにします。

②ではRetrievalタスクで絞り込まれた求人に対して、ある求職者がその求人に対して何点のレーティングを付けるかの予測値を返します。

ここでは便宜的に、求人の閲覧、応募などのイベントを求職者の暗黙的な評価と見なして、レーティングデータを作成しており、その予測値が分かることによって絞られた求人に優先順位が付き、その中でも本当にレコメンドする意味がある求人がどれかを可視化しようとしています。

教師データがあるので、基礎的なMLP(多層パーセプトロン)で求人に対するレーティングの関数近似器を作ることがこのタスクのゴールです。

結果

具体的な求職者と求人の情報はお見せできないので、ちょっとボヤかした結果を見せます。

味気ない見せ方になってしまいすみません!

【サンプル①】

対象の求職者は「30代のシステム開発経験4年。年収500万円以上」。

これまでJavaJavaScriptのスキルを軸にSaaS開発をやってきたエンジニアに対するレコメンドを実施してみました。

結果、職種や年収レンジが合致した求人が推薦され、中にはSaaSのバックエンド開発で技術スタックもある程度合致している求人もありました。

あまり悪くない推薦ですが、希望勤務地が合っていなかったり、「これ結局本人が見たらどう感じるんだろう?」というのがよくわからず、良いレコメンドなのかの評価しかできませんでした(これは反省)。

レコメンドの評価制度を最初に作っておくべきで、ここは大反省しています。

正直作るだけで精一杯だったので急いでとりあえず猛ダッシュしてしまい、進め方としては完全OUTです(笑)。

【サンプル②】

この勉強会をリードしていただいた、我らがデータサイエンティストの杉山にレコメンドしてみました。

結果は...とても悲惨なものになりましたw

データサイエンティストなのに、人事総務や経理など、不思議なほど管理・バックオフィス系の求人がレコメンドされていました。しかも勤務地もめちゃくちゃで、東京希望なのに沖縄の求人が出ています...。(笑)

これは杉山が運営会社の人間ということもあり、登録情報があまりにも少なかったり、応募履歴がゼロなので、学習精度が担保できなかったという背景がありそうです。 そうだとしても、本来機械学習を組む目的は未知の求職者に対しても精度の高いレコメンドを実現することにあるので、その意味ではまだまだ未完成なレコメンドシステムになっているということです。

杉山は「まあ、Deep Learning君が言うのなら俺の天職は経理で、沖縄で働いたほうがいいってことだね!」と明るい冗談を言ってましたが、サンプルによってはかなり的はずれなレコメンドになってしまいました(笑)

所感

「求人を選ぶ」という行為は、モノを購入したり広告をクリックするという行為よりも、圧倒的に意思決定の重い性質があり(転職 = 人生を左右するものなので)、「かっこいい」とか「かわいい」といった感情の意思決定だけではなく希望条件や前職との違いなどかなり理性的な意思決定が入るものです。

なので、求人のレコメンドはある程度は予測ではなくて条件固定で求人を絞ったほうが良いと思いました(もしくは、可能であれば希望データはなるべく明示的に取得していきたい)。

明示的に取得できている求職者の希望データは、勤務地や年収など諸々あるので、そこはRetrievalの段階でシンプルな条件分岐などで合致したものにする方が良いです。

さらに、暗黙的な希望データは、過去の応募履歴などから自作することでより学習を補助できると思いました(例えば、応募履歴から希望のセクターであったりとか、エンジニアであれば自社プロダクトを作りたいか、SIerで働きたいかなども作れると思います)。

現在ではこのレコメンドの作成はSTOPしており、効率の良いマッチングを作る別のHowに挑戦しています。

所感としてはここが伝えたいポイントなのですが、この講座で学習したSQLPythonの技術は日頃の業務でも大活躍しており、SQLを使わない日はほぼ1日もないです。複雑かつ重いデータを使って何かを企画するときは必ずColaboratory上でPandasなどを使いながら高速に複雑な前処理をしてから諸々の集計・可視化・予測計算をして、ビジネス現場での意思決定に活かしています。

文系ビジネス職ですが、このチャレンジをしたことでビジネスサイドで価値にできる可能性は少なからず見ることができたので、今後もその方面での学習と挑戦も継続していこうと考えております!

(2) Stock market movement prediction with DS

Overview

 I have always been fascinated by the self learning nature of reinforcement learning algorithms. In this blog, I will be talking about the implementation of reinforcement learning on the financial markets. There is already a lot written on this topic. But there is still a huge upside for further research and development.
The reason there has been much attention from the financial industry in reinforcement learning is that reinforcement learning has the power of combining price prediction and portfolio construction as a single integrated task. Which is great but attention needs to be paid to certain factors such as transaction costs, market liquidity, and the investor's degree of risk-aversion needs to be taken into account.

Introduction

 In this project we will be using a reinforcement learning algorithm to create an automatic trading bot that will trade the financial markets, the forex market in particular. Focus shall be laid on the tick data not the normally used daily “close” and “open” data.

Why forex data not stock data  The reason for focusing on the forex market and not stocks is that, unlike stock price data, forex price data is a ratio not an absolute price. This implies forex price is relatively more volatile and non directional, hence creating a reinforcement learning algorithm will be worth the effort. On the contrary when we use stock price data (for example DOW stock index, APP) the algorithm resolves to a buy and hold strategy for stocks that have been on a rise, bullish stocks(or sell and hold for stocks that have been on a decline, bearish stocks).

f:id:fredyyy:20210617182105p:plain
Fig1. Example of a bullish security

f:id:fredyyy:20210617182102p:plain
Fig2. Example of a bearish security

Why tick data not daily price data.  General trends in securities can easily be discovered by a reinforcement learning algorithm or even the human eye. Therefore using the daily price data will likely result in a buy and hold strategy or a sell and hold strategy. Using tick data forces the algorithm to search for a strategy that is sensitive volatility and directional change

f:id:fredyyy:20210617182017p:plain
Fig3. Example of ratio data(mostly a range data)

Data

In this project the British pound US dollar pair tick data. This data was streamed from an the FXCM API

f:id:fredyyy:20210617182017p:plain
Fig4. Stream ticked data (GBPUSD pair)

Methods

 The model used in this project was built by stacking the Sequential, LSTM, Dropout APIs together. In detail, the APIs were stacked in a cascade arrangement as follows, Sequential -> LSTM -> Dropout -> LSTM -> Dropout -> Dense. Finally we activated the model with a linear activation api. In regards to optimizing the model, an Adam optimizer was used.

Results

 The result we obtained was really interesting. The model made a lot of trades but didn’t make or lose money. This is a huge achievement because building a model that doesn’t lose money is proven to be very difficult. The account balance at the after trading was about the same level as the beginning.

f:id:fredyyy:20210617181956p:plain
Fig5. Account balance during trading.

Fig6. Number of trades.

f:id:fredyyy:20210617183247p:plain
Fig6. Number of trades.

さいごに

このブログでは、和田とFredyによる分析をお送りしました。 機械学習全くやったことない状態から半年でここまで来たのはすごい。

こんな感じで、Atrae は AI-Ready 化を進め、次の時代の世界を中心から作っていける会社になってやろうと目論んでおります。 一緒に働いてみたい方、 welcome です!! 興味があればこちらからどうぞ!

atrae.co.jp