Pythonの機械学習発展(1)~pandasを用いたデータ前処理の手法

Pythonの機械学習ライブラリ「scikit-learn」の使い方を簡単に説明します。今回は機械学習で使用するデータの前処理について纏めます。

概要

データの前処理の手法に正解はありませんが、個人的には以下の順番で前処理を行っています。

  1. データの読込み
  2. 処理前データの確認
  3. 目的変数の欠損確認
  4. 欠損データの削除
  5. 目的変数の数値変換(※任意)
  6. 説明変数と目的変数への分離
  7. カテゴリカル変数のone-hotエンコーディング
  8. 連続量の欠損補完
  9. 処理後データの確認

サンプルデータ

今回は下記のようなローン審査に関するデータ(CSVファイル)を扱います。

sample data

データ項目の中で「ID」は実際の機械学習には使用しません。説明変数は「性別」「年齢」「住宅」「雇用」「年収」の5つです。目的変数は「ローン審査」です。

データを見ると分かりますが、いくつかの値は欠損しています。また、「性別」や「住宅」などのように値が文字列になる項目(カテゴリカル変数)も存在します。

データが欠損したり、カテゴリカル変数を含む状態で機械学習を行うとエラーが発生する原因になります。

従って、機械学習を行う前に、欠損値を補完(または削除)したり、カテゴリカル変数を数値化(one-hotエンコーディングなど)する必要があります。

データの前処理

【Step.1】データの読込み

import pandas as pd
# データの読込み
data = pd.read_csv('data.csv')

データの読込みはpandasのread_csvメソッドを使用します。

【Step.2】処理前データの確認

# 処理前データの確認
print ('---------------------------')
print (data.head(5))
print ('---------------------------') print (data.describe())
print ('---------------------------') print (data.groupby(['ローン審査']).size())
print ('---------------------------')

check data

先ずは処理前データの概要を確認します。head(n)メソッドを使用して、先頭からn番目までのデータを表示させました。

データが欠損している箇所は「NaN」と表記されていることが確認できます。

次に、describeメソッドで、連続量の統計値をざっと確認します。平均値(mean)や標準偏差(std)、最大値(max)、最小値(min)などが表示されます。

最後に、目的変数「ローン審査」のカテゴリ値の内訳を確認しておきます。groupbyメソッドで項目を指定し、sizeメソッドでカウントします。NGとOKの件数が表示されます。

必要に応じて、各データをグラフ化し、視覚的に確認することもあります。

機械学習を行う前に、データに極端な偏りがないかを確認しておくことが重要です。

データの偏りが大きいと、正しく学習できず(過学習)、未知のデータに対する予測や分類の精度が出ません。

【Step.3】目的変数の欠損確認

# 目的変数の欠損確認
num = data['ローン審査'].isnull().sum()
print ('欠損は「%d」件' % num)

check missing value

isnullとsumメソッドを結合することで、「ローン審査」項目の欠損数を表示させました。

機械学習に使用するデータに欠損値が存在すると、処理する際にエラーが出る可能性があります。

欠損値があるデータについては、基本的に「削除」するか「補完」するかの2択です。

削除せずに補完する理由は、データ件数を減らさないためです。機械学習では大量のデータが必要になるからです。

なお、個人的には目的変数のデータに欠損値があった際は削除し、説明変数のデータに欠損値があった際は補完するようにしています。

目的変数は「正解値」なので、この値を推測で補完するべきでないと考えています。

【Step.4】欠損データの削除

# 欠損データの削除
if num > 0:
data = data.dropna(subset = ['ローン審査'])
data = data.reset_index(drop=True)

目的変数のデータに欠損値があった場合は、dropnaメソッドでデータを削除します。dropnaの引数のsubsetに削除したい項目を入力します。

【Step.5】目的変数の数値変換

# 目的変数の数値変換
data['ローン審査'] = data['ローン審査'].map({'NG': 0, 'OK': 1})

