機械学習用のデータを準備する

完了

機械学習モデルを作成する前に、トレーニングと評価に使用するデータを準備する必要があります。 データは、ソース (多くの場合、データ ファイル) から Azure Databricks に取り込まれます。 必要に応じて、データ ファイルに基づいて差分テーブルを作成して、データの探索と分析を簡略化できます。 データが取り込まれた後、データ サイエンティストが機械学習用に準備します。

通常、データの準備には、次の 2 つの重要なタスクが含まれます。

  • データ クレンジング: 機械学習の有用性に影響を与えるデータの問題を特定して軽減します。
  • 特徴エンジニアリングと前処理: モデル トレーニングに適した特徴の選択と変換。

データ クレンジング

データをクリーンアップするために必要な具体的な手順はプロジェクトによって異なりますが、対処する必要がある一般的な問題は次のとおりです。

  • 不完全なデータ: データには、多くの場合、個々のフィールドが欠落しているレコードが含まれます (多くの場合、NULL 値の存在によって示されます)。 欠損値を特定し、次の方法で軽減する必要があります。
    • 系列内の値を補間するか、平均値 (または中央値) を使用するか、他の適切な値を作成することによって、それらを適切な置換に置き換えます。
    • 不完全な行を完全に削除する (モデリングに十分な適切な代表的なデータが残っていると仮定)
  • エラー: データ入力の間違いやアップストリームデータ処理の失敗により、データにエラーが含まれるのは珍しくありません。 エラーの検出は困難な場合があり、通常はクエリと視覚化を使用してデータを詳しく調べ、データを要約し、特定のフィールド内の他のほとんどの値と一致しない値を探す必要があります。
  • 外れ値: 外れ値は、データの統計的分布の大幅な外側 (上または下) の値です。 外れ値はエラーを示す場合があり (たとえば、他のユーザーが余分なゼロの値を持っている場合や、小数点を省略した場合など)、ほとんどの観測値と比較して異常に高い値または低い正規の値である場合があります。 いずれの場合も、極端な外れ値は機械学習モデルのトレーニングに悪影響を及ぼす可能性があります。そのため、通常は、しきい値を上限または下限にリセットするか、データセットから外れ値を含むレコードを削除して処理することをお勧めします。
  • 不適切なデータ型: 機械学習アルゴリズムは、特徴値に割り当てられたデータ型に依存する可能性があります。 エラーまたは null 値を含むテキスト ファイルに基づくデータセットでは、数値フィールドを 文字列 データ型に誤ってキャストするのが一般的であり、不連続の整数値を表す値が 10 進数 (またはその逆) に誤ってキャストされることがよくあります。 データのスキーマを調べ、データ値を最も効果的に反映する適切なデータ型を割り当てる必要があります。
  • 不均衡なデータ: 機械学習トレーニングは、発生する可能性があるさまざまな特徴とラベルの組み合わせすべてに対してトレーニング データが適切に表現されている場合に最適です。 不均衡なデータセットでは、特定のカテゴリ値またはフィールドの組み合わせを含むレコードが過剰に表現されます。これは、トレーニング アルゴリズムに影響を与え、モデルにバイアスを導入する可能性があります。 この問題を軽減する一般的な手法は、重複する行を含めることで、低い値を オーバーサンプリング するか、過剰に表現された行をアンダー サンプリング することです (データセットから削除します)。

Azure Databricks では、このような問題を検出して処理する最も一般的な方法は、データを探索して操作するコードをノートブックに記述することです。 この種のデータ操作に使用されるプライマリ クラスは、Spark データフレームです

たとえば、次のコードでは、テキスト ファイルからデータフレームにデータを読み込みます。

df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")

または、データが Azure Databricks ワークスペースのデルタ テーブルに読み込まれている場合は、SQL クエリを使用してデータフレームにデータを読み込むことができます。

df = spark.sql("SELECT * FROM mytable")

データがデータフレームに読み込まれたら、Spark SQL ライブラリのメソッドやその他の関数を使用して、データを探索および変換できます。 たとえば、次のコードでは dropna メソッドを使用して、null 値を含む行を削除し、データフレーム内の列に特定のデータ型を割り当てます。

clean_data = df.dropna().select(col("column1").astype("string"),
                                col("column2").astype("float"))

ヒント

Spark データフレーム機能の詳細については、 Spark データフレームのドキュメントを参照してください

