機械学習のデータセットの作成を爆速にするツールを作ったのでこだわりポイントを3つ紹介する

どうも、AdansonsのPdMの樋口です。

タイトルの通りですが、機械学習をやるときにありがちな面倒臭い作業を自動化する`Base`というツールを作っています。
テストユーザーを募集しているので、ぜひフィードバックしてください！

**Get Invitation Form**
↓↓↓

https://share.hsforms.com/1IiKZRnYrQz27zq05Ys_QKQ8moen

https://github.com/adansons/base

## データをコード上で解析に使えるようになるまでに手間かかりすぎ！
アノテーションに人手がかかることはよく注目されるけど、アノテーションなどのメタデータを記録したファイルとデータファイルを紐付けて解析するための事前準備ってめちゃくちゃ手作業で頑張ってるよね、って実体験を踏まえて考え始めたのがこのツールを作り始めたきっかけです。

特に画像や音声データなどの非構造化データを使う際は、データファイルにメタデータを付与することが難しいので、複数のCSVファイルを参照しながらデータを選出する複雑なデータローダー関数を実装したり、フォルダ構造やファイル名としてメタデータを付与する作業が必要になるわけです。

まだメタデータのファイルの内部構造が整っている場合ならマシなんですが、アノテーターによってカラム名がちょっと変わったり、カラムの順番が入れ替わったりした日には最悪で、プロジェクトメンバーの誰かが手作業で内部構造を修正するか、データローダー関数側で対応しようとして分岐に溢れた複雑で保守性に欠けたコードを産み出すことになります...orz

<img src="https://2.bp.blogspot.com/-sylTUfVE08Y/VD3RewfuVdI/AAAAAAAAoDI/PnIHFvV7oTc/s800/computer_tsukare.png" width="400">

また、フォルダ構造としてメタデータを記述すると、メタデータを更新・修正するのが難しくなるだけでなく、データをプロジェクトメンバーそれぞれのローカルに配置して解析する場合であれば、解析コードやデータローダー関数が動かなくなることもあります。

こういった事前準備とも言える作業って、データサイエンティストのバリューが出るところではないにも関わらず、多くの人が手作業で解決していてかつ技術的負債になるのは、労多くして功少なしともいうべき事態です。
今よりもっとメタデータを柔軟に追加（紐付け）・編集できるようになり、データセット作成が簡単になれば、これらの課題が解決するだけでなく、より細かい条件でデータをフィルターしながらデータセントリックに深い考察が得られるようになってデータサイエンティストとしてのバリューをこれまで以上に発揮できると思うわけです。

「[人工知能の権威アンドリュー・エンが語る「データの質」の重要性](https://forbesjapan.com/articles/detail/42149/1/1/1?s=ns)」

## だからフォルダ名やCSVなどの外部ファイルを読み取るコードを実装しなくても、簡単にデータを条件で絞り込むためのツールを作ったよ！

![base_flow_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615011/d30b1741-cb60-b877-907f-f66de13138d7.png)

要は、メタデータのファイルやフォルダ構造に記録されたメタデータを抽出し、整理されたデータベースを作るツールです。
これだけ聞くといわゆるデータカタログなどのサービスとあまり違いがわからないと思うので、こだわりポイントをちょこっと紹介したいと思います。

### ポイント1. メタデータファイルの内部構造の表記揺れに対応した抽出ができるようにする

https://twitter.com/miyasaka/status/1395725306833510405?s=20&t=yYZvQUmE64boB2nW2ZdBog

https://www.soumu.go.jp/main_content/000723626.pdf

見ての通り官庁主導で声かけするぐらい、世の中にはそのままでは解析に使えないデータ（しかも貴重なデータ）が溢れています。
人に見やすい構造≠機械が解析しやすい（機械判読可能な）構造です。
また、機械が自動的に生成するデータであっても、部署間で仕様変更の共有が十分になされず、構築したデータパイプラインが突然停止することもあります。
データは利用者ごとに都合のいい構造が違うわけですから、データの生成者と解析者のそれぞれにとって都合がいい構造と相互変換できるようなインタフェースを作るべきです。

### ポイント2. メタデータの値の表記揺れや重複を判別し、自動でメタデータDBに追加メタデータのテーブルを統合できるようにする

データセットの事前準備で、手作業が多発するもう1つの原因は、メタデータの表記揺れです。
例えばアノテーターによってテーブルデータのカラム名に表記揺れがあったり、メタデータファイルを生成した機械によっては重複した内容のカラムであってもデータ型の種類（文字列, 数値, ...）が違うことがあります。
これらの仕様の揺らぎによるエラーが生じないように手作業で修正するのは、決して楽な作業ではないですし、メタデータのテーブル同士の情報を紐付ける際に、その揺らぎに対応した分岐を実装をすることは保守性が高いとは言い難いです。
そのため、表記揺れに寛容なシステムを作るべきです。

![base_join_tables_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615011/bfe16664-4781-a157-1fd9-3291804e06d6.png)

### ポイント3. 画像などのデータファイルはアップロードせず、Hash値を識別子に使用することで、安全で軽量高速なデータベースにする

メタデータは多くの場合、CSVやExcel、JSON形式で記述されており、比較的ファイルの容量は小さいですが、画像や音声といったデータファイルは1つ1つの容量が大きく、数も多いです。
データセット作成するたびに大容量通信をするのは現実的ではなく、また機密性の観点からもデータファイルはユーザー自身の管理下で安全に保管するべきです。
メタデータとデータファイルの紐付けにはデータファイルの識別子があれば十分であり、それにHash値を採用することでフォルダ構造やファイル名を好き勝手編集してもデータファイルを紐付けることができるため、実行環境によってフォルダ構造が一致せず、解析コードが動作しないという問題を防ぐことができます。

## このツールを使ってあなたのプロジェクトのデータを整理するには

現在、無料機能を開放してテストユーザーを募集しています！

1. [Form](https://share.hsforms.com/1IiKZRnYrQz27zq05Ys_QKQ8moen)にメアドを登録する
1. Slackに入る
1. Slack上で自動BotからAccess Keyを受け取る
1. BaseをGithubから`pip`でインストールして初めてコマンドを実行する際にAccess Keyを登録する

そしてぜひフィードバックをお願いします！

**Get Invitation Form**
↓↓↓

https://share.hsforms.com/1IiKZRnYrQz27zq05Ys_QKQ8moen

https://github.com/adansons/base

(5/18追記)
`Base`でデータを解析可能な状態にするために必要な3つのコマンドについて紹介する記事を書きました！

https://qiita.com/KenichiHiguchi/items/82a4431610fce9c5fe2a