必要に応じて目的変数のカテゴリ値をmapメソッドで数字に変換することもできます。この処理は任意です。

【Step.6】説明変数と目的変数への分離

# 説明変数と目的変数に分離
X = data.iloc[:, 1:-1]
y = data.iloc[:, [-1]]

機械学習で扱うために、データを説明変数(X)と目的変数(y)に分離します。ilocメソッドを使用して項目列を指定します。

【Step.7】カテゴリカル変数のone-hotエンコーディング

# カテゴリカル変数のone-hotエンコーディング
col = ['性別', '住宅', '雇用']
X = pd.get_dummies(X, dummy_na = True, columns = col)

機械学習のアルゴリズムを使用する場合は、基本的に説明変数の値は数値でなければいけません。

one-hotエンコーディングという手法を用いて、カテゴリカル変数の値を数値化します。

one-hotエンコーディングとは、カテゴリ値の数だけ項目列を増やし、該当する項目に0または1の値をフラグとして立てます。

具体的には、pandasのget_dummiesメソッドを使用します。パラメータのdummy_naをTrueに設定することで、欠損値を補完することもできます(NaNを項目に追加)。

【Step.8】連続量の欠損補完

from sklearn.preprocessing import Imputer
# 連続量の欠損補完
imp = Imputer(missing_values = 'NaN', strategy = 'mean', axis = 0) imp.fit(X) X = pd.DataFrame(imp.transform(X), columns = X.columns.values)

Step.7で「カテゴリカル変数」の欠損値の補完はできました。ただし、連続量の欠損値の補完はまだできていません。

そこで、次に連続量の欠損値の補完を行います。Imputerクラスを使用することで簡単に連続量を補完することができます。

補完する値としては平均値(mean)を用いました。

【Step.9】処理後データの確認

# 処理後データの確認
X.join(y).to_csv("result.csv")

最後は、処理後データを確認します。下記のようなデータが出力されました。

check result

カテゴリカル変数がone-hotエンコーディング(0または1のフラグ)されており、欠損値が平均値で補完されていることが確認できます。

まとめ

今回は機械学習で使用するデータの前処理を行いました。

押さえておきたいポイントとしては、

  • 欠損値の削除や補完
  • カテゴリカル変数のone-hotエンコーディング 

付録(ソースコード)

preprocessing.pyのソースコード

import pandas as pd
from sklearn.preprocessing import Imputer
from sklearn.preprocessing import StandardScaler

# データの読込み
data = pd.read_csv('data.csv')

# 処理前データの確認
print ('---------------------------')
print (data.head(5))
print ('---------------------------')
print (data.describe())
print ('---------------------------')
print (data.groupby(['ローン審査']).size())
print ('---------------------------')
# 目的変数の欠損確認 num = data['ローン審査'].isnull().sum() print ('欠損は「%d」件' % num) # 欠損データの削除 if num > 0: data = data.dropna(subset = ['ローン審査']) data = data.reset_index(drop=True) # 目的変数の数値化 data['ローン審査'] = data['ローン審査'].map({'NG': 0, 'OK': 1}) # 説明変数と目的変数に分離 X = data.iloc[:, 1:-1] y = data.iloc[:, [-1]] # カテゴリカル変数のone-hotエンコーディング col = ['性別', '住宅', '雇用'] X = pd.get_dummies(X, dummy_na = True, columns = col) # 連続量の欠損補完 imp = Imputer(missing_values = 'NaN', strategy = 'mean', axis = 0) imp.fit(X) X = pd.DataFrame(imp.transform(X), columns = X.columns.values) # 処理後のデータ X.join(y).to_csv("result.csv")

参考文献

AIジョブカレの教材

実務で使うとこだけ!python機械学習(AI)のデータ処理(pandas/scikit-learn)
http://aiweeklynews.com/archives/49945455.html

シェアする

  • このエントリーをはてなブックマークに追加

フォローする