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

Platform For AI:特徴量生成のベストプラクティス

最終更新日:Nov 01, 2025

Platform for AI (PAI) で FeatureStore を使用して特徴量を生成できます。FeatureStore は、一般的に使用される生成操作を標準化します。いくつかの構成を行うだけで特徴量を生成できます。これにより、特徴量生成が効率的に簡素化されます。特徴量生成は、レコメンデーション、広告、リスク管理、機械学習など、さまざまなシナリオで広く使用されています。このトピックでは、レコメンデーションシナリオでソーステーブルを使用して特徴量とサンプルテーブルを生成する方法について説明します。

前提条件

次の表に記載されている準備が完了していることを確認してください。

サービス

操作

PAI

MaxCompute

DataWorks

1. 準備

ソーステーブルの準備

レコメンデーションシナリオでは、特徴量生成に次の 3 つのソーステーブルが必要です。これらのテーブルを使用して、数百の特徴量を生成できます。これにより、目的に合わせたモデル構築が容易になります。

  • rec_sln_demo_user_table_preprocess_v1: ユーザーテーブル。性別、年齢、都市、フォロワー数などの基本的なユーザー特徴量が含まれます。

  • rec_sln_demo_item_table_preprocess_v1: アイテムテーブル。カテゴリ、作成者、累積クリック数、累積賞賛数などの基本的なアイテム特徴量が含まれます。

  • rec_sln_demo_behavior_table_preprocess_v1: 行動テーブル。行動特徴量が含まれます。たとえば、ユーザーが特定の時点でアイテムをクリックするなどです。

データテーブルは、すべてのユーザーに表示される pai_online_project ワークスペースに保存されます。データテーブルにはシミュレーションデータのみが保存されます。DataWorks で SQL 文を実行して、pai_online_project ワークスペースから MaxCompute プロジェクトに前述のテーブルのデータを同期する必要があります。次のステップを実行します。

  1. DataWorks コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[Data Development & O&M] > [Data Development] をクリックします。

  3. 作成した DataWorks ワークスペースを選択し、[Enter Data Development] をクリックします。

  4. [New] にカーソルを合わせ、[New Node] > [MaxCompute] > [ODPS SQL] を選択します。表示されるページで、ノードパラメーターを構成します。

    パラメーター

    推奨値

    エンジンインスタンス

    作成した MaxCompute エンジンを選択します。

    ノードタイプ

    ODPS SQL

    パス

    Business Flow/Workflow/MaxCompute

    名前

    カスタム名を入力します。

  5. [確認] をクリックします。

  6. 新しいノードの SQL エディターで、次の SQL 文を実行して、pai_online_project ワークスペースから MaxCompute プロジェクトにユーザーテーブル、アイテムテーブル、行動テーブルのデータを同期します。既存の専用リソースグループを選択してデータを同期します。

    • 次の SQL 文を実行して、ユーザーテーブル rec_sln_demo_user_table_preprocess_v1 のデータを同期します。

      CREATE TABLE IF NOT EXISTS rec_sln_demo_user_table_preprocess_v1
      like pai_online_project.rec_sln_demo_user_table_preprocess_v1
      STORED AS ALIORC  
      LIFECYCLE 90;
      
      INSERT OVERWRITE TABLE rec_sln_demo_user_table_preprocess_v1 PARTITION(ds)
      SELECT *
      FROM pai_online_project.rec_sln_demo_user_table_preprocess_v1
      WHERE ds >= '20240530' and ds <='20240605';
    • 次の SQL 文を実行して、アイテムテーブル rec_sln_demo_item_table_preprocess_v1 のデータを同期します。

      CREATE TABLE IF NOT EXISTS rec_sln_demo_item_table_preprocess_v1
      like pai_online_project.rec_sln_demo_item_table_preprocess_v1
      STORED AS ALIORC  
      LIFECYCLE 90;
      
      INSERT OVERWRITE TABLE rec_sln_demo_item_table_preprocess_v1 PARTITION(ds)
      SELECT *
      FROM pai_online_project.rec_sln_demo_item_table_preprocess_v1
      WHERE ds >= '20240530' and ds <='20240605';
    • 次の SQL 文を実行して、行動テーブル rec_sln_demo_behavior_table_preprocess_v1 のデータを同期します。

      CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_preprocess_v1
      like pai_online_project.rec_sln_demo_behavior_table_preprocess_v1
      STORED AS ALIORC  
      LIFECYCLE 90;
      
      INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_preprocess_v1 PARTITION(ds)
      SELECT *
      FROM pai_online_project.rec_sln_demo_behavior_table_preprocess_v1
      WHERE ds >= '20240530' and ds <='20240605';

FeatureStore SDK for Python のインストール

Jupyter Notebook を使用して次のコードを実行することをお勧めします。

  • Python3 環境に FeatureStore SDK for Python をインストールします。

    %pip install https://feature-store-py.oss-cn-beijing.aliyuncs.com/package/feature_store_py-2.0.2-py3-none-any.whl
  • 必要な機能モジュールをインポートします。

    import os
    from feature_store_py import FeatureStoreClient
    from feature_store_py.fs_datasource import MaxComputeDataSource
    from feature_store_py.feature_engineering import TableTransform, Condition, DayOf, ComboTransform, Feature, AggregationTransform, auto_count_feature_transform, WindowTransform, auto_window_feature_transform

2. ソーステーブルの変換

準備が完了したら、ワークスペースでユーザーテーブル rec_sln_demo_user_table_preprocess_v1、アイテムテーブル rec_sln_demo_item_table_preprocess_v1、行動テーブル rec_sln_demo_behavior_table_preprocess_v1 を表示できます。

