AI(人工知能)を実際に作ってみたものの、なかなか精度が上がらない経験って、ありますよね。そんなときいろいろ調べてみると、前処理というキーワードに出会うかもしれません。でも、前処理と言われても、なかなか何をすれば良いのかわからないでしょう。
前処理のなかでも大切で、効果的なもののひとつが、「標準化」です。これを使うことで、測定単位が学習データの大きさに与える影響を取り除くことができ、AI(人工知能)の性能を上げることができます。そして、そういった前処理の機能が充実したライブラリとして、scikit-learnがあります。scikit-learnで標準化を実現できるのが、standardscalerというクラスの関数です。
そう言われても、scikit-learnって何?「標準化」って何?一体どういうことなの?などなかなかピンとこないかもしれません。そこで今回は、scikit-learnとstandardscalerの役割や、使い方、メリット、気をつけるポイントなどについて、丁寧に説明します。
機械学習ライブラリscikit-learnとは
scikit-learnというのは、Pythonの機械学習ライブラリです。オープンソースで開発され、無料で利用できます。
scikit-learnは、さまざまな機械学習のパターンに対応しています。線形回帰などの回帰系のもの、決定木などに代表される分類系のものや、k近傍法などの教師なし学習、ランダムフォレストなどのアンサンブル学習などです。
つまり、機械学習プログラムに必要となる一連のプロセスを、scikit-learnだけで完結させることができるのです。
データを標準化する「standardscaler」
standardscalerの機能は、データを標準化することです。データの標準化とは、データセットの各項目のばらつきをそろえること。
データの項目ごとにばらつきが異なると、ばらつきが大きい項目が機械学習の結果に不当に大きな影響を与える場合がありますが、標準化を用いることでそれを回避できます。
ばらつきをそろえなければ、各項目のうち特にばらつきが大きいものが学習の結果に影響しやすくなる場合があります。しかし、世の中のデータのうち、必ずしもばらつきの大きいものが正解に寄与しているとは限りません。
standardscalerを用いることで、各項目のばらつきをそろえ、この問題を回避できます。ですから、データの単位が揃っていない場合や、データを見たとき学習結果に影響しないデータのばらつきが大きく見えた場合には特に、標準化が有効であるといえます。
standardscalerを使うメリットとは
では、standardscalerを使うことのメリットは、以下のような点があります。
- 自分で数式を書かなくても標準化を実現することができる
- 単位の違いなどによって起こるばらつきを取り除くことで、AI(人工知能)の精度を上げられる
メリットはなんといっても、自分で数式を書かなくてもよいこと。
dataという変数が元のデータだとすると、
scaler.fit(data)
newdata = scaler.transform(data)
とするだけで、標準化された新しいデータを作ることができます。たったの3行なので、簡単ですよね。
また、AI(人工知能)の精度向上が実現できるのもメリットです。特に、ばらつきが影響を与えやすい分類法(たとえば、k-means法)では、標準化によって精度を上げることができます。
また、AI(人工知能)では次元の数が問題になりますが、それを減らすときにもstandardscalerが活躍します。次元の数を減らす代表的な手法である「主成分分析」も、ばらつきの影響を受ける方法なので、standardcalerを用いればその影響を取り除けます。
standardscalerを使った場合の例
では実際に、standardscalerを使った例を紹介しましょう。
ここではstandardscalerを使う例として、公式ドキュメントのコードを少し編集したコードを示します。
>>> data = [[0, 2], [0, 2], [1, 3], [1, 3]] >>> scaler = StandardScaler()
>>> print(scaler.fit(data))
StandardScaler()
>>> print(scaler.mean_)
[0.5 2.5] >>> print(scaler.transform(data))
[[-1. -1.] [-1. -1.] [ 1. 1.] [ 1. 1.]]
上のコードのdataは、2つの項目を有するデータです。1列目の値は0,0,1,1の4つで、2列目の値は2,2,3,3,の4つとなっています。
scaler.fit(data)によってdataの平均と分散(ばらつき)を記憶しています。これによって、後に2つの列のばらつきをそろえる準備が整いました。
print(scaler.mean_)によって、dataの平均を確認することができます。確かに1列目の平均は0.5で、2列目の平均は2.5ですよね。
そしていよいよ、scaler.transform(data)によって標準化を実行します。
これで標準化が完了しました。print関数による標準化の結果を見ると、
となっていて、2つの列のばらつきが一定になっていることがわかります。
上記のdata変数を、実データに置き換えれば、直ちに実データの標準化をおこなえます。たとえば、身体測定の結果のデータセットを利用し、標準化の後に学習部分のプログラムを接続すれば、簡単な機械学習プログラムの完成です。
さて今回は、scikit-learnのstandardscalerを使った標準化について説明しました。
そもそもscikit-learnとは、Pythonの機械学習ライブラリで、機械学習のためのツールが充実し、前処理の一部としての標準化の機能も備えています。
その機能がstandardscalerであり、standardscalerを使うことで、自分で数式を書かなくても標準化を実現でき、なおかつ単位の違いなどによって生じるばらつきの違いを取り除くことで、AI(人工知能)の精度を上げられる場合があるというメリットがありました。
standardscalerを使ったコードのサンプルも確認しました。各列のばらつきが一定になっていることが確認できましたよね。
AI(人工知能)というと、決定木やニューラルネットワークなど、学習・推測部分のアルゴリズムが脚光を浴びがちですが、実は前処理の部分が重要です。実際にエンジニアのあいだでは、開発の8割が前処理に関わるものだといわれることもあるとのこと。
standardscalerによる標準化も、前処理のなかのたいせつなプロセスのひとつです。これを活用していけば、AI(人工知能)の精度向上につながることが必ずあるに違いありません。今回のサンプルコードのデータははあくまで単純な物を取り上げましたが、これで十分に基本を抑えることができています。ぜひ、あなたのデータで、標準化の結果を確かめしょう。