機械学習における欠損値に対処する9つの方法

機械学習における欠損値に対処する9つの方法

データサイエンスはデータに関するものです。これは、あらゆるデータ サイエンスや機械学習プロジェクトの核心です。ほとんどの場合、さまざまなリソースからデータを収集したり、どこかからデータをダウンロードしたりすると、データに欠損値が含まれる可能性がほぼ 95% になります。欠損値を含むデータに対して分析を実行したり、機械学習モデルをトレーニングしたりすることはできません。これが、私たちがデータの前処理に 90% の時間を費やしている主な理由です。欠損データに対処するために使用できるテクニックは多数あります。この記事では、欠損データに対処する 9 つの方法を紹介しますが、まず欠損データが発生する理由と欠損データにはどのような種類があるのか​​を見てみましょう。

[[349617]]

欠損値の種類

欠損値には主に 3 つの種類があります。

  • 完全にランダムに欠損している (MCAR): データが MCAR の場合、すべての観測値が欠損する確率が同じであれば、変数は完全にランダムに欠損しています。つまり、欠損データはデータセット内の他の観測値や欠損値とまったく関係がありません。言い換えれば、欠落しているデータ ポイントはデータセットのランダムなサブセットです。
  • 欠損データはランダムではない (MNAR): 名前が示すように、欠損データとデータセット内の他の値の間には何らかの関係があります。
  • ランダム欠損 (MAR): これは、データ ポイントが欠損する傾向が欠損データとは関係なく、データセット内の他の観測データと関係していることを意味します。

データセットに欠損値が存在する理由は多数あります。たとえば、身長と年齢のデータセットでは、女性は通常年齢を隠すため、年齢の列に欠損値が多くなります。同様に、給与と経験のデータを作成すると、ほとんどの男性が給与を公開したがらないため、給与に欠損値が多くなります。人口、疾病、事故による死亡、納税者記録などのデータを準備するなど、より大規模なケースでは、情報を書き留めて実際の数字を隠すことをためらう人がよくいます。サードパーティのソースからデータをダウンロードする場合でも、ダウンロード中にファイルが破損して値が失われる可能性があります。理由が何であれ、データセットには欠損値があり、それを処理する必要があります。欠損値を処理する 9 つの方法を見てみましょう。

ここでは、古典的なタイタニック データセットも使用されます。

まずデータセットをロードし、すべてのライブラリをインポートしましょう。

  1. pandasをpdとしてインポートする
  2. df = pd.read_csv( "data/titanic.csv" ,usecols=[ '年齢' , 'キャビン' , '生存' ])
  3. df.isnull ().mean()
  4. df.dtypes

上記のコード ブロックを実行すると、Age、Cabin、Loading に null 値が含まれていることがわかります。 Age にはすべての整数値が含まれ、Cabin にはすべてのカテゴリ値が含まれます。

1. 平均値、中央値、最頻値の置換

この手法では、列内のすべての値の平均/中央値または最頻値で null 値を置き換えます。

平均: すべての値の平均

  1. def impute_nan(自由度、、平均):
  2. df[+ '_mean' ] = df[].fillna(mean) ##NaN -> 平均
  3.      
  4. impute_nan(df, 'Age' ,df.Age.mean()) ## Age平均(29.69)

中央値: すべての値の中心値

  1. def impute_nan(自由度、、中央値):
  2. df[+ '_mean' ]=df[].fillna(中央値)
  3. impute_nan(df, 'Age' ,df.Age.median()) ## Age中央値(28.0)

モード: 最も一般的な値

  1. def impute_nan(df,, モード):
  2. df[+ '_mean' ]=df[].fillna(モード)
  3. impute_nan(df, 'Age' ,df.Age.mode()) ## Ageモード(24.0)

アドバンテージ

  • 実装が簡単(外れ値に対して堅牢)
  • 完全なデータセットをより速く取得する方法

欠点

  • 元の差異の変更または歪み
  • 影響の関連性
  • カテゴリ変数の場合、モードが必要です。平均値も中央値も機能しません。

2. ランダムサンプル推定

この手法では、すべての nan 値をデータフレームからのランダムなサンプルに置き換えます。数値データの入力に使用します。データをサンプリングするには sample() を使用します。ここでは、まず NaN 値を埋めるためにデータのサンプルを取得します。次にインデックスを変更して NaN 値と同じインデックスに置き換え、最後にすべての NaN 値をランダム サンプルに置き換えます。

アドバンテージ

  • 実装が簡単
  • 分散歪みが小さい

