Python
OpenCV
機械学習
scikit-learn
svm

機械学習のデータセットの重要性

機械学習のデータセットの重要性についての私見を以下に述べます。

「じゃあ、他の手法と比べてみたときにどうなんだ?」に付記として書いていた内容に追記して独立の記事に書き換えたものです。)

 さまざまな機械学習の例題を見つけて実行すると、web上にある十分によく使われているデータセットを使うことになる。国内外の研究所や大学や一部の企業が公開したデータの作成者は、その分野の機械学習の専門家であり、学習や評価に足りるだけの力を尽くしたデータセットになっています。そのデータを用いて、web上に書かれたよいサンプルプログラムをそのまま実行してみると、とても簡単にそれなりの結果が得られるので、機械学習はとても簡単なことだと勘違いしてしまうことがあるかもしれません。しかし、実用水準の機械学習結果を作り上げるには、独自の学習データの収集が有効だということを知る価値があります。空港でパスポートの写真と顔照合する際の顔検出と、デジタルカメラやスマートフォンの顔検出では違います。車載分野の人検出と監視カメラの人検出でも違います。データの素性の違いというのは想像以上に大きいのです。手書き文字でも鉛筆の場合とボールペンの場合では、文字のかすれなど挙動が違ってきます。このように、自分が実現するべき対象のデータの癖を知ってみると、既存のデータと挙動が違うことが珍しくありません。ですから、データセットを自分の問題で自分が集めるのは並大抵でないけれども、成し遂げることの価値があることを知る必要があります。

データの特徴の違い

正面顔と横顔の学習の違い

正面顔と横顔では検出器の学習として違いがあることを「詳解OpenCV」の中にも書かれています。正面顔では学習範囲の中に顔以外の部分がほとんどないことに比べて、横顔では背景に顔以外のものが必ず写っているという違いがあることです。このようなデータの特徴の違いは、学習データの与え方によっては、不十分な学習になることを述べています。深層学習など学習手法の進化はありますが、このような問題に対する対策は、学習を行う人が注意深くデータを扱うことでしか対処できないと私は考えています。

声優の素の声とアニメの声の違いの事例

次の記事は、学習データとテストデータの違いによって、その結果がどのように違ってしまうのかを
述べている。声によって声優を識別する学習とテストを行っている。(1):声優の素の声と声優のデータから、
アニメの声を元に声優を予測する。(2):声優のアニメの声と声優のデータから、素の声を元に声優を予測する。その2通りを実施している。いずれも不十分な認識率になっていることを述べている。
声優の声を分類してみた

用途にふさわしい学習データの分散を持つべきこと

学習データは、用途にふさわしい分散をもっていなければならない。その分散を持っているように学習データを収集しなければならない。クラス間分散やクラス内分散が用途にふさわしいものであるのかを確認することです。機械学習はそのような学習データの収集を設計して実現することが大切なのです。プログラミングやアルゴリズムの考案よりも計測であるとさえ言えるでしょう。主成分分析で得られた固有画像eigen image をmatplotlibを使って画像として表示してみましょう。そうすれば、どのような分散を持っているのかをみることができます。それらはデータの素性やデータの前処理の結果がどのようであるのかを理解するのにつながります。

用途にふさわしいデータ分布の平均を持つべきこと(追記)

また、学習データは用途にふさわしい学習データの平均を持つべきである。学習データの平均は、アルゴリズムのいろんな部分で影響する。固有顔Eigenfaces に基づく顔照合の際にも、平均を差し引いてから、固有値としての固有顔が出てくる。だから、人種の偏りや年齢が極端に違う場合には、それまでに築いた顔照合のシステムが性能がでないということがおこりうる。
 ヨーロッパ人に偏ったデータベースで作られた年齢推定システムは、東洋人に対しては性能がでないことが得てしておこります。
このようなことは、機械学習だけではなく、自分が日頃みなれていない人たちの区別がつけにくい、年齢が推定しにくいという人自体にもおこることのようです。

学習データを過度に難しくしない

学習データには、どこまで難しいデータを入れて大丈夫かは、人が調整する必要があると思っています。顔検出の場合には、顔の部分の隠れが多すぎる画像を加えることは、顔検出の性能を悪くすることが経験的に知られています。学習アルゴリズムによっては、学習データの分布によって著しく特性の劣化を生じる場合もあります。学習データにどのようなものを含め、どのようなものを除外するかは、実用的な学習結果を得るためには欠かせない作業です。(ただ、あまりに経験的な作業なので、学習アルゴリズム自体で論文を書く人には、向かない話となります。)

