すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:改良されたSWING類似アルゴリズムを使用する

最終更新日:Jan 03, 2025

このトピックでは、改善されたSliding Window and Incremental Generation (SWING) 類似アルゴリズムの動作、ツールキットのダウンロード手順、ツールキットのパラメーターの説明、およびFAQについて説明します。

はじめに改善

改善ポイント1: 共通の隣人の数の制限

元のSWING類似性アルゴリズムは、同時に2つのアイテムと対話するユーザーの数が極端に少ないシナリオには適していません。 統計的な観点から、不十分なデータは結果に重大なエラーをもたらします。 同時に2つのアイテムと対話するユーザの数が極めて少ない場合、SWING類似性アルゴリズムは、重大な誤差を伴う結果を生成し得る。

次のセクションでは、例を示します。

次の図は、中〜低周波のビデオA、ニッチビデオB、人気ビデオC、X1からX10までの10人のサッカーファン、および音楽愛好家Yを示しています。たとえば、10人のサッカーファンがビデオAとCに関連する200のビデオを視聴します。ファンX1の友人はニッチなビデオBを推薦するが、ファンX1はビデオBが好きではなく、ビデオAが好きである。音楽愛好家Yは、ビデオAおよびBを含む様々な音楽関連のビデオを見る。この場合、2人のユーザのみがビデオA及びBを同時に視聴する。 その結果、SWING類似アルゴリズムを用いて計算されるスコアはs (a, B) = 0.33 > s(A,C) = 0.22。 この場合、ユーザがビデオaを見ているとき、ビデオCを推薦することは、ビデオBを推薦することよりも良い。

image.png

解決策: この問題は、2種類のビデオを同時に視聴する少数のユーザーが原因です。 この問題を解決するには、2種類のビデオを同時に視聴するユーザーの数に基づいて結果を処理する必要があります。 解決策は、ノイズ除去を達成するために、SWING類似性アルゴリズムに基づく式にId(.) インジケータ関数を追加することである。 人気のあるユーザーやアイテムを抑制するために、行動重みも導入されます。 改善された式:

image.png

改善ポイント2: i2iシナリオのサポート

i2iシナリオでは、SWINGアルゴリズムは、グローバルクリックとシーン固有クリックの共起を学習して、ユーザがシーン内でどのアイテムをクリックできるかを予測することによって最適化される。 これは、次の式を使用して表されます。

image.png

改良されたSWING類似性アルゴリズムの使用

  1. swing -1.0.jarのアルゴリズムパッケージをオンプレミスのマシンにダウンロードします。

パッケージをダウンロードできない場合は、上記のリンクをブラウザにコピーしてパッケージを開きます。

  1. MaxComputeプロジェクトに.jarパッケージを追加します。

    image.png

    注: プロジェクトのデプロイは1回だけです。

入出力フォーマット

パーティションテーブルなどの入力テーブルには、少なくとも2つの列を含める必要があります。

  • user_id: BIGINTまたはSTRINGタイプのユーザーIDまたはセッションID (推奨) 。コードではチェックされていません。

  • item_list: STRING型のアイテムのリスト。 アイテムはセミコロン (;) で区切ります。 各アイテムは、BIGINTタイプのIDによって指定される。

各アイテムは、少なくとも3つのフィールド (item_id、norm、timestamp、sceneなど) で構成されます。 item_idは先頭に配置する必要があることに注意してください。

ノルムは、アイテムに対するユーザーのクリック数など、アイテムの最近の人気度を示します。 これは、非常に人気のあるアイテムにペナルティを課し、「ハリーポッター効果」を処理するために使用されるマグニチュードとしても知られています。 ノルムの計算方法がわからない場合、または"アイテムのハリー・ポッター効果は"深刻ではない、このフィールドは空のままにできます。

「ハリーポッター効果」とは、ハリーポッターの本や映画など、非常に人気があり広く知られているプロジェクトが推奨リストを支配し、他のプロジェクトが同じ注目を集めることを困難にする現象を指します。

注: normフィールドの値は、現在の項目にのみ関連しています。 この値は、アイテムのグローバルな人気を示し、現在のユーザーとは関係ありません。 同じ項目のnormフィールドの値は、トレーニングデータセット全体の複数のレコードで一貫している必要があります。

