データセットのロードとデータの前処理

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

機械学習の分野におけるデータセットの読み込みとデータの前処理は常に注目されていますが、教師あり学習でも教師なし学習でも、元のデータを機械学習が処理しやすい形式に変換する必要があります。特徴ベクトル、ラベル ベクトル、または構造化データ構造。この記事ではこのモジュールについて詳しく紹介します。

まず、データ セットは通常、ファイル、データベース、ネットワーク インターフェイスなどのさまざまなソースから生成されます。次に、これらのデータは、クリーニング、変換、標準化、正規化などの一連の前処理ステップを経て、処理しやすいトレーニング データ セットを取得する必要があります。その中で、データ分割、層化サンプリング、欠損値補完、特徴量エンジニアリングなどの手法も考慮する必要があります。

さらに、深層学習フレームワークは、次のようなデータ前処理のための便利なツール関数とクラスも多数提供します。

  • DataLoader: データ セットをロードし、複数のスレッドを通じて非同期的にロードするために使用されます。
  • データセット: カスタム データ セット クラス。基本クラスを継承して独自のロジックを実装できます。
  • DataAugmentation: トレーニング セットを拡張するために使用できるデータ拡張ツール。
  • FeatureExtractor: 画像、テキスト、その他のデータの特徴ベクトルを抽出するために使用できる特徴抽出ツール。
  • LabelEncoder: ラベル エンコーダー。カテゴリカル変数を整数形式に変換するために使用されます。
  • トークナイザー: テキスト データをセグメント化し、テキスト シーケンスをベクトル表現に変換するために使用されます。

この記事では主に上記のテクノロジーの原理と使用法について説明します。

2. データセットの読み込み

2.1 ファイルパスの一致

データ セットのロード プロセス中に、最も単純なケースは、ローカル ディレクトリからファイルを読み取ることです。次のように、ファイルのパス リストを直接指定するだけです。

file_list = ['data/train.txt', 'data/test.txt'] # 假设文件已经存在

2.2 フォルダーパスの一致

もう 1 つの方法は、フォルダー全体のファイルをデータ セットの一部として使用することです。この場合、os モジュールの walk() 関数を使用して、ディレクトリを再帰的に走査し、すべてのファイル パスを見つけることができます。次に、実際のニーズに応じて、フォルダー名またはその他の情報 (ファイル名、カテゴリ ラベルなど) を保持するかどうかを選択します。次のように:

import os

def find_files(path):
    """查找给定目录下的所有文件"""
    files = []
    for root, dirs, file_names in os.walk(path):
        if len(dirs) > 0:
            print('Ignoring directory:', dirs)
        for name in file_names:
            path = os.path.join(root, name)
            files.append(path)
    return files

file_list = find_files('/path/to/dataset')
print(len(file_list), 'files found.')

2.3 HDF5フォーマット

HDF5 は、多次元配列、テーブル、画像、メタデータなど、さまざまな種類のデータに適した汎用のディスク ベースのデータ ストレージ形式です。複雑なデータ構成を持つ機械学習データ セットの場合、プレーン テキスト形式よりも効率的であり、データ セットのスライスや圧縮などの前処理操作を簡単に実行できます。

データ セットが大きい場合、HDF5 形式を使用すると非常に有利になる場合があります。まずデータ セットを HDF5 形式に変換し、次に Python が提供する API を使用してデータを読み取り、メモリを節約できます。HDF5 形式に書き込むには、pandas ライブラリの to_hdf() 関数を使用でき、それを読み取るには、pandas ライブラリの read_hdf() 関数を使用できます。

以下に例を示します。

import pandas as pd

# 将数据集保存成HDF5格式
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df.to_hdf('my_dataset.h5', key='df', mode='w')

# 从HDF5格式读取数据集
df = pd.read_hdf('my_dataset.h5', key='df')

上の例は、データセットを HDF5 形式で保存および読み取る方法を示しています。

3. データの前処理

データの前処理とは、データの理解、分析、処理を容易にするために、生データのクリーニング、変換、標準化、正規化などの操作を指します。ここでは、いくつかの一般的な前処理テクニックを簡単に紹介します。

3.1 データのパーティショニング

データ分割とは、元のデータセットを一定の割合に従ってトレーニングセット、検証セット、テストセットに分割することを指します。通常は、7:1:2 の比率で分割します。つまり、トレーニング セットが 70%、検証セットが 10%、テスト セットが 20% になります。これにより、最も安定したモデル トレーニング効果と、より正確なモデル パラメーターの調整と比較が可能になります。さらに、トレーニング セットは、k 分割交差検証、転移学習など、さまざまな目的に応じて複数のサブセットに分割できます。

データのパーティショニングには 2 つの方法があります。

  1. ランダム分割: 最も簡単な方法は、データ セットを行ごとにランダムに並べ替え、最初の 70% と最後の 10% をトレーニング セットと検証セットとして選択し、最初の 10% をテスト セットとして選択することです。
  2. 通常のパーティショニング: データ セットは、特定の機能 (タイムスタンプなど) またはターゲット変数に基づいて複数のサブセットに分割することもできます。たとえば、データセットを年ごとに分割して各年をサブセットに対応させたり、ユーザー ID ごとに分割して各ユーザーをサブセットに対応させることもできます。これを行うと、各サブセットの分布が可能な限りバランスよくなり、一部のサブセットが 1 つのカテゴリに偏りすぎるのを防ぐことができます。

