機械学習

仕事の9割を占める?データの前処理について簡単解説

この記事は以下の人に向けて書いています。

  • 機械学習における前処理の役割を知りたい方
  • データの前処理について学びたい人
  • 前処理の手法について学びたい方

データ解析における、データの前処理の必要性

機械学習に限らず、データを解析する際は、解析するデータの前処理が非常に重要です。
機械学習についての書籍を見ると、簡単にデータを解析できそうですが、書籍で使われているサンプルデータは、すでに前処理がなされており、すぐに学習させてモデルを作ることができます。

しかし、実はこの前処理のプロセスが最も大変で、実際のデータ解析においては8~9割のパワーが、データの前処理に注がれています。

実際に解析しようとする、いわゆる「生データ」は「汚れて」いるのが一般的です。
汚れているデータというのは、例えば、欠損値(欠測値)があったり、明らかな異常値が含まれていたりするデータで、要するにそのままの状態では解析することができないデータのことです。

汚れているデータをそのまま解析しようとすると、欠損値のある行または列が解析から除かれたり、異常値に引っ張られたりして、おかしな結果となってしまうことがあります。

従って、よいモデルを得ようとすると、データの前処理が不可欠となります。

今回は、様々なデータの前処理方法を紹介します。

1. はじめに

機械学習のフローにおいて、前処理は最も重要なフェーズと言っても過言ではありません。

データ解析について昔からある格言の一つに、「Garbage in, garbage out (GIGO)」という有名なものがあります。直訳すると「ゴミを入れると、ゴミが出てくる」で、もう少しデータ解析の世界に近づけると、「『無意味なデータ』をコンピュータに入力すると『無意味な結果』が返される」です。
この格言は1957年に初めて用いられたのですが、60年以上経ってコンピュータが飛躍的に進歩した現代でも不変の格言と言えます。

作成したモデルの良し悪しは、モデル作成に用いたデータの質によって大きく変化します。

なぜそんなに時間がかかるのか?

データサイエンティスト周辺で有名な言葉として、「データ分析は前処理が9割」があります。
「前処理」というのは、データ分析ができる状態にするために、収集したデータを加工する作業のことを指します。

収集したデータをそのままモデル作成に使えることはほとんどなく、何らかの前処理が必要で、ここに膨大な時間がかかるのです。

しかし、データ解析をしたことがない依頼側から見ると、「なぜデータがあるのに、すぐにモデルを作れないのか?前処理なんて、コンピュータで簡単にできないのか?何にそんなに時間がかかるのか?」と疑問に思うでしょう。

例えば、計画的に実験を行う場合、事前にどんなデータをどのように採取するかを決めることが多いので、得られたデータは統制が取れており、ほぼそのままの状態でモデル作成に使うことができます。

ところが、Web上のデータや市場データ、各自で好き勝手に入力したExcelデータなど、統制が取られないまま得られたデータは、無関係な特徴量が含まれる、抜けがある、小数点以下の数値が異なる、全角と半角が混在しているというように、傍から見るとめちゃくちゃな状態になっていることが多いのです。

このようなデータをそのまま解析することは不可能なので、そのめちゃくちゃなデータを丁寧に見て、必要に応じて修正して、1枚のきれいなデータシートに仕上げる必要があるのです。
当然、プログラムを組んで自動的に前処理を行うことは難しいので、解析者が都度処理方法を考えて、データをきれいにしていかないといけないのです。
コンピュータの進化は著しいものの、前処理はまだ泥臭い作業となっていることが、前処理に時間が非常にかかる理由です。

アルゴリズムに適用する形にデータを整えてあげる必要がある

機械学習には様々なアルゴリズムがあります。前処理の詳細は後ほど述べますが、モデル作成に用いるアルゴリズムにより、データを適切に前処理する必要があります。

例えば、ランダムフォレストは空白データに対応していないので、そのまま解析しようとすると、そのサンプルは解析対象から除外されてしまいます。従って、空白値には何らかの処理を加える必要があります。
また、ニューラルネットワークに画像データを入力する場合、大抵入力できる画像サイズは決まっているので、大きすぎたり小さすぎたりする画像はサイズを調整する必要があります。

2.前処理の効果

①前処理で精度が変わってくる

アルゴリズムによっては、前処理の有無により精度に影響が出る場合があります。

例えば、線形回帰やランダムフォレストでは、特徴量のスケーリングをしてもしなくても精度は変わりませんが、サポートベクターマシンでは、スケーリングしないと精度が上がらない、といったことが起こります。

②画像解析における前処理

