機能変換手法
変換は、データをモデルのトレーニングや分析に適した形式に変換またはスケールし、最適なパフォーマンスと精度を確保する重要な前処理ステップです。 このドキュメントは、補足的な構文リソースとして機能し、データの前処理に関する主な機能変換手法の詳細を提供します。
機械学習モデルでは、文字列値や null 値を直接処理できないので、データの前処理が不可欠になります。 このガイドでは、様々な変換を使用して、欠落値を取り込み、カテゴリデータを数値形式に変換し、ワンホットエンコーディングやベクトル化などの機能スケーリング手法を適用する方法について説明します。 これらのメソッドを使用すると、モデルはデータを解釈し、データから効果的に学習できるので、最終的にパフォーマンスが向上します。
自動フィーチャ変換 automatic-transformations
CREATE MODEL
コマンドの TRANSFORM
句をスキップする場合、フィーチャ変換は自動的に行われます。 自動データ前処理には、NULL 置換と標準機能変換(データタイプに基づく)が含まれます。 数値とテキストの列は自動的に入力され、フィーチャ変換が実行されて、データが機械学習モデルのトレーニングに適した形式になります。 このプロセスには、データ変換とカテゴリ、数値、ブール値の変換の欠落が含まれます。
次の表では、CREATE MODEL
コマンド中に TRANSFORM
句が省略された場合の様々なデータ型の処理方法を説明します。
Null 置換 automatic-null-replacement
ml_unknown
キーワードに置き換えられます。FALSE
値に置き換えられます。機能変換 automatic-feature-transformation
例
CREATE model modelname options(model_type='logistic_reg', label='rating') AS SELECT * FROM movie_rating;
手動フィーチャー変換 manual-transformations
CREATE MODEL
ステートメントでカスタムデータの前処理を定義するには、TRANSFORM
句を使用可能な任意の数の変換関数と組み合わせて使用します。 これらの手動による前処理関数は、TRANSFORM
句の外部でも使用できます。 以下のトランスフォーマーの節で説明するすべての変換を使用して、データを手動で前処理できます。
主な特徴 key-characteristics
前処理関数を定義する際に考慮すべきフィーチャー変換の主な特性を以下に示します。
-
構文:
TRANSFORM(functionName(colName, parameters) <aliasNAME>)
- エイリアス名は構文で必須です。 エイリアス名を指定する必要があります。指定しないと、クエリが失敗します。
-
パラメーター:パラメーターは位置引数です。 つまり、各パラメーターは特定の値のみを取ることができ、カスタム値が指定されている場合は、先行するすべてのパラメーターを指定する必要があります。 どの関数がどの引数を取るかについては、関連するドキュメントを参照してください。
-
チェーントランス:あるトランスの出力が別のトランスの入力になる場合があります。
-
機能の使用状況:最後の機能変換は、機械学習モデルの機能として使用されます。
例
CREATE MODEL modelname
TRANSFORM(
string_imputer(language, 'adding_null') AS imp_language,
numeric_imputer(users_count, 'mode') AS imp_users_count,
string_indexer(imp_language) AS si_lang,
vector_assembler(array(imp_users_count, si_lang, watch_minutes)) AS features
)
OPTIONS(MODEL_TYPE='logistic_reg', LABEL='rating')
AS SELECT * FROM df;
使用可能な変換 available-transformations
利用可能な変換は 19 個あります。 これらの変換は、 一般変換、 数値変換、 カテゴリ変換および テキスト変換に分割されます。
一般的な変換 general-transformations
幅広いデータ型に使用される変圧器の詳細については、この節を参照してください。 この情報は、カテゴリデータやテキストデータに固有でない変換を適用する必要がある場合に不可欠です。
数値インプター numeric-imputer
数値入力 変換サービスは、データセット内の欠落値を補完します。 欠落している値が含まれている列の平均値、中央値、モードのいずれかを使用します。 入力列は DoubleType
または FloatType
にしてください。 詳細と例については、Spark アルゴリズムのドキュメントを参照してください。
データタイプ
- 入力データタイプ:数値
- 出力データタイプ:数値
定義
transformer(numeric_imputer(hour, 'mean') hour_imputed)
パラメーター
STRATEGY
mean
、median
、mode
] です。偽装の前の例
帰属後の例(平均戦略を使用)
文字列演算子 string-imputer
String imputer トランスフォーマーは、ユーザーから関数引数として提供された文字列を使用して、データセット内の欠落値を補完します。 入力列と出力列は、string
のデータタイプである必要があります。
データタイプ
- 入力データタイプ:文字列
- 出力データタイプ:文字列
定義
transform(string_imputer(name, 'unknown_name') as name_imputed)
パラメーター
NULL_REPLACEMENT
偽装の前の例
変換後の例(「ml_unknown」を置換として使用)
ブール演算子 boolean-imputer
ブール演算子 変換は、ブール値列のデータセットの欠落値を補完します。 入力列と出力列は Boolean
型にする必要があります。
データタイプ
- 入力データタイプ:ブール値
- 出力データタイプ:ブール値
定義
transform(boolean_imputer(name, true) as name_imputed)
パラメーター
NULL_REPLACEMENT
true
、false
]。偽装の前の例
変換後の例(「true」を置き換えに使用)
ベクトルアセンブラ vector-assembler
VectorAssembler
変圧器は、指定された入力列のリストを 1 つのベクトル列に組み合わせるので、機械学習モデルの複数の機能を管理しやすくなります。 これは、生の特徴と、異なる特徴トランスフォーマーによって生成された特徴を 1 つの統一された特徴ベクトルにマージする場合に特に便利です。 VectorAssembler
には、数値、ブール値、およびベクトル型の入力列を使用できます。 各行では、入力列の値が指定した順序でベクトルに連結されます。
データタイプ
- 入力データタイプ:
array[string]
(数値/配列 [ 数値 ] 値を含む列名) - 出力データタイプ :
Vector[double]
定義
transform(vector_assembler(id, hour, mobile, userFeatures) as features)
パラメーター
変換前の例
変換後の例
数値変換 numeric-transformations
数値データの処理とスケーリングに使用できるトランスフォーマーについては、この節を参照してください。 これらのトランスフォーマーは、データセットの数値機能を処理および最適化するために必要です。
二値化器 binarizer
Binarizer
変圧器は、二値化と呼ばれるプロセスによって数値特性を二項(0/1)特性に変換します。 指定したしきい値を超えるフィーチャ値は 1.0 に変換され、しきい値以下のフィーチャ値は 0.0 に変換されます。Binarizer
は、入力列の Vector
型と Double
型の両方をサポートします。
データタイプ
- 入力データタイプ:数値列
- 出力データタイプ:数値
定義
transform(numeric_imputer(rating, 'mode') rating_imp, binarizer(rating_imp) rating_binarizer)
パラメーター
THRESHOLD
二値化前の入力例
二値化後の出力例(デフォルトのしきい値は 0.0)
カスタムしきい値を使用した定義
transform(numeric_imputer(age, 'mode') age_imp, binarizer(age_imp, 14.0) age_binarizer)
二値化後の出力例(しきい値が 14.0)
バケタイザー bucketizer
Bucketizer
変圧器は、ユーザが指定したしきい値に基づいて、連続するフィーチャの列をフィーチャ グループの列に変換します。 このプロセスは、連続データを個別の bin またはバケットにセグメント化する場合に役立ちます。 Bucketizer
には、バケットの境界を定義する splits
パラメーターが必要です。
データタイプ
- 入力データタイプ:数値列
- 出力データタイプ:数値(連結された値)
定義
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, max_abs_scaler(vec_assembler) as maxScaling, min_max_scaler(maxScaling) as features)
パラメーター
splits
n+1
分割では、バケツが n
個あります。 分割は厳密に昇順にする必要があり、範囲(x,y)は、y を含む最後のバケットを除いて、各バケットに使用されます。分割の例
- 配列(Double.NegativeInfinity, 0.0, 1.0, Double.PositiveInfinity)
- 配列(0.0, 1.0, 2.0)
分割は、Double 値の範囲全体に適用する必要があります。そうしないと、指定した分割以外の値はエラーとして扱われます。
変換の例
この例では、連続機能の列(course_duration
)を取り出し、指定された splits
に従って bin で結合し、結果のバケットを他の機能と組み立てます。
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, max_abs_scaler(vec_assembler) as maxScaling, min_max_scaler(maxScaling) as features)
MinMaxScaler minmaxscaler
MinMaxScaler
トランスフォーマーは、ベクトル行のデータセット内の各機能を指定された範囲(通常は [0、1] に再スケールします。 これにより、すべてのフィーチャがモデルに等しく作用するようになります。 これは、グラデーション下降ベースのアルゴリズムなど、フィーチャのスケーリングに敏感なモデルで特に便利です。 この MinMaxScaler
は、次のパラメーターで動作します。
- min:すべての特性で共有される変換の下限。 デフォルトは
0.0
です。 - max:変換の上限。すべての機能で共有されます。 デフォルトは
1.0
です。
データタイプ
- 入力データ型:
Array[Double]
- 出力データタイプ :
Array[Double]
定義
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, max_abs_scaler(vec_assembler) as maxScaling, min_max_scaler(maxScaling) as features)
パラメーター
min
max
変換の例
次の使用例は、他のいくつかの変換を適用した後に、MinMaxScaler を使用してフィーチャのセットを指定された範囲に再スケールして変換します。
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, max_abs_scaler(vec_assembler) as maxScaling, min_max_scaler(maxScaling) as features)
MaxAbsScaler maxabsscaler
MaxAbsScaler
変圧器は、ベクトル行のデータセット内の各特徴を、各特徴の最大絶対値で割って [-1,1] の範囲に再スケールする。 この変換は、データがシフトしたり中央に配置されたりすることがないので、正の値と負の値の両方を持つデータセットで希薄さを維持するのに最適です。 これにより、距離計算を含むモデルなど、入力フィーチャの尺度に敏感なモデルに特に適した MaxAbsScaler
ールが得られます。
データタイプ
- 入力データ型:
Array[Double]
- 出力データタイプ :
Array[Double]
定義
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, max_abs_scaler(vec_assembler) as maxScaling)
パラメーター
変換の例
この例では、MaxAbsScaler
を含むいくつかの変換を適用して、フィーチャを [-1, 1] の範囲に再スケールします。
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, max_abs_scaler(vec_assembler) as maxScaling)
Normalizer normalizer
Normalizer
は、ベクトル行のデータセット内の各ベクトルを正規化して単位ノルムを持たせるトランスフォーマーです。 このプロセスにより、ベクトルの方向を変更することなく、一貫したスケールが保証されます。 この変換は、特にベクトルの大きさが大きく変化する場合に、距離測定やその他のベクトルベースの計算に依存する機械学習モデルで特に役立ちます。
データタイプ
- 入力データタイプ :
array[double]
/vector[double]
- 出力データタイプ :
vector[double]
定義
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, normalizer(vec_assembler, 3) as normalized)
パラメーター
p
p-norm
を指定します(例:1-norm
、2-norm
など)。変換の例
この例では、Normalizer
を含む複数の変換を適用して、指定された p-norm
を使用して一連の機能を正規化する方法を示します。
TRANSFORM(binarizer(time_spent, 5.0) as binary, bucketizer(course_duration, array(-440.5, 0.0, 150.0, 1000.7)) as buck_features, vector_assembler(array(buck_features, users_count, binary)) as vec_assembler, normalizer(vec_assembler, 3) as normalized)
QuantileDiscretizer quantilediscretizer
QuantileDiscretizer
は、連続特性を持つ列を、numBuckets
パラメーターによって決定された bin の数で、連結されたカテゴリ特性に変換するトランスフォーマーです。 場合によっては、十分な量の数値を作成するのに十分な明確な値が少なすぎる場合、実際のバケット数が指定した数よりも小さくなる可能性があります。
この変換は、連続データの表現を簡略化する場合や、カテゴリ入力でより適切に機能するアルゴリズムに対してデータを準備する場合に特に役立ちます。
データタイプ
- 入力データタイプ:数値列
- 出力データタイプ:数値列(カテゴリ順)
定義
TRANSFORM(quantile_discretizer(hour, 3) as result)
パラメーター
NUM_BUCKETS
変換の例
この例では、QuantileDiscretizer
が連続特性(hour
)の列を 3 つのカテゴリ別に連結する方法を示しています。
TRANSFORM(quantile_discretizer(hour, 3) as result)
離散化の前後の例
StandardScaler standardscaler
StandardScaler
は、ベクトル行のデータセット内の各特性を正規化して、単位標準偏差やゼロ平均を持つトランスフォーマーです。 このプロセスにより、一貫したスケールでゼロを中心とした特性を想定したアルゴリズムにデータが適するようになります。 この変換は、SVM、ロジスティック回帰、ニューラルネットワークなどの機械学習モデルで特に重要です。これらのモデルでは、標準化されていないデータが収束の問題や精度の低下につながる可能性があります。
データタイプ
- 入力データタイプ : ベクトル
- 出力データタイプ:ベクトル
定義
TRANSFORM(standard_scaler(feature) as ss_features)
パラメーター
withStd
withMean
変換の例
この例では、一連のフィーチャに StandardScaler を適用し、それらを単位標準偏差とゼロ平均で正規化する方法を示します。
TRANSFORM(standard_scaler(feature) as ss_features)
カテゴリ変換 categorical-transformations
機械学習モデルのカテゴリデータを変換し、前処理するために設計された使用可能なトランスフォーマーの概要については、この節を参照してください。 これらの変換は、数値ではなく、個別のカテゴリやラベルを表すデータポイントに対して設計されています。
StringIndexer stringindexer
StringIndexer
は、ラベルの文字列列を数値インデックスの列にエンコードするトランスフォーマーです。 インデックスの範囲は 0 ~ numLabels
で、ラベルの頻度順に並べられます(最も頻繁に使用されるラベルは 0 のインデックスを受け取ります)。 入力列が数値の場合は、インデックス作成の前に文字列にキャストされます。 ユーザーが指定した場合は、見えないラベルをインデックス numLabels
に割り当てることができます。
この変換は、カテゴリ文字列データを数値形式に変換する場合に特に役立ち、数値入力が必要な機械学習モデルに適しています。
データタイプ
- 入力データタイプ:文字列
- 出力データタイプ:数値
定義
TRANSFORM(string_indexer(category) as si_category)
パラメーター
StringIndexer
の操作には、追加のパラメーターは必要ありません。変換の例
この例では、StringIndexer
をカテゴリ特性に適用し、数値インデックスに変換する方法を示します。
TRANSFORM(string_indexer(category) as si_category)
OneHotEncoder onehotencoder
OneHotEncoder
は、ラベルインデックスの列をスパースなバイナリベクトルの列に変換するトランスフォーマーで、各ベクトルは最大で 1 つの値を持ちます。 このエンコーディングは、ロジスティック回帰などの数値入力を必要とするアルゴリズムで、カテゴリデータを効果的に取り込む場合に特に便利です。
データタイプ
- 入力データタイプ:数値
- 出力データタイプ:Vector[Int]
定義
TRANSFORM(string_indexer(category) as si_category, one_hot_encoder(si_category) as ohe_category)
パラメーター
変換の例
この例では、最初に StringIndexer
をカテゴリ特性に適用し、次にその OneHotEncoder
を使用してインデックス付きの値をバイナリ ベクトルに変換する方法を示します。
TRANSFORM(string_indexer(category) as si_category, one_hot_encoder(si_category) as ohe_category)
テキスト変換 textual-transformations
この節では、テキストデータの処理と、機械学習モデルで使用可能な形式への変換に使用できるトランスフォーマーについて詳しく説明します。 このセクションは、自然言語データとテキスト分析を扱う開発者にとって重要です。
CountVector countvectorizer
CountVectorizer
は、テキストドキュメントの集まりをトークン数のベクトルに変換し、コーパスから抽出された語彙に基づいてスパース表現を生成するトランスフォーマーです。 この変換は、テキストデータを、各ドキュメント内のトークンの頻度を表すことで、LDA (Lidual Dirichtlet Allocation)などの機械学習アルゴリズムで使用できる数値形式に変換するために不可欠です。
データタイプ
- 入力データタイプ:配列 [ 文字列 ]
- 出力データタイプ:密ベクトル
定義
TRANSFORM(count_vectorizer(texts) as cv_output)
パラメーター
VOCAB_SIZE
vocabSize
用語のみを考慮した語彙を作成します。MIN_DOC_FREQ
MAX_DOC_FREQ
MIN_TERM_FREQ
変換の例
この例では、CountVectorizer がテキスト配列のコレクションをトークン数のベクトルに変換し、疎表現を生成する方法を示しています。
TRANSFORM(count_vectorizer(texts) as cv_output)
ベクトル化の前後の例
NGram ngram
NGram
は、n-gram のシーケンスを生成するトランスフォーマーであり、n-gram は、ある整数(𝑛
)の('??')トークンのシーケンス(通常は単語)です。 出力は、「??」の連続する単語のスペース区切り文字列で構成されており、機械学習モデル、特に自然言語処理に焦点を当てたモデルの機能として使用できます。
データタイプ
- 入力データタイプ:配列 [ 文字列 ]
- 出力データタイプ:配列 [ 文字列 ]
定義
TRANSFORM(tokenizer(review_comments) as token_comments, ngram(token_comments, 3) as n_tokens)
パラメーター
N
変換の例
この例では、NGram トランスフォーマーがテキストデータから派生したトークンのリストから 3 グラムのシーケンスを作成する方法を示しています。
TRANSFORM(tokenizer(review_comments) as token_comments, ngram(token_comments, 3) as n_tokens)
n グラム変換前後の例
StopWordsRemover stopwordsremover
StopWordsRemover
は、文字列のシーケンスからストップワードを削除し、重要な意味を持たない一般的な単語をフィルタリングするトランスフォーマーです。 これは、文字列のシーケンス(トークナイザの出力など)を入力として受け取り、stopWords
パラメータで指定されたすべてのストップワードを削除します。
この変換は、テキストデータの前処理に役立ち、全体的な意味にあまり寄与しない単語を排除することで、ダウンストリーム機械学習モデルの有効性を高めることができます。
データタイプ
- 入力データタイプ:配列 [ 文字列 ]
- 出力データタイプ:配列 [ 文字列 ]
定義
TRANSFORM(stop_words_remover(raw) as filtered)
パラメーター
stopWords
変換の例
この例では、StopWordsRemover
がトークンのリストから一般的な英語のストップワードを除外する方法を示しています。
TRANSFORM(stop_words_remover(raw) as filtered)
ストップワード削除の前後の例
カスタムのストップワードを使用した例
この例では、ストップワードのカスタム・リストを使用して、入力シーケンスから特定のワードを除外する方法を示します。
TRANSFORM(stop_words_remover(raw, array("red", "I", "had")) as filtered)
カスタムストップワード削除の前後の例
TF-IDF tf-idf
TF-IDF
(Term Frequency-Inverse Document Frequency)は、コーパスに対する文書内の単語の重要度を測定するために使用されるトランスフォーマーです。 用語頻度(TF)は用語\(t\)が文書\(d\)に現れる回数を表し、文書頻度(DF)はコーパス \(D\)内の\(t\)という用語を含む文書数を測定します。 この方法は、「a」、「the」、「of」など、ユニークな情報をほとんど持たない一般的に使用される単語の影響を軽減するために、テキストマイニングで広く使用されています。
この変換は、ドキュメント内およびコーパス全体での各単語の重要度に数値を割り当てるので、テキストマイニングおよび自然言語処理タスクで特に役立ちます。
データタイプ
- 入力データタイプ:配列 [ 文字列 ]
- 出力データタイプ:Vector[Int]
定義
create table td_idf_model transform(tokenizer(sentence) as token_sentence, tf_idf(token_sentence) as tf_sentence, vector_assembler(array(tf_sentence)) as feature) OPTIONS()
パラメーター
NUM_FEATURES
MIN_DOC_FREQ
変換の例
この例では、TF-IDF を使用して、トークン化された文を、コーパス全体のコンテキストでの各用語の重要性を表す機能ベクトルに変換する方法を示します。
create table td_idf_model transform(tokenizer(sentence) as token_sentence, tf_idf(token_sentence) as tf_sentence, vector_assembler(array(tf_sentence)) as feature) OPTIONS()
Tokenizer tokenizer
Tokenizer
は、文などのテキストを個別の用語(通常は単語)に分解するトランスフォーマーです。 文をトークンの配列に変換し、さらなるテキスト分析やモデリング処理のためにデータを準備する、テキストの前処理の基本的な手順を提供します。
データタイプ
- 入力データタイプ:テキスト文
- 出力データタイプ:配列 [ 文字列 ]
定義
create table td_idf_model transform(tokenizer(sentence) as token_sentence, tf_idf(token_sentence) as tf_sentence, vector_assembler(array(tf_sentence)) as feature) OPTIONS()
パラメーター
Tokenizer
の操作に追加のパラメーターは必要ありません。変換の例
この例では、Tokenizer
がテキスト処理パイプラインの一部として文を個々の単語(トークン)に分割する方法を示しています。
create table td_idf_model transform(tokenizer(sentence) as token_sentence, tf_idf(token_sentence) as tf_sentence, vector_assembler(array(tf_sentence)) as feature) OPTIONS()
Word2Vec word2vec
Word2Vec
は、ドキュメントを表す単語のシーケンスを処理し、文 Word2VecModel
をトレーニングする推定量です。 このモデルは、各単語を固有の固定サイズベクトルにマッピングし、文書内の全単語のベクトルを平均化することにより、各文書をベクトルに変換する。 Word2Vec
は、自然言語処理タスクで広く使用されており、意味論的意味を取り込む単語の埋め込みを作成し、テキストデータを単語間の関係を表す数値ベクトルに変換し、より効果的なテキスト分析と機械学習モデルを可能にします。
データタイプ
- 入力データタイプ:配列 [ 文字列 ]
- 出力データタイプ:Vector[Double]
定義
TRANSFORM(tokenizer(review) as tokenized, word2Vec(tokenized, 10, 1) as word2Vec)
パラメーター
VECTOR_SIZE
MIN_COUNT
Word2Vec
モデルのボキャブラリに含まれるように見える最小回数。変換の例
次の例は、トークン化され Word2Vec
レビューを、文書内の単語ベクトルの平均を表す固定サイズのベクトルに変換する方法を示しています。
TRANSFORM(tokenizer(review) as tokenized, word2Vec(tokenized, 10, 1) as word2Vec)
Word2Vec 変換の前後の例