Topik ini menjelaskan cara mengonfigurasi pemuatan fitur pengguna atau item.
Konfigurasi fitur berkorespondensi dengan FeatureConfs dalam ikhtisar konfigurasi. FeatureConfs merupakan struktur Map[string]object dengan kunci berupa nama skenario. Anda dapat mengonfigurasi fitur yang berbeda untuk skenario yang berbeda.
Memuat fitur
Sebelum fine-ranking, Anda harus mengambil data fitur pengguna atau item dari sumber fitur.
Dalam beberapa kasus, data fitur yang diambil memerlukan pemrosesan lebih lanjut, misalnya dengan menghasilkan fitur baru dari fitur yang sudah ada atau menggabungkan beberapa fitur.
Fitur dapat dimuat dari berbagai sumber data, seperti Hologres, Redis, Tablestore (OTS), dan PAI-FeatureStore.
Hologres
Contoh konfigurasi
{
"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: Menentukan apakah fitur dimuat secara asinkron. Fitur ini memungkinkan pemuatan fitur secara konkuren ketika beberapa FeatureLoadConfs dikonfigurasi.
FeatureLoadConfs/FeatureDaoConf
Nama bidang | Tipe | Wajib | Deskripsi |
AdapterType | string | Ya | Jenis sumber data. Tetapkan nilainya ke `hologres`. |
HologresName | string | Ya | Nama kustom instans Hologres yang didefinisikan dalam `HologresConfs`. Misalnya, `holo_info`. |
FeatureKey | string | Ya | Fitur yang digunakan untuk mengkueri tabel fitur. `FeatureKey` menentukan bidang mana dari pengguna atau item yang digunakan untuk pencarian. Misalnya, `user:uid` mengambil nilai properti `uid` dari pengguna, dan `item:id` mengambil nilai properti `id` dari item. |
UserFeatureKeyName | string | Ya | Bidang kunci utama tabel fitur pengguna. |
ItemFeatureKeyName | string | Ya | Bidang kunci utama tabel fitur item. |
HologresTableName | string | Ya | Nama tabel fitur di Hologres. |
UserSelectFields | string | Tidak | Fitur pengguna yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. |
ItemSelectFields | string | Tidak | Fitur item yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. |
FeatureStore | string | Ya | Lokasi tempat fitur yang diambil disimpan. Nilai yang valid: `user` atau `item`. |
CacheSize | integer | Tidak | Jumlah entri fitur yang di-cache secara lokal. Nilai default adalah 0, yang berarti data tidak di-cache. |
CacheTime | integer | Tidak | Waktu kedaluwarsa untuk entri fitur yang di-cache secara lokal, dalam detik. Parameter ini hanya berlaku jika `CacheSize` lebih besar dari 0. Nilai default adalah 3600. |
PAI-FeatureStore
Untuk informasi selengkapnya tentang cara mengonfigurasi platform PAI-FeatureStore, lihat Ikhtisar FeatureStore.
Contoh konfigurasi
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "user:uid",
"FeatureStoreModelName": "rank_v1",
"FeatureStoreEntityName": "user",
"FeatureStore": "user"
}
}
]
}
}
}FeatureLoadConfs/FeatureDaoConf
Nama Bidang | Tipe | Wajib | Deskripsi |
AdapterType | string | Ya | Jenis sumber data. Tetapkan nilainya ke `featurestore`. |
FeatureStoreName | string | Ya | Nama kustom instans FeatureStore yang didefinisikan dalam `FeatureStoreConfs`. Misalnya, `pairec-fs`. |
FeatureKey | string | Ya | Fitur yang digunakan untuk mengkueri tabel fitur. `FeatureKey` menentukan bidang mana dari pengguna atau item yang digunakan untuk pencarian. Misalnya, `user:uid` mengambil nilai properti `uid` dari pengguna, dan `item:id` mengambil nilai properti `id` dari item. |
FeatureStoreModelName | string | Ya | Nama fitur model di PAI-FeatureStore. |
FeatureStoreEntityName | string | Ya | Nama entitas di PAI-FeatureStore. |
FeatureStore | string | Ya | Lokasi tempat fitur yang diambil disimpan. Nilai yang valid: `user` atau `item`. |
CacheSize | integer | Tidak | Jumlah entri fitur yang di-cache secara lokal. Nilai default adalah 0, yang berarti data tidak di-cache. |
CacheTime | integer | Tidak | Waktu kedaluwarsa untuk entri fitur yang di-cache secara lokal, dalam detik. Parameter ini hanya berlaku jika `CacheSize` lebih besar dari 0. Nilai default adalah 3600. |
Konfigurasi di atas mengambil semua fitur entitas pengguna dari fitur model rank_v1. Untuk mengambil fitur entitas item, konfigurasikan parameter sebagai berikut:
{
"FeatureConfs" :{
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "item:id",
"FeatureStoreModelName": "rank_v1",
"FeatureStoreEntityName": "item",
"FeatureStore": "item"
}
}]
}
}
}Namun, sering kali Anda hanya perlu mengambil sebagian fitur dari tampilan fitur tertentu. Misalnya, untuk mengambil semua fitur dari tampilan fitur bernama user_table_preprocess_all_feature_v1 dan menyimpannya dalam properti pengguna, konfigurasikan parameter sebagai berikut:
{
"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"
}
}]
}
}
}Nama bidang | Tipe | Wajib | Deskripsi |
FeatureStoreViewName | string | Ya | Nama tampilan fitur. |
UserSelectFields | string | Tidak | Fitur pengguna yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. |
ItemSelectFields | string | Tidak | Fitur item yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. |
TableStore(OTS)
Contoh konfigurasi
{
"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
Nama bidang | Tipe | Wajib | Deskripsi |
AdapterType | string | Ya | Jenis sumber data. Tetapkan nilainya ke `tablestore`. |
TableStoreName | string | Ya | Nama kustom instans Tablestore yang didefinisikan dalam `TableStoreConfs`. Misalnya, `tablestore_info`. |
FeatureKey | string | Ya | Fitur yang digunakan untuk mengkueri tabel fitur. `FeatureKey` menentukan bidang mana dari pengguna atau item yang digunakan untuk pencarian. Misalnya, `user:uid` mengambil nilai properti `uid` dari pengguna, dan `item:pair_id` mengambil nilai properti `pair_id` dari item. |
UserFeatureKeyName | string | Tidak | Bidang kunci utama tabel fitur pengguna. |
ItemFeatureKeyName | string | Tidak | Bidang kunci utama tabel fitur item. |
TableStoreTableName | string | Ya | Nama tabel fitur di Tablestore. |
UserSelectFields | string | Tidak | Fitur pengguna yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. |
ItemSelectFields | string | Tidak | Fitur item yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. |
FeatureStore | string | Ya | Lokasi tempat fitur yang diambil disimpan. Nilai yang valid: `user` atau `item`. |
CacheSize | integer | Tidak | Jumlah entri fitur yang di-cache secara lokal. Nilai default adalah 0, yang berarti data tidak di-cache. |
CacheTime | integer | Tidak | Waktu kedaluwarsa untuk entri fitur yang di-cache secara lokal, dalam detik. Parameter ini hanya berlaku jika `CacheSize` lebih besar dari 0. Nilai default adalah 3600. |
Redis
Redis menyediakan penyimpanan data yang fleksibel. Anda dapat menggunakan format key-value (KV), di mana nilai dapat berupa CSV atau JSON. Anda juga dapat menggunakan format HASH untuk mengambil semua atau sebagian data dengan menentukan nama bidang.
Contoh konfigurasi
{
"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": [ ]
}
]
}
}
}Pada contoh di atas, fitur pengguna dan fitur item keduanya diambil dalam format KV. Namun, fitur pengguna disimpan sebagai CSV dengan pemisah yang ditentukan oleh RedisValueDelimeter, sedangkan fitur item disimpan sebagai JSON.
Contoh berikut menunjukkan cara mengambil data fitur dalam format 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
Nama bidang | Tipe | Wajib | Deskripsi |
AdapterType | string | Ya | Jenis sumber data. Tetapkan nilainya ke `redis`. |
RedisName | string | Ya | Nama kustom instans Redis yang didefinisikan dalam `RedisConfs`. Misalnya, `redis_info`. |
RedisPrefix | string | Ya | Awalan kunci. |
FeatureKey | string | Ya | Fitur yang digunakan untuk mengkueri tabel fitur. `FeatureKey` menentukan bidang mana dari pengguna atau item yang digunakan untuk pencarian. Misalnya, `user:uid` mengambil nilai properti `uid` dari pengguna, dan `item:pair_id` mengambil nilai properti `pair_id` dari item. |
UserSelectFields | string | Tidak | Fitur pengguna yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. Parameter ini hanya berlaku ketika `RedisDataType` diatur ke `hash`. |
ItemSelectFields | string | Tidak | Fitur item yang akan diambil. Gunakan `*` untuk mengambil semua fitur, atau tentukan fitur dalam daftar yang dipisahkan koma, seperti `feature1,feature2`. Parameter ini hanya berlaku ketika `RedisDataType` diatur ke `hash`. |
FeatureStore | string | Ya | Lokasi tempat fitur yang diambil disimpan. Nilai yang valid: `user` atau `item`. |
RedisDataType | string | Ya | Format penyimpanan data. 2. hash menentukan HASH. |
RedisFieldType | string | Tidak | Nilai yang valid adalah `csv` atau `json`. Parameter ini hanya berlaku ketika `RedisDataType` diatur ke `string`. |
RedisValueDelimeter | string | Tidak | Pemisah data. Parameter ini hanya berlaku ketika `RedisFieldType` diatur ke `csv`. |
CacheSize | integer | Tidak | Jumlah entri fitur yang di-cache secara lokal. Nilai default adalah 0, yang berarti data tidak di-cache. |
CacheTime | integer | Tidak | Waktu kedaluwarsa untuk entri fitur yang di-cache secara lokal, dalam detik. Parameter ini hanya berlaku jika `CacheSize` lebih besar dari 0. Nilai default adalah 3600. |
Transformasi fitur
Setelah fitur dimuat, Anda mungkin perlu memprosesnya lebih lanjut dengan mentransformasikannya atau menghasilkan fitur baru. Mesin menyediakan beberapa jenis transformasi fitur bawaan, yang dijelaskan di bawah ini.
FeatureType (Jenis transformasi) | Deskripsi |
new_feature | Menghasilkan fitur yang benar-benar baru. |
raw_feature | Membuat fitur baru berdasarkan fitur yang sudah ada. |
compose_feature | Fitur komposit. Menggabungkan beberapa fitur yang sudah ada untuk menghasilkan fitur baru. |
new_feature
Fitur day_h dan week_day sering digunakan untuk fitur pengguna. Kedua fitur ini dihasilkan secara real-time.
{
"FeatureType": "new_feature",
"FeatureName": "day_h",
"Normalizer": "hour_in_day",
"FeatureStore": "user"
}{
"FeatureType": "new_feature",
"FeatureName": "week_day",
"Normalizer": "weekday",
"FeatureStore": "user"
}FeatureName: Nama fitur yang dihasilkan.
FeatureStore: Menentukan apakah fitur disimpan di sisi pengguna atau item. Nilai yang valid: user atau item.
Hasilkan bilangan acak. Bilangan acak kadang-kadang digunakan untuk penilaian berbasis probabilitas. Konfigurasi berikut menghasilkan fitur rand_int_v dengan nilai dalam rentang [0, 100).
{
"FeatureType": "new_feature",
"FeatureName": "rand_int_v",
"Normalizer": "random",
"FeatureStore": "user"
}Hasilkan bidang statis. Konfigurasi berikut menghasilkan fitur bernama alg dengan nilai ALRC.
{
"FeatureType": "new_feature",
"FeatureStore": "user",
"Normalizer": "const_value",
"FeatureValue": "ALRC",
"FeatureName": "alg"
}Hasilkan fitur berdasarkan ekspresi. Ekspresi diinterpretasikan dan dieksekusi oleh pustaka https://github.com/Knetic/govaluate.
Konfigurasi berikut menghasilkan fitur boolean bernama is_retarget dengan memeriksa apakah recall_name berada dalam larik. Nilai fitur boolean direpresentasikan oleh 1 atau 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: Untuk informasi selengkapnya tentang aturan ekspresi, lihat https://github.com/Knetic/govaluate/blob/master/MANUAL.md.
FeatureSource: Menentukan sumber nilai fitur. Misalnya, item:recall_name menunjukkan bahwa nilai berasal dari fitur recall_name item. Jika ekspresi berisi beberapa properti item, Anda dapat menghilangkan FeatureSource. Dalam hal ini, semua properti item diteruskan ke ekspresi untuk perhitungan.
Anda dapat menggunakan currentTime untuk merujuk pada timestamp Unix sistem saat ini dalam detik.
Hasilkan fitur berdasarkan ekspresi (V2). Versi ini menawarkan sintaks yang lebih fleksibel dan kinerja yang lebih baik. Ekspresi diinterpretasikan dan dieksekusi menggunakan pustaka https://github.com/expr-lang/expr. Ini adalah metode yang direkomendasikan untuk menggunakan ekspresi.
Ekspresi sebelumnya dapat ditulis ulang sebagai berikut:
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"Normalizer": "expr",
"Expression": "item.recall_name in ['retarget_u2i','realtime_retarget_click']",
"FeatureName": "is_retarget"
}Expression: Untuk informasi selengkapnya tentang aturan ekspresi, lihat https://expr-lang.org/docs/language-definition.
Untuk fitur sisi item, Anda dapat menambahkan awalan item.. Untuk fitur sisi pengguna, Anda dapat menambahkan awalan user.. item.recall_name merujuk pada fitur recall_name di sisi item. Ketika FeatureStore diatur ke item, Anda juga dapat mereferensikan fitur sisi pengguna dalam ekspresi.
Anda dapat menggunakan currentTime untuk merujuk pada timestamp Unix sistem saat ini dalam detik.
Untuk menggunakan fitur sisi pengguna dan sisi item sekaligus, lihat contoh berikut:
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"Normalizer": "expr",
"Expression": "user.user_index - item.index",
"FeatureName": "index_delta"
}raw_feature
Transformasikan fitur yang sudah ada.
{
"FeatureType": "raw_feature",
"FeatureStore": "user",
"FeatureSource": "user:age",
"RemoveFeatureSource": true,
"FeatureName": "age_v2"
}Konfigurasi ini menghasilkan fitur baru bernama age_v2 berdasarkan fitur age pengguna. Nilai fitur age ditetapkan ke age_v2. Parameter RemoveFeatureSource menentukan apakah fitur sumber asli (age) dihapus.
user:age menggunakan fitur sisi pengguna. Untuk menggunakan fitur sisi item, Anda akan menentukannya sebagai item:city.
compose_feature
Menghasilkan fitur komposit.
{
"FeatureType": "compose_feature",
"FeatureStore": "item",
"FeatureSource": "user:category,item:author",
"FeatureName": "item_author"
}Untuk mereferensikan beberapa fitur dalam FeatureSource, tambahkan awalan
user:untuk fitur pengguna dan awalanitem:untuk fitur item.Fitur baru, item_author, dihasilkan dengan menggabungkan nilai fitur sumber menggunakan garis bawah (_). Misalnya, jika nilai user:category adalah category1 dan nilai item:author adalah author1, maka nilai item_author menjadi
category1_author1.Anda juga dapat membuat jenis fitur komposit ini secara lebih fleksibel menggunakan metode ekspresi (V2) untuk new_feature.
Fungsi ekspresi bawaan
Pada bagian new_feature, metode berbasis ekspresi menggunakan ekspresi untuk menghasilkan fitur baru. Mesin juga menyediakan fungsi user-defined bawaan berikut yang dapat Anda gunakan langsung dalam ekspresi.
Nama fungsi | Tanda tangan fungsi | Deskripsi |
getString | getString(a, b) | Jika a bukan nilai kosong, mengembalikan a. Jika tidak, mengembalikan b. |
trim | trim(str, cutset) | Menghapus semua karakter awal dan akhir dari `str` yang terdapat dalam `cutset`. |
trimPrefix | trimPrefix(str, cutset) | Menghapus karakter awal dari `str` yang terdapat dalam `cutset`. |
replace | replace(str, old, new) | Mengganti kemunculan string `old` dengan string `new` dalam `str`. |
round | round(number) round(number, places) |
|
hash32 | hash32(str) | Algoritma hash yang menggunakan murmur3.Sum32. |
log | log(number) | Menghitung logaritma natural (basis e) dari suatu angka. |
log10 | log10(number) | Menghitung logaritma umum (basis 10) dari suatu angka. |
log2 | log2(number) | Menghitung logaritma biner (basis 2) dari suatu angka. |
pow | pow(base, exponent) | Menghitung pangkat suatu angka. |
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) |
|