機械学習における欠損値の統計的な入力

Tweet 共有

Last Updated on August 18, 2020

データセットには欠損値があり、これは多くの機械学習アルゴリズムに問題を引き起こすことがあります。

そのため、予測タスクをモデル化する前に入力データ内の各列について欠損値を識別し置き換えることは良い練習になります。

データインピュテーションの一般的なアプローチは、各列の統計値(平均値など)を計算し、その列のすべての欠損値をその統計値で置き換えることです。 統計値は学習データセットを使用して簡単に計算でき、しばしば良いパフォーマンスにつながるため、人気のあるアプローチです。

このチュートリアルでは、機械学習における欠損データに対する統計的インピュテーション戦略の使用方法を発見します。

このチュートリアルを完了すると、次のことがわかるようになります:

  • Missing values must be marked with NaN values and can be replaced with statistical measure to calculate the column of values.
  • 欠損値を含むCSV値を読み込み、欠損値をNaN値でマークし、各列の欠損値の数と割合を報告する方法
  • モデルの評価時、および新しいデータで予測を行うために最終的なモデルを適合する際のデータ準備方法として統計で欠損値をインピュートする方法。

ステップバイステップのチュートリアルとすべての例のPythonソースコードファイルを含む私の新しい本「Data Preparation for Machine Learning」であなたのプロジェクトを始めましょう!

  • 更新日:2020年6月。

Statistical Imputation for Missing Values in Machine Learning
Photo by Bernal Saborio, some rights reserved.を更新しました。

チュートリアルの概要

