既存データのカテゴリ移行するためにデータセットの作成と機械学習モデルの構築をした話

tomoris|2021年12月20日
機械学習

ランサーズ開発部の tomoris です。この記事はランサーズAdvent Calendar 2021の19日目の記事です。本稿では、機械学習手法による既存データのカテゴリ移行とその応用について書きます。

背景

ランサーズは今年の11月にスキルパッケージ(納品形式)をリニューアルし、パッケージをリリースしましたパッケージとは、ランサーズでスキルを購入・販売できる機能で、ユーザが提供内容や納期、価格を設定し出品できます。今回のリニューアルに伴い、ユーザがより出品や購入しやすいようにカテゴリツリーの再編が行われました。ユーザの細かいニーズに応えるために新カテゴリツリーは既存のカテゴリツリーよりも粒度が細かくなっており、もともとのスキルパッケージ(納品形式)に出品されていたスキルを新しく再編されたカテゴリへと移行する必要があります。しかしその全てを人手で移行することは大変なので機械学習技術を用いて自動的に移行することになり、そのシステムの開発を担当しました。

データセット作成とデータ移行

すでに出品されているスキルから新カテゴリを推定する機械学習モデルを構築するためにまずは教師データの作成を行いました。ランサーズはAI教師データ生成・アノテーション支援サービスを提供しています。今回はそのサービスを社内利用し、タイトルや提供内容、旧カテゴリの情報を渡し、そこから適切だと思う新カテゴリをアノテーションしてもらいました。

まずはランダムに1,000件のデータを抽出し、各データを3人にアノテーションしてもらいました。今回のアノテーションデータでは、3人ともアノテーションが一致したものは1,000件中439件となり少々難しそうな印象ですが、アノテータの一致率をより定量的に判断するために Fleiss’ Kappa 係数を計算してみると0.56でしたので適度に一致していることがわかります(ここでは詳しく述べませんが Fleiss’ Kappa 係数とその解釈については Wikipedia の記事を参考にしてみてください)。生データとこの数値をみて、機械学習モデルを構築してもある程度は自動的にデータ移行できそうだと判断しました。

しかし1,000件だけではデータが少ないのでアクティブラーニング方式でアノテーションデータの量を増やして行きました。すでにあるアノテーションデータを使ってモデルを作成し、そのモデルでの予測確率が低いデータをサンプリングし追加アノテーションしてもらうという流れで進めました。下の図は1回目から3回目までのアノテーションデータで作成した機械学習モデル(次の節で説明)の予測確率の閾値を変化させたときにデータを移行できる割合の曲線を表してます。閾値が低いほどたくさんのデータを移行できますが、その分予測に自信のないデータまで移行するので精度が下がってしまいます。これ以上アノテーションデータを増やしても自動的に移行できるデータサイズは大きく変化しなさそうなので3回目のアノテーションで最終的なモデル作成を行いました。モデル構築のところで説明しますが閾値を0.4に設定すると70~90%くらいの精度になることがわかっていたのでこれで全体データの80%を移行し、残りの予測確率の低いデータは4回目のアノテーションをお願いし人手で移行しました。

また、アノテーションを発注するたびに新カテゴリを付与しづらかったデータや新しく追加した方が良いと思うカテゴリをフィードバックしてもらい、それを新カテゴリツリーの再編を行なっている部署と共有することで新カテゴリツリーの調整も行いました。アノテーション作業は自社が提供しているサービスを使うことでスピード感を持って進めることができましたし、細かいディレクションも担当のランサーさんにほぼ全てお願いすることができたのでとても助かりました。

モデル構築

アノテーションデータが作成できたので、それを使ってモデルを学習させます。今回はタイトルや提供内容のテキスト情報を Bag of Words にし、旧カテゴリの情報を one-hot ベクトル表現にしたものを特徴量とし、新カテゴリを予測するロジスティック回帰モデルを採用しました。理由としては、 BERT 等の事前学習済みのニューラルネットワークモデルを用いたモデルも構築してみましたが精度が思ったよりも向上しなかったことやできるだけシンプルなモデルにした方が説明しやすいと思ったため上記のモデルを採用しました。

下の図は予測確率の閾値を変化させたときに、その閾値以上のデータだけを評価したときの予測精度を表してます。それぞれ k-fold cross validation で評価しました。追加アノテーションのデータにはこれまでのモデルで予測するのが難しかったものだけを渡しているので、アノテーションデータを追加するたびに k-fold cross validation での精度評価は下がってしまいました。データ移行の際に閾値0.4に設定した理由としては、アノテーションの一致率からすべて人手で作業したときの上限が70~90%くらいだと考えたことと移行できるデータサイズを考慮して決定しました。

スキル出品補助のためのカテゴリ推定

せっかくデータセットを作成したのでデータ移行だけするのではなく、そのデータセットを用いてスキル出品補助のためにタイトルからのカテゴリ推定モデルの構築も行いました。リニューアルに伴い新カテゴリの粒度を細かくしたことでユーザが新しくスキルを出品する際に適切なカテゴリを選ぶことが大変になりました。そこでまずはタイトルに入力してもらい、そこから予測したカテゴリを3つ表示することで出品の際の負担を軽減することが目的です。

タイトルからのカテゴリ推定モデルの基礎となる部分はデータ移行の際に作成したプログラムをほとんどそのまま利用できました。すでにデータセットがあるのでオフラインで精度評価できるのでリリース前に細かい調整がしやすかったです。ただカテゴリごとの予測精度を見ると数の少ないカテゴリはなかなか上位3つにでてこないので、今後に貯まってくるデータを見ながら調整できたらと思います。

まとめ

本稿では、ランサーズの一部機能のリニューアルによるデータ移行の方法について説明しました。機械学習による新カテゴリの推定のためにデータセットを作成し、データの移行を行いました。また、それを応用しスキル出品補助機能をリリースしました。

今回データセットの作成からモデル構築、実サービスへの実装まで一貫して担当することができ、とても良い経験になりました。データを移行する際にはモデルが自信を持って移行できないものに関しては人手で移行する等、機械学習技術だけで解決するようなことはせずに作業スピードと精度の両方を考慮しながら進めることができ、実装に関してはインフラ等のアーキテクチャ設計から一通り経験することができて良かったです。今回初めてAI教師データ生成・アノテーション支援サービスの社内利用に挑戦してみましたが、今後も様々なプロジェクトに応用できそうです。ランサーズにはテキストや画像、音声や動画の他に経済的な観点からも面白いデータがたくさんあり、まだまだ機械学習的にもできることがありそうなので、今回のデータ移行を一例としてより便利なサービスを目指していけたらと思います。