画像解析では、画像内の物体の検出を行い、画像から切り出す「物体検出」が重要となります。
画像内の物体を正確に検出するためには、適切な前処理が必要となります。
物体検出を行うのに最適な物体は、輪郭がはっきりしていて、かつ、連続しているデータです。
物体を検出しやすいように、事前に「閾値処理」や「フィルター処理」といった前処理を行います。

③自然言語解析における前処理

テキストデータは文字の羅列であり、構造化されていないため、そのままでは解析するのが困難です。

例えば、Webから収集したデータを解析しようとすると、HTMLタグ や JavaScript のコードといった、解析に不要なデータが含まれています。このような不要なデータは前処理して取り除かなければ、そのまま機械学習を行っても、期待する結果は得られません。

また、日本語データを解析しようとする場合、日本語は単語の区切りが明らかでないという問題に直面します。そこで、日本語のように単語の区切りがはっきりしていない言語に対してまず行われるのが、単語の分割処理です。
分割処理を行う理由は、ほとんどの自然言語処理システムでは、入力を単語レベルで扱うこためです。分割処理は通常、形態素解析で行われます。

3.前処理の手法を解説

すべての前処理の手法を解説するのは困難なので、ここでは代表的な方法を解説します。

①カテゴリ変数(カテゴリカル変数)のダミー変数への変換とは?なぜ必要か?

機械学習に用いる変数は、量的変数かカテゴリ変数のいずれかです。量的変数とは、長さや重量など数値で表せるデータで、カテゴリ変数とは、血液型や雇用形態などグループを表す変数のことです。

カテゴリ変数は通常、「ダミー変数」というものに置き換えます。(ワンホットエンコーディング)
では、なぜダミー変数に変換する必要があるのでしょうか?

線形回帰モデルの例で考えてみましょう。
線形回帰は、次の式でyを予測します。
y=a1x1+a2x2+anxn+b

anとbは学習用データから学習した係数で、xiは特徴量です。この式は、xiが数値である場合は意味を持ちますが、カテゴリデータの場合は意味をなしません。

これを、具体的な例で見てみましょう。(表1)

この場合、性能が目的変数、温度、回転数、設備が特徴量です。

線形回帰式で表そうとすると、以下のようになります。

性能=a1× 温度 + a2 × 回転数 + a3× 設備 + b

このとき、a1× 温度、a2 × 回転数 、bは数値で得られるため、そのまま足し算できますが、a3× 設備は数値で表せないため、性能を数値で表すことが不可能になります。

設備のようなカテゴリ変数の場合、これをダミー変数に置き換えることで、数値計算できるようになります。ダミー変数に置換した例を表2に示します。

表2. カテゴリ変数をダミー変数に変換した例

このデータを基に性能の線形回帰式を作ると、以下のようになります。

性能=a1× 温度 + a2 × 回転数 + a3× 設備A + a4× 設備B + b

このように表せば、例えば設備Aのサンプルであれば、a3× 設備A の項は数値となり、a4× 設備Bの項は0と数値で表せるようになります。

これを一般化すると、ある特徴量がk個の異なるカテゴリから成り立っている場合、k個の特徴量に置換することで、量的変数と同じように解析できるようになります。

ダミー変数を作る場合の注意事項は、重回帰分析など行列を用いるアルゴリズムの場合、このまま解析すると、多重共線性が生じて解析不能になることです。これは、設備A + 設備B = 1の関係が常に成り立つからです。

このような場合、1つのダミー変数を消してk – 1個の特徴量で表すことで、この問題を回避できます。上記のデータの場合、以下のようになります。(表3)

表3では、設備Bの特徴量を削除しましたが、設備Bの代わりに設備Aを削除しても、結果は同じになります。

②正規化とは何か?

機械学習で用いられるアルゴリズムの大半は、特徴量の尺度が同じである場合、はるかに精度よく動作します。
通常のデータの特徴量は尺度がまちまちなため、尺度を合わせるスケーリング(スケール変換)を前処理の段階で行います。

例えば、特徴量が2つある場合を考えてみましょう。1つ目の特徴量が1~10の範囲で測定されており、2つ目の特徴量が100~100,000の範囲で測定されているとすると、アルゴリズムは範囲の広い2つ目の特徴量に従って、一生懸命に最適化することが想像できるでしょう。

従って、すべての特徴量を同じ土俵に乗せるため、特徴量のスケーリングが必要となるのです。
スケーリングにはいくつかの種類があるので、代表的な2つの変換方法を見ていきましょう。

1) 正規化

正規化は、個々の特徴量が0~1の範囲に入るように変換する方法です。

xnorm=X-XminXmax-Xmin

ここで、Xは特定のサンプルの値、Xminはその特徴量の列において最も小さい値、Xmaxは最も大きい値を表します。

