

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Neptune ML での特徴エンコーディング
特徴エンコーディング

プロパティ値と RDF リテラルには、さまざまな形式とデータ型があります。機械学習で優れたパフォーマンスを実現するには、これらの値を*特徴*として知られる数値エンコーディングに変換することが不可欠です。

Neptune ML は、ここで説明されているように、データのエクスポートおよびデータ処理手順の一部として、特徴抽出とエンコーディングを実行します。

**注記**  
カスタムモデルの実装で独自の特徴エンコーディングを実装する場合は、データの前処理段階で `none` を特徴エンコーディングタイプとして選択することで自動特徴エンコーディングを無効にすることができます。その後、そのノードまたはエッジプロパティで特徴エンコーディングは発生せず、代わりに生プロパティ値が解析され、ディクショナリに保存されます。データの前処理では、エクスポートされたデータセットから DGL グラフが作成されますが、構築された DGL グラフにはトレーニング用の前処理特徴がありません。  
カスタムモデルトレーニングの一部として独自のカスタム特徴エンコーディングを実行する予定の場合のみこの選択肢を使用します。詳細については、「[Neptune ML のカスタムモデル](machine-learning-custom-models.md)」を参照してください。

## Neptune MLのカテゴリ別特徴
カテゴリ別特徴

可能な値の固定リストから 1 つ以上の異なる値を取得できるプロパティは、カテゴリ別特徴です。Neptune ML では、カテゴリ別特徴は [one-hot エンコーディング](https://en.wikipedia.org/wiki/One-hot)を使用して符号化されます。次の例は、さまざまな食品のプロパティ名がそのカテゴリに従って one-hot 符号化される方法を示しています。

```
    Food        Veg.   Meat   Fruit    Encoding
   ---------    ----   ----   -----    --------
    Apple         0      0      1         001
    Chicken       0      1      0         010
    Broccoli      1      0      0         100
```

**注記**  
カテゴリ別特徴の最大数は 100 です。プロパティの値のカテゴリが 100 を超える場合、最も一般的なカテゴリの 99 のみが個別のカテゴリに配置され、残りは `OTHER` という名前の特別なカテゴリに配置されます。

## Neptune MLのカテゴリ別特徴
数値特徴

値が実数であるプロパティは、Neptune ML で数値特徴として符号化できます。数値特徴は、浮動小数点数を使用して符号化されます。

次のように、数値特徴を符号化するときに使用するデータ正規化方法を指定できます。`"norm": "normalization technique"`。次の正規化手法がサポートされています。
+ **"none"** — エンコーディング中に数値を正規化しないでください。
+ **"min-max"** — 最小値を減算し、最大値と最小値の差で除算して、各値を正規化します。
+ **"standard"** — すべての値の合計で割って、各値を正規化します。

## Neptune MLの Bucket-numerical 特徴
Bucket-numerical 特徴

生の数値を使用して数値プロパティを表すのではなく、数値をカテゴリに集約できます。たとえば、人の年齢を、子供 (0 ～20 歳)、若年大人 (20 ～ 40 歳)、中年 (40 ～ 60 歳)、および高齢者 (60歳以上) などのカテゴリに分類できます。これらの数値バケットを使用すると、数値プロパティを一種のカテゴリ特徴に変換することになります。

Neptune ML では、数値プロパティをバケット数値特徴として符号化できます。次の 2 つを指定する必要があります。
+ 数値範囲、` "range": [a, b] ` 形式では、`a` および `b` は整数です。
+ バケットカウント、` "bucket_cnt": c ` 形式では、`c` はバケットの数であり、整数でもあります。

次に、Neptune ML は各バケットのサイズを ` ( b - a ) / c ` と計算し、各数値を格納するバケットの数として符号化します。`a` 未満の値は最初のバケットに属していると見なされ、`b` より大きい任意の値は最後のバケットに属していると見なされます。

オプションで、次のようにスライドウィンドウサイズを ` "slide_window_size": s ` のように (`s` は数字) 指定することで、数値を複数のバケットに分類することもできます。Neptune ML はプロパティの各数値 `v` を` v - s/2 ` から ` v + s/2 ` 範囲内へ変換し、範囲がカバーするすべてのバケットに値 `v` を代入します。

最後に、オプションで、数値特徴と bucket-numerical 特徴の欠損値を埋める方法を提供することもできます。これは、` "imputer": "imputation technique "` を使用して行います。ここで、帰属技法は`"mean"`、`"median"` または `"most-frequent"` のうちの 1 つです。中央値を指定しなかった場合、値が欠落していると、処理が停止する可能性があります。

## Neptune ML でのテキストフィーチャエンコーディング
テキストフィーチャ

自由形式のテキストの場合、Neptune ML はいくつかの異なるモデルを使用して、プロパティ値文字列内のトークンのシーケンスを固定サイズの実数値ベクトルに変換できます。
+ [`text_fasttext`](#machine-learning-fasttext-features) — [fastText](https://fasttext.cc/) エンコーディングを使用します。これは、fastText がサポートする 5 つの言語のうちの 1 つだけを使用するフィーチャに推奨されるエンコーディングです。
+ [`text_sbert`](#machine-learning-sbert-features) — [Sentence BERT](https://www.sbert.net/docs/pretrained_models.html#sentence-embedding-models) (SBERT) エンコーディングモデルを使用します。これは、`text_fasttext` がサポートしていないテキストについて推奨されるエンコーディングです。
+ [`text_word2vec`](#machine-learning-word2vec-features) — [Google](https://code.google.com/archive/p/word2vec/) が最初に公開した [Word2Vec](https://wikipedia.org/wiki/Word2vec) アルゴリズムを使用して、テキストをエンコードします。Word2Vec は英語のみをサポートしています。
+ [`text_tfidf`](#machine-learning-tfidf-features) — [term frequency–inverse document frequency](https://wikipedia.org/wiki/Tf-idf) (TF-IDF) ベクタライザを使用して、テキストのエンコードを行います。TF-IDF エンコーディングは、他のエンコーディングにはない統計機能をサポートします。

### Neptune ML でのテキストプロパティ値の *fastText* エンコーディング
`text_fasttext` エンコーディング

Neptune ML は [fastText](https://fasttext.cc/) モデルを使用して、テキストプロパティ値を固定サイズの実数値ベクトルに変換できます。これは、FastText がサポートする 5 つの言語のいずれかのテキストプロパティ値の推奨エンコーディング方法です。
+ `en`   (英語)
+ `zh`   (中国語)
+ `hi`   (ヒンディー語)
+ `es`   (スペイン語)
+ `fr`   (フランス語)

fastText は複数の言語の単語を含む文を処理できないことに注意してください。

`text_fasttext` メソッドは、エンコードされるテキストプロパティ値のトークンの最大数を指定する `max_length` フィールドをオプションで取得できます。この数を超えると、文字列は切り捨てられます。これによって、テキストプロパティ値に長い文字列が含まれる場合のパフォーマンスが向上します。`max_length` が指定されなかった場合、fastText は文字列の長さに関係なく、すべてのトークンをエンコードするためです。

次の例では、フランス語の映画タイトルが fastText を使用してエンコードされるように指定しています。

```
{
    "file_name" : "nodes/movie.csv",
    "separator" : ",",
    "node" : ["~id", "movie"],
    "features" : [
      {
        "feature": ["title", "title", "text_fasttext"],
        "language": "fr",
        "max_length": 1024
      }
    ]
  }
```

### Neptune MLにおけるテキストフィーチャの Sentence BERT (SBERT) エンコーディング
`text_sbert` エンコーディング

Neptune ML は、[Sententh BERT](https://www.sbert.net/docs/pretrained_models.html#sentence-embedding-models) (SBERT) モデルを使用して、文字列プロパティ値内のトークンのシーケンスを固定サイズの実数値ベクトルに変換できます。Neptune は 2 つの SBERT メソッドをサポートしています。すなわち、`text_sbert128` (`text_sbert` を指定した場合のデフォルト) と `text_sbert512` です。この 2 つの違いは、エンコードされるテキストプロパティ値文字列の最大長です。`text_sbert128` エンコーディングでは、128 トークンをエンコードするとテキスト文字列が切り捨てられますが、`text_sbert512` では、512 トークンをエンコードした後にテキスト文字列が切り捨てられます。その結果、`text_sbert512` を使用する場合は、`text_sbert128` よりも処理時間が長くなる可能性があります。どちらの方法も、`text_fasttext` より遅くなります。

SBERT エンコーディングは多言語対応なので、エンコードするプロパティ値のテキストについて言語を指定する必要はありません。SBERT は多くの言語をサポートしており、複数の言語を含む文をエンコードできます。fastText がサポートしていない言語のテキストを含むプロパティ値をエンコードする場合は、SBERT が推奨されるエンコード方法です。

次の例では、映画のタイトルを最大 128 トークンまで SBERT としてエンコードするように指定しています。

```
{
    "file_name" : "nodes/movie.csv",
    "separator" : ",",
    "node" : ["~id", "movie"],
    "features" : [
      { "feature": ["title", "title", "text_sbert128"] }
    ]
  }
```

### Neptune ML でのテキストフィーチャの Word2Vec エンコーディング
`text_word2vec` エンコーディング

Neptune ML は、文字列プロパティ値を Word2Vec 機能としてエンコードできます ([Word2Vec](https://wikipedia.org/wiki/Word2vec) アルゴリズムは元々 [Google](https://code.google.com/archive/p/word2vec/) によって公開されました)。`text_word2vec` メソッドは、[spaCy でトレーニング済みモデル](https://spacy.io/models)のいずれかを使用して、文字列内のトークンを密なベクトルとしてエンコードします。これは [en\$1core\$1web\$1lg](https://spacy.io/models/en#en_core_web_lg) モデルを使用する英語のみをサポートしています。

次の例では、映画のタイトルを Word2Vec を使用してエンコードするように指定しています。

```
{
    "file_name" : "nodes/movie.csv",
    "separator" : ",",
    "node" : ["~id", "movie"],
    "features" : [
      {
        "feature": ["title", "title", "text_word2vec"],
        "language": "en_core_web_lg"
      }
    ]
  }
```

Neptune がサポートしているのは英語 `en_core_web_lg` モデルだけなので、言語フィールドはオプションであることに注意してください。

### Neptune ML でのテキストフィーチャの TF-IDF エンコーディング
`text_tfidf` エンコーディング

Neptune ML は、テキストプロパティ値を `text_tfidf` フィーチャとしてエンコードできます。このエンコーディングは、[term frequency–inverse document frequency](https://wikipedia.org/wiki/Tf-idf) (TF-IDF) ベクタライザを使用して、テキスト内の単語のシーケンスを数値ベクトルに変換し、その後に次元削減操作を実行します。

[TF-IDF](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) (項の頻度 — 逆ドキュメントの頻度) は、文書セット内の単語の重要性を測定するための数値です。これは、特定のプロパティ値に単語が表示される回数をそのプロパティ値の合計数で割って計算されます。

例えば、ある映画のタイトルに「キス」という単語が2回登場し (例えば「キス・キス・バン・バン」)、4本の映画のタイトルすべてに「キス」が登場する場合、「キス・バンバン」タイトルの「キス」の TF-IDF 値は、` 2 / 4 ` となります。

最初に作成されるベクトルは ***d*** ディメンションで、ここで ***d*** は、そのタイプのすべてのプロパティ値の一意の項の数です。次元削減オペレーションでは、ランダムなスパース投影を使用して、その数値を最大 100 に減らします。グラフのボキャブラリーは、その中の `text_tfidf` 特徴をすべて合わせて生成されます。

TF-IDF ベクタライザーは、いくつかの方法で制御できます。
+ **`max_features`** — `max_features` パラメータを使用して、最も一般的な特徴に `text_tfidf` 特徴の項数を制限できます。たとえば、`max_features` を 100 に設定した場合、最も一般的に使用される項の上位 100 のみが含まれます。`max_features` のデフォルト値を明示的に設定しなかった場合、5,000 となります。
+ **`min_df`** — `min_df` パラメータを使用して、少なくとも指定されたドキュメント頻度を持つ特徴へ `text_tfidf` 特徴の項数を制限できます。たとえば、`min_df` を 5 に設定した場合、少なくとも 5 つの異なるプロパティ値に含まれる項のみが使用されます。`min_df` のデフォルト値を明示的に設定しなかった場合、2 となります。
+ **`ngram_range`** — `ngram_range` パラメータは、項として扱われる単語の組み合わせを決定します。たとえば、`ngram_range` を `[2, 4]` に設定した場合、「キス・キス・バン・バン」のタイトルで以下の 6 項が見つかることになります。
  + *2 単語項*：「キス・キス」、「キス・バン」、「バン・バン」。
  + *3 単語項*：「キス・キス・バン」と「キス・バン・バン」。
  + *4 単語項*：「キス・キス・バン・バン」。

  `ngram_range` のデフォルトの設定は `[1, 1]` です。

## Neptune ML のDatetime 特徴
Datetime 特徴

Neptune ML は `datetime` プロパティ値の一部を、[one-hot 配列](https://en.wikipedia.org/wiki/One-hot)として符号化してカテゴリ別特徴に変換できます `datetime_parts` パラメータを使用して、符号化する次のパートの `["year", "month", "weekday", "hour"]` のうち 1 つまたは複数を指定します。`datetime_parts` を設定しなければで、デフォルトで 4 つの部分すべてが符号化されます。

たとえば、datetime 値の範囲が 2010 年から 2012 年にわたる場合、datetime 入力 `2011-04-22 01:16:34` の 4 つの部分は次のとおりです。
+ **year**   –   `[0, 1, 0]`。

  スパンには 3 年 (2010、2011、2012) しかないため、one-hot 配列には各年に 1 つずつ、3 つの入力値があります。
+ **month**   –   `[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]`。

  ここでは、one-hot 配列には、その年の各月の入力値があります。
+ **weekday**   –   `[0, 0, 0, 0, 1, 0, 0]`。

  ISO 8601 規格では、月曜日が週の最初の曜日であると定められており、2011 年 4 月 22 日は金曜日であったため、対応するone-hot weekday 配列は 5 番目の位置で hot です。
+ **hour**   –   `[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]`。

  午前 1 時の時間は 24-member one-hot 配列で設定されます。

月、分、秒の曜日はカテゴリ的に符号化されません。

総 `datetime` 対象範囲に 1 年以内の日付のみが含まれている場合、`year` 配列はどれも符号化されません。

`imputer` パラメータと、数値特徴に使用できる戦略の 1 つを使用して、欠落した`datetime`値を保管するためのインピュテーション戦略を指定できます。

## Neptune ML での自動特徴エンコーディング
自動エンコーディング

グラフのプロパティに使用する特徴エンコーディングメソッドを手動で指定する代わりに、特徴エンコーディングメソッドとして `auto` を設定できます。次に、Neptune ML は、基礎となるデータ型に基づいて、各プロパティの最適な特徴エンコーディングを推論しようとします。

Neptune ML が適切な特徴エンコーディングを選択する際に使用する発見的手法をいくつか紹介します。
+ プロパティが数値のみを持ち、数値データ型にキャストできる場合、Neptune ML は通常、それを数値として符号化します。ただし、プロパティの一意の値の数が値の合計数の 10% 未満で、それらの一意の値のカーディナリティが 100 未満の場合、Neptune ML はカテゴリ別エンコーディングを使用します。
+ プロパティ値を `datetime` 型にキャストできる場合、Neptune ML はそれらを `datetime` 特徴に符号化します。
+ プロパティ値をブール値 (1/0 または True/False) に強制できる場合、Neptune ML はカテゴリエンコーディングを使用します。
+ プロパティがその値の 10% を超える一意の文字列であり、値あたりの平均トークン数が 3 以上の場合、Neptune ML はプロパティタイプをテキストとして推論し、使用されている言語を自動的に検出します。検出された言語が [fastText](#machine-learning-fasttext-features) によってサポートされている言語、つまり、英語、中国語、ヒンディー語、スペイン語、フランス語のいずれかである場合、Neptune ML は `text_fasttext` を使用してテキストをエンコードします。それ以外の場合、Neptune ML は [`text_sbert`](#machine-learning-sbert-features) を使用します。
+ プロパティがテキスト特徴として分類されない文字列の場合、Neptune ML はカテゴリ別特徴であると仮定し、カテゴリエンコーディングを使用します。
+ 各ノードがカテゴリ特徴であると推論されるプロパティに固有の値がある場合、Neptune ML は学習に有益ではない ID であるため、トレーニンググラフからプロパティを削除します。
+ プロパティにセミコロン (「;」) などの有効な Neptune 区切り文字が含まれていることがわかっている場合、Neptune ML はプロパティを `MultiNumerical` または `MultiCategorical` とのみ扱えます。
  + Neptune ML は、まず値を数値特徴として符号化しようとします。これが成功すると、Neptune ML は数値エンコーディングを使用して数値ベクトル特徴を作成します。
  + それ以外の場合、Neptune ML は値をマルチカテゴリとして符号化します。
+ Neptune ML がプロパティの値のデータ型を推論できない場合、Neptune MLはトレーニンググラフからプロパティを削除します。