特徴エンジニアリングと前処理

データセットが完全でクリーンであることを確認したら、機械学習用の機能の準備を開始できます。 特徴エンジニアリングは反復的なアプローチであり、多くの場合、予測値を持つ特徴列と、特徴を表現するのに最適な方法を決定するために、いくつかの試行とエラーが含まれます。 一般的な特徴エンジニアリングと前処理のタスクは次のとおりです。

  • 新機能の派生: 多くの場合、既存の特徴から新しいより多くの予測機能を導き出すことができます。 たとえば、データセットに日付列が含まれていて、ラベルを識別する際に完全な日付は重要な予測要因ではないかもしれませんが、曜日が重要な可能性があるとします。 日付から派生した新しい day_of_week 特徴を作成し、理論をテストすることができます。

  • 数値特徴の分離: 場合によっては、特定の値の範囲を表すカテゴリに 分離 すると、数値の方が予測性が高い場合があります。 たとえば、 価格 機能の数値を取得し、適切なしきい値に基づいて のカテゴリに割り当てることができます。

  • カテゴリ特徴のエンコード: 多くのデータセットには、文字列値で表されるカテゴリ データが含まれています。 ただし、ほとんどの機械学習アルゴリズムは数値データに対して最適に機能します。 そのため、文字列ではなくカテゴリを表す数値コードを割り当てるのが一般的です。 たとえば、製品の詳細のデータセットには、"Green"、"Red"、または "Blue" の値を持つ カラー の機能が含まれる場合があります。 これらの値は、"Green" の 場合は 0 、"Red" の場合は 1 、"Blue" の 場合は 2 などの単純な整数コードを使用してエンコードできます。 または、 1 ホット エンコード 手法を使用して、使用可能なカテゴリごとに新しい列を作成し、次のように各行に必要に応じて値 1 または 0 を各列に割り当てることができます。

    元の色の列 緑色 赤い 青い
    1 0 0
    青い 0 0 1
    赤い 0 1 0
  • スケーリング (正規化) 数値: 数値データ値は、多くの場合、互いに異なるスケールまたは測定単位で行われます。 機械学習アルゴリズムでは、それらをすべて絶対値として処理します。値が大きい特徴は、多くの場合、モデルのトレーニングを支配する可能性があります。 この問題を解決するには、1 つの列の個々の値が互いに同じ比例関係を維持するようにすべての数値列をスケーリングするのが一般的ですが、すべての数値列は同様のスケールになります。 たとえば、データセットにメートルとキロ単位で測定された長さと重みの値が含まれているとします。 次のように、これらの機能の両方を 0 から 1 のスケール値に変換できます。

    length 体重 scaled_length scaled_weight
    250.0 2.1 0.250 0.210
    176.0 0.9 0.176 0.09

多くの機械学習ライブラリには、一般的な特徴エンジニアリング タスクを実行するために使用できるクラスが含まれています。 たとえば、Spark MLlib ライブラリには StringIndexer クラスが含まれており、これを使用して文字列値に対して単純な整数ベースのエンコードを実行できます。

from pyspark.ml.feature import StringIndexer

encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)

StringIndexer コード サンプルについてもう少し詳しく説明する価値があります。 Spark MLlib クラスには、特定の変換操作のアルゴリズムを一部のサンプル データに適合させる エバリュエーター を含めることができます。 この場合、StringIndexer は、エンコードされた値を含む新しい catColCode 列を生成するために必要な特定の計算を決定するために、エンコード アルゴリズムを データ データフレームの catCol 列の個別の文字列値に適合させます。 エバリュエーターの出力は、エバリュエーターによって定義された関数をカプセル化し、その関数をデータに適用して新しいデータフレームを生成できる トランスフォーマー です。 この例では、エンコード関数を 決定 するために使用したのと同じデータを結果のトランスフォーマーに渡して、実際にエンコードを 適用 します。

Spark MLLib では、データの準備に必要なすべての特徴エンジニアリングと前処理の手順を実行する パイプライン で、一連のエバリュエーターとトランスフォーマーを連結できます。 パイプラインは、エバリュエーターとして機能する機械学習アルゴリズムで終わり、準備された特徴からラベルを予測するために必要な操作を決定できます。 パイプラインの出力は機械学習モデルであり、実際にはデータフレーム内の特徴にモデル関数を適用し、対応するラベル値を予測するために使用できるトランスフォーマーです。