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

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

欠損データの処理は簡単な作業ではありません。 方法は、単純な平均補完や観察結果の完全な削除から、MICE などのより高度な技術まで多岐にわたります。 問題解決における課題は、どのアプローチを使用するかを選択することです。 今日は、欠損データを埋めるためのシンプルかつ効率的な方法である KNN アルゴリズムについて説明します。

[[348243]]

KNN は「K Nearest Neighbors」の略で、定義された数の最も近い近傍に基づいて予測を行う単純なアルゴリズムです。 分類するインスタンスからトレーニング セット内の他のすべてのインスタンスまでの距離を計算します。

タイトルが示すように、このアルゴリズムは分類目的ではなく、欠損値を埋めるために使用します。 この記事では、500 件を超えるエントリを含むシンプルでよく知られたデータセットである住宅価格データセットを使用します。

この投稿は次のように構成されています。

  • データセットの読み込みと探索
  • KNN アトリビューション
  • アトリビューション最適化
  • 結論は

データセットの読み込みと探索

前述したように、まず住宅データセットをダウンロードします。 また、Numpy と Pandas の両方がインポートされていることを確認してください。 最初の数行は次のようになります。

デフォルトでは、データセットの欠損値は非常に少なく、単一の属性に 5 つしかありません。

それを変えましょう。 通常はこれを行うことはありませんが、欠損値がさらに必要です。 まず、1 からデータセットの長さまでの範囲の乱数の配列を 2 つ作成します。 最初の配列には 35 個の要素が含まれ、2 番目の配列には 20 個の要素 (任意に選択) が含まれます。

  1. i1 = np.random.choice(a=df.index サイズ= 35)
  2. i2 = np.random.choice(a= df.index サイズ=20)

最初の配列は次のようになります。

ランダム化プロセスはランダムであるため、配列は異なります。 次に、特定のインデックスの既存の値をNANに置き換えます。 方法は次のとおりです。

  1. df.loc[i1, 'INDUS' ] = np.nan
  2. df.loc[i2, '税金' ] = np.nan

さて、欠損値をもう一度確認してみましょう。今回はカウントが異なります。

これが、帰属から始まる私たちが行う準備作業のすべてです。 次のセクションでそれをやってみましょう。

KNN アトリビューション

全体の補間は 4 行のコードに要約されます。そのうちの 1 行はライブラリのインポートです。 sklearn.impute の KNNImputer が必要であり、よく知られている Scikit-Learn の方法でそのインスタンスを作成します。 このクラスには、1 つの必須パラメータ n_neighbors が必要です。 これは、偽装者にパラメータ K のサイズを伝えます。

まず、任意の数字 3 を選びます。このパラメータは後で最適化しますが、最初は 3 で十分です。 次に、マシン上で fit_transform メソッドを呼び出して、欠損データを補完します。

最後に、結果の配列を pandas.DataFrame オブジェクトに変換して、解釈しやすくします。 コードは次のとおりです:

  1. sklearn.imputeからKNNImputer をインポートします
  2.  
  3. 入力者 = KNNImputer(n_neighbors=3)
  4. 代入 = imputer.fit_transform(df)
  5. df_imputed = pd.DataFrame(imputed、列=df.columns)

とてもシンプルです。 欠損値を確認してみましょう:

それでも、1 つの疑問が残ります。K の適切な値をどのように選択すればよいのでしょうか?

アトリビューション最適化

この住宅データセットは、ターゲット変数が連続的 (MEDV) であるため、回帰アルゴリズムによる予測モデリングを目的としています。 これは、欠損値を補完するための K の異なる値を使用して多くの予測モデルをトレーニングし、どのモデルが最も優れたパフォーマンスを発揮するかを確認できることを意味します。

しかし、まずは輸入です。 Scikit-Learn が提供する機能の一部、つまりデータセットをトレーニング用とテスト用のサブセットに分割し、モデルをトレーニングして検証することが必要です。 トレーニングには「ランダム フォレスト」アルゴリズムを選択しました。 RMSE は次のことを検証するために使用されます:

  1. sklearn.model_selectionからtrain_test_split をインポートします
  2. sklearn.ensembleからRandomForestRegressor をインポートします
  3. sklearn.metricsからmean_squared_errorをインポートする
  4.  
  5. rmse = ラムダ y、yhat: np.sqrt(平均二乗誤差(y、yhat))

最適化を実行するために必要な手順は次のとおりです。

Kの可能な範囲を反復します - 1から20までのすべての奇数が機能します

  • 現在のK値を使用して補間を実行する
  • データセットをトレーニング用とテスト用のサブセットに分割する
  • ランダムフォレストモデルの適合
  • 予測テストセット
  • 評価にはRMSEを使用する