このチュートリアルは、3つのパートに分かれています。

  1. Statistical Imputation
  2. Horse Colic Dataset
  3. Statistical Imputation With SimpleImputer
    1. SimpleImputer Data Transform
    2. SimpleImputer and Model Evaluation
    3. (英語

    4. 異なるインプットされた統計値を比較する
    5. 予測を行う際のSimpleImputer変換

    統計的インプット

    データセットには欠損値がある場合があります。

    これらは、その行の1つまたは複数の値または列が存在しないデータの行です。 値は完全に欠落している場合もあれば、クエスチョンマーク “?” などの特殊な文字または値でマークされている場合もあります。

    これらの値はさまざまな方法で表現することができます。 何もない、空の文字列、明示的な文字列 NULL または undefined または N/A または NaN、そして数字 0 などとして表示されるのを見たことがあります。

    – Page 10, Bad Data Handbook, 2012.

    値がない理由はさまざまですが、問題領域に特有のものが多く、破損した測定やデータの使用不可などの理由が含まれる場合があります。

    測定機器の故障、データ収集中の実験デザインの変更、類似しているが同一ではない複数のデータセットの照合など、多くの理由で発生する可能性があります。

    – Page 63, Data Mining: Practical Machine Learning Tools and Techniques, 2016.

    ほとんどの機械学習アルゴリズムは数値入力値を必要とし、データセットの各行と列に対して値が存在することが必要です。 そのため、欠損値は機械学習アルゴリズムにとって問題を引き起こす可能性があります。

    そのため、データセット内の欠損値を特定し、数値で置き換えることが一般的となっています。 これはデータインピュテーション、または欠損データインピュテーションと呼ばれます。

    データインピュテーションへのシンプルで一般的なアプローチは、統計的手法を使用して、存在するこれらの値から列の値を推定し、次に列内のすべての欠損値を計算された統計値に置き換えることを含んでいます。

    統計は計算が速いので単純であり、しばしば非常に効果的であると判明するので人気があります。

    • 列平均値。

    欠損値代入の統計的手法に慣れたところで、欠損値のあるデータセットを見てみましょう。

    データ準備を始めたいですか?

    今すぐ7日間の無料Eメール クラッシュコース(サンプルコード付き)に参加しましょう。

    Click to sign-up and also get the free PDF Ebook version of the course.

    Download Your FREE Mini-Course

    Horse Colic Dataset

    The horse colic dataset described the medical characteristics of horses with colic and whether they lived or dead.

    There is 300 rows and 26 input variables with one output variable.これは、300行の26入力変数と1出力変数のデータセットで、馬の病気と死亡のデータセットです。 これは2値分類の予測タスクで、馬が生きていたら1を、馬が死んだら2を予測する。

    このデータセットで予測するために選択できるフィールドがたくさんある。

    このデータセットには、多くの列で多数の欠損値があり、各欠損値はクエスチョンマーク文字(”?”)でマークされています。

    以下は、データセットからマークされた欠損値を持つ行の例です。

    1
    2
    3
    4
    5

    2,1,530101,38.50,66,28,3,3,?,2,5,4,4,?,?,?,3,5,45.00,8.40,?,?,2,2,11300,00000,00000,2
    1,1,534817,39.2,88,20,?,?,4,1,3,4,2,?,?,?,4,2,50,85,2,2,3,2,02208,00000,00000,2
    2,1,530334,38.30,40,24,1,1,3,1,3,3,1,?,?,?,1,1,33.00,6.70,?,?,1,2,00000,00000,00000,1
    1,9,5290409,39.10,164,84,4,1,6,2,2,4,4,1,2,5.00,3,?,48.00,7.20,3,5.30,2,1,02208,00000,00000,1

    データセットについての詳細はこちら:

      Horse Colic Dataset

    • Horse Colic Dataset Description

    動作例で自動的にデータセットをダウンロードしますので、必要ございません。

    Python を使って読み込んだデータセットで NaN (not a number) 値で欠損値をマークすることはベストプラクティスです。

    Pandas 関数の read_csv() を使ってデータセットを読み込み、「na_values」を指定して ‘?’の値を欠損として、NaN値でマークします。

    1
    2
    3
    4

    ・・・・・・・。
    # load dataset
    url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv’
    dataframe = read_csv(url, header=None, na_values=’?’)

    ロードしたら、ロードしたデータを見て「?”の値はNaNとしてマークされます。

    1
    2
    3

    …です。
    # 最初の数行を要約する
    print(dataframe.head())

    次に、各列を列挙し、その列に値がない行の数を報告することができます。

    1
    2
    3
    4
    5
    6
    7

    # 各列の欠損値のある行数をまとめる
    for i in range(dataframe.shape):
    # 欠損値のある行数を数える
    n_miss = dataframe].isnull().sum()
    perc = n_miss / dataframe.shape * 100
    print(‘> %d, 欠落している。 %d (%.1f%%%)’ % (i, n_miss, perc)).

    これを結びつけて、データセットをロードしてサマライズする完全な例を以下に示します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # summarize horse colic dataset
    from pandas import read_csv
    # load dataset

    url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv’

    dataframe = read_csv(url.Layer.Layer), header=None, na_values=’?’)
    # 最初の数行を要約する
    print(dataframe.head())
    # 各列の欠損値のある行数をまとめる
    for i in range(dataframe.shape):
    # 欠損値のある行数を数える
    n_miss = dataframe].isnull().sum()
    perc = n_miss / dataframe.shape * 100
    print(‘> %d, 欠損値: %d (%.1f%%)’ % (i, n_miss, perc))

    例を実行すると、まずデータセットをロードし、最初の5行を要約します。

    「?」文字でマークされていた欠損値がNaN値で置換されていることが確認できます。

    次に、データセット内のすべての列のリストと欠損値の数と割合を見ることができます。

    いくつかの列(例えば、列インデックス1および2)には欠損値がなく、他の列(例えば、列インデックス15および21)には多くの欠損値または過半数さえあることが分かります。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    > 0, Missing: 1 (0.3%)
    > 1, Missing: 0 (0.0%)
    > 2, 不足している。 0 (0.0%)
    > 3, 不足している。 60 (20.0%)
    > 4, 不足している。 24 (8.0%)
    > 5、欠落している。 58 (19.3%)
    > 6、行方不明。 56 (18.7%)
    > 7、欠番。 69 (23.0%)
    > 8、行方不明。 47 (15.7%)
    > 9、行方不明。 32 (10.7%)
    > 10、行方不明。 55 (18.3%)
    > 11、行方不明。 44 (14.7%)
    > 12、行方不明。 56 (18.7%)
    > 13, 行方不明: 104名(34.7%)
    > 14名, 行方不明: 106 (35.3%)
    > 15, 行方不明: 247 (82.3%)
    > 16、行方不明。 102 (34.0%)
    > 17, 行方不明: 118名(39.3%)
    > 18名、行方不明。 29 (9.7%)
    > 19, 行方不明: 33 (11.0%)
    > 20、行方不明。 165 (55.0%)
    > 21, 行方不明: 198 (66.0%)
    > 22, 不在: 1 (0.3%)
    > 23, 不在(Missing): 0 (0.0%)
    > 24、欠番。 0 (0.0%)
    > 25, 不足している。 0 (0.0%)
    > 26, 不足している。 0 (0.0%)
    > 27, 不足している。 0 (0.0%)

    欠損値を持つ馬疝痛のデータセットに慣れたところで、統計的インピュテーションの使い方を見ていきましょう。

    SimpleImputerによる統計的インピュテーション

    scikit-learn 機械学習ライブラリでは、統計的インピュテーションをサポートするクラス SimpleImputer が提供されています。

    このセクションでは、SimpleImputer クラスを効果的に使用する方法を探ります。

    SimpleImputer Data Transform

    SimpleImputerは、各列に対して計算する統計の種類に基づいて最初に設定されるデータ変換で、例.g. mean.

    1
    2
    3

    …等。
    # define imputer
    imputer = SimpleImputer(strategy=’mean’)

    そしてインピュータはデータセットにフィットして各列の統計量を算出する。

    1
    2
    3

    # fit on the dataset
    imputer.fit(X)

    fit imputerは、データセットに適用して、各列のすべての欠損値を統計値で置換したデータセットの複製を作成します。

    1
    2
    3

    # transform the dataset
    Xtrans = imputer.transform(X)

    horse colic datasetでその使い方を示し、変換前後のデータセットの欠損値の総数をまとめてその効果を確認できる

    Complete exampleは次の通りである。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    # statistical imputation(統計的インピュテーション transform for horse colic dataset
    from numpy import isnan
    from pandas import read_csv
    from sklearn.Dataset
    from numpy import isnan
    from pandas import read_csv
    # load dataset
    url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv’
    dataframe = read_csv(url, header=None, na_values=’?’)
    # split into input and output elements
    data = dataframe.values
    ix = ) if i != 23] ←クリックすると拡大されます。
    X, y = data, data
    # print total missing
    print(‘Missing: %d’ % sum(isnan(X).flatten()))
    # define imputer
    imputer = SimpleImputer(strategy=’mean’)
    # fit on the dataset
    imputer.fit(X)
    # transform the dataset
    Xtrans = imputer.transform(X)
    # print total missing
    print(‘Missing: %d’ % sum(isnan(Xtrans).Xtrans).Xtrans)
    # print(‘Missing: %d’ % sum(isnan(Xtrans).Xtrans).flatten())

    例を実行すると、まずデータセットをロードし、データセット内の欠損値の総数が1,605と報告されます。

    変換が設定、フィット、実行されて、結果の新しいデータセットに欠損値がなく、期待通りに実行されたことが確認されました。

    各欠測値はその列の平均値に置き換えられました。

    1
    2

    欠測あり。 1605
    Missing: 0

    SimpleImputer and Model Evaluation

    k-fold cross-validation を使用してデータセット上で機械学習モデルを評価することは良い習慣である。

    統計的欠損データインピュテーションを正しく適用し、データの漏洩を避けるためには、各列で計算された統計量をトレーニングデータセットのみで計算し、データセットの各フォールドのトレーニングセットとテストセットに適用することが必要である。

    チューニングパラメータ値を選択するため、またはパフォーマンスを推定するためにリサンプリングを使用している場合、インピュテーションはリサンプリング内に組み込まれるべきである。

    – Page 42, Applied Predictive Modeling, 2013.

    これは、最初のステップが統計インピュテーション、次に次のステップがモデルであるモデリングパイプラインを作ることで達成することができます。 これは、Pipelineクラスを使用して実現できます。

    たとえば、以下のPipelineは、「平均」戦略を持つSimpleImputerを使用し、次にランダムフォレストモデルを使用しています。

    1
    2
    3
    4
    5

    # define modeling pipeline
    model = RandomForestClassifier()
    imputer = SimpleImputer(strategy=’mean’)
    pipeline = Pipeline(steps=)

    mean-> の評価もできるようになりました。馬の疝痛のデータセットに対して、インプットされたデータセットとランダムフォレストモデリングのパイプラインを、10回クロスバリデーションを繰り返し行う。

    完全な例を以下に示す。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    # mean imputation と random を評価する。 forest for horse colic dataset
    from numpy import mean
    from numpy import std
    from pandas import read_csv
    from sklearn.NET Framework 2.0

    from numpy import std
    from pandas import read_csv

    from sklearn.NET Framework 2.0ensemble import RandomForestClassifier
    from sklearn.impute import SimpleImputer
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import RepeatedStratifiedKFold
    from sklearn.import_security(インポート)(英語)

    for Sklearn.Model_Selection import RandomForestClassifier
    # load dataset
    url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv’
    dataframe = read_csv(url, header=None, na_values=’?’)
    # input要素とoutput要素に分割
    data = dataframe.values
    ix = ) if i != 23]. ←クリックすると詳細がご覧いただけます。
    X, y = data, data
    # define modeling pipeline
    model = RandomForestClassifier()
    imputer = SimpleImputer(strategy=’mean’)
    pipeline = Pipeline(steps=)
    # define model evaluation
    cv = RepeatedStratifiedKFold(n_splits=10.Cv = RandomClassifier) # model evaluation

    # defined model evaluation # define model evaluation

    # evaluate model
    scores = cross_val_score(pipeline, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
    print(‘Mean Accuracy. “平均値”、”平均値 “は “精度 “を意味する。 %.3f (%.3f)’ % (mean(scores), std(scores))

    例を実行すると、クロスバリデーション手順の各フォールドにデータインピュテーションが正しく適用されます。

    注意:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いによって、結果が異なる場合があります。 パイプラインは、10 倍のクロスバリデーションの 3 回の繰り返しを使用して評価され、データセットでの平均分類精度は約 86 と報告されました。3%であり、これは良いスコアである。

    1
    Mean Accuracy: 0.863 (0.3) (1)平均精度:0.5%(1.5%) (2)平均精度:0.5%(2.5%) (3)平均精度:0.5%(1.5%) (4.5%)054)

    Comparing Different Imputed Statistics

    「平均」統計戦略を使うことがこのデータセットにとって良いまたは最良だとなぜわかるのか?

    答えは、わからない、そしてそれは任意に選ばれたということです。

    私たちは、平均、中央値、最頻値(最も頻繁に)、および一定(0)の戦略を比較しながら、各統計戦略をテストし、このデータセットに最適なものを発見する実験を設計することができます。 各アプローチの平均精度を比較することができます。

    完全な例を以下に記載します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    #を比較する。 馬の疝痛データセットに対する統計的インピュテーション戦略
    from numpy import mean
    from numpy import std
    from pandas import read_csv
    from sklearn.Inc.ensemble import RandomForestClassifier
    from sklearn.impute import SimpleImputer
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import RepeatedStratifiedKFold
    from sklearn.pipeline import Pipeline
    from matplotlib import pyplot
    # load dataset
    url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv’
    dataframe = read_csv(url, header=None, na_values=’?’)
    # input要素とoutput要素に分割
    data = dataframe.values
    ix = ) if i != 23].
    X, y = data, data
    # evaluate each strategy on dataset
    results = list()
    strategies =
    for s in strategies.X, y = data, data
    # for strategies.y = data, y = data:
    # モデリングパイプラインの作成
    pipeline = Pipeline(steps=)
    # モデルの評価
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
    scores = cross_val_score(pipeline, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
    # results store
    results.append(scores)
    print(‘>%s %.3f (%.3f)’ % (s, mean(scores), std(scores)))
    # plot model performance for comparison
    pyplot.boxplot(results, labels=strategies, showmeans=True)
    pyplot.show()

    例の実行により、反復クロスバリデーションによる馬colicデータの各統計置換戦略を評価することができました。

    注意:アルゴリズムや評価手順の確率的性質、または数値精度の違いにより、結果が異なる場合があります。 この例を数回実行し、平均結果を比較することを検討してください。

    各戦略の平均精度が途中で報告されます。 その結果、一定値、例えば0を使用すると、約88.1%という最高のパフォーマンスが得られることが示唆され、これは傑出した結果である。

    1
    2
    3
    4

    >平均 0. “0 “を使用。860 (0.054)
    >median 0.862 (0. 0.054)065)
    >most_frequent 0.872 (0.052)
    >constant 0.881 (0.047)

    実行終了時に結果のボックスとウィスカープロットが各セットに対して作成されて、結果の分布が比較できるようになります。

    定数戦略の精度スコアの分布が、他の戦略よりも優れていることがよくわかります。

    Box and Whisker Plot of Statistical Imputation Strategies Applied to the Horse Colic Dataset

    SimpleImputer Transform When Making a Prediction

    constant imputation strategy と random forest algorithm で最終モデリングパイプラインを作って、新しいデータに対して予測したい場合もありますね。

    これは、パイプラインを定義し、利用可能なすべてのデータでそれをフィットさせ、次に新しいデータを引数として渡すpredict()関数を呼び出すことで実現できる。

    重要なのは、新しいデータの行は、NaN 値を使用して任意の欠損値をマークする必要があることです。

    1
    2
    3

    # define new data
    row =

    完全な例を以下に列挙します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    # constant imputation(定数インピュテーション ホースコリックデータセットの戦略と予測
    from numpy import nan
    from pandas import read_csv
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.impute import SimpleImputer
    from sklearn.pipeline import Pipeline
    # load dataset
    url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv’
    dataframe = read_csv(url, header=None, na_values=’?’)
    # split into input and output elements
    data = dataframe.values
    ix = ) if i != 23]
    X, y = data, data
    # create modeling pipeline
    pipeline = Pipeline(steps=)
    # fit the model
    pipeline.X, y = model, data
    # fit the model, y = model, data
    # fit the model, y = data, data

    # modeling pipeline.fit(X, y)

    # define new data
    row =
    # make a prediction
    yhat = pipeline.Fit(X)・Y(y)・Y(X)・Y(X)・Y(Y)predict()
    # summarize prediction
    print(‘Predicted Class: %d’ % yhat)

    例を実行すると、すべての利用可能データでモデリングパイプラインを適合させることができます。

    データの新しい行は、NaNでマークされた欠損値で定義され、分類予測が行われます。

    1
    予測したクラスです。 2

    Further Reading

    このセクションでは、さらに深く知りたい場合に、このトピックに関するより多くのリソースを提供します。

    関連チュートリアル

    • 標準の分類および回帰機械学習データセットの結果
    • How to Handle Missing Data with Python

    書籍

    • Bad Data Handbook, 2012.
    • Data Mining.DataMining.DataMining、2012、

      DataMining.DataMining.DataMining、2012、

      DataMining.DataMining.DataMining、2012、

    • Applied Predictive Modeling, 2013.

    APIs

    • Imputation of missing values, scikit-learn Documentation.
    • sklearn.impute.SimpleImputer APIの紹介です。

    データセット

    • Horse Colic Dataset Description

    概要

    このチュートリアルでは、機械学習における欠損データへの統計的インプットストラクションの使用方法を発見しました。

    具体的には、次のことを学びました:

    • 欠損値を NaN 値でマークする必要があり、値の列を計算するために統計的尺度で置き換えることができます。
    • 欠損値を持つ CSV 値をロードし、欠損値を NaN 値でマークし、各列の欠損値の数と割合を報告する方法です。
    • モデルの評価時や、新しいデータで予測を行うための最終的なモデルのフィッティング時に、データ準備の方法として統計学で欠損値をインピュートする方法

    何か質問はありませんか?
    下のコメントで質問していただければ、できる限りお答えします。

    最新のデータ準備のハンドルを握ろう!

    Prepare Your Machine Learning Data in Minutes

    …(英語)。
    Data Preparation for Machine Learning

    このチュートリアルでは、
    Feature Selection, RFE, Data Cleaning, Data Transforms, Scaling, Dimensionality Reduction, and moreに関する完全な動作コードとともに自習することができます。…

    最新のデータ準備技術を
    あなたの機械学習プロジェクトに導入する

    中身を見る

    Tweet 共有する

コメントを残す

メールアドレスが公開されることはありません。