データのクリーニングと前処理の完全ガイド

データのクリーニングと前処理の完全ガイド

データの前処理は、機械学習モデルを構築する際の最初の (そしておそらく最も重要な) ステップであり、最終結果に決定的な役割を果たします。データセットがクリーンアップされ、前処理されていない場合、モデルは効果がない可能性が高くなります。それだけです。

[[257841]]

データの前処理は非常に退屈な部分だとよく思われます。しかし、それは準備ができていることと全く準備ができていないことの違いであり、プロであることとアマチュアであることの違いです。休暇の計画を立てるのと同じように、旅行の詳細を事前に決めておけば、旅行が悪夢に変わるのを防ぐことができます。

それで、何をすべきでしょうか?

この記事では、あらゆるデータセット上のあらゆる機械学習モデルのデータ前処理を完了する方法を説明します。

ステップ1: インポート

まず、データの前処理に必要なライブラリをインポートします。ライブラリは使用するのに最適なツールです。ライブラリに入力を渡すと、ライブラリが作業を実行します。多くのライブラリにアクセスできますが、PYTHON では最も基本的なライブラリが 3 つあります。いつでも、それらを使用することになる可能性が高くなります。 PYTHON を使用する際に最も人気のある 3 つのライブラリは、Numpy、Matplotlib、Pandas です。 Numpyはあらゆる数学演算を満たすライブラリです。コードは数式に基づいているため、これを使用します。 Maplotlib (具体的には Matplotlib.pyplot) は描画のニーズを満たすライブラリです。 Pandas は、データ セットをインポートして処理するためのライブラリです。データの前処理には、基本的に Pandas と Numpy が必要です。

最も適切な方法は、これらのライブラリをインポートするときに略語を指定することです。これにより、後続の使用時に一定の時間を節約できます。このステップは非常に簡単で、次のように実行できます。

  1. numpyをnpとしてインポートする
  2. matplotlib.pyplot を plt としてインポートします。
  3. pandasをpdとしてインポートする

これで、データセットを読むには次のように入力します。

  1. データセット= pd .read_csv('my_data.csv')

このステートメントは、Pandas (pd) にデータセットを読み込むように指示します。この記事では、データセットの最初の数行も添付します。

データセットはありますが、独立変数を保持する行列と従属変数を保持するベクトルを作成する必要があります。独立変数を保持する行列を作成するには、次のステートメントを入力します。

  1. X =データセット.iloc[:, :-1].値

最初のコロンはデータ セットのすべての行を抽出することを意味し、「:-1」は最初の列を除くすべての列を抽出することを意味します。 *** の「.values」は、すべての値を抽出することを意味します。次に、データの最初の列を取得して、従属変数を保持するベクトルを作成します。入力ステートメント:

  1. y =データセット.iloc[:, 3].値

データセットを表示する場合、インデックスは 0 から始まることに注意してください。したがって、列の数を数える場合は、1 ではなく 0 から数え始めます。 "[:, :3]" は、animal、age、worth の 3 つの列を返します。そのうち、0 は動物、1 は年齢、2 は価値を表します。これまでこのカウント方法を見たことがなくても、すぐに慣れるでしょう。

データが欠落している場合はどうなりますか?

現実には、欠落したデータに常に遭遇することになります。この点では、欠落している行を直接削除することもできますが、これは良い方法ではなく、簡単に問題が発生する可能性があります。したがって、より良い解決策が必要です。最も一般的なアプローチは、欠損値を、その欠損値が存在する列の平均で埋めることです。これを行うには、scikit-learn の前処理モデルの Inputer クラスを簡単に使用できます。 (まだご存じない方は、ぜひチェックしてみてください。scikit-learn には素晴らしい機械学習モデルが含まれています)。機械学習では、「メソッド」、「クラス」、「オブジェクト」などの用語に慣れていないかもしれません。大したことじゃないよ!

  • クラスとは、特定の目的のために構築するモデルです。小屋を建てたい場合、建築計画はクラスになります。
  • オブジェクトはクラスのインスタンスです。この例では、計画に従って建てられた小屋がオブジェクトです。計画に従って多くの小屋を建てることができるのと同じように、同じクラスに多くのオブジェクトを含めることができます。
  • メソッドは、オブジェクトで使用できるツール、またはオブジェクトに実装する関数です。つまり、何らかの入力を渡すと、出力が返されます。小屋が少し蒸し暑くなったら、「窓を開ける」という方法が使えるようなものです。

[[257842]]

画像: Roman Kraft が Unsplash に投稿

インプターを使用するには、次のようなステートメントを入力します。

  1. sklearn.preprocessing から Imputer をインポート
  2. imputer = Imputer ( missing_values = np.nan strategy ='mean'、 axis = 0 )

平均充填はデフォルトの充填戦略なので、指定する必要はありません。ここでは、どのような情報を含めることができるかを理解しやすくなるように追加されています。 missing_valuesのデフォルト値はnanです。データセットに「NaN」形式の欠損値がある場合は、np.nanに注意する必要があります。公式ドキュメントはここからご覧いただけます。

