機械学習の精度を左右する「データ加工」の基礎知識――「攻めのデータ加工」=「特徴量エンジニアリング」編:「AI」エンジニアになるための「基礎数学」再入門(5)(1/2 ページ)
AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す連載。前回から2回に分けて「データ加工」の手法を紹介します。今回は「攻めのデータ加工」です。
AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す本連載『「AI」エンジニアになるための「基礎数学」再入門』。初回は、「AIエンジニア」になるために数学を学び直す意義や心構え、連載で学ぶ範囲についてお話ししました。
また第2回では、データの種類を紹介しました。そこでは、数値としてのデータ自体、あるいはその統計量には尺度によって意味のあるもの(=情報として価値があるもの)と、そうでないものがあることを確認しました。忘れてしまった方は、もう一度目を通していただくことをお勧めします。第3回では、統計について、その概念と各種統計量(「最頻値」「中央値」「平均値」「分散」など)が表す意味について学びました。そこでは、「統計量は数値として抜き出された情報である」ということを述べました。
ここから発展的に考えてみると、「どのようにすると、より多くの情報、そしてより価値のある情報を抜き出すことができるのか?」という疑問が湧いてきませんか? 前回、そして今回の内容である、「データ加工」はまさしく、その疑問を解消するものになっています。それに加え、データ加工は分析者にとって腕の見せどころの一つです。前回は「守りのデータ加工」と称して「欠損値」への対処法を解説しました。
「攻めのデータ加工」=「特徴量エンジニアリング」
今回は、「攻めのデータ加工」です。一般的には「特徴量エンジニアリング」とも呼ばれています。“攻め”というのは、これから紹介するテクニックは次のようなモチベーションから用いられるものだからです。
- いかにデータ量を増やすか
- いかにデータの質を高めるか
すなわち、「情報量を増やす」ことが念頭にあるわけです。
また、そのテクニックは各データの種類(連載第2回で解説しました)に対応して存在します。今回からはオープンデータである、「CensusDataset」を例に挙げながら解説していきます。
なお、このデータは米国の国税調査のデータを基に「収入が5万ドルより大きいか否か」を予測するトレーニングをするために公開されているものです。
質的データの加工
「質的データ」とは、「名義尺度」「順序尺度」の総称でした。これらは、一般的に文字型でデータを持っており、さらには「四則演算の結果に意味がないデータ」です。
これから紹介するテクニックは、「文字を数字へと変換する」とともに、「四則演算の結果に意味を持たせる」(一部、例外あり)ことを実現するものです。
OneHot-Encoding
質的データの加工において基本中の基本に位置する手法で、データをxxxであるか否かの「1 or 0」で表現する手法です。
例えば、下図左の「education」は学歴を表す列ですが、OneHot-Encodingを施すと下図右のようになります。
1行目を例にとると、値がBachelorsであることを、「1(Bachelorsである)」「0(Mastersではない)」「0(Doctorateではない)」という、1か0の羅列で表現できています。業務で使うようなデータでは16種類の値が登場するので、16個の1か0の羅列で表現されることになります。
なお、OneHot-Encodingには、2つ注意点があります。
【1】1列が不要である
加工後のデータを見ると、各行のどこかに必ず1が存在しています。その前提に立つと、例えばDoctorateは「0(Bachelorsではない)」「0(Mastersでない)」……とあった時点で値がDoctorateであったことは判別できます。
このような他の列から再現できてしまう列の存在は予測精度に悪影響を及ぼす可能性(専門的には「多重共線性」と呼びます)もあるので、OneHot-Encoding後は任意の1列を削除することをお勧めします。
【2】データがスパースになる(≒列がむやみに増える)
加工後のデータを見ると、与えられた表に対してやけに0が多いことが分かります。こういったデータを「スパース(疎)なデータ」と呼びます。データがスパースになればなるほど、機械学習において最適な計算ができない要因となるので、次のような対策も知っておくといいでしょう。
- 値をまとめる(例えば、ひとまとめに「高卒以下」「大卒以上」などという値に変換する)
- 以降で紹介する列が増えない加工方法を試す
Label-Encoding
出現する値と対応する連番へと変換する手法です。例えば、先ほどのeducationにLabel-Encodingを施すと下図右のようになります。
気ままに連番を付けてもいいのですが、より意味のあるデータにしたければ何かしらの順序に従うような番号、つまり順位を振りましょう。
ここで、educationを学位という見方をすれば、順序性を見いだすことができます。この例は、博士を最大の3、学士を最小の1として番号を振る様子です。
なお、Label-Encodingには、3つ注意点があります。
【1】順序性がない値、すなわち名義尺度に適用するのは避ける
機械学習のアルゴリズムによって有効な場面が限られてくるため注意が必要です。順序が見つからない場合はOneHot-Encodingなど他の手法を選択しましょう。
【2】順序は吟味する
連番で表現される順序が予測したい値に関係するほど有効なデータになるので、どのような順序にするかは吟味しましょう。例えば、国名などは、人口順、1人当たりGDP順などさまざまな順序を見いだすことができます。今回は、年収を予測するので1人当たりGDP順の連番などは有効であると考えられます。
【3】順位間の差が一定でないものは避ける
例えば徒競走において、1位と2位のタイム差と、2位と3位のタイム差は同じとは限りません。このように順位間の差に一定性がない場合、アルゴリズムによってはうまく予測できない可能性があります。
Count-Encodingの例
出現する値の頻度へと変換する手法です。
例えば、「workclass」は職業区分を表す列ですが、educationのように順序性を見いだすのは比較的難しいです。そういった場合は、Count-Encodingが有効である場合があります。
なお、Label-EncodingとCount-Encodingの合わせ技で、「LabelCount-Encoding」というものがあります。これは、単純に上の頻度を順位へと加工し、その順位で元の値を変換するというものです。予測したいデータと関係ありそうなら試してみる価値があります。
Target-Encoding
ここまで、「予測したいデータと関係がありそうなら……」という言い回しを用いてきましたが、Target-Encodingはまさに予測したい値の平均値に変換してしまう手法です。
多くの場合に、予測にとって有効なデータに変換されてくれることでしょう。ただし、Target-Encodingはうっかり「leak」という現象を起こしやすいテクニックです。
専門的な話は割愛しますが、端的に言えばleakとは「手に入らないはずのデータを手に入れた体で予測してしまう」というミスです。つまり「情報漏えい」という意味です。Target-Encodingを施した結果、異常なまでに精度が上がった場合にはこれを疑いましょう。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 数学ができると「数学ができないエンジニアはダメだ」の効果が計れる
数学ができるとエンジニアとして活躍できるのか、むしろ数学ができないとエンジニア失格なのか?――「エンジニアに数学の知識は必要か?」を、数学オタクが論理的に解説します。 - [Python入門]Pythonってどんな言語なの?
機械学習に取り組んでみたいという人に(そうでない人にも)向けて、Pythonプログラミングを基礎からやさしく解説する連載をPython 3.10に合わせて改訂します。 - Pythonで機械学習/Deep Learningを始めるなら知っておきたいライブラリ/ツール7選
最近流行の機械学習/Deep Learningを試してみたいという人のために、Pythonを使った機械学習について主要なライブラリ/ツールの使い方を中心に解説する連載。初回は、筆者が実業務で有用としているライブラリ/ツールを7つ紹介します。