条件の整えられたデータ取得とランダムなデータ取得

データの取得と評価は、条件の整えられたデータとランダムなデータとを取得する必要があります。どちらか一方だとうまくいきません。
条件が整えられたデータを使わないと、アルゴリズムの骨格を作ることができません。

例として顔検出・顔照合を上げてみましょう。
顔の向き、照明の条件などがそろったデータベースが必要です。照明の条件がそろったデータベースであるから、照明の影響がどのように顔照合に影響するのかが評価可能になります。

このような条件がそろったデータベースは、他の目的の機械学習でも十分に必要性が高いことがあるでしょう。

条件が整えられたデータは、世の中の一般的なデータとはだいぶ異なります。証明写真の顔画像では、背景が平坦でものが写っていない写真となっています(http://www.keishicho.metro.tokyo.jp/menkyo/koshin/koshin/koshin02_2.html)

このようなデータが顔検出・顔照合の初期の研究開発段階から多数作られてきました。

次にランダムなデータ取得が必要です。

ある用途のための顔検出をしようとしたときに、開発中のシステムがどれだけの性能がでているのかを知るとき、人為を減らしたデータの取得が必要です。
最近は、このタイプのデータ・セットが増えてきています。
顔照合のデータベースであるLabeled Faces in the Wild Homeはこのようなデータベースです。

条件が揃いすぎたデータでは、たくさんの評価漏れを生じる危険を含んでいます。

データセットは繰り返し改訂する必要がある

「じゃあ、他の手法と比べてみたときにどうなんだ?」が適切な時期は、最初のあたりをつける方式を選ぶときに「始めやすい、この問題に適した手法を、文献ベースの知識や自分や他の人の経験に基づいて選ぶ段階」と、「データがそろってきていて、手法の比較をすることの意味がでてきた段階」と私は思っています。どんなに優れた手法であっても、手法を使う側の人間の理解がおっつかない手法では、適切な評価はできません。始めやすさ、初心者にとって理解のしやすさ、扱いやすさも、最初の手法には必要です。
「データがそろってきていて、手法の比較をすることの意味がでてきた段階」にするためには、以下の点に注意してください。

  • recall rate の低さが目立つとき

 そのカテゴリのデータに対するrecall rateが低いときには、そのカテゴリに対する学習用のデータが不足していることを示しています。そのカテゴリの学習データの数自体が少ないこともあれば、学習データの分散が少ない場合もあります。
 それらを実データ、もしくは加工データを使って補ったときにrecall rateが向上する可能性が高いはずです。

  • accuracy の低さが目立つとき

そのカテゴリに分類されてしまう別カテゴリのデータが多いことを意味します。混同行列をみて、影響しているカテゴリを見極めます。そのカテゴリの学習データを増やしてみることも、accuracyの低いカテゴリの改善につながります。

  • positiveとnegativeの境界が重要なアルゴリズムと、分布自体が重要なアルゴリズム

アルゴリズムには、positiveとnegativeの境界が重要なアルゴリズムと、分布自体が重要なアルゴリズムとがあります。それによって、学習データの集め方が変わってきます。判別が容易なデータばかり追加すると、追加前よりも認識性能が劣化するアルゴリズムがあります。AdaBoostはそのようなアルゴリズムの1つです。他方、SVMにおいては境界を与えるデータ(サポートベクター)だけが重要であると言います。逆に、難易度が高すぎるデータを加えることも、認識率を低下させる要因になります。

データが少ないときには、データが少ないときにむくアルゴリズムを使おう。

Boostingはデータが多いときに向くアルゴリズムです。少ないデータの中ででたらめよりちょっとだけましな結果を得ることから始めるならば、Naive Bayesian  例題 Probability calibration of classifiersなどのアルゴリズムを使うことが考えられます。K近傍法などもでたらめよりちょっとだけましな結果を少ない学習データに対して行うならば、ちょっとだけましな結果が得られそうです。

データ数が少ないときには、アルゴリズム間の評価は制約が多い

 
そのモデルが持つ自由度と学習データの数との組み合わせによっては、そのモデルの自由度に対して適切に値を決めきらないという状況に陥りやすくなります。これは次元の呪いという言葉で知られています。

データ収集の手間を惜しまないこと

機械学習のデータセットの重要性 について組織の上部の人にわかってもらったら、手間を惜しまずデータを収集することです。
データを収集し、機械学習の最初の版を動かしだすと、問題が見えてきます。データを収集し、最初の版を動かし始めて、ようやく今後必要になることが見えてきます。データの実際を見ていない段階で立てた計画というのには、大きな漏れがあったりするものです。
 顔認証に力を入れている会社の場合、一度に多方向から顔を撮影する装置を研究部署にそろえていたりするものです。光の照射条件を変えて同時に撮影します。顔画像の光の照射条件の違いを分散に含んだデータセットをとるには、同一人物で同一の表情で、しかも多様な光照射での撮影が必要です。このようなデータから主成分分析を行えば、光の照射条件の違いによる固有顔の成分を取り出すことができます。
 そのようにして得られた光の照射条件の違いによる固有顔の成分は、人物の認証には役に立たないはずの成分です。ですから、その光の照射条件の違いによる固有顔の成分を求めるときの実験データが、利用目的が対象とする手段の分の広がりを持っている必要があります。100歳近い高齢者の顔は、70歳の顔とは明らかに違います。100歳近い人での顔認証の率が、通常市販されている製品で実現できるかは、検証する価値があるでしょう。

 固有顔の一例が「実践コンピュータビジョン」, Programming Computer Vision with Pythonに書かれています。そのなかでは、顔の位置を十分に正規化する前の正面顔での場合と、両目の位置を正規化してそろえた後の、いずれも同一の人物の固有顔(eigen face)のが記載されています。このような違いを見れば、同一人物で同一の表情で、しかも多様な光照射での撮影を行わない限り、光の照射の違いを強く反映する固有顔を得られないことが容易にご理解いただけると思います。このようなデータ収集の上にあって、光の照射の影響をに左右されにくい要素を抜き出せるようになるのです。(つまり、光の照射の成分を主成分分析で適切に含むようにしたいのなら、顔の位置を正規化している必要があることを述べています。また、光の照射による成分を適切に含めたいのであれば、人の顔の形状の分布も、実際の顔の多様性を反映するように広がりをもたせて撮影する必要があるといっていいでしょう。)

データ収集のコストを下げること

上で言っていることと矛盾するように聞こえるかもしれませんが、データ収集のコストを下げるための方策を同時に考えることです。データを集めなくては、既存の識別器が良好な学習になっているのかを確認することさえできません。

  • 動画からの自動切り出し
  • Webからの検出
  • Kinectなどのdepth情報が得られるカメラの利用

Using Kinect and other OpenNI compatible depth sensors

間違ってラベル付けされたデータの除外

データセットを構築するとき、間違ってラベル付けしまうことがあります。そのようなデータは学習データにあると、学習結果の劣化につながります。そのため、間違ってラベル付けされてしまったデータがないか確認することです。
 このことは、学習データセットによっては、簡単な話ではありません。超音波診断の画像が、病状があるpositive画像か、病状がないnegative画像かは、通常の人には知りようがありません。正しくラベル付けされていない限り、機械学習は適切な結果にはなりません。
 学習結果を元に、認識率が低い学習データがあれば、そのデータのラベルが本当に正しいのかは、チェックする価値があったりします。 

学習データの分布によって、識別性能が変わることがある。

 学習アルゴリズムによっては、データの境界によって識別性能が決まるものもありますが、データの境界ではなく、データの分布によって決まるものも多い。そのため、学習データにどのようなものを含めて、どのようなものを含めないか重要な学習のノウハウになります。
学習済みの結果に基づいて学習データのスコアの分布をグラフにしてみましょう。スコアの低いデータにどのようなデータが多いのか見えるようにしましょう。学習が画像データに対するものである場合には、それらの画像をhtmlファイルで表示させることで、特徴をつかみやすくなります。どのようなデータを学習データに加えるのかが、学習の成否につながります。

学習データの意図しない偏り

 学習データに意図しない偏りを生じていると出来上がる学習結果が間違ったものになることがあります。たとえば、肩から上の人の頭部を検出したいとします。そのときに、人を壁の前に立たせて、多数の人で学習させたとします。そのデータを使って検出器を作り上げると、周辺部分の壁検出器になっているということが起こりえます。学習結果に対して意図しない偏りを生じていないことを、十分なテストで実行してみてください。そうすれば、そのような学習データの偏りの可能性を見つけて、対策のとれた実験を立案・推進できるようになっていくはずです。

学習データの意図しない偏り(追記)

 たとえば、頭部検出器を学習で作る場合、頭髪の色によって頭部検出の性能が違ってくる可能性がある。濃淡ベースの特徴量の場合、黒い頭髪が周辺よりも黒いという前提になる学習データが多く用いてしまうことが多そうです。そうすると、スキンヘッドや白髪の場合には、黒い頭髪ほどの検出率がでない可能性があります。
 そのようなことが、今あなたが取り組んでいる機械学習で生じていないか疑ってみることも、ときとして必要です。

他の手法を利用して、データ収集を楽にしよう。

 たとえば、犬検出の学習データを集めたいと仮定しよう。その場合、固定カメラで動いている対象物を、背景差分などの手法で抽出できる。その対象物を、カメラの設置角などの情報をもとに、大きさを推定する。その大きさを元に、犬である可能性が高い画像を集めることができる。その画像から、犬の画像を選択することで、何もしないよりは楽をできる。
 他にも、kinectのような距離センサが利用できるので、距離情報を元にデータを選ぶということもできるだろう。最終成果物には使えない技術でも、技術の開発段階では、積極的に利用しよう。

CGデータの利用

画像系の機械学習の場合だと、正解データのラベリングに多大な量力を必要とします。このとき、問題の種類によっては、CGデータを使ってラベリングの済んだ正解データを作り上げることがあります[1]。
SYNTHIA Datasetはそのようなひとつです。

[サーベイ論文] 統計的学習手法による人検出 5. 2 学習サンプルの収集

SYNTHIA Dataset 

The SYNTHetic collection of Imagery and Annotations, is a dataset that has been generated with the purpose of aiding semantic segmentation and related scene understanding problems in the context of driving scenarios. SYNTHIA consists of a collection of photo-realistic frames rendered from a virtual city and comes with precise pixel-level semantic annotations for 13 classes: misc, sky, building, road, sidewalk, fence, vegetation, pole, car, sign, pedestrian, cyclist, lanemarking.

機械学習の経験者の知見をデータセットの構築に反映させること

どのようなデータを収集すべきかには、機械学習の分野の経験がいる。どのようなデータだと間違った学習をしてしまうかということを経験する価値はある。人検出を学習したつもりが、学習データを収集した撮影環境の背景を学習したなんてことにもなりかねない。無駄のないデータ取得計画を立てたいと思うかもしれないが、データを収集する、学習する、結果を評価する、どう改善すべきか考えるという繰り返しが必要だ。その中で得られた知見を元にデータを収集する部分を改善していくことです。

ネガティブサンプルの重要性

 ネガティブサンプルをどう集めるか、ネガティブサンプルの品質をどう確保するのかも重要な問題です。
一例をあげれば、歩行者検出があります。自動車が走行中にみる可能性のある画像の中で歩行者以外のものを歩行者でないとして判定させるためには、街路樹を歩行者ではないとして学習させる必要があります。郵便ポストも歩行者ではありません。立て看板も歩行者ではありません。ガードレールの端っこも歩行者ではありません。横断歩道も、路面に書かれた表示も歩行者ではありません。建物の壁も歩行者ではありません。そういった歩行者でないものを全て誤検出しないような学習が重要です。
 このようなネガティブサンプルを十分に集めきること、それらを含めて学習しきることが、製品レベルの検出器を実現する上で必要になります。
Mobileye (モービルアイ)
そのような学習を行って、単眼での歩行者検出をさまざまなクルマに提供しています。

ネガティブサンプルはとても重要です。

cascade の識別器の場合の注意点

Haar like cascade の識別器の場合だと、後段の強識別器になるほど、学習結果の汎化性が怪しくなりがちです。

ネガティブサンプルの中に混入したポジティブサンプルによって学習結果がおかしくなることが起こりえます。
そのために、本来十分に検出できるはずのものが検出できないという状況になりやすいのです。
ですから、後段の強識別器に使われたポジティブサンプルは、目視でチェックする価値があります。
そのようにすることで、ネガティブサンプルの中に混入したポジティブサンプルによって学習結果がおかしくなることを防ぐことができます。

テストデータは本当にテストデータとして十分か?

・機械学習のテストデータは、学習に用いたデータを含まないようにすることが必須です。
・データを加工によって増やしている場合には、加工済みのデータを学習用とテスト用に分けてはいけません。同じ原画像を用いているものが、学習用とテスト用に含まれることになるので、実際以上によいテスト結果を与えてしまいます。
・有名人の顔画像を含むデータセットを利用すると、大統領の異なる正面顔画像が学習用、テスト用に含まれる危険があります。

利用目的を理解しよう

実装する機能についての使われ方を理解することから始める必要があります。
その識別器が失敗したときの影響は何かによって、どのように実装すべきなのかを理解することです。
他に補助的な手法で改善できないのかを考えることです。
機械学習万能説にはたたないことです。

SlideShare 機械学習で泣かないためのコード設計

十分にデータを集めきることができていて、その学習データを外部に提供してアルゴリズムを開発してほしいのであれば、Kaggleというサイトを利用する方法があります。賞金を設定しているのも、あればrecruiting competitionsになっているのもあります。

賞金稼ぎから仕事探しまで、世界のデータサイエンティストが「Kaggle」に集まる理由

できない英語を駆使してKaggleに挑戦してみた

次の記事は2値分類の学習において、そもそも、そのどちらでもない画像が入ってきたときの問題を指摘している(いわば血液型の判定の入力にトマトジュースが入ってきたようなもの)。利用目的に応じて、どのようなシステムを構築するのか適切なのか、その直前の前処理をどうするのかを含めて、機械学習を含むシステムは構築されるべきなのでしょう。

DeepLearningで上司を認識して画面を隠す

付記:人にとっては学習できているか?

画像の機械学習の場合、学習できそうかどうかの直感として、人にとって学習できているような内容かどうかという視点を用いることがある。
 例として、年齢推定や顔認証を考えてみよう。
自分とは異なる民族・人種では、その人の年齢の推定や、同じ人かどうかの判定が難しいと感じる。これは、集団によって、平均顔や顔の変動要素、主成分分析の成分が異なることに起因しているのではないかと思っている。研究や開発の労力が並大抵ではない顔の分野でさえそうである。その他の分野の機械学習は、データの数が不足しがちで、「ゴミが入ればゴミが出る」ということを忘れてはならない。

データをよく見よう

 データをよく見て観察することは、結果だけを見ていては気づかないことを知ることにつながります。
 次の記事は、そのような例です。

DeepLearningだ!と意気込んだものの手書き数字認識の後に続かなくなった時に読むデータそのものの話

(17) cuda-convnetで自筆数字画像を自動認識

Shinsai FaxOCR 手書き文字認識用データセットテストデータ (MNIST IDX形式)


追記
dlibの顔器官点の検出は優秀だと感じています。
その結果を用いれば、顔画像の正規化などは、やりやすくなります。
dlibで実現されている以上の精度で新たに構築しようとするのでない限り、
そのようなツールの利用は有効だと感じています。
今までは、目位置の正解入力を多数作らなければならないという大変さのために
顔関係のアルゴリズムの開発が限られた場所でしかできなかったという状況でした。


論文を読もう。

論文の中では、その画像認識技術の良さを他と比較して主張するために、必ずデータベースで比較している。
学習する場合には、どのようなデータベースを用いて学習しているのかを記載しているはずだ。

公開データベースを用いている場合が大半なはずだ。
まれに、自分たちで取得したデータを使って、学習や評価をしている場合もあるが、
そのような場合でも、利用しているデータの素性を述べていたり、データを公開している場合も多い。

最新の論文であれば、その目的では、どのようなデータベースが最近の比較に使われいるデータベースなのかを知ることができる。

そういった用途で、論文を読むこともできる。


追記:

機械学習のデータセットを作成・利用時にしてはいけないこと

  • 評価用のデータと学習用の画像が区別されていない。

 データの管理をきちんとしていないと、評価用の画像の画像を、学習画像として使ってしまっている可能性がある。
 学習用の画像をどこかからコピーして素性がわかりにくいものになってしまったあとで、その出典をたどるのは困難になってしまう。
 データを取得したら、早い段階で評価用と学習用を分けて管理しよう。
 早い段階で評価用・学習用と分けて宣言してからでなくては、チームの他のメンバーに使わせないことだ。

  • 評価用のデータと学習用のデータを過度に似た画像にしすぎる。

動画フレームから静止画を切り出して、それをシャフルして評価用と学習用と分ける。しかし撮影環境が同じであるので、静止画を切り出す時間間隔が短すぎると、似た画像になりすぎている。そういう状況でだと、評価用画像と学習用画像との間の特性の差がなくなってしまう。そうすると、評価が過度に良い結果がでてしまう。

 ところが、実際の環境になったとたんに、変動が加わるので性能が出ないということが起きる。

 評価用の画像と学習用の画像が似すぎるという問題は、意図しない形で入ってくることがある。顔照合のシステムにおいては、顔照合のシステムを構築するため学習済みデータを作る際に、評価用の顔照合に含まれているのと極めて似た画像をいつの間にか使っているという心配である。
 たとえば、バラク・オバマ(元大統領)の顔画像などというのは、顔画像のデータベースの中で含められやすいので、異なるデータセットを学習用・評価用としても、どちらにもバラク・オバマが含まれてしまっているということは容易に起こりやすい。