モジュールは、SimpleImputer と互換性があります。

この入力に適合させるには、次のように入力します。

  1. imputer imputer = imputer.fit(X[:, 1:3])

欠損データがある列にのみ入力関数を当てはめたいと考えています。ここで最初のコロンはすべての行が含まれることを意味し、「1:3」はインデックス 1 と 2 の列を取得することを意味します。心配しないでください。PTYHON のカウント方法にはすぐに慣れます。

ここで、欠落したデータを実際に置き換えるメソッドを呼び出します。これは、次のステートメントを入力することによって行われます。

  1. X[:, 1:3] = imputer.transform(X[:, 1:3])

いくつかの異なる充填戦略を試してください。おそらく、プロジェクトによっては、欠損値が存在する列の中央値または最頻値で欠損値を埋める方が合理的であることがわかるかもしれません。フィル戦略のような決定は微妙に思えるかもしれませんが、大きな結果をもたらす可能性があります。人気があり一般的な方法が必ずしも正しい選択であるとは限らず、平均値がモデル内の欠損値を埋めるための最良の選択であるとは限らないからです。

結局のところ、これを読んでいるほとんどすべての人は、平均以上の腕の数を持っています。

[[257843]]

写真: マシュー・ヘンリー、Unsplash に投稿

属性データが含まれている場合はどうなりますか?

それは良い質問ですね。たとえば、猫、犬、ヘラジカなどの平均を明示的に計算する方法はありません。では、何ができるでしょうか? 属性データを数値にエンコードすることができます。sklearn.preprocessing によって提供される LabelEncoder クラスを使用するとよいでしょう。エンコードするデータの列から始めて、ラベル エンコーダーを呼び出してデータに適合させます。

  1. sklearn.preprocessing から LabelEncoder をインポートします
  2. labelencoder_X =ラベルエンコーダー()
  3. X[:, 0] = ラベルエンコーダー_X.fit_transform(X[:, 0])

(括弧内の数字の意味を覚えていますか? 「:」はすべての行からデータを抽出することを意味し、0 は最後の列を抽出することを意味します)

*** 列の属性変数をその値に置き換えるには、これだけです。たとえば、ヘラジカは 0 で表され、犬は 2 で表され、猫は 3 で表されます。

何か潜在的な問題はありますか?

ラベル付けシステムは、使用される数値階層がモデルの結果に影響を与える可能性があることを示唆しています。3 は 0 より大きいですが、猫は必ずしもヘラジカより大きいわけではありません。

[[257844]]

画像: Cel Lisboa が Unsplash に投稿

ダミー変数を作成する必要があります。

猫用の列、ヘラジカ用の列などを作成できます。次に、各列にそれぞれ 0/1 を入力します (1=はい、0=いいえと考えてください)。つまり、元の列の値が cat の場合、elk 列には 0、dog 列には 0、cat 列には 1 が返されます。

とても複雑そうです。 OneHotEncoder の登場です!

エンコーダーをインポートし、対応する列のインデックスを指定します。

  1. sklearn.preprocessing から OneHotEncoder をインポートします
  2. onehotencoder = OneHotEncoder (カテゴリ特徴=[0])

次に、少しのフィッティングと変換を行います。

  1. X = onehotencoder.fit_transform (X).toarray()

これで、データ列が次の形式で置き換えられました。データ セット内の属性データごとに 1 つの列があり、属性変数は 1 と 0 に置き換えられました。かなりいいですね。Y 列も「Y」や「N」のような属性変数であれば、このエンコーダーも使用できます。

  1. labelencoder_y =ラベルエンコーダー()
  2. y =ラベルエンコーダーy.fit_transform (y)

これは直接適合し、y をエンコードされた変数として表します。「Y」の場合は 1、「N」の場合は 0 です。

トレーニングセットとテストセットの分割

これで、データセットをトレーニング セットとテスト セットに分割できるようになります。これについては、以前の画像分類チュートリアルで説明しました。ただし、必ずデータをトレーニング セットとテスト セットに分割し、テスト セットをトレーニングに使用しないでください。オーバーフィッティングを避ける必要があります (オーバーフィッティングとは、テスト前に多くの詳細を記憶するが、情報を理解しないことです。詳細のみを記憶すると、自宅で知識カードを復習するときにはうまくいきますが、新しい情報をテストする実際のテストではすべて不合格になります)。

これで、学習する必要のあるモデルができました。モデルはデータでトレーニングし、追加データでテストする必要があります。トレーニング セットを記憶することは学習と同じではありません。トレーニング セットでのモデルの学習が良ければ、テスト セットでの予測精度も向上するはずです。過剰適合は決して望ましい結果ではありません。学習こそが望ましい結果です。

[[257845]]

Janko Ferlič の Unsplash

まず、以下をインポートします。

  1. sklearn.model_selection から train_test_split をインポートします

これで、X_train、X_test、y_train、y_test セットを作成できます。

  1. X_train、X_test、y_train、 y_test = train_test_split (X、y、 test_size = 0.2 random_state = 0 )

