このトピックでは、改善された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を推薦することよりも良い。
解決策: この問題は、2種類のビデオを同時に視聴する少数のユーザーが原因です。 この問題を解決するには、2種類のビデオを同時に視聴するユーザーの数に基づいて結果を処理する必要があります。 解決策は、ノイズ除去を達成するために、SWING類似性アルゴリズムに基づく式にId(.) インジケータ関数を追加することである。 人気のあるユーザーやアイテムを抑制するために、行動重みも導入されます。 改善された式:
改善ポイント2: i2iシナリオのサポート
i2iシナリオでは、SWINGアルゴリズムは、グローバルクリックとシーン固有クリックの共起を学習して、ユーザがシーン内でどのアイテムをクリックできるかを予測することによって最適化される。 これは、次の式を使用して表されます。
改良されたSWING類似性アルゴリズムの使用
swing -1.0.jarのアルゴリズムパッケージをオンプレミスのマシンにダウンロードします。
パッケージをダウンロードできない場合は、上記のリンクをブラウザにコピーしてパッケージを開きます。
MaxComputeプロジェクトに.jarパッケージを追加します。
注: プロジェクトのデプロイは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
ステートメントのスキーマ情報が正しいことに注意してください。