テーブルを使用して特徴量を生成する前に、特徴量生成を容易にするためにテーブルを前処理します。作成した ODPS SQL ノードを使用して次の SQL 文を実行し、テーブルを前処理できます。詳細については、「ソーステーブルの準備」をご参照ください。

  • ユーザーテーブル、アイテムテーブル、行動テーブルをマージします。

    CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_preprocess_wide_v1 
    (
        request_id bigint
        ,user_id string
        ,page string
        ,net_type string
        ,day_h bigint COMMENT '行動が発生した時間。'
        ,week_day bigint COMMENT '行動が発生した曜日。'
        ,event_unix_time bigint
        ,item_id string
        ,event string
        ,playtime double
        ,gender string
        ,age bigint
        ,city string
        ,item_cnt bigint
        ,follow_cnt bigint
        ,follower_cnt bigint
        ,is_new_user bigint
        ,tags string
        ,duration double
        ,category string
        ,author bigint
        ,click_count bigint
        ,praise_count bigint
        ,is_new_item bigint
    )
    PARTITIONED BY 
    (
        ds string
    )
    LIFECYCLE 90
    ;
    INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_preprocess_wide_v1 PARTITION(ds='${bdp.system.bizdate}')
    SELECT  sq0.request_id
            ,sq0.user_id
            ,sq0.page
            ,sq0.net_type
            ,sq0.day_h
            ,sq0.week_day
            ,sq0.event_unix_time
            ,sq0.item_id
            ,sq0.event
            ,sq0.playtime
            ,sq1.gender
            ,sq1.age
            ,sq1.city
            ,sq1.item_cnt
            ,sq1.follow_cnt
            ,sq1.follower_cnt
            ,sq1.is_new_user
            ,sq1.tags
            ,sq2.duration
            ,sq2.category
            ,sq2.author
            ,sq2.click_count
            ,sq2.praise_count
            ,sq2.is_new_item
    FROM    (
                SELECT  *
                FROM    rec_sln_demo_behavior_table_preprocess_v1
                WHERE   ds = '${bdp.system.bizdate}'
            ) sq0
    LEFT JOIN (
                  SELECT  *
                  FROM    rec_sln_demo_user_table_preprocess_v1
                  WHERE   ds = '${bdp.system.bizdate}'
              ) sq1
    ON      sq0.user_id = sq1.user_id LEFT
    JOIN    (
                SELECT  *
                FROM    rec_sln_demo_item_table_preprocess_v1
                WHERE   ds = '${bdp.system.bizdate}'
            ) sq2
    ON      sq0.item_id = sq2.item_id
    ;
  • 行動テーブルを前処理してラベルテーブルに変換します。モデルのトレーニングにはラベルが必要です。この例では、クリック、再生時間、賞賛がラベルとして使用されます。

    CREATE TABLE IF NOT EXISTS rec_sln_demo_fs_label_table_v1
    (
        request_id bigint
        ,user_id string
        ,page string
        ,net_type string
        ,day_h bigint COMMENT '行動が発生した時間。'
        ,week_day bigint COMMENT '行動が発生した曜日。'
        ,day_min string
        ,event_unix_time bigint
        ,item_id string
        ,playtime double
        ,is_click BIGINT
        ,ln_playtime DOUBLE
        ,is_praise BIGINT
    )
    PARTITIONED BY 
    (
        ds string
    )
    LIFECYCLE 90
    ;
    INSERT OVERWRITE TABLE rec_sln_demo_fs_label_table_v1 PARTITION(ds='${bdp.system.bizdate}')
    SELECT  request_id
            ,user_id
            ,MAX(page) page
            ,MAX(net_type) net_type
            ,MAX(day_h) day_h
            ,MAX(week_day) week_day
            ,TO_CHAR(FROM_UNIXTIME(MIN(event_unix_time)),'yyyymmddhhmi') day_min
            ,MAX(event_unix_time) event_unix_time
            ,item_id
            ,MAX(playtime) playtime
            ,max(if(event='click', 1, 0)) is_click
            ,ln(sum(playtime) + 1) ln_playtime
            ,max(if(event='praise', 1, 0)) is_praise
    FROM    rec_sln_demo_behavior_table_preprocess_v1
    WHERE   ds = '${bdp.system.bizdate}'
    GROUP BY request_id
             ,user_id
             ,item_id
    ;

上記の SQL 文を実行すると、次のテーブルを取得できます。

  • rec_sln_demo_behavior_table_preprocess_wide_v1: 特徴量を生成するために使用される新しい行動テーブル。

  • rec_sln_demo_fs_label_table_v1: サンプルテーブルを生成するために使用されるラベルテーブル。

3. 特徴量の生成

自動拡張関数を呼び出して特徴量を生成できます。わずか数行のコードで数百の特徴量を生成できます。

特徴量生成には、ユーザー特徴量とアイテム特徴量の生成が必要です。次のステップを実行します。

ユーザー特徴量の生成