3.2 層別サンプリング

層化サンプリングは、各カテゴリの十分な数を確実にサンプリングするために一般的に使用される手法です。通常、トレーニング セットは完全にバランスが取れている必要があります。つまり、各カテゴリのサンプル数が同じである必要があります。ただし、実際のデータはこの条件を完全には満たさないことがよくあります。層化サンプリングは、この問題の解決に役立ちます。

層化サンプリングの基本的な考え方は、元のデータセットをいくつかのサブセットに分割し、各サブセットには同じカテゴリのサンプルが含まれるようにすることです。次に、各カテゴリが十分な割合でサンプリングされるように、各サブセットに対して通常のランダム サンプリングが実行されます。これにより、トレーニング セットと検証セットの間のクラス分布が類似することが保証されます。層化サンプリングにはさまざまな方法がありますが、一般的なものは次のとおりです。

  1. 不均一層化サンプリング: これは古典的な層化サンプリング戦略です。基本的な考え方は、まず元のデータ セットを比例して K 個のサブセットに分割し、次に均一の確率で各サブセットをサンプリングして、各カテゴリが十分な割合でサンプリングされるようにすることです。このアプローチの利点は、生成されたサブセット間に偏りがないことですが、欠点は、各サブセットが真のデータ分布を独立して反映できないことです。
  2. 一貫した層化サンプリング: 一貫した層化サンプリングは、より複雑な層化サンプリング方法です。その基本的な考え方は、各カテゴリのサンプル数が K 個のサブセットになるように、元のデータ セット内の各カテゴリをサンプリングすることです。スケールは、元のデータセット。この方法では、不均一な層化サンプリングの問題は回避されますが、各サブセットには同じ数のサンプルが含まれるため、真のデータ分布を反映することはできません。
  3. 単調層化サンプリング: 単調層化サンプリングは、新しい層化サンプリング方法です。その基本的な考え方は、最初に元のデータ セットを比例して K 個のサブセットに分割し、次に同じカテゴリのサンプルの数と順序に従って各サブセットを分割することです。トレーニング セット内の各タイプのサンプル数が 1 を超えて変わらないようにします。

3.3 欠損値の補完

データセットには欠損値が存在することがよくありますが、この場合、欠損値補完メソッドを使用して欠損値を埋めることができます。一般的な方法は次の 3 つです。

  1. 欠損値のあるサンプルを削除する: これは最も単純で直接的な方法です。ただし、サンプルが多すぎると、データセットの品質に影響します。
  2. モード充填方法: 外れ値がほとんどない変数の場合、モードを使用して欠損値を埋めることができます。たとえば、欠損値をモード (最も頻繁に発生するサンプル値) で埋めます。
  3. 補間方法: 連続変数の場合、補間方法を使用して欠損値を補完できます。例えば、線形補間法、最近傍補間法などです。

3.4 特徴量エンジニアリング

特徴エンジニアリングとは、機械学習モデルへの入力として使用される生データから効果的な特徴を抽出することを指します。一般的に使用される特徴量エンジニアリング手法には、次の側面が含まれます。

  1. 結合機能: 複数の低次元変数を新しい変数に結合すると、サンプル サイズが効果的に増加し、モデルのパフォーマンスが向上します。たとえば、2 つの変数の和、積、差、比率などを計算します。
  2. 多項式機能: 数値変数の場合、一連の多項式関数を通じて複数の指標に拡張できます。たとえば、変数の 2 乗、3 乗などを計算できます。
  3. インタラクティブな機能: さまざまな機能を組み合わせて、より豊富な機能空間を形成します。たとえば、2 つの変数の積、除算の商、余りなどを計算します。
  4. テキストの特徴: テキストデータの場合、統計、分類、クラスタリングなどの手段によって効果的な特徴を抽出できます。たとえば、単語の頻度、TF-IDF、キーワード、トピック モデルなどを計算します。
  5. 画像の特徴: 画像データの場合、さまざまな特徴抽出方法によって効果的な特徴を抽出できます。たとえば、エッジ、テクスチャ、HOG 記述子などを計算します。

3.5 正規化と標準化

正規化と標準化はどちらもデータの前処理における重要な手順であり、データの分布を同じスケールまたは範囲にマッピングするために使用されます。一般的な正規化方法には、MinMaxScaler、StandardScaler などが含まれます。一般的な標準化方法には、Z スコア正規化、Min-max 正規化などが含まれます。

正規化と標準化の違いは、正規化ではデータの平均が 0、標準偏差が 1 になるのに対し、正規化では特定の間隔にのみスケールされ、データの分布は変更されないことです。実際のアプリケーションでは、複数の方法を組み合わせて使用​​すると、より良い結果が得られます。

おすすめ

転載: blog.csdn.net/universsky2015/article/details/133504593