タイムスタンプフィールドは % Y % m % d % H % M % S形式 (たとえば20190805223205) である必要があります。 タイムスタンプフィールドが必要ない場合は、同じタイムスタンプ値を使用して各アイテムのフィールドに入力します。 リスト内のアイテムは、最も早いクリックから最新のクリックまで時系列でリストされている必要があります。

シーンフィールドはオプションです。 このフィールドは、ユーザーがアイテムをクリックするシーンを示し、i2iシナリオを指定するために使用されます。

user_id

item_list

12031602

558448406561,137、20190805223205;585456515773,39397、20190806170331;10200442969,81、20190807223820

3954442742

658448406561,137、20190805223206;485456515773,39397、20190806170335

注: 同じレコードのitem_idフィールドの重複値を項目リストに含めることはできません。 毎日1つの <user,item> ペアのみを保持し、入力テーブルのuser_idフィールドの値を、仮想セッションIDとしてユーザーIDや日付などのconcatに変換することを推奨します。

出力テーブルにはパーティション列を含めることができ、次の列を含める必要があります。

  • item_id: BIGINT型のアイテムID。

  • similar_items: 類似アイテムのリスト。

similar_itemsフィールドは、item_id1,score1,coccur1,ori_score1;item_id2,score2,coccur2,ori_score2;... 形式でなければなりません。 ori_score1は元の類似性スコアであり、score1は最大値に基づいて計算された正規化スコアであり、coccur1は共起数である。

注: 事前に出力テーブルを作成する必要があります。 列のタイプは正しい必要があります。 カスタム列名を指定できます。

サンプル結果:

item_id

similar_items

1084315

7876717,0.000047,2、0.003601;6929557,0.000250,2、0.019373;1084342,0.000780,4、0.060325;1089552,0.000963,4、0.074516;1083467,0.008233,5、0.637016;66042,0.012925,6、1.000000

1090195

1090172,0.015136,1,1.000000

参照コマンド

DataWorksで、ODPS MRノードを作成し、次のコマンドを実行してジョブを送信します。 ODPS SQLノードを作成すると、エラーが発生する可能性があります。

jar [<GENERIC_OPTIONS>] <MAIN_CLASS> [ARGS];
        -conf <configuration_file>         Specify an application configuration file
        -resources <resource_name_list>    file\table resources used in mapper or reducer, seperate by comma
        -classpath <local_file_list>       classpaths used to run mainClass
        -D<name>=<value>                  Property value pair, which will be used to run mainClass
ARGS: <in_table/input_partition> <out_table/output_partition>

例:

パブリッククラウド (帯域外) ユーザー向けのコマンド:

##@resource_reference{"swing-1.0.jar"}
jar -resources swing-1.0.jar 
  -classpath swing-1.0.jar 
  -DtopN=150
  -Dmax.user.behavior.count=500
  -Dcommon.user.number.threshold=0
  -Dmax.user.per.item=600
  -Ddebug.info.print.number=10
  -Dalpha1=5
  -Dalpha2=1
  -Dbeta=0.3
  -Dodps.stage.mapper.split.size=1
  com.alibaba.algo.PaiSwing
  swing_click_input_table/ds=${bizdate}
  swing_output/ds=${bizdate}
;

注: 完全なコードには、コメントの最初の行を含める必要があります。 パラメーター値を-D<key >=< value> 形式で指定します。

インバンドユーザーのコマンド:

jar -resources swing-1.0.jar 
  -classpath http://schedule@{env}inside.cheetah.alibaba-inc.com/scheduler/res?id=XXXXX
  -DtopN=150
  -Dmax.user.behavior.count=500
  -Dcommon.user.number.threshold=0
  -Dmax.user.per.item=600
  -Ddebug.info.print.number=10
  -Dalpha1=5
  -Dalpha2=1
  -Dbeta=0.3
  -Dodps.stage.mapper.split.size=1
  com.alibaba.algo.PaiSwing
  swing_click_input_table/ds=${bizdate}
  swing_output/ds=${bizdate}
;

パラメータ

パラメーター

の説明

タイプ

