マサムネの部屋

データの前処理

機械学習やデータ分析をする上で避けて通れないのがデータの前処理です。アプリを作るシリーズで扱った前処理をまとめています。アプリを作るシリーズは以下から読めます。

Pythonでアプリを作る1
python で簡単なアプリを作ります。測定データを前処理してモデルに渡し、予測値を表示する、というアプリです。tkinter を使って外面を作ります。主な機能はデータの取得と受け渡し、受取、後はもらったデータの保存の予定です。
Pythonでアプリを作る2
Pythonで簡単なアプリを作ります。今回はエクセルからデータを読み込む部分と、読み込むデータを計算し、表示する部分です。
スポンサーリンク

欠損値の扱い

人が取ったデータにはほぼ確実に欠損値やタイプミスが含まれます。これをどう処理するか定番の方法があります。

欠損値の割合が少ない場合

全体のデータの中で、欠損値を含むデータが殆どない場合は、単純に欠損値を省く事が多いです。pythonでは、pandas のdropnaで実行できます。

ラベルの扱い

文字データのラベル化

生データでは、英数字の羅列で商品などが管理されている事が多いです。例えばティファールの電気ケトルについている BF805170 などです。
この時、文字のままだと機械学習で処理できないので、必要に応じて文字の一部分を切り取ってラベルにします。 BF805170 だったら、最初の文字のBFを抜き取っておきます。
タイタニック号の生存者に関するデータで例を見てみます。

タイタニック号のデータ

タイタニック号事故の生存率には、年齢と性別が大きく関わっています。名前に大体Mr. とMs. とかが付いていて、その部分が有効な特徴量になります。
名前のデータから、その部分をラベルとして取り出します。以下のように書けます。


import pandas as pd
df = pd.read_csv('train.csv')
df['Title'] = df.Name.str.extract(' ([A-Za-z]+)\.', expand=False)

Title という列を新たに生成して、そこにMr.とかを入れてます。 1 extract はpandas で正規表現を使う時の関数です。正規表現については以下のサイトを見てください。文字の塊+ .(ドット)の形の文字の集合を検索してます。

分かりやすいpythonの正規表現の例 - Qiita
基本の例noComplieの方法import re# rを付けることを推奨。# バックスラッシュをそのままで分かりやすいため。content = r'hellow python, 123,…

ラベルの数値化

ラベルにしても、ラベルのままでは機械学習のモデルに与える事は出来ません。という訳で、ラベルを数字にしなくてはいけません。そのような処理をone hot encoding と言います。titanic のデータでは、Embarked のデータがその対象になります。
やり方としては、pandasのget_dummies があります。


Emb = pd.get_dummies(df.Embarked)
df=pd.concat(df, Emb], axis=1)
one hot encoding したデータ

数値の正規化

機械学習の理論には、データが正規化された前提の物があります。そのような手法を用いない場合でも、特徴量の分布に大きな偏りがあると解析が上手くいかない場合が多数です。
ポピュラーなやり方としては、特徴量の平均を引いて、分散で割ります。
titanic データの Fareを正規化してみます。2

fare = df.Fare
norm_fare = (fare - fare.mean() )/ fare.std()

plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
sns.distplot(fare)
plt.subplot(1,2,2)
sns.distplot(norm_fare)
正規化されたFare

殆どが0~100に固まっていた分布が0~2に縮まりました。分布の形自体は変わっていないことに注意が必要です。
今回のアプリ作成で行った前処理は以上です。定番の物はもう少しあるので、機会があれば記事にしたいと思います。

まとめ

  1. 殆ど出てこないラベルもあり、それらはother とかにまとめる必要がありますが、本題とは違うのでやりません。まとめないでおくと、特徴量の次元が非常に大きくなってしまいます。
  2. Fare は凄く偏った分布をしているので、本当に正規化したい場合はbox cox変換が必要です。