本文目录导读:

计算用户标签权重值(如兴趣偏好、行为倾向等),没有唯一的公式,它完全取决于你的业务场景(是电商推荐、内容推荐还是风控?)以及你拥有的数据(点击、购买、时长、频率等)。
最常用的核心逻辑是:基于用户行为的时间衰减、行为强度、行为频次进行加权计算。
下面提供几个在不同场景下经典的脚本计算思路(以Python伪代码为例),你可以直接套用或修改。
核心思想框架
通常标签权重 = 基础分 × 行为权重 × 时间衰减系数 × 数量权重
- 基础分:标签本身的属性(如“高消费”比“低消费”分高)。
- 行为权重:用户做了什么事(购买 > 收藏 > 点击 > 浏览)。
- 时间衰减:近期行为比远期行为权重大(如指数或对数衰减)。
- 数量权重:行为次数越多,权重越大,但通常用对数(Log)防止刷屏。
推荐(最经典)
目标:计算用户对“数码产品”这个标签的偏好分数。
数据假设:用户行为日志表 user_behavior 包含:user_id, tag, action_type, timestamp
脚本逻辑
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# 1. 定义参数
now = datetime.now() # 假设当前时间
action_weight = {
'purchase': 10.0, # 购买权重最高
'collect': 5.0,
'cart': 4.0,
'click': 2.0,
'view': 1.0 # 浏览权重最低
}
decay_factor = 0.95 # 时间衰减系数(每天衰减5%)
def calculate_tag_weight(df_user_behaviors):
"""
计算单个用户对某一个标签的权重
"""
total_score = 0.0
for _, row in df_user_behaviors.iterrows():
action_score = action_weight.get(row['action_type'], 1)
# 2. 时间衰减计算 (天数间隔)
days_diff = (now - row['timestamp']).days
time_decay = pow(decay_factor, days_diff)
# 3. 单次行为得分
single_score = action_score * time_decay
total_score += single_score
# 4. 可选:对总次数进行降噪(防刷屏)
# 总次数权重 = log(1 + 总次数)
count = len(df_user_behaviors)
count_weight = np.log1p(count) # log(1+count)
final_weight = total_score * count_weight
return round(final_weight, 2)
# 调用示例:用户123对“手机”标签的所有行为
user_phone_behaviors = pd.DataFrame({
'action_type': ['view', 'click', 'purchase'],
'timestamp': [
datetime.now() - timedelta(days=10),
datetime.now() - timedelta(days=5),
datetime.now() - timedelta(days=1)
]
})
weight = calculate_tag_weight(user_phone_behaviors)
print(f"用户对【手机】标签权重: {weight}")
风控/反作弊(高敏感度)
目标:计算用户“欺诈风险”标签的分数。 特点:高频、短时、异常行为会放大权重。
脚本逻辑
def risk_tag_weight(actions, base_score=0):
"""
actions: 用户近期的高危行为列表
"""
risk = base_score
for action in actions:
# 1. 行为本身权重(高风险行为直接加高分)
if action['type'] == 'rapid_login': # 1秒内多次登录失败
risk += 30
elif action['type'] == 'device_fraud':
risk += 50
# 2. 速度惩罚(时间差越小,权重越大)
time_since_last = action.get('time_diff_seconds', 999)
if time_since_last < 10: # 10秒内连续操作
risk += 20 * (10 / (time_since_last + 1))
# 3. 无时间衰减(近7天行为直接累加,超过7天权重为0)
if action['days_ago'] > 7:
continue
# 4. 触发阈值判断(非线性放大)
if risk > 100:
risk = 100 + (risk - 100) ** 1.5 # 超过100分,指数级增长
return min(risk, 200) # 上限200
内容标签(简单加权)
适用于CRM或用户画像系统,不需要复杂时间衰减。
def simple_tag_weight(user_profile):
"""
基于用户静态属性+行为统计的简单加权
"""
weight = 0
# 1. 静态基础分
if user_profile['age'] in ['18-25']:
weight += 5 # 年轻用户对“潮牌”基础分高
if user_profile['city_level'] == '一线':
weight += 3
# 2. 行为统计(近30天)
weight += min(50, user_profile['purchase_count'] * 2) # 购买1次=2分,上限50
weight += min(20, user_profile['favorite_count'] * 1) # 收藏1次=1分,上限20
weight += min(10, user_profile['browse_count'] * 0.1) # 浏览10次=1分
# 3. 反向惩罚(不感兴趣)
if user_profile['dislike_count'] > 5:
weight -= 10
return max(0, weight) # 权重不能为负
关键算法公式详解(供扩展)
Hacker News 排序算法(适合近实时权重)排序,但用户行为也适用。热度随时间呈指数衰减。
- 公式:( Score = \frac{P - 1}{(T + 2)^G} )
- ( P ):行为次数(upvote/购买)
- ( T ):距离发帖/行为的小时数
- ( G ):重力因子(通常1.8)
- 好处:前期权重上升快,后期快速下降。
贝叶斯平均(适合新用户/长尾标签)
防止少量行为导致权重虚高。
- 公式:( Weight = \frac{C \times m + \sum (reviews)}{C + N} )
- ( C ):先验常数(通常取全局平均次数)
- ( m ):全局平均权重
- ( N ):该用户的行为次数
- 好处:行为次数少时,权重会“向平均水平靠拢”。
脚本实现建议
- 不要实时跑:全量标签权重建议用 Spark/ETL 离线计算(每天/每小时更新一次)。
- 存储结构:推荐存入 Redis(Hash结构)或 HBase,key 为
user_id,value 为{tag1: weight1, tag2: weight2}。 - 增量更新:如果是实时计算(如用户刚买了一件商品),直接更新该用户该标签的分数:
new_weight = old_weight * decay(时间差) + new_action_score
你的公式原型
权重 = Σ(行为类型权重 × 时间衰减因子) × log(1 + 行为次数) + 静态属性评分
你可以根据业务目标调整三个核心参数:衰减速度(天/周)、行为类型权重表、次数降噪函数(线性/对数)。