機械学習

Pythonで機械学習を始めるならNumpyから勉強しよう!

1.機械学習とは

まず、「機械学習」とはどのようなことなのでしょうか。

機械学習とは、AIを支える技術の1つであり、コンピュータが問題とその答えを使って学習し、データに潜むパターンを見つける技術です。

機械に作業をさせる場合、これまでは人間が機械に対してその都度命令を与えて実行させる必要がありました。しかし、機械学習を活用することで、機械が自分で学習対象となるデータを読み込み、機械自らがデータを分析してルール、パターンを学習して頭脳を強化させていきます。

機械学習は予測、分類が得意です。身の回りでは、迷惑メールの振り分けやクレジットカードの不正利用検知、商品のレコメンデーションなどに使われています。

2.機械学習にnumpyが必要となる理由

numpy(ナンパイ)はpythonで数値計算を効率的に行うためのライブラリです。

ライブラリとは「図書館、資料室、書庫」などの意味を持つ英単語ですが、プログラミングの世界では「便利な処理ができるプログラム郡を、みんなで利用できるようにまとめたもの」を指します。

「pythonのライブラリ」も同様の意味であり、作りたいプログラムの目的に応じたライブラリを用いることで、1から自分でプログラムを組むことなく、簡単にプログラムを設計、実行できることが最大のメリットとなります。numpyの特徴として下記2点があります。

・numpyの特徴① 処理速度が早い

numpy自身は、Pythonとは別のプログラミング言語である「C言語」によって実装されており、大量のデータであっても短時間で処理できることが特徴です。

機械学習では膨大な量のインプットデータを基にパターン解析、モデル構築を行うため、処理速度は後々非常に重要な要素となってきます。

・numpyの特徴② 配列の扱いが柔軟

機械学習には数学の考え方、特に「行列」が重要となってきます。行列とは「同一の性質を持つ情報の要素を縦×横に並べたもの」であり、データを意味のあるひとかたまりとして表現することで取り扱いが用意になり、数値化することで機械(コンピュータ)が計算できるようになるのです。

行列をプログラムで表現する際に使うものが「配列」です。エクセルやノートのマス目の様なものをイメージしていただければ良いです。

下図の様に1次元配列は1行だけのマス目、2次元配列は複数行のマス目から構成されます。

 

numpyを使うことでベクトル(1次元配列)や行列(2次元配列)などの多次元配列を作ることができます。

3.numpyでできることと機械学習との関連

機械学習はAI(人工知能)を支えており、「行列」と同じく「線形代数」「統計学」「微分積分」といった分野の数学知識を使うデータ演算が重要になってきます。

データ演算① 線形代数

線形代数の中でも、特に「ベクトル」の感覚は必須です。「ベクトル」とは「大きさと方向を持つ量」という定義となります。

機械学習は、入力データを処理し、出力されたデータをまた入力として処理する、という繰り返しでだんだんと正解(現実の世界での現象)に近づけていく事です。

データ → 処理 → データ → 処理・・・・

この「→」にあたる部分が、間違えている方向を向いていたとしたら、正解にたどり着くことは難しいでしょう。

「出力された結果を分析し、どのような方向(ベクトル)に進めていくか」というアプローチが機械学習の中心的考え方であるといっても過言ではありません。

データ演算② 確率・統計学

確率・統計学は、データの持つ特徴を見出し、用途に応じてデータの分布や発生頻度を分析するときに使われる学問です。「大量のデータを扱いやすく分類整理すること」これは機械学習にとっては最重要なプロセスとなり、確率・統計学は必須の数学的知識となります。

機械学習で重要なキーワードである「回帰分析」「クラスタリング」といったキーワードもこの分野に含まれます。

 ・回帰分析

回帰分析は、結果となる数値と要因となる数値の、2つの相関関係を調べ、それぞれの関係を明らかにする統計的手法です。

具体的な活用例では、企業が商品やサービスの広告を行う際に「広告費を増額することでどのくらいの売上増加を見込めるか」といった予測する際に使われます。 

 ・クラスタリング

クラスタリングは、データの集まりの中から性質、特徴が似ている部分を見出す手法であり、似たものグループを作成するというイメージです。

具体的な活用例では、「人間」「犬」「鳥」のたくさんの写真に対して、「2足歩行」「耳と尻尾がある」「羽とくちばしがある」などのそれぞれの特徴をとらえてグループ分けを行うなどのデータ分類に使われます。

データ演算③ 微分積分

微分積分と聞くと、難しそう・・・という声も聞こえてきそうですが、微分積分を活用できれば、機械学習のデータ分析の中で「ある値が最大(最小)になる部分を計算することができる」様になります。

例えば微分とは、現在の状況がどのくらいのスピードや頻度で変化をしているのか、または変化をせず停滞しているのか、を数値化して表現することができます。将来の変化を予測してどのような数値に推移していくのか、最大値、最小値はどこになるのか、を詳細に予測することに活用することができます。機械学習でのモデル作成において、最大と最小を求めることで、現実世界により近い強力なモデルを作成することができるようになります

numpyではこれらの数学的処理を得意としていて、機械学習の入力となるデータ群に対して「2つの値の関係をとらえて将来データを予測」「データの特徴をとらえてカテゴリに分類」「データ変化の推移と最小値、最大値の算出」などを行うことができます。これは、機械学習のプロセスの中の「データ前処理」と言われるフェーズになります。

ビジネスで取り扱うデータ、例えば「ユーザからのアンケート回答」「店舗ごとの売上実績」「センサーで収集したデータ」などはすべてがきれいに揃っている状態、とは限りません。

データの一部が欠損していたり、入力ミスにより誤ったデータが登録されている、などの状態であることは考慮しなくてはいけません。そして、不備のあるデータのままで機械学習を行ってしまうと、出力されるデータの精度が低く、目的とする学習モデルを構築できないという結果となってしまう可能性もあります。

「データ前処理」では下記の項目を実施して、機械学習の入力データとして使える形にすることを行います。

データ前処理① データクレンジング

文字通り、データをきれいにする作業になります。前述したとおり、収集されたばかりのデータには欠損値、入力誤りやエラーデータなどが含まれています。これらの「ノイズ」と呼ばれるデータを、分析できる形に整えることを行います。相関関係やデータの増減から、欠損値を推測して補完する、冗長的に保持されている部分を取り除く、など地味で複雑な作業となりますが、ここでの精度がデータ分析全体に大きく影響を与えるため、最も重要な作業であると言われています。

データ前処理② データ統合

クレンジングが完了したデータに対して、データを統合していきます。

データは1つの収集源から採取されているとは限らず、一貫したデータとなっていないケースも多いです。粒度の異なるデータを統合して、一貫性の取れたデータを作ります。

データ前処理③ データ変換

最後に、機械学習プログラムの形に合うようにデータのフォーマットを整えます。

例えば、数値の項目が、数字と漢数字で記入されていた場合はそのまま計算することができませんので、数字に置き換えていきます。

住所の項目で、同じ住所を指していても、都道府県から記入されている場合と市区町村から記入されている場合では、異なるデータと認識されてしまいますので、住所の書式を揃えることが必要となります。

「データ前処理」でのこれらの処理もnumpyを活用することができます。

まとめ

機械学習では、膨大な入力データに対して数学的演算を行い、データをわかりやすく分析、集計する事が必要となります。そして書式が統一された「きれいなデータ」として整備することで機械学習の精度は向上します。numpyは「機械学習での縁の下の力持ち」として重要なスキルと言えるでしょう。