このトピックでは、ユーザーまたはアイテムのフィーチャーの読み込みを構成する方法について説明します。
フィーチャー構成は、構成概要の FeatureConfs に対応します。FeatureConfs は、キーがシナリオ名である Map[string]object 構造です。シナリオごとに異なるフィーチャーを構成できます。
機能の読み込み
ファインランキングの前に、フィーチャーソースからユーザーまたはアイテムのフィーチャーデータを取得する必要があります。
場合によっては、取得したフィーチャーデータにさらなる処理が必要になることがあります。たとえば、既存のフィーチャーから新しいフィーチャーを生成したり、既存のフィーチャーを組み合わせたりすることができます。
フィーチャーは、Hologres、Redis、Tablestore (OTS)、PAI-FeatureStore などの複数のデータソースから読み込むことができます。
Hologres
構成例
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "holo-pai",
"FeatureKey": "user:uid",
"UserFeatureKeyName": "user_id",
"HologresTableName": "recom_user_features_processed_holo_online",
"UserSelectFields": "rids_count,sex,alladdfriendnum,allpayrosenum",
"FeatureStore": "user"
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "holo-pai",
"ItemFeatureKeyName": "item_id",
"FeatureKey": "item:id",
"HologresTableName": "recom_user_features_processed_holo_online",
"ItemSelectFields": "rids_count as rids2_count,sex as guestsex,alladdfriendnum as alladdfriendnum2",
"FeatureStore": "item"
},
"Features": []
}
]
}
}
}AsynLoadFeature: フィーチャーを非同期で読み込むかどうかを指定します。これにより、複数の `FeatureLoadConfs` が構成されている場合に、フィーチャーを同時に読み込むことができます。
FeatureLoadConfs/FeatureDaoConf
フィールド名 | タイプ | 必須 | 説明 |
AdapterType | string | はい | データソースのタイプ。値を `hologres` に設定します。 |
HologresName | string | はい | `HologresConfs` で定義された Hologres インスタンスのカスタム名。例: `holo_info`。 |
FeatureKey | string | はい | フィーチャーテーブルのクエリに使用されるフィーチャー。 `FeatureKey` は、ルックアップに使用するユーザーまたはアイテムのフィールドを指定します。たとえば、`user:uid` はユーザーから `uid` プロパティの値を取得し、`item:id` はアイテムから `id` プロパティの値を取得します。 |
UserFeatureKeyName | string | はい | ユーザーフィーチャーテーブルのプライマリキーフィールド。 |
ItemFeatureKeyName | string | はい | アイテムフィーチャーテーブルのプライマリキーフィールド。 |
HologresTableName | string | はい | Hologres のフィーチャーテーブルの名前。 |
UserSelectFields | string | いいえ | 取得するユーザーフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。 |
ItemSelectFields | string | いいえ | 取得するアイテムフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。 |
FeatureStore | string | はい | 取得したフィーチャーが保存される場所。有効な値: `user` または `item`。 |
CacheSize | integer | いいえ | ローカルにキャッシュするフィーチャーエントリの数。デフォルト値は 0 で、データがキャッシュされないことを意味します。 |
CacheTime | integer | いいえ | ローカルにキャッシュされたフィーチャーエントリの有効期限 (秒単位)。このパラメーターは `CacheSize` が 0 より大きい場合にのみ有効です。デフォルト値は 3600 です。 |
PAI-FeatureStore
PAI-FeatureStore プラットフォームの構成方法の詳細については、「FeatureStore の概要」をご参照ください。
構成例
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "user:uid",
"FeatureStoreModelName": "rank_v1",
"FeatureStoreEntityName": "user",
"FeatureStore": "user"
}
}
]
}
}
}FeatureLoadConfs/FeatureDaoConf
フィールド名 | タイプ | 必須 | 説明 |
AdapterType | string | はい | データソースのタイプ。値を `featurestore` に設定します。 |
FeatureStoreName | string | はい | `FeatureStoreConfs` で定義された FeatureStore インスタンスのカスタム名。例: `pairec-fs`。 |
FeatureKey | string | はい | フィーチャーテーブルのクエリに使用されるフィーチャー。 `FeatureKey` は、ルックアップに使用するユーザーまたはアイテムのフィールドを指定します。たとえば、`user:uid` はユーザーから `uid` プロパティの値を取得し、`item:id` はアイテムから `id` プロパティの値を取得します。 |
FeatureStoreModelName | string | はい | PAI-FeatureStore のモデルフィーチャー名。 |
FeatureStoreEntityName | string | はい | PAI-FeatureStore のエンティティ名。 |
FeatureStore | string | はい | 取得したフィーチャーが保存される場所。有効な値: `user` または `item`。 |
CacheSize | integer | いいえ | ローカルにキャッシュするフィーチャーエントリの数。デフォルト値は 0 で、データがキャッシュされないことを意味します。 |
CacheTime | integer | いいえ | ローカルにキャッシュされたフィーチャーエントリの有効期限 (秒単位)。このパラメーターは `CacheSize` が 0 より大きい場合にのみ有効です。デフォルト値は 3600 です。 |
上記の構成では、rank_v1 モデルフィーチャーからユーザーエンティティのすべてのフィーチャーを取得します。アイテムエンティティのフィーチャーを取得するには、パラメーターを次のように構成します:
{
"FeatureConfs" :{
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "item:id",
"FeatureStoreModelName": "rank_v1",
"FeatureStoreEntityName": "item",
"FeatureStore": "item"
}
}]
}
}
}ただし、多くの場合、特定のフィーチャービューからフィーチャーのサブセットのみを取得する必要があります。たとえば、user_table_preprocess_all_feature_v1 という名前のフィーチャービューからすべてのフィーチャーを取得し、それらをユーザープロパティに保存するには、パラメーターを次のように構成します:
{
"FeatureConfs" :{
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "user:uid",
"FeatureStoreViewName": "user_table_preprocess_all_feature_v1",
"UserSelectFields": "*",
"FeatureStore": "user"
}
},
{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "item:id",
"FeatureStoreViewName": "item_table_preprocess_all_feature_v1",
"ItemSelectFields": "author,duration,category",
"FeatureStore": "item"
}
}]
}
}
}フィールド名 | タイプ | 必須 | 説明 |
FeatureStoreViewName | string | はい | フィーチャービューの名前。 |
UserSelectFields | string | いいえ | 取得するユーザーフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。 |
ItemSelectFields | string | いいえ | 取得するアイテムフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。 |
TableStore (OTS)
構成例
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "tablestore",
"TableStoreName": "tablestore_info",
"FeatureKey": "user:uid",
"UserFeatureKeyName": "uid",
"TableStoreTableName": "",
"UserSelectFields": "*",
"FeatureStore": "user"
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "tablestore",
"TableStoreName": "tablestore_info",
"FeatureKey": "item:id",
"ItemFeatureKeyName": "item_id",
"TableStoreTableName": "",
"ItemSelectFields": "*",
"FeatureStore": "item"
},
"Features": []
}
]
}
}
}FeatureLoadConfs/FeatureDaoConf
フィールド名 | タイプ | 必須 | 説明 |
AdapterType | string | はい | データソースのタイプ。値を `tablestore` に設定します。 |
TableStoreName | string | はい | `TableStoreConfs` で定義された Tablestore インスタンスのカスタム名。例: `tablestore_info`。 |
FeatureKey | string | はい | フィーチャーテーブルのクエリに使用されるフィーチャー。 `FeatureKey` は、ルックアップに使用するユーザーまたはアイテムのフィールドを指定します。たとえば、`user:uid` はユーザーから `uid` プロパティの値を取得し、`item:pair_id` はアイテムから `pair_id` プロパティの値を取得します。 |
UserFeatureKeyName | string | いいえ | ユーザーフィーチャーテーブルのプライマリキーフィールド。 |
ItemFeatureKeyName | string | いいえ | アイテムフィーチャーテーブルのプライマリキーフィールド。 |
TableStoreTableName | string | はい | Tablestore のフィーチャーテーブルの名前。 |
UserSelectFields | string | いいえ | 取得するユーザーフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。 |
ItemSelectFields | string | いいえ | 取得するアイテムフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。 |
FeatureStore | string | はい | 取得したフィーチャーが保存される場所。有効な値: `user` または `item`。 |
CacheSize | integer | いいえ | ローカルにキャッシュするフィーチャーエントリの数。デフォルト値は 0 で、データがキャッシュされないことを意味します。 |
CacheTime | integer | いいえ | ローカルにキャッシュされたフィーチャーエントリの有効期限 (秒単位)。このパラメーターは `CacheSize` が 0 より大きい場合にのみ有効です。デフォルト値は 3600 です。 |
Redis
Redis は柔軟なデータストレージを提供します。キーバリュー (KV) フォーマットを使用でき、値は CSV または JSON フォーマットにすることができます。また、HASH フォーマットを使用して、フィールド名を指定することですべてまたは一部のデータを取得することもできます。
構成例
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "user_redis",
"RedisPrefix": "UF_V2_",
"FeatureKey": "user:uid",
"FeatureStore": "user",
"RedisDataType": "string",
"RedisFieldType": "csv",
"RedisValueDelimeter": ","
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "item_redis",
"RedisPrefix": "IF_V2_FM_",
"FeatureKey": "item:id",
"FeatureStore": "item",
"RedisDataType": "string",
"RedisFieldType": "json"
},
"Features": [ ]
}
]
}
}
}上記の例では、ユーザーフィーチャーとアイテムフィーチャーは両方とも KV フォーマットで取得されます。ただし、ユーザーフィーチャーは `RedisValueDelimeter` で指定された区切り文字を持つ CSV として保存され、アイテムフィーチャーは JSON として保存されます。
次の例は、HASH フォーマットでフィーチャーデータを取得する方法を示しています。
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "user_redis",
"RedisPrefix": "UF_V2_",
"FeatureKey": "user:uid",
"FeatureStore": "user",
"RedisDataType": "hash",
"UserSelectFields": "*"
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "item_redis",
"RedisPrefix": "IF_V2_FM_",
"FeatureKey": "item:id",
"FeatureStore": "item",
"RedisDataType": "hash",
"ItemSelectFields": "city,author,duration"
},
"Features": []
}
]
}
}
}FeatureLoadConfs/FeatureDaoConf
フィールド名 | タイプ | 必須 | 説明 |
AdapterType | string | はい | データソースのタイプ。値を `redis` に設定します。 |
RedisName | string | はい | `RedisConfs` で定義された Redis インスタンスのカスタム名。例: `redis_info`。 |
RedisPrefix | string | はい | キープレフィックス。 |
FeatureKey | string | はい | フィーチャーテーブルのクエリに使用されるフィーチャー。 `FeatureKey` は、ルックアップに使用するユーザーまたはアイテムのフィールドを指定します。たとえば、`user:uid` はユーザーから `uid` プロパティの値を取得し、`item:pair_id` はアイテムから `pair_id` プロパティの値を取得します。 |
UserSelectFields | string | いいえ | 取得するユーザーフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。このパラメーターは `RedisDataType` が `hash` に設定されている場合にのみ有効です。 |
ItemSelectFields | string | いいえ | 取得するアイテムフィーチャー。`*` を使用してすべてのフィーチャーを取得するか、`feature1,feature2` のようにカンマ区切りのリストでフィーチャーを指定します。このパラメーターは `RedisDataType` が `hash` に設定されている場合にのみ有効です。 |
FeatureStore | string | はい | 取得したフィーチャーが保存される場所。有効な値: `user` または `item`。 |
RedisDataType | string | はい | データストレージフォーマット。 2. hash は HASH を指定します。 |
RedisFieldType | string | いいえ | 有効な値は `csv` または `json` です。このパラメーターは `RedisDataType` が `string` に設定されている場合にのみ有効です。 |
RedisValueDelimeter | string | いいえ | データ区切り文字。このパラメーターは `RedisFieldType` が `csv` に設定されている場合にのみ有効です。 |
CacheSize | integer | いいえ | ローカルにキャッシュするフィーチャーエントリの数。デフォルト値は 0 で、データがキャッシュされないことを意味します。 |
CacheTime | integer | いいえ | ローカルにキャッシュされたフィーチャーエントリの有効期限 (秒単位)。このパラメーターは `CacheSize` が 0 より大きい場合にのみ有効です。デフォルト値は 3600 です。 |
フィーチャー変換
フィーチャーが読み込まれた後、それらを変換したり新しいフィーチャーを生成したりして、さらに処理する必要がある場合があります。エンジンには、以下で説明するいくつかの組み込みフィーチャー変換タイプがあります。
FeatureType (変換タイプ) | 説明 |
new_feature | 完全に新しいフィーチャーを生成します。 |
raw_feature | 既存のフィーチャーに基づいて新しいフィーチャーを作成します。 |
compose_feature | 複合フィーチャー。複数の既存のフィーチャーを組み合わせて新しいフィーチャーを生成します。 |
new_feature
day_h と week_day フィーチャーは、ユーザーフィーチャーによく使用されます。これら 2 つのフィーチャーはリアルタイムで生成されます。
{
"FeatureType": "new_feature",
"FeatureName": "day_h",
"Normalizer": "hour_in_day",
"FeatureStore": "user"
}{
"FeatureType": "new_feature",
"FeatureName": "week_day",
"Normalizer": "weekday",
"FeatureStore": "user"
}FeatureName: 生成されるフィーチャーの名前。
FeatureStore: フィーチャーがユーザー側とアイテム側のどちらに保存されるかを指定します。有効な値: user または item。
乱数を生成します。乱数は、確率に基づく判断に使用されることがあります。次の構成では、[0, 100) の範囲の値を持つ rand_int_v フィーチャーが生成されます。
{
"FeatureType": "new_feature",
"FeatureName": "rand_int_v",
"Normalizer": "random",
"FeatureStore": "user"
}静的フィールドを生成します。次の構成では、値が ALRC の alg という名前のフィーチャーが生成されます。
{
"FeatureType": "new_feature",
"FeatureStore": "user",
"Normalizer": "const_value",
"FeatureValue": "ALRC",
"FeatureName": "alg"
}式に基づいてフィーチャーを生成します。式は https://github.com/Knetic/govaluate ライブラリによって解釈および実行されます。
次の構成では、recall_name が配列内にあるかどうかをチェックすることで、is_retarget という名前のブール値フィーチャーが生成されます。ブール値フィーチャーの値は 1 または 0 で表されます。
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"FeatureSource": "item:recall_name",
"Normalizer": "expression",
"Expression": "recall_name in ('retarget_u2i','realtime_retarget_click')",
"FeatureName": "is_retarget"
}Expression: 式のルールの詳細については、「https://github.com/Knetic/govaluate/blob/master/MANUAL.md」をご参照ください。
FeatureSource: フィーチャー値のソースを指定します。たとえば、item:recall_name は、値がアイテムの recall_name フィーチャーから取得されることを示します。式に複数のアイテムプロパティが含まれている場合は、FeatureSource を省略できます。この場合、すべてのアイテムプロパティが計算のために式に渡されます。
currentTime を使用して、現在のシステムの Unix タイムスタンプ (秒単位) を参照できます。
式 (V2) に基づいてフィーチャーを生成します。このバージョンは、より柔軟な構文と優れたパフォーマンスを提供します。式を解釈して実行するために https://github.com/expr-lang/expr ライブラリを使用します。これは、式を使用するための推奨されるメソッドです。
上記の式は次のように書き換えることができます:
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"Normalizer": "expr",
"Expression": "item.recall_name in ['retarget_u2i','realtime_retarget_click']",
"FeatureName": "is_retarget"
}Expression: 式のルールの詳細については、「https://expr-lang.org/docs/language-definition」をご参照ください。
アイテム側のフィーチャーには、item. プレフィックスを追加できます。ユーザー側のフィーチャーには、user. プレフィックスを追加できます。item.recall_name は、アイテム側の recall_name フィーチャーを参照します。FeatureStore が item に設定されている場合、式でユーザー側のフィーチャーを参照することもできます。
currentTime を使用して、現在のシステムの Unix タイムスタンプ (秒単位) を参照できます。
ユーザー側とアイテム側の両方のフィーチャーを使用するには、次の例をご参照ください:
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"Normalizer": "expr",
"Expression": "user.user_index - item.index",
"FeatureName": "index_delta"
}raw_feature
既存のフィーチャーを変換します。
{
"FeatureType": "raw_feature",
"FeatureStore": "user",
"FeatureSource": "user:age",
"RemoveFeatureSource": true,
"FeatureName": "age_v2"
}この構成は、ユーザーの age フィーチャーに基づいて age_v2 という名前の新しいフィーチャーを生成します。age フィーチャーの値が age_v2 に割り当てられます。RemoveFeatureSource パラメーターは、元のソースフィーチャー (age) を削除するかどうかを決定します。
user:age はユーザー側のフィーチャーを使用します。アイテム側のフィーチャーを使用するには、item:city のように指定します。
compose_feature
複合フィーチャーを生成します。
{
"FeatureType": "compose_feature",
"FeatureStore": "item",
"FeatureSource": "user:category,item:author",
"FeatureName": "item_author"
}`FeatureSource` で複数のフィーチャーを参照するには、ユーザーフィーチャーに `
user:` プレフィックスを追加し、アイテムフィーチャーに `item:` プレフィックスを追加します。新しいフィーチャー `item_author` は、ソースフィーチャーの値をアンダースコア (`
_`) で結合することによって生成されます。たとえば、`user:category` の値が `category1` で、`item:author` の値が `author1` の場合、`item_author` の値は `category1_author1` になります。また、new_feature の式 (V2) メソッドを使用して、このタイプの複合フィーチャーをより柔軟に作成することもできます。
組み込み式関数
new_feature セクションでは、式ベースのメソッドは式を使用して新しいフィーチャーを生成します。エンジンは、式で直接使用できる次の組み込みユーザー定義関数も提供します。
関数名 | 関数シグネチャ | 説明 |
getString | getString(a, b) | a が空の値でない場合は a を返します。それ以外の場合は b を返します。 |
trim | trim(str, cutset) | `str` から `cutset` に含まれるすべての先頭および末尾の文字を削除します。 |
trimPrefix | trimPrefix(str, cutset) | `str` から `cutset` に含まれる先頭の文字を削除します。 |
replace | replace(str, old, new) | `str` 内の `old` 文字列の出現箇所を `new` 文字列に置き換えます。 |
round | round(number) round(number, places) |
|
hash32 | hash32(str) | murmur3.Sum32 を使用するハッシュアルゴリズム。 |
log | log(number) | 数値の自然対数 (底 e) を計算します。 |
log10 | log10(number) | 数値の常用対数 (底 10) を計算します。 |
log2 | log2(number) | 数値の二進対数 (底 2) を計算します。 |
pow | pow(base, exponent) | 数値のべき乗を計算します。 |
s2CellID | s2CellID(lat,lng) s2CellID(lat, lng, level) |
|
s2CellNeighbors | s2CellNeighbors(lat,lng) s2CellNeighbors(lat,lng, level) |
|
geoHash | geoHash(lat, lng) geoHash(lat, lng, precision) |
|
geoHashWithNeighbors | geoHashWithNeighbors(lat,lng) geoHashWithNeighbors(lat, lng, precision) |
|
haversine | haversine(lng1, lat1, lng2, lat2) |
|
sphereDistance | sphereDistance(lng1, lat1, lng2, lat2) |
|