Jupyter Notebook を使用して次のコードを実行することをお勧めします。

  1. クライアントを初期化します。

    access_key_id=os.environ.get ("ALIBABA_CLOUD_ACCESS_KEY_ID") # AccessKey ID を入力します。
    access_key_secret=os.environ.get ("ALIBABA_CLOUD_ACCESS_KEY_SECRET") # AccessKey シークレットを入力します。
    project='project_name' # プロジェクト名を入力します。
    region='cn-hangzhou' # プロジェクトが存在するリージョンを入力します。たとえば、プロジェクトが中国 (杭州) にある場合は、cn-hangzhou と入力します。
    fs_client = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, region=region)
  2. 特徴量変換を実行するソーステーブルを指定します。

    input_bhv_table_name = "rec_sln_demo_behavior_table_preprocess_wide_v1"
    ds_bhv = MaxComputeDataSource(table=input_bhv_table_name, project=project)
    
    input_user_table_name = "rec_sln_demo_user_table_preprocess_v1"
    ds_user = MaxComputeDataSource(table=input_user_table_name, project=project)
    
    input_item_table_name = "rec_sln_demo_item_table_preprocess_v1"
    ds_item = MaxComputeDataSource(table=input_item_table_name, project=project)
  3. JoinTransform および AggregationTransform 操作を実行して生成されるユーザー特徴量テーブルの名前を指定します。

    agg_user_table_v1 = 'rec_sln_demo_user_table_preprocess_agg_v1'
  4. 自動拡張関数を使用して、統計的特徴量の自動拡張を実装します。

    name_prefix = "user"
    input_list = ["playtime", "duration", "click_count", "praise_count"]
    event_name = 'event'
    event_type = 'expr'
    group_by_key = "user_id"
    window_size = [3,7,15]
    user_count_feature_list = auto_count_feature_transform(name_prefix, input_list, event_name, event_type, group_by_key, window_size)
    print("len_count_feature_list = ", len(user_count_feature_list))
    print("count_feature_list = ", user_count_feature_list)
  5. パイプラインを実行し、テーブル生成結果を表示します。

    1. パイプラインを作成します。

      agg_user_bhv_pipeline = fs_client.create_pipeline(ds_bhv).add_feature_transform(user_count_feature_list)
      agg_user_pipeline =fs_client.create_pipeline(ds_user, agg_user_table_v1).merge(agg_user_bhv_pipeline, keep_input_columns=False)
    2. パイプラインを実行します。

      execute_date = '20240605'
      output_agg_user_table = agg_user_pipeline.execute(execute_date, drop_table=True)
    3. テーブル生成結果を表示します。

      agg_user_ret = output_agg_user_table.to_pandas(execute_date, limit=20)
      agg_user_ret
  6. WindowTransform 操作を実行して生成されるユーザー特徴量テーブルの名前を指定します。

    win_user_table_v1 = 'rec_sln_demo_user_table_preprocess_win_v1'
  7. 組み込みの自動拡張関数を使用して WindowTransform 操作を実行します。

    name_prefix = 'user'
    input_list = ['day_h', 'category']
    agg_field = ['duration', 'click_count']
    event_name = 'event'
    event_type = 'expr'
    group_by_key = 'user_id'
    window_size = [7, 15, 30, 45]
    user_win_feature_list = auto_window_feature_transform(name_prefix, input_list, agg_field, event_name, event_type, group_by_key, window_size)
    print("len_user_win_feature_list = ", len(user_win_feature_list))
    print("user_win_feature_list = ", user_win_feature_list)
  8. パイプラインを実行し、テーブル生成結果を表示します。

    1. パイプラインを作成します。

      win_user_bhv_pipeline = fs_client.create_pipeline(ds_bhv).add_feature_transform(user_win_feature_list)
      win_user_pipeline = fs_client.create_pipeline(ds_user, win_user_table_v1).merge(win_user_bhv_pipeline, keep_input_columns=False)
    2. パイプラインを実行します。

      execute_date = '20240605'
      output_win_user_table = win_user_pipeline.execute(execute_date, drop_table=True)
      
      # 詳細については、関連ドキュメントをご参照ください。この操作には中間テーブルが含まれます。初めてコードを実行するときは、データをバックフィルする必要があり、これには長い時間がかかる場合があります。次のコードを実行してデータをバックフィルできます。
      # output_win_user_table = win_user_pipeline.execute(execute_date, drop_table=True, backfill_partitions=True)
    3. テーブル生成結果を表示します。

      win_user_ret = output_win_user_table.to_pandas(execute_date, limit=20)
      win_user_ret

アイテム特徴量の生成

ユーザー特徴量を生成した後、アイテムタイプに基づいてアイテム特徴量を生成できます。次のステップを実行します。

  1. AggregationTransform 操作を実行して生成されるアイテム特徴量テーブルの名前を指定します。

    agg_item_table_v1 = 'rec_sln_demo_item_table_preprocess_agg_v1'
  2. 自動拡張関数を使用して、統計的特徴量の自動拡張を実装します。

    name_prefix = "item"
    input_list = ["item_cnt", "follow_cnt", "follower_cnt"]
    event_name = 'event'
    event_type = 'expr'
    group_by_key = "item_id"
    window_size = [3,7,15]
    item_count_feature_list = auto_count_feature_transform(name_prefix, input_list, event_name, event_type, group_by_key, window_size)
    print("len_count_feature_list = ", len(item_count_feature_list))
    print("count_feature_list = ", item_count_feature_list)
  3. パイプラインを実行し、テーブル生成結果を表示します。

    1. パイプラインを作成します。

      agg_item_bhv_pipeline =fs_client.create_pipeline(ds_bhv).add_feature_transform(item_count_feature_list)
      agg_item_pipeline =fs_client.create_pipeline(ds_item, agg_item_table_v1).merge(agg_item_bhv_pipeline, keep_input_columns=False)
    2. パイプラインを実行します。

      execute_date = '20240605'
      output_agg_item_table = agg_item_pipeline.execute(execute_date, drop_table=True)
    3. テーブル生成結果を表示します。

      agg_item_ret = output_agg_item_table.to_pandas(execute_date, limit=20)
      agg_item_ret
  4. WindowTransform 操作を実行して生成されるアイテム特徴量テーブルの名前を指定します。

    win_item_table_v1 = 'rec_sln_demo_item_table_preprocess_win_v1'
  5. 組み込みの自動拡張関数を使用して WindowTransform 操作を実行します。

    name_prefix = 'item'
    input_list = ['day_h', 'category']
    agg_field = ['click_count', 'praise_count']
    event_name = 'event'
    event_type = 'expr'
    group_by_key = 'item_id'
    window_size = [7, 15, 30, 45]
    item_win_feature_list = auto_window_feature_transform(name_prefix, input_list, agg_field, event_name, event_type, group_by_key, window_size)
    print("len_item_win_feature_list = ", len(item_win_feature_list))
    print("item_win_feature_list = ", item_win_feature_list)
  6. パイプラインを実行し、テーブル生成結果を表示します。

    1. パイプラインを作成します。

      win_item_bhv_pipeline = fs_client.create_pipeline(ds_bhv).add_feature_transform(item_win_feature_list)
      win_item_pipeline = fs_client.create_pipeline(ds_item, win_item_table_v1).merge(win_item_bhv_pipeline, keep_input_columns=False)
    2. パイプラインを実行します。

      execute_date = '20240605'
      output_win_item_table = win_item_pipeline.execute(execute_date, drop_table=True)
      
      # 詳細については、関連ドキュメントをご参照ください。この操作には中間テーブルが含まれます。初めてコードを実行するときは、データをバックフィルする必要があり、これには長い時間がかかる場合があります。次のコードを実行してデータをバックフィルできます。
      # output_win_item_table = win_item_pipeline.execute(execute_date, drop_table=True, backfill_partitions=True)
    3. テーブル生成結果を表示します。

      win_item_ret = output_win_item_table.to_pandas(execute_date, limit=20)
      win_item_ret