欠点

  • あらゆる状況にそれを適用できるわけではありません。

ランダムサンプル注入で年齢列のNaN値を置き換える

  1. def impute_nan(df,変数):
  2. df[変数+ "_random" ]=df[変数]
  3. ## naを埋めるためのランダムサンプルがあります
  4. random_sample = df[変数].dropna().sample(df[変数] .isnull (). sum (),random_state=0)
  5. ##pandasは同じインデックスを持つ必要あります  注文 データセットをマージする
  6. random_sample.index =df[df[variable] .isnull ()]. index # random_sampleのインデックスを置き換える  NaNの場合 索引 
  7. 交換する  NaNが存在する場所
  8. df.loc[df[変数] .isnull (),変数+ '_random' ]=ランダムサンプル
  9. col=変数+ "_random"  
  10. df = df.drop (列、軸=1)
  11.  
  12. impute_nan(df, "年齢" )

3. 新機能でNAN値を取得する

この手法は、データが完全にランダムに欠落していない場合に最も効果的です。ここでは、データセットに新しい列を追加し、すべての NaN 値を 1 に置き換えます。

アドバンテージ

  • 実装が簡単
  • NaN値の重要性を理解

欠点

  • 追加機能の作成(次元の呪い)

  1. numpyをnpとしてインポートする
  2. df[ 'age_nan' ]=np.where ( df[ 'Age' ] .isnull (),1,0)
  3. ##値1を含む新しい列を1つ作成ます  Age の値NaN、それ以外の場合は 0 です。

4. 配布終了

この手法では、NaN 値を 3 番目の標準偏差値に置き換えます。また、データセットからすべての外れ値を削除するためにも使用されます。まず、std() を使用して 3 番目の標準偏差を計算し、その値で NaN を置き換えます。アドバンテージ

  • 実装が簡単です。
  • 欠損値がある場合はその重要度を取得します。

欠点

  • 変数の元の分布を歪めます。
  • NAN の数が多い場合。分布内の真の外れ値が隠されてしまいます。
  • NAN の数が少ない場合、置き換えられた NAN は外れ値とみなされ、後続の特徴エンジニアリングで前処理されます。

  1. def impute_nan(自由度、変数、中央値、極値):
  2. df[変数+ "_end_distribution" ]=df[変数].fillna(extreme)
  3.      
  4. extreme = df.Age.mean() + 3*df.Age.std() ##73.27 --> 3番目の標準偏差 
  5. impute_nan(df, '年齢' ,df.年齢.中央値(),極値)

5. 任意の値を置き換える

この手法では、NaN 値を任意の値に置き換えます。データセット内でどの値もこれより頻繁に出現してはなりません。通常、任意の値として、最小の外れ値または最後の外れ値を選択します。

アドバンテージ

  • 実装が簡単
  • 欠損値がある場合はその重要度を取得

欠点

  • 値は手動で決定する必要があります。

  1. def impute_nan(df,var):
  2. df[var+ '_zero' ]=df[var].fillna(0) # 0埋める(最小外れ値)
  3. df[var+ '_hundred' ]=df[var].fillna(100) # 100( last )埋める
  4.  
  5. impute_nan(df, '年齢' )

6. 頻繁なカテゴリーの帰属

この手法は、カテゴリデータ内の欠損値を埋めるために使用されます。ここでは、NaN 値を最も一般的なラベルに置き換えます。まず、最も一般的なラベルを見つけて、それに NaN を置き換えます。

アドバンテージ

  • 実装が簡単

欠点

  • より頻繁なラベルを使用しているため、NaN 値が多数ある場合は、それらを過剰表現の方法で使用する可能性があります。
  • 最も一般的なラベル間の関係を歪めます。

  1. def impute_nan(df,変数):
  2. most_frequent_category = df[variable].mode()[0] ##最も頻繁な
  3. df[変数].fillna(most_frequent_category,inplace= True )
  4.      
  5. for feature in [ 'Cabin' ]: ##カテゴリ特徴リスト
  6. impute_nan(自由度、特徴)

7. Nan値は新しいカテゴリとしてみなされる

この手法では、すべての NaN 値を Missing などの新しいカテゴリに置き換えるだけです。

  1. df[ 'キャビン' ] = df[ 'キャビン' ].fillna( '欠落' ) ##NaN -> 欠落

8. KNN充填を使用する