common.us er.number.threshold

2つのアイテムを同時に操作するユーザーの数。 このパラメーターを非常に高い値に設定すると、類似アイテムの数は非常に少なくなります。 ビジネス要件に基づいてこのパラメーターを設定します。

0

max.us er.per.item

各アイテムのK近傍 (KNN) の最大数。

700

max.us er.behavior.count

各ユーザーに関連付けられているアイテムの最大数。 アイテムの数が制限を超えると、ユーザーに関連付けられている最新のアイテムがタイムスタンプに基づいて保持されます。

600

debug.info.print.number

デバッグ情報を出力するレコードの数。

10

alpha1

SWINGアルゴリズムパラメーターをします。 詳細については、式 [1] を参照してください。

5

ベータ版

SWINGアルゴリズムパラメーターをします。 詳細については、式 [1] を参照してください。

0.3

alpha2

SWINGアルゴリズムパラメーターをします。 詳細については、式 [1] を参照してください。

1

user.column.name

ユーザーまたはセッションID列の名前。

user_id

item.list.column.name

アイテムリストの列の名前。

item_list

topN

トリガーアイテムごとに保持されるKNNの最大数。

200

odps.stage.mapper.split.size

各マッパによって処理されるデータの量。 単位:MB。

256

odps.stage.reducer.num

アイテムの類似性を計算するために必要なレデューサーの数。

200

item.deリミッター

入力テーブルのアイテムリストの区切り文字です。

;

item.field.delimiter

入力テーブルのアイテム情報の区切り文字。

,

pos_norm

0から始まるアイテムの人気。 例: 1.

1

pos_time

アイテムリストのタイムスタンプフィールドに対応するシリアル番号。0から始まります。 例: 2.

2

pos_scene

アイテムリストのシーンフィールドに対応するシリアル番号。0から始まります。

3

target.scene.name

i2iモデリングに使用されるシーンの名前。

グローバルi2i

max.time.span

隣接する2つのアイテムを2回クリックするまでの最大日数。

1

do_supplement_by_adamic_adar

AdamicまたはAdarアルゴリズムを使用して上位N個の類似項目を決定するかどうかを指定します。

true

FQA

1. java.lang.ClassCastException: com.aliyun.odps.io.LongWritableはcom.aliyun.odps.io.Textにキャストできません

FAILED: ODPS-0123131:User defined function exception - Traceback:
java.lang.ClassCastException: com.aliyun.odps.io.LongWritable cannot be cast to com.aliyun.odps.io.Text
 at com.aliyun.odps.udf.impl.batch.TextBinary.put(TextBinary.java:55)
 at com.aliyun.odps.udf.impl.batch.BaseWritableSerde.put(BaseWritableSerde.java:20)
 at com.aliyun.odps.udf.impl.batch.BatchUDTFCollector.collect(BatchUDTFCollector.java:54)
 at com.aliyun.odps.udf.UDTF.forward(UDTF.java:164)
 at com.aliyun.odps.mapred.bridge.LotTaskUDTF.collect(LotTaskUDTF.java:62)
 at com.aliyun.odps.mapred.bridge.LotReducerUDTF$ReduceContextImpl.write(LotReducerUDTF.java:167)
 at com.aliyun.odps.mapred.bridge.LotReducerUDTF$ReduceContextImpl.write(LotReducerUDTF.java:162)
 at com.aliyun.odps.mapred.bridge.LotReducerUDTF$ReduceContextImpl.write(LotReducerUDTF.java:151)
 at com.alibaba.algo.Paiswing$swingI2IReducer.reduce(Paiswing.java:346)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:497)
 at com.aliyun.odps.mapred.bridge.utils.MapReduceUtils.runReducer(MapReduceUtils.java:160)
 at com.aliyun.odps.mapred.bridge.LotReducerUDTF.run(LotReducerUDTF.java:330)
 at com.aliyun.odps.udf.impl.batch.BatchStandaloneUDTFEvaluator.run(BatchStandaloneUDTFEvaluator.java:53)

出力テーブルのitem_idの値は、BIGINT型である必要があり、STRING型であることはできません。 create tableステートメントのスキーマ情報が正しいことに注意してください。