【Python】機械学習の前処理その3 NaNを除外 、線形・多項式補間する方法!

【Python】機械学習の前処理その3 NaNを除外 、線形・多項式補間する方法!

まえがき

 以前、機械学習の精度を向上させるための前処理として、正規化・標準化の方法を学びました。その時の記事は以下をご覧ください。
https://tedukapm.tech/?p=137
しかし、そもそも、データの中に「NaN」が混ざっていたり、数値データの中に「」や「80%」の様に数値化できない値が混ざっていると機械学習そのものを行うことができません。
 そこで、今回はデータの中から「 NaN 」を除外する方法と、任意の値で補間する方法、線形・多項式補完する方法をご紹介したいと思います。
 今回は以下のデータを使用します。ちょっと、普通のDataFarmeの表示形式とは違いますが、これは毎度スクショを取るのが面倒になって、プログラム処理で画像出力したものを利用したためです。そのうち、この方法についてもご紹介する機会があるかもしれません。

データの確認

 さて、本題である除外の方法について説明する前に、まずは、生データの状態を確認する必要があります。なぜなら、一口に除外すると言っても、除外の仕方によって機械学習の結果にも影響を与えてしまうからです。生データの状態を確認する方法は以下の記事まとめていますので、ご覧ください。

https://tedukapm.tech/?p=209

NaNを除外する方法

 まずは、 「NaN」 を除外する方法についてです。方法はいくつかありますが、まずは、単純にNaNを削除する、dropna()の使い方をご紹介します。詳細は以下の公式リファレンスをご覧ください。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html?highlight=dropna#pandas.DataFrame.dropna

df.dropna()

 df.dropna()を使うと、NaNが一つでも含まれている行はすべて削除されます。

 ”axis=1″を引数に加えることで、 NaNが一つでも含まれている列をすべて削除することもできます。

df.dropna(axis = 1)

NaNを任意の値で補間する方法

NaNを任意の値で埋めるにはfillna()を使います。 詳細は以下の公式リファレンスをご覧ください。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.fillna.html?highlight=fillna#pandas.DataFrame.fillna 

df.fillna(100)

 NaNの部分が引数に入力した100に置き換わっています。また、引数に文字列を与えれば任意の文字列に置き換えることも可能です。ただし、数値のみの列に文字列を入れてしまうと、グラフ化の際に不都合が出ることがあります。これは、列(Series)の型が”float64″から“object”に変わってしまうことによるものです。気づかないとグラフ作成時にはまる原因になるので注意しましょう。

NaNを直前の値で補間する方法

  NaNを直前の値で埋めるにはfillna()method引数に”pad“または”ffill“を入力します。

df.fillna(method='pad')

NaNを直後の値で補間する方法

 NaNを直後の値で埋めるにはfillna()method引数に”backfill“または”bfill“を入力します。

df.fillna(method='backfill')

NaNを最近接の値で補間する方法

  NaNを 最近接 の値で埋めるにはinterpolate()method引数に”nearest“を入力します。 interpolate()の 詳細は以下の公式リファレンスをご覧ください。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.interpolate.html?highlight=interpolate#pandas.DataFrame.interpolate

df.interpolate(method='nearest')

NaNを線形補完する方法

 NaNを線形補完するにはinterpolate()method引数に”linear“を入力します。

df.interpolate(method='linear')

NaNを多項式補完する方法

 NaNを多公式補完する方法はいくつかあります。2次関数補完であれば、interpolate()method引数に”quadratic“を入力します。 3次関数補間をする場合は、”cubic“です。それ以上の次数の多項式で補間する場合は、 interpolate()method引数に”polynomial“を 入力し、order引数に次数を入力します。以下は、5次関数で補完する場合の例です。

df.interpolate(method='polynomial',order=5)

まとめ

 データの中から「 NaN 」を除外する方法と、任意の値で補間する方法、線形・多項式補完する方法をご紹介しました。本当は文字列型が含まれる場合にも言及したかったのですが、思いのほか長くなったので次回に回します。