この手法では、sklearn を使用して KNN インプッター モデルを作成し、このモデルをデータに適合させて NaN 値を予測します。値を計算するために使用されます。これは 5 つのステップから成るプロセスです。

  • 列のリストを作成する(int、float)
  • 見積りを入力し、近隣住民を特定します。
  • データの適合に基づく推定値。
  • 変換されたデータ
  • 変換されたデータを使用して新しいデータ フレームを作成します。

アドバンテージ

  • 簡単に実装できる
  • 結果は通常最高です

欠点

  • 数値データにのみ適用されます

前回の記事で詳しく紹介したので、ここでは詳細は省きます。

Python で KNN アルゴリズムを使用して欠損データを処理する

9. すべてのNaN値を削除する

これは、使用および実装が最も簡単なテクニックの 1 つです。この手法は、NaN 値が 10% 未満の場合にのみ使用してください。

アドバンテージ:

  • 簡単に実装できる
  • 高速処理

欠点:

  • 大量のデータ損失を引き起こす
  1. df.dropna(inplace= True ) ##ドロップ  NaN含むすべて

要約する

欠損値を処理するテクニックは他にもたくさんあります。私たちの目標は、問題に最適なテクノロジーを見つけて、それを実装することです。欠損値を処理するのは常に良いアイデアですが、すべての値を削除しなければならない場合もあります。基本的にはデータの種類と量によって異なります。

最後に、すべてのコードはここにあります: https://github.com/Abhayparashar31/feature-engineering

<<:  機械学習サーバーの利用率とスケーラビリティを最大化するにはどうすればよいでしょうか?

>>:  運輸省は自動運転について「技術革新を歓迎し、支持する」と回答

ブログ    
ブログ    
ブログ    

推薦する

GPT-4を粉砕せよ! Google DeepMind CEOが明かす:次世代の大規模モデルはAlphaGoと統合される

Googleは本当に全力を尽くしています。 AlphaGoとGPT-4に似た大規模モデルを組み合わせ...

PCの顔認証ログイン、驚くほど簡単

以前、オープンソース プロジェクトをやったことがあります。GitHub ログインが完成した後、もっと...

ガートナー、2022年の銀行・投資サービスにおける3つの注目のテクノロジートレンドを発表

ガートナーは、2022年の銀行および投資サービス業界における3つの注目の技術トレンドとして、生成型人...

テクノロジーファイナンスからスマートファイナンスまで、民生銀行の革新的な人工知能の応用をご覧ください

[51CTO.comからのオリジナル記事] 「インターネット+」から「インテリジェンス+」まで、革新...

「半導体第一の都市」上海、ついに半導体製造再開の夜明けを迎える

上海市経済情報化委員会は4月16日、「上海市工業企業の業務・生産再開に関する防疫対策ガイドライン(第...

JavaScript による機械学習の例 10 選

機械学習ライブラリは時間の経過とともに高速化と使いやすさが向上しており、開発のペースが鈍化する兆候は...

世界初!人間の脳のようなスーパーコンピュータ「シェナン」がまもなく発売され、ムーアの法則を破り、エネルギー消費を数桁削減する

人間の脳は地球上で最も効率的な計算装置です。わずか 20W の電力と 1.3kg の質量で、1 秒間...

中国の教授が犯罪認識率97%の人工知能「検察官」を開発、現在テスト中

[[442697]]最近、「中国の教授らが人工知能検察官を開発中」というニュースが多くの海外ネットユ...

顔認識に関する国家基準が策定中:顔のスキャンは許可されず、検証後にデータは削除される必要がある

近年、顔認識技術が急速に発展し、顔をスキャンするだけで高速鉄道駅に入ることができるので非常に便利です...

TS と AI が出会うと何が起こるでしょうか?

人工知能は日々進歩しており、大規模な言語モデルはますます強力になっています。仕事に役立つ AI ツー...

コンテナ化された機械学習モデルの作成

[[252634]]データ サイエンティストは機械学習モデルを作成した後、それを本番環境にデプロイす...

AIが髪の毛に至るまで肖像画を生成!北京大学卒業生の最新研究が2.8千個の星を獲得

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

WeChat AIがHPおよびIntelと提携し、PC向け人工知能音声アシスタントを開発

9月9日、テンセントグローバルデジタルエコシステムカンファレンスの「WeChat新成長発見」特別イベ...

高精度地図のデータの問題についてお話ししましょう。地図以外の認識の落とし穴は何でしょうか?

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

ペンシルバニア大学は、ディープニューラルネットワークの対称構造を研究し、層ごとの剥離解析モデルを提案した。

[[435206]]近年、ディープニューラルネットワークは多くの科学技術上の問題において優れたパフ...