正規化はよく使われる手法ですが、外れ値が含まれる場合、その影響を受けやすい問題があります。

2) 標準化(規格化)

標準化は、個々の特徴量の平均が0で分散が1になるように変換する方法です。

xstd=X-XX

ここで、Xは特徴量の列の平均値、Xは標準偏差を表します。

特徴量の列は標準正規分布に従うため、重みを学習しやすくなります。また、標準化では外れ値の情報が維持されるので、正規化に比べて外れ値から受ける影響が小さくなります。

③クラスタリングも前処理になる

クラスタリングは教師なし学習のアルゴリズムの一つですが、クラスタリングを前処理に用いることもできます。

例えば、画像認識を行いたい場合、データをクラスタリングでグループ分けし、それぞれのクラスタごとに異なるラベルを付けて機械に学習させます。
こうすることで、クラスタリングを行わずに学習した場合に比べて、予測精度が向上したとの報告事例があります。

④欠損値への対処法

計画的に採取されていないデータの場合、サンプルの値が欠損していることはよくあります。例えば、アンケート調査で空欄になっていたり、データを集める際に何らかの誤りがあったり、測定のミスがあったりなどです。

このような欠損値があった場合、各アルゴリズムは対応できないため、欠損値を無視して想定外の結果をもたらすことも起こり得ます。
従って、精度の良いモデルを作ろうとすると、解析の前に欠損値に対処しておくことが非常に重要となります。

ここでは、欠損値に対処するための具体的な方法を紹介します。

1) 欠損値を持つサンプルか特徴量を取り除く

欠損値が少ない場合はサンプルを、特定の特徴量で欠損値が目立つ場合は特徴量を、解析対象から除きます。
サンプルを除くことはデータシートの行を削除することを意味し、特徴量を除くことは列を削除することを意味します。

欠損値の除去は最も簡単な方法ですが、問題点もあります。

例えば、サンプルを削除し過ぎてしまうと、信頼性の低下を招く場合があります。機械学習においては、サンプル数の確保がモデル精度向上のための重要な手段ですが、それと逆行することになってしまうのです。

また、特徴量を削除し過ぎてしまうと、モデルがクラスを判別するのに有益な情報が失われる可能性があります。クラス判別に最も重要な特徴量が削除されてしまったら、どれだけサンプル数を増やしても、性能を上げることは困難です。

2) 欠損値を補完する

サンプルを削除したり、特徴量を削除したりすると、欠損値以外の重要なデータを多く削除してしまう恐れがあります。そのため、欠損値の削除はあまり現実的な方法とは言えません。

欠損値に対しては、何らかの数値で欠損部分を補完する補完法が一般的です。
最もよく使われる補完法の1つは、平均値補完です。
平均値補完とは、欠損値を特徴量の列全体の平均値と置き換える方法です。こうすることで、欠損値以外の情報を保持したまま、モデルを作成することができます。

4.まとめ

今回は、データの前処理について整理してみました。

用いるアルゴリズムによって、前処理の方法に違いは出てきますが、今回紹介した方法は、どのようなアルゴリズムにも使える、一般的な方法です。
前処理は大変なプロセスですが、欠くことのできないとても大切なプロセスです。事前にデータをしっかり吟味して、適切な前処理を行うことが、精度の高いモデルを作るための重要な要素となります。

もちろん、元のデータに重要な特徴量が含まれていない、用いるアルゴリズムが不適切といったような場合は、いくら丁寧に前処理を行っても、モデルの精度は上がりません。

正しく前処理を行えば、常に精度のよいモデルが得られる、というわけではないことはご理解ください。

機械学習を学ぶとつい、すぐにモデルを作成してモデルの性能評価をしたくなりますが、データの前処理をさぼってしまうと、うまく学習させることができません。
「急がば回れ」の精神で、解析を焦らずにまずはデータの前処理をしっかり行いましょう。

ABOUT ME
北爪 聖也
ダメ営業マンからデータサイエンティストへキャリアチェンジ。 技術とビジネスサイドの橋渡しが出来るため、ダメ営業マンの経験も役に立ちました。 広告代理店ADKにて3年勤務→データ分析受託の会社DATUM STUDIOにて1.2年勤務後、独立。
データサイエンスの仕事に興味がある方!

株式会社piponではデータサイエンティストの方々へお仕事をご紹介しております。

もし、仕事にご興味ある方がいらっしゃいましたらこちらのフォームよりご連絡頂けると嬉しいです。

また、「未経験から転職して1年で身につけたスキルで月収25万円の副業を得るまで」という記事を有料noteとして出していますので、興味ある方は購入いただけると嬉しいです!