こんにちは、小澤です。
今回から、Pythonで機械学習を行うためのライブラリ「scikit-learn」について解説します。scikit-learnは、データの前処理、モデルの構築、評価といった機械学習の一連のプロセスを効率的に実行できるライブラリです。線形回帰やサポートベクターマシン、決定木、クラスタリングなど、数多くのアルゴリズムが組み込まれており、データ分析や予測の幅広い用途に役立ちます。scikit-learnはまた、前処理ツールが豊富で、欠損値の補完やカテゴリ変数のエンコーディング、特徴量のスケーリングといったデータ品質を高めるための処理を簡単に行えます。適切な前処理は分析や予測モデルの性能に直接影響を与えるので、データの不完全さや不均一さを前処理で適切に扱うことが重要です。これにより、モデルの精度と信頼性が大幅に向上します。
本稿では、前処理の中でも「欠損値への対応」に焦点を当てて解説します。教科書『Pythonによる新しいデータ分析の教科書(第2版)』では、4.4.1章「前処理」(214〜217ページ)です。
欠損値への対応
データ分析や機械学習のプロセスでは、完全なデータセットが理想的ですが、現実には欠損値を含むデータを扱うことが多々あります。欠損値とは、何らかの理由で記録されなかったデータの一部を指します。例えば、アンケート調査で回答者が一部の質問に答えなかったり、センサーが一時的にデータを取得できなかったりした場合に生じます。欠損値の存在は機械学習モデルの正確な学習を妨げる可能性があるため、適切な対処が必要です。scikit-learnでは、欠損値への対応として「補完」と「除去」という2つの方法が一般的に用いられます。
欠損値の補完
欠損値の補完は、データの欠損部分を他の値で埋める方法です。一般的な補完方法として、数値データでは列の平均値や中央値を、カテゴリデータでは最頻値(最も頻繁に出現する値)を用います。scikit-learnのSimpleImputerクラスを活用すれば、この補完処理を簡単に実装できます。
SimpleImputerでは、strategyパラメータを使用して欠損値の補完方法を指定し、インピュータ(Imputer)を作成できます。
- mean:平均値で補完
- median:中央値で補完
- most_frequent:最頻値で補完
- constant:指定した定数で補完
インピュータを作成したら、fit_transformメソッドを使って、データ内の欠損値を補完します。
import numpy as np from sklearn.impute import SimpleImputer # サンプルデータ data = np.array([[1, 2, np.nan], [5, np.nan, np.nan], [2, 3, 5], [np.nan, 4, 6]]) # 平均値で補完 imputer_mean = SimpleImputer(strategy=’mean’) data_filled_mean = imputer_mean.fit_transform(data) # 中央値で補完 imputer_median = SimpleImputer(strategy=’median’) data_filled_median = imputer_median.fit_transform(data) # 固定値で補完 imputer_constant = SimpleImputer(strategy=’constant’, fill_value=-1) data_filled_constant = imputer_constant.fit_transform(data) |
- 平均値での補完:列の平均値で欠損値を埋める方法で、データの全体的な傾向を反映するために有効です。ただし、外れ値が多いデータには影響を受けやすくなります。
- 中央値での補完:外れ値の影響を避けたい場合には、中央値での補完が効果的です。特に、データが偏っている場合には、平均よりも中央値が適していることが多いです。
- 最頻値での補完:カテゴリデータに適した方法で、最も多く現れるカテゴリで欠損値を補完します。回答形式やカテゴリが限られているデータでは、この方法で自然な補完が可能です。
このように、欠損値の補完はデータ特性や目的に合わせて柔軟に対応できます。
KNNImputer(K近傍法)による補完
SimpleImputerの他にも、K近傍法を用いるKNNImputerクラスで欠損値を補完する方法があります。この方法では、欠損のあるデータポイントの近隣サンプルを参照し、それらの値に基づいて欠損値を埋めます。
from sklearn.impute import KNNImputer knn_imputer = KNNImputer(n_neighbors=5) # kの値は任意 X_imputed_knn = knn_imputer.fit_transform(X) |
IterativeImputer(多重代入法)による補完
また、IterativeImputerクラスは多重代入法による補完を行います。この方法では、他の特徴量を用いた回帰モデルで欠損値を予測します。補完プロセスが繰り返されることで、各特徴量の欠損値が徐々に埋まっていきます。
from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer iterative_imputer = IterativeImputer(max_iter=10, random_state=0) X_imputed_iterative = iterative_imputer.fit_transform(X) |
欠損値の除去
データの欠損が多すぎる場合や、補完が適切でないと判断される場合には、欠損値のある行や列を「除去」することも選択肢の一つです。欠損値の多い行や列を削除することで、残りのデータの整合性を保ちやすくなりますが、データ量が減少するために分析の精度が低下する可能性もあります。除去を行う場合には、欠損値の割合やデータ全体の分布にどのような影響があるかを慎重に検討してください。
scikit-learnには欠損値を直接除去するメソッドがありません。そのため、一般的にはpandasを使ってデータを前処理し、その後scikit-learnの機能でモデルに組み込みます。欠損値の除去には、pandasのdropna()メソッドが利用できます。
import pandas as pd # 行ごとに欠損がある場合に行を削除 X_dropped = X.dropna() # 列ごとに欠損が多い場合に列を削除 X_dropped_col = X.dropna(axis=1) |
まとめ
このように、scikit-learnの欠損値処理機能を活用することで、データの欠損値を適切に扱い、モデルの精度と信頼性を向上させることができます。欠損値の除去や補完を通じて、偏りの少ない分析や予測が可能となり、分析結果の信頼性が高まります。scikit-learnが提供する豊富な前処理機能を効果的に使用することで、より強力で信頼性の高い機械学習モデルを構築できるでしょう。
次回も、scikit-learnの前処理として、カテゴリ変数のエンコーディングと特徴量の正規化について解説します。次回もお楽しみに。