多いように聞こえますが、結局は 15 行程度のコードになります。 コードスニペットは次のとおりです。

  1. def optimize_k(データ、ターゲット):
  2. エラー = []
  3. k範囲(1, 20, 2)の場合:
  4. 入力者 = KNNI入力者(n_neighbors=k)
  5. 代入 = imputer.fit_transform(データ)
  6. df_imputed = pd.DataFrame(imputed、列=df.columns)
  7.          
  8. X = df_imputed.drop (ターゲット、軸=1)
  9. y = df_imputed[ターゲット]
  10. X_train、X_test、y_train、y_test = train_test_split(X、y、test_size=0.2、random_state=42) です。
  11.  
  12. モデル = RandomForestRegressor()
  13. モデルをフィット(X_train, y_train)
  14. 予測 = モデル.予測(X_test)
  15. 誤差 = rmse(y_test, preds)
  16. エラーを追加({ 'K' : k, 'RMSE' : エラー})
  17.          
  18. エラーを返す

これで、変更したデータセット(3 列に欠損値がある)を使用して optimize_k 関数を呼び出し、ターゲット変数(MEDV)を渡すことができます。

  1. k_errors = optimize_k(データ=df、ターゲット= 'MEDV' )

これで完了です。k_errors 配列は次のようになります。

視覚的に表現する:

指定された範囲内では、誤差が最小になるため、K = 15 が最適な値のようです。 このエラーの説明はこの記事の範囲を超えているため、ここでは取り上げません。 次のセクションでまとめてみましょう。

要約する

欠損データの補完を処理するコードを書くのは、直接使用できる既存のアルゴリズムが多数あるため簡単です。 しかし、その理由を理解することは困難です。つまり、どのプロパティを推論すべきで、どのプロパティを推論すべきでないのかを知ることは困難です。 たとえば、顧客がそのタイプのサービスを使用していないために一部の値が欠落している可能性があり、その場合は見積りを実行する必要はありません。

欠損データの処理が必要かどうかを最終的に判断するには、ドメインの専門知識も必要です。ドメインの専門家に相談し、その分野を調査することは良いアプローチです。

<<:  張亜琴:業界にとって、ディープラーニングの黄金時代は始まったばかりだ

>>:  感情セグメンテーションを理解する: 機械学習を活用してポジティブな気持ちを維持する方法

ブログ    
ブログ    

推薦する

将来のデジタル環境を一変させる 5 つのテクノロジートレンド

テクノロジーが世界を変えたというのは議論の余地のない事実です。古代の鋤から今日の印刷機やパソコンまで...

...

AI 導入の謎を解明: クラウドとエッジ

現在、ディープラーニング テクノロジーを展開できる方法としては、デバイス上への直接展開、クラウド内へ...

Adobe がインドのスタートアップ Rephrase.ai を買収、生成 AI 分野で初の買収となる

海外メディアの報道によると、デザインソフトウェアプロバイダーのAdobeは最近、インドの生成AIスタ...

人工知能はビッグデータの保存と管理の効率をどのように向上させるのでしょうか?

ビッグデータのソースが多数存在し、企業が利用できるデータの量も増加しているため、ストレージ管理者にと...

テクノロジーの専門家が若者と対談、第1回JD全国大学生アルゴリズム設計・プログラミングエリート競技会セミナーが開催されました

最近、「2021 JD全国大学生アルゴリズム設計・プログラミングエリートコンテスト-コードの無限の想...

中国チームが最優秀論文賞と最優秀システム論文賞を受賞し、CoRLの受賞論文が発表されました。

CoRL は 2017 年に初めて開催されて以来、ロボット工学と機械学習の交差点における世界トップ...

ディープラーニングは物理システムのシミュレーションを変え、速度を最大20億倍に高めている。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

2021 年のサイバーセキュリティにおける人工知能のトレンドは何ですか?

研究によると、人工知能技術はサイバーセキュリティの脅威やデータ侵害を防ぐ上で非常に重要です。人工知能...

...

Julia vs Python: 2019 年に機械学習でナンバー 1 になるプログラミング言語はどれでしょうか?

[[252207]] [51CTO.com クイック翻訳] Juliaは2018年に登場し、現在最...

2024年のビッグデータ産業予測(I)

分析するオムニチャネルコマースが拡大するにつれ、広告分析の世界は劇的な変化を遂げるでしょう。オンライ...

人工知能とビッグデータがもたらす「新たな雇用形態」

現在の社会経済情勢において、「新しい雇用形態」は強力なツールとなっている。新しい雇用モデルとは、新た...

...