4. サンプルテーブルの生成

前述の操作を実行すると、ラベルテーブル、3 つのユーザー特徴量テーブル、3 つのアイテム特徴量テーブルを取得できます。3 つの特徴量テーブルには、ソーステーブルと、特徴量処理後に生成された 2 つの特徴量テーブルが含まれます。次に、作成した ODPS SQL ノードを使用して次の SQL 文を実行し、7 つのテーブルを完全なサンプルテーブルにマージできます。詳細については、「ソーステーブルの準備」をご参照ください。

CREATE TABLE IF NOT EXISTS fs_demo_fs_engineering_v1_training_set(
	request_id BIGINT,
	 user_id STRING,
	 page STRING,
	 net_type STRING,
	 day_h BIGINT,
	 week_day BIGINT,
	 day_min STRING,
	 event_unix_time BIGINT,
	 item_id STRING,
	 playtime DOUBLE,
	 is_click BIGINT,
	 ln_playtime DOUBLE,
	 is_praise BIGINT,
	 duration DOUBLE,
	 category STRING,
	 author BIGINT,
	 click_count BIGINT,
	 praise_count BIGINT,
	 is_new_item BIGINT,
	 item__sum_item_cnt_3d BIGINT,
	 item__sum_follow_cnt_3d BIGINT,
	 item__sum_follower_cnt_3d BIGINT,
	 item__max_item_cnt_3d BIGINT,
	 item__max_follow_cnt_3d BIGINT,
	 item__max_follower_cnt_3d BIGINT,
	 item__min_item_cnt_3d BIGINT,
	 item__min_follow_cnt_3d BIGINT,
	 item__min_follower_cnt_3d BIGINT,
	 item__avg_item_cnt_3d DOUBLE,
	 item__avg_follow_cnt_3d DOUBLE,
	 item__avg_follower_cnt_3d DOUBLE,
	 item__sum_item_cnt_7d BIGINT,
	 item__sum_follow_cnt_7d BIGINT,
	 item__sum_follower_cnt_7d BIGINT,
	 item__max_item_cnt_7d BIGINT,
	 item__max_follow_cnt_7d BIGINT,
	 item__max_follower_cnt_7d BIGINT,
	 item__min_item_cnt_7d BIGINT,
	 item__min_follow_cnt_7d BIGINT,
	 item__min_follower_cnt_7d BIGINT,
	 item__avg_item_cnt_7d DOUBLE,
	 item__avg_follow_cnt_7d DOUBLE,
	 item__avg_follower_cnt_7d DOUBLE,
	 item__sum_item_cnt_15d BIGINT,
	 item__sum_follow_cnt_15d BIGINT,
	 item__sum_follower_cnt_15d BIGINT,
	 item__max_item_cnt_15d BIGINT,
	 item__max_follow_cnt_15d BIGINT,
	 item__max_follower_cnt_15d BIGINT,
	 item__min_item_cnt_15d BIGINT,
	 item__min_follow_cnt_15d BIGINT,
	 item__min_follower_cnt_15d BIGINT,
	 item__avg_item_cnt_15d DOUBLE,
	 item__avg_follow_cnt_15d DOUBLE,
	 item__avg_follower_cnt_15d DOUBLE,
	 item__kv_day_h_click_count_sum_7d STRING,
	 item__kv_category_click_count_sum_7d STRING,
	 item__kv_day_h_praise_count_sum_7d STRING,
	 item__kv_category_praise_count_sum_7d STRING,
	 item__kv_day_h_click_count_max_7d STRING,
	 item__kv_category_click_count_max_7d STRING,
	 item__kv_day_h_praise_count_max_7d STRING,
	 item__kv_category_praise_count_max_7d STRING,
	 item__kv_day_h_click_count_min_7d STRING,
	 item__kv_category_click_count_min_7d STRING,
	 item__kv_day_h_praise_count_min_7d STRING,
	 item__kv_category_praise_count_min_7d STRING,
	 item__kv_day_h_click_count_avg_7d STRING,
	 item__kv_category_click_count_avg_7d STRING,
	 item__kv_day_h_praise_count_avg_7d STRING,
	 item__kv_category_praise_count_avg_7d STRING,
	 item__kv_day_h_click_count_sum_15d STRING,
	 item__kv_category_click_count_sum_15d STRING,
	 item__kv_day_h_praise_count_sum_15d STRING,
	 item__kv_category_praise_count_sum_15d STRING,
	 item__kv_day_h_click_count_max_15d STRING,
	 item__kv_category_click_count_max_15d STRING,
	 item__kv_day_h_praise_count_max_15d STRING,
	 item__kv_category_praise_count_max_15d STRING,
	 item__kv_day_h_click_count_min_15d STRING,
	 item__kv_category_click_count_min_15d STRING,
	 item__kv_day_h_praise_count_min_15d STRING,
	 item__kv_category_praise_count_min_15d STRING,
	 item__kv_day_h_click_count_avg_15d STRING,
	 item__kv_category_click_count_avg_15d STRING,
	 item__kv_day_h_praise_count_avg_15d STRING,
	 item__kv_category_praise_count_avg_15d STRING,
	 item__kv_day_h_click_count_sum_30d STRING,
	 item__kv_category_click_count_sum_30d STRING,
	 item__kv_day_h_praise_count_sum_30d STRING,
	 item__kv_category_praise_count_sum_30d STRING,
	 item__kv_day_h_click_count_max_30d STRING,
	 item__kv_category_click_count_max_30d STRING,
	 item__kv_day_h_praise_count_max_30d STRING,
	 item__kv_category_praise_count_max_30d STRING,
	 item__kv_day_h_click_count_min_30d STRING,
	 item__kv_category_click_count_min_30d STRING,
	 item__kv_day_h_praise_count_min_30d STRING,
	 item__kv_category_praise_count_min_30d STRING,
	 item__kv_day_h_click_count_avg_30d STRING,
	 item__kv_category_click_count_avg_30d STRING,
	 item__kv_day_h_praise_count_avg_30d STRING,
	 item__kv_category_praise_count_avg_30d STRING,
	 item__kv_day_h_click_count_sum_45d STRING,
	 item__kv_category_click_count_sum_45d STRING,
	 item__kv_day_h_praise_count_sum_45d STRING,
	 item__kv_category_praise_count_sum_45d STRING,
	 item__kv_day_h_click_count_max_45d STRING,
	 item__kv_category_click_count_max_45d STRING,
	 item__kv_day_h_praise_count_max_45d STRING,
	 item__kv_category_praise_count_max_45d STRING,
	 item__kv_day_h_click_count_min_45d STRING,
	 item__kv_category_click_count_min_45d STRING,
	 item__kv_day_h_praise_count_min_45d STRING,
	 item__kv_category_praise_count_min_45d STRING,
	 item__kv_day_h_click_count_avg_45d STRING,
	 item__kv_category_click_count_avg_45d STRING,
	 item__kv_day_h_praise_count_avg_45d STRING,
	 item__kv_category_praise_count_avg_45d STRING,
	 gender STRING,
	 age BIGINT,
	 city STRING,
	 item_cnt BIGINT,
	 follow_cnt BIGINT,
	 follower_cnt BIGINT,
	 is_new_user BIGINT,
	 tags STRING,
	 user__sum_playtime_3d DOUBLE,
	 user__sum_duration_3d DOUBLE,
	 user__sum_click_count_3d BIGINT,
	 user__sum_praise_count_3d BIGINT,
	 user__max_playtime_3d DOUBLE,
	 user__max_duration_3d DOUBLE,
	 user__max_click_count_3d BIGINT,
	 user__max_praise_count_3d BIGINT,
	 user__min_playtime_3d DOUBLE,
	 user__min_duration_3d DOUBLE,
	 user__min_click_count_3d BIGINT,
	 user__min_praise_count_3d BIGINT,
	 user__avg_playtime_3d DOUBLE,
	 user__avg_duration_3d DOUBLE,
	 user__avg_click_count_3d DOUBLE,
	 user__avg_praise_count_3d DOUBLE,
	 user__sum_playtime_7d DOUBLE,
	 user__sum_duration_7d DOUBLE,
	 user__sum_click_count_7d BIGINT,
	 user__sum_praise_count_7d BIGINT,
	 user__max_playtime_7d DOUBLE,
	 user__max_duration_7d DOUBLE,
	 user__max_click_count_7d BIGINT,
	 user__max_praise_count_7d BIGINT,
	 user__min_playtime_7d DOUBLE,
	 user__min_duration_7d DOUBLE,
	 user__min_click_count_7d BIGINT,
	 user__min_praise_count_7d BIGINT,
	 user__avg_playtime_7d DOUBLE,
	 user__avg_duration_7d DOUBLE,
	 user__avg_click_count_7d DOUBLE,
	 user__avg_praise_count_7d DOUBLE,
	 user__sum_playtime_15d DOUBLE,
	 user__sum_duration_15d DOUBLE,
	 user__sum_click_count_15d BIGINT,
	 user__sum_praise_count_15d BIGINT,
	 user__max_playtime_15d DOUBLE,
	 user__max_duration_15d DOUBLE,
	 user__max_click_count_15d BIGINT,
	 user__max_praise_count_15d BIGINT,
	 user__min_playtime_15d DOUBLE,
	 user__min_duration_15d DOUBLE,
	 user__min_click_count_15d BIGINT,
	 user__min_praise_count_15d BIGINT,
	 user__avg_playtime_15d DOUBLE,
	 user__avg_duration_15d DOUBLE,
	 user__avg_click_count_15d DOUBLE,
	 user__avg_praise_count_15d DOUBLE,
	 user__kv_day_h_duration_sum_7d STRING,
	 user__kv_category_duration_sum_7d STRING,
	 user__kv_day_h_click_count_sum_7d STRING,
	 user__kv_category_click_count_sum_7d STRING,
	 user__kv_day_h_duration_max_7d STRING,
	 user__kv_category_duration_max_7d STRING,
	 user__kv_day_h_click_count_max_7d STRING,
	 user__kv_category_click_count_max_7d STRING,
	 user__kv_day_h_duration_min_7d STRING,
	 user__kv_category_duration_min_7d STRING,
	 user__kv_day_h_click_count_min_7d STRING,
	 user__kv_category_click_count_min_7d STRING,
	 user__kv_day_h_duration_avg_7d STRING,
	 user__kv_category_duration_avg_7d STRING,
	 user__kv_day_h_click_count_avg_7d STRING,
	 user__kv_category_click_count_avg_7d STRING,
	 user__kv_day_h_duration_sum_15d STRING,
	 user__kv_category_duration_sum_15d STRING,
	 user__kv_day_h_click_count_sum_15d STRING,
	 user__kv_category_click_count_sum_15d STRING,
	 user__kv_day_h_duration_max_15d STRING,
	 user__kv_category_duration_max_15d STRING,
	 user__kv_day_h_click_count_max_15d STRING,
	 user__kv_category_click_count_max_15d STRING,
	 user__kv_day_h_duration_min_15d STRING,
	 user__kv_category_duration_min_15d STRING,
	 user__kv_day_h_click_count_min_15d STRING,
	 user__kv_category_click_count_min_15d STRING,
	 user__kv_day_h_duration_avg_15d STRING,
	 user__kv_category_duration_avg_15d STRING,
	 user__kv_day_h_click_count_avg_15d STRING,
	 user__kv_category_click_count_avg_15d STRING,
	 user__kv_day_h_duration_sum_30d STRING,
	 user__kv_category_duration_sum_30d STRING,
	 user__kv_day_h_click_count_sum_30d STRING,
	 user__kv_category_click_count_sum_30d STRING,
	 user__kv_day_h_duration_max_30d STRING,
	 user__kv_category_duration_max_30d STRING,
	 user__kv_day_h_click_count_max_30d STRING,
	 user__kv_category_click_count_max_30d STRING,
	 user__kv_day_h_duration_min_30d STRING,
	 user__kv_category_duration_min_30d STRING,
	 user__kv_day_h_click_count_min_30d STRING,
	 user__kv_category_click_count_min_30d STRING,
	 user__kv_day_h_duration_avg_30d STRING,
	 user__kv_category_duration_avg_30d STRING,
	 user__kv_day_h_click_count_avg_30d STRING,
	 user__kv_category_click_count_avg_30d STRING,
	 user__kv_day_h_duration_sum_45d STRING,
	 user__kv_category_duration_sum_45d STRING,
	 user__kv_day_h_click_count_sum_45d STRING,
	 user__kv_category_click_count_sum_45d STRING,
	 user__kv_day_h_duration_max_45d STRING,
	 user__kv_category_duration_max_45d STRING,
	 user__kv_day_h_click_count_max_45d STRING,
	 user__kv_category_click_count_max_45d STRING,
	 user__kv_day_h_duration_min_45d STRING,
	 user__kv_category_duration_min_45d STRING,
	 user__kv_day_h_click_count_min_45d STRING,
	 user__kv_category_click_count_min_45d STRING,
	 user__kv_day_h_duration_avg_45d STRING,
	 user__kv_category_duration_avg_45d STRING,
	 user__kv_day_h_click_count_avg_45d STRING,
	 user__kv_category_click_count_avg_45d STRING
) 
PARTITIONED BY (ds STRING)
LIFECYCLE 90;