一般的なアプローチは、データセットを 80/20 に分割することです。この場合、データの 80% はトレーニングに使用され、20% のデータはテストに使用されます。このため、test_size は 0.2 に指定されます。必要に応じて任意に分割することもできます。 random_state を設定する必要はありませんが、結果を完全に再現できるようにここで設定されています。

機能のスケーリング

機能スケーリングとは何ですか? なぜ必要なのですか?

私たちのデータを見てください。動物の年齢 (4 ~ 17 歳) の列と、動物の価値 (48,000 ~ 83,000 ドル) の列があります。値列の値は年齢列よりもはるかに大きいだけでなく、より広範囲のデータをカバーします。これは、年齢データの支配的な効果を無視して、ユークリッド距離が値の特徴によって完全に支配されることを示しています。ユークリッド距離が特定の機械学習モデルで特別な役割を果たさない場合はどうなるでしょうか? 特徴をスケーリングするとモデルは依然として高速化されるため、特徴のスケーリングをデータ前処理の一部として含めることができます。

機能のスケーリングにはさまざまな方法があります。しかし、それらはすべて、ある特性が他の特性に支配されないように、すべての特性を同じ尺度に置くことを意味します。

関連するライブラリをインポートすることから始めます。

  1. sklearn.preprocessing から StandardScaler をインポートします

スケール変更が必要なオブジェクトを作成し、Standard Scalerを呼び出します。

  1. sc_X =標準スケーラー()

データセットに直接適合および変換します。オブジェクトを取得してメソッドを適用します。

  1. X_train = sc_X.fit_transform (X_train)
  2. X_test = sc_X .transform(X_test)

テスト セットに適合する必要はなく、変換するだけです。

  1. sc_y =標準スケーラー()
  2. y_train = sc_y.fit_transform (y_train)

ダミー変数にはスケーリングが必要ですか?

必要だと考える人もいれば、必要ではないと考える人もいます。モデルの解釈可能性をどの程度重視するかによって異なります。すべてのデータを同じ次元にスケーリングすることには利点がありますが、各観測がどの変数に属しているかを説明する利便性が失われるという欠点があります。

Y についてはどうでしょうか? 従属変数が 0 と 1 の場合、特徴スケーリングは必要ありません。これは相関値が明確な分類問題です。しかし、値の範囲が非常に大きい場合、答えはスケーリングする必要があるということです。

おめでとうございます。データの前処理が完了しました。

わずか数行のコードで、データのクリーニングと前処理の基本を学習しました。データの前処理手順については、間違いなく多くの考慮を払う必要があります。欠損値をどのように埋めるかを考える必要があるかもしれません。特徴量をスケーリングするかどうか、またどのようにスケーリングするかを検討します。ダミー変数を導入するかどうか。データをエンコードするかどうか。ダミー変数をエンコードするかどうか... 考慮すべき詳細はたくさんあります。これらを完全に理解したら、自分で試してデータを準備してみましょう。

オリジナルリンク:

https://towardsdatascience.com/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d

[この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です]

この著者の他の記事を読むにはここをクリックしてください

<<:  マイクロソフト中国CTO: AIを祭壇から外してください

>>:  2019年には疑似AIはすべて排除されるのでしょうか?

ブログ    
ブログ    
ブログ    

推薦する

傲慢か偏見か?AIはあなたの美的観念に影響を与えていますか?

数日前、TikTokで、ある親がTikTokの特殊効果を使って子供の年齢と容姿を計測する動画を見まし...

...

初めて精度が人間を超えました!アリババの機械読解力が世界記録を更新

2018年の初めに、人工知能は大きな進歩を遂げました。 1月11日、スタンフォード大学が主催する世界...

...

生成 AI の「生産性パラドックス」: Microsoft はすでに利益を上げていますが、他のクラウド大手はいつ成果を実感するのでしょうか?

1987 年のノーベル経済学賞受賞者であるボブ・ソローは、「生産性統計を除けば、コンピュータ時代は...

RPAを成功させる方法

ロボティック プロセス オートメーション (RPA) は、ルールベースのプロセスを使用して、人間より...

国家人工知能実験区の数は 8 つに増えました。なぜこの 5 つの都市が選ばれたのでしょうか?

丑年の最初の仕事週に、国家人工知能イノベーションおよび応用パイロットゾーンの数が増加しました。工業情...

...

マイクロソフトの無料 AI エッセイ採点ソフトウェアがアップグレード: IELTS、CET-4、CET-6 に使用可能

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

中国が米国を追い落とすのに40年かかり、特許申請は20年間で200倍に増加した。

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

人工知能が仕事を奪っていますが、将来の職場で私たちは何のために戦うのでしょうか?

病院では、人工知能 (AI) は人間の医師よりもレントゲンの分析が得意です。法律事務所では、AI は...

ソラ爆発的人気の裏側|世界のモデルとは何かを語ろう!

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

5G自動運転はどのようなものになるのでしょうか?韓国のテストではこの結果が出た

自動運転と5Gの産業発展は大きな注目を集めており、韓国企業は最近、両者を組み合わせた効果を模索してい...

...