insert overwrite table fs_demo_fs_engineering_v1_training_set partition (ds = '${bdp.system.bizdate}')
select 
sq0.request_id,
sq0.user_id,
sq0.page,
sq0.net_type,
sq0.day_h,
sq0.week_day,
sq0.day_min,
sq0.event_unix_time,
sq0.item_id,
sq0.playtime,
sq0.is_click,
sq0.ln_playtime,
sq0.is_praise,
sq2.duration,
sq2.category,
sq2.author,
sq2.click_count,
sq2.praise_count,
sq2.is_new_item,
sq5.item__sum_item_cnt_3d,
sq5.item__sum_follow_cnt_3d,
sq5.item__sum_follower_cnt_3d,
sq5.item__max_item_cnt_3d,
sq5.item__max_follow_cnt_3d,
sq5.item__max_follower_cnt_3d,
sq5.item__min_item_cnt_3d,
sq5.item__min_follow_cnt_3d,
sq5.item__min_follower_cnt_3d,
sq5.item__avg_item_cnt_3d,
sq5.item__avg_follow_cnt_3d,
sq5.item__avg_follower_cnt_3d,
sq5.item__sum_item_cnt_7d,
sq5.item__sum_follow_cnt_7d,
sq5.item__sum_follower_cnt_7d,
sq5.item__max_item_cnt_7d,
sq5.item__max_follow_cnt_7d,
sq5.item__max_follower_cnt_7d,
sq5.item__min_item_cnt_7d,
sq5.item__min_follow_cnt_7d,
sq5.item__min_follower_cnt_7d,
sq5.item__avg_item_cnt_7d,
sq5.item__avg_follow_cnt_7d,
sq5.item__avg_follower_cnt_7d,
sq5.item__sum_item_cnt_15d,
sq5.item__sum_follow_cnt_15d,
sq5.item__sum_follower_cnt_15d,
sq5.item__max_item_cnt_15d,
sq5.item__max_follow_cnt_15d,
sq5.item__max_follower_cnt_15d,
sq5.item__min_item_cnt_15d,
sq5.item__min_follow_cnt_15d,
sq5.item__min_follower_cnt_15d,
sq5.item__avg_item_cnt_15d,
sq5.item__avg_follow_cnt_15d,
sq5.item__avg_follower_cnt_15d,
sq6.item__kv_day_h_click_count_sum_7d,
sq6.item__kv_category_click_count_sum_7d,
sq6.item__kv_day_h_praise_count_sum_7d,
sq6.item__kv_category_praise_count_sum_7d,
sq6.item__kv_day_h_click_count_max_7d,
sq6.item__kv_category_click_count_max_7d,
sq6.item__kv_day_h_praise_count_max_7d,
sq6.item__kv_category_praise_count_max_7d,
sq6.item__kv_day_h_click_count_min_7d,
sq6.item__kv_category_click_count_min_7d,
sq6.item__kv_day_h_praise_count_min_7d,
sq6.item__kv_category_praise_count_min_7d,
sq6.item__kv_day_h_click_count_avg_7d,
sq6.item__kv_category_click_count_avg_7d,
sq6.item__kv_day_h_praise_count_avg_7d,
sq6.item__kv_category_praise_count_avg_7d,
sq6.item__kv_day_h_click_count_sum_15d,
sq6.item__kv_category_click_count_sum_15d,
sq6.item__kv_day_h_praise_count_sum_15d,
sq6.item__kv_category_praise_count_sum_15d,
sq6.item__kv_day_h_click_count_max_15d,
sq6.item__kv_category_click_count_max_15d,
sq6.item__kv_day_h_praise_count_max_15d,
sq6.item__kv_category_praise_count_max_15d,
sq6.item__kv_day_h_click_count_min_15d,
sq6.item__kv_category_click_count_min_15d,
sq6.item__kv_day_h_praise_count_min_15d,
sq6.item__kv_category_praise_count_min_15d,
sq6.item__kv_day_h_click_count_avg_15d,
sq6.item__kv_category_click_count_avg_15d,
sq6.item__kv_day_h_praise_count_avg_15d,
sq6.item__kv_category_praise_count_avg_15d,
sq6.item__kv_day_h_click_count_sum_30d,
sq6.item__kv_category_click_count_sum_30d,
sq6.item__kv_day_h_praise_count_sum_30d,
sq6.item__kv_category_praise_count_sum_30d,
sq6.item__kv_day_h_click_count_max_30d,
sq6.item__kv_category_click_count_max_30d,
sq6.item__kv_day_h_praise_count_max_30d,
sq6.item__kv_category_praise_count_max_30d,
sq6.item__kv_day_h_click_count_min_30d,
sq6.item__kv_category_click_count_min_30d,
sq6.item__kv_day_h_praise_count_min_30d,
sq6.item__kv_category_praise_count_min_30d,
sq6.item__kv_day_h_click_count_avg_30d,
sq6.item__kv_category_click_count_avg_30d,
sq6.item__kv_day_h_praise_count_avg_30d,
sq6.item__kv_category_praise_count_avg_30d,
sq6.item__kv_day_h_click_count_sum_45d,
sq6.item__kv_category_click_count_sum_45d,
sq6.item__kv_day_h_praise_count_sum_45d,
sq6.item__kv_category_praise_count_sum_45d,
sq6.item__kv_day_h_click_count_max_45d,
sq6.item__kv_category_click_count_max_45d,
sq6.item__kv_day_h_praise_count_max_45d,
sq6.item__kv_category_praise_count_max_45d,
sq6.item__kv_day_h_click_count_min_45d,
sq6.item__kv_category_click_count_min_45d,
sq6.item__kv_day_h_praise_count_min_45d,
sq6.item__kv_category_praise_count_min_45d,
sq6.item__kv_day_h_click_count_avg_45d,
sq6.item__kv_category_click_count_avg_45d,
sq6.item__kv_day_h_praise_count_avg_45d,
sq6.item__kv_category_praise_count_avg_45d,
sq1.gender,
sq1.age,
sq1.city,
sq1.item_cnt,
sq1.follow_cnt,
sq1.follower_cnt,
sq1.is_new_user,
sq1.tags,
sq3.user__sum_playtime_3d,
sq3.user__sum_duration_3d,
sq3.user__sum_click_count_3d,
sq3.user__sum_praise_count_3d,
sq3.user__max_playtime_3d,
sq3.user__max_duration_3d,
sq3.user__max_click_count_3d,
sq3.user__max_praise_count_3d,
sq3.user__min_playtime_3d,
sq3.user__min_duration_3d,
sq3.user__min_click_count_3d,
sq3.user__min_praise_count_3d,
sq3.user__avg_playtime_3d,
sq3.user__avg_duration_3d,
sq3.user__avg_click_count_3d,
sq3.user__avg_praise_count_3d,
sq3.user__sum_playtime_7d,
sq3.user__sum_duration_7d,
sq3.user__sum_click_count_7d,
sq3.user__sum_praise_count_7d,
sq3.user__max_playtime_7d,
sq3.user__max_duration_7d,
sq3.user__max_click_count_7d,
sq3.user__max_praise_count_7d,
sq3.user__min_playtime_7d,
sq3.user__min_duration_7d,
sq3.user__min_click_count_7d,
sq3.user__min_praise_count_7d,
sq3.user__avg_playtime_7d,
sq3.user__avg_duration_7d,
sq3.user__avg_click_count_7d,
sq3.user__avg_praise_count_7d,
sq3.user__sum_playtime_15d,
sq3.user__sum_duration_15d,
sq3.user__sum_click_count_15d,
sq3.user__sum_praise_count_15d,
sq3.user__max_playtime_15d,
sq3.user__max_duration_15d,
sq3.user__max_click_count_15d,
sq3.user__max_praise_count_15d,
sq3.user__min_playtime_15d,
sq3.user__min_duration_15d,
sq3.user__min_click_count_15d,
sq3.user__min_praise_count_15d,
sq3.user__avg_playtime_15d,
sq3.user__avg_duration_15d,
sq3.user__avg_click_count_15d,
sq3.user__avg_praise_count_15d,
sq4.user__kv_day_h_duration_sum_7d,
sq4.user__kv_category_duration_sum_7d,
sq4.user__kv_day_h_click_count_sum_7d,
sq4.user__kv_category_click_count_sum_7d,
sq4.user__kv_day_h_duration_max_7d,
sq4.user__kv_category_duration_max_7d,
sq4.user__kv_day_h_click_count_max_7d,
sq4.user__kv_category_click_count_max_7d,
sq4.user__kv_day_h_duration_min_7d,
sq4.user__kv_category_duration_min_7d,
sq4.user__kv_day_h_click_count_min_7d,
sq4.user__kv_category_click_count_min_7d,
sq4.user__kv_day_h_duration_avg_7d,
sq4.user__kv_category_duration_avg_7d,
sq4.user__kv_day_h_click_count_avg_7d,
sq4.user__kv_category_click_count_avg_7d,
sq4.user__kv_day_h_duration_sum_15d,
sq4.user__kv_category_duration_sum_15d,
sq4.user__kv_day_h_click_count_sum_15d,
sq4.user__kv_category_click_count_sum_15d,
sq4.user__kv_day_h_duration_max_15d,
sq4.user__kv_category_duration_max_15d,
sq4.user__kv_day_h_click_count_max_15d,
sq4.user__kv_category_click_count_max_15d,
sq4.user__kv_day_h_duration_min_15d,
sq4.user__kv_category_duration_min_15d,
sq4.user__kv_day_h_click_count_min_15d,
sq4.user__kv_category_click_count_min_15d,
sq4.user__kv_day_h_duration_avg_15d,
sq4.user__kv_category_duration_avg_15d,
sq4.user__kv_day_h_click_count_avg_15d,
sq4.user__kv_category_click_count_avg_15d,
sq4.user__kv_day_h_duration_sum_30d,
sq4.user__kv_category_duration_sum_30d,
sq4.user__kv_day_h_click_count_sum_30d,
sq4.user__kv_category_click_count_sum_30d,
sq4.user__kv_day_h_duration_max_30d,
sq4.user__kv_category_duration_max_30d,
sq4.user__kv_day_h_click_count_max_30d,
sq4.user__kv_category_click_count_max_30d,
sq4.user__kv_day_h_duration_min_30d,
sq4.user__kv_category_duration_min_30d,
sq4.user__kv_day_h_click_count_min_30d,
sq4.user__kv_category_click_count_min_30d,
sq4.user__kv_day_h_duration_avg_30d,
sq4.user__kv_category_duration_avg_30d,
sq4.user__kv_day_h_click_count_avg_30d,
sq4.user__kv_category_click_count_avg_30d,
sq4.user__kv_day_h_duration_sum_45d,
sq4.user__kv_category_duration_sum_45d,
sq4.user__kv_day_h_click_count_sum_45d,
sq4.user__kv_category_click_count_sum_45d,
sq4.user__kv_day_h_duration_max_45d,
sq4.user__kv_category_duration_max_45d,
sq4.user__kv_day_h_click_count_max_45d,
sq4.user__kv_category_click_count_max_45d,
sq4.user__kv_day_h_duration_min_45d,
sq4.user__kv_category_duration_min_45d,
sq4.user__kv_day_h_click_count_min_45d,
sq4.user__kv_category_click_count_min_45d,
sq4.user__kv_day_h_duration_avg_45d,
sq4.user__kv_category_duration_avg_45d,
sq4.user__kv_day_h_click_count_avg_45d,
sq4.user__kv_category_click_count_avg_45d
from 
(
	select *
	from rec_sln_demo_fs_label_table_v1
	where ds = '${bdp.system.bizdate}'
) sq0
 left join (
	select 
	*
	from <project_name>.rec_sln_demo_user_table_preprocess_v1
	where ds = TO_CHAR(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'), - 1,'dd'),'yyyymmdd')
) sq1 on sq0.user_id = sq1.user_id
 left join (
	select 
	*
	from <project_name>.rec_sln_demo_item_table_preprocess_v1
	where ds = TO_CHAR(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'), - 1,'dd'),'yyyymmdd')
) sq2 on sq0.item_id = sq2.item_id
 left join (
	select 
	*
	from <project_name>.rec_sln_demo_user_table_preprocess_win_v1
	where ds = TO_CHAR(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'), - 1,'dd'),'yyyymmdd')
) sq4 on sq0.user_id = sq4.user_id
 left join (
	select 
	*
	from <project_name>.rec_sln_demo_item_table_preprocess_agg_v1
	where ds = TO_CHAR(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'), - 1,'dd'),'yyyymmdd')
) sq5 on sq0.item_id = sq5.item_id
 left join (
	select 
	*
	from <project_name>.rec_sln_demo_item_table_preprocess_win_v1
	where ds = TO_CHAR(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'), - 1,'dd'),'yyyymmdd')
) sq6 on sq0.item_id = sq6.item_id
 left join (
	select 
	*
	from <project_name>.rec_sln_demo_user_table_preprocess_agg_v1
	where ds = TO_CHAR(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'), - 1,'dd'),'yyyymmdd')
) sq3 on sq0.user_id = sq3.user_id
;

上記の SQL 文では、<project_name> を実際のプロジェクト名に置き換える必要があります。

リファレンス

  • 特徴量の生成方法の詳細については、「特徴量プラットフォームと特徴量エンジニアリング」をご参照ください。

  • FeatureStore は、レコメンデーション、金融リスク管理、ユーザーグロースシナリオなど、特徴量を必要とするすべてのシナリオに適しています。FeatureStore は、Alibaba Cloud の一般的なデータソースエンジンおよびレコメンデーションサービスエンジンと統合されています。FeatureStore は、特徴量の登録からモデルの開発、アプリケーションまで、効率的で便利なエンドツーエンドのプラットフォームを提供します。FeatureStore の詳細については、「概要」をご参照ください。

  • FeatureStore の使用中に質問がある場合は、DingTalk グループ 34415007523 に参加して技術支援を受けることができます。