当前位置: 首页 > java >正文

用户画像建模的7种机器学习方法

核心算法原理&具体操作步骤

1.基于RFM模型的用户价值分层

RFM模型通过三个关键维度评估用户价值:

import pandas as pd
from datetime import datetime# 示例数据:用户ID、消费日期、消费金额
data = {'user_id': [1, 1, 2, 3, 3, 3, 4],'date': ['2023-01-01', '2023-03-15', '2023-01-20', '2022-12-01', '2023-02-14', '2023-03-01', '2023-03-30'],'amount': [100, 200, 50, 300, 150, 120, 80]
}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])# 计算RFM指标
now = datetime(2023, 4, 1)
rfm = df.groupby('user_id').agg({'date': lambda x: (now - x.max()).days,  # Recency'user_id': 'count',  # Frequency'amount': 'sum'  # Monetary
}).rename(columns={'date': 'recency','user_id': 'frequency','amount': 'monetary'
})# 分箱处理
rfm['R'] = pd.qcut(rfm['recency'], q=3, labels=[3, 2, 1])
rfm['F'] = pd.qcut(rfm['frequency'], q=3, labels=[1, 2, 3])
rfm['M'] = pd.qcut(rfm['monetary'], q=3, labels=[1, 2, 3])
rfm['RFM'] = rfm['R'].astype(str) + rfm['F'].astype(str) + rfm['M'].astype(str)print(rfm)
2. 基于K-Means的用户聚类分析
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt# 准备数据
X = rfm[['recency', 'frequency', 'monetary']]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 寻找最佳K值
inertia = []
for k in range(1, 6):kmeans = KMeans(n_clusters=k, random_state=42)kmeans.fit(X_scaled)inertia.append(kmeans.inertia_)plt.plot(range(1, 6), inertia, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()# 应用K-Means
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X_scaled)
rfm['cluster'] = clusters# 可视化
plt.scatter(rfm['recency'], rfm['frequency'], c=rfm['cluster'])
plt.xlabel('Recency')
plt.ylabel('Frequency')
plt.show()
3. 基于决策树的用户分类模型
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split# 假设我们有一些标签数据
# 这里用cluster作为目标变量演示
X = rfm[['recency', 'frequency', 'monetary']]
y = rfm['cluster']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X_train, y_train)plt.figure(figsize=(12, 8))
plot_tree(clf, feature_names=X.columns, class_names=['低价值', '中价值', '高价值'], filled=True)
plt.show()
4. 基于协同过滤的用户兴趣预测
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity# 用户-物品交互矩阵
interactions = np.array([[1, 0, 1, 0, 1],  # 用户1[0, 1, 1, 1, 0],  # 用户2[1, 1, 0, 0, 1],  # 用户3[0, 0, 1, 1, 0]   # 用户4
])# 计算用户相似度
user_sim = cosine_similarity(interactions)
print("用户相似度矩阵:")
print(user_sim)# 预测用户对未交互物品的兴趣
def predict(user_id, item_id):# 找到相似用户sim_users = np.argsort(-user_sim[user_id])# 计算加权评分score = 0total_sim = 0for u in sim_users[1:]:  # 排除自己if interactions[u, item_id] > 0:score += user_sim[user_id, u] * interactions[u, item_id]total_sim += user_sim[user_id, u]return score / total_sim if total_sim > 0 else 0# 预测用户0对物品1的兴趣
print("用户0对物品1的预测兴趣:", predict(0, 1))
5. 基于LDA的主题模型分析
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation# 用户浏览的关键词数据
documents = ['手机 游戏 电竞 性能 处理器','美妆 护肤 面膜 化妆品 口红','运动 健身 跑步 装备 营养','手机 摄影 相机 拍照 像素','美妆 香水 品牌 折扣 促销'
]# 构建词袋模型
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)# 训练LDA模型
lda = LatentDirichletAllocation(n_components=3, random_state=42)
lda.fit(X)# 显示每个主题的关键词
def print_top_words(model, feature_names, n_top_words):for topic_idx, topic in enumerate(model.components_):message = f"主题#{topic_idx}: "message += " ".join([feature_names[i]for i in topic.argsort()[:-n_top_words - 1:-1]])print(message)print_top_words(lda, vectorizer.get_feature_names_out(), 3)
6. 基于神经网络的用户嵌入表示
import torch
import torch.nn as nn
import torch.optim as optim# 用户特征数据
num_users = 1000
num_features = 10
user_features = torch.randn(num_users, num_features)# 简单的嵌入模型
class UserEmbedding(nn.Module):def __init__(self, input_dim, embedding_dim):super().__init__()self.fc1 = nn.Linear(input_dim, 64)self.fc2 = nn.Linear(64, embedding_dim)self.relu = nn.ReLU()def forward(self, x):x = self.relu(self.fc1(x))x = self.fc2(x)return x# 训练配置
model = UserEmbedding(num_features, 5)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)# 模拟训练过程
for epoch in range(10):optimizer.zero_grad()outputs = model(user_features)loss = criterion(outputs, torch.randn(num_users, 5))  # 模拟目标loss.backward()optimizer.step()print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')# 获取用户嵌入
user_embeddings = model(user_features)
print("用户嵌入维度:", user_embeddings.shape)
7. 基于时间序列的用户行为预测
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA# 用户每日活跃度数据
dates = pd.date_range(start='2023-01-01', end='2023-03-31')
activity = [int(x) for x in np.sin(np.linspace(0, 10, len(dates))) * 10 + 15 + np.random.normal(0, 2, len(dates))]
df = pd.DataFrame({'date': dates, 'activity': activity}).set_index('date')# 训练ARIMA模型
model = ARIMA(df, order=(5,1,0))
model_fit = model.fit()# 预测未来7天
forecast = model_fit.forecast(steps=7)
print("未来7天预测:")
print(forecast)# 可视化
plt.plot(df.index, df['activity'], label='实际')
plt.plot(pd.date_range(start='2023-04-01', periods=7), forecast, label='预测')
plt.legend()
plt.show()

http://www.xdnf.cn/news/13058.html

相关文章:

  • Rex-Thinker模型的核心思想、亮点和挑战
  • Solidity从入门到精通-Remix的基本使用和Solidity的基本数据类型
  • Java UDP网络通信实战指南
  • 时空网络动力学图谱分析完整解决方案
  • delphi安装SAP控件:SAPFunctionsSAPLogonControl
  • 线程中可见性ABA问题是什么如何解决
  • Redis上篇--知识点总结
  • STM32简易示波器/逻辑分析仪设计指南
  • 用虚拟机安装macos系统之后进入Boot Manager页面
  • Vue 实例的数据对象详解
  • ECS架构之Entity设计与传统OOP的碰撞思考
  • Jinja2核心应用场景及示例
  • JavaWeb-JDBC实现数据库更新操作(超简单入门版)
  • 综合态势显示 ASD-100
  • leetcode41-缺失的第一个正数
  • java复习 06
  • 写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
  • 今日行情明日机会——20250609
  • AT模式下的全局锁冲突如何解决?
  • 【大厂机试题解法笔记】报文响应时间
  • 理解大端与小端字节序——原理、实践与网络编程
  • 发立得信息发布系统房屋信息版(php+mysql)V1.0版
  • 在Ubuntu24上采用Wine打开SourceInsight
  • 什么时候用GraphRAG?RAG VS GraphRAG综合分析
  • 算法—栈系列
  • 什么是RPA机器人?详解RPA机器人:诞生背景、核心定义、工作原理、行业应用、国产代表与未来趋势
  • 《信号与系统》第 6 章 信号与系统的时域和频域特性
  • 视图去水印软件:告别水印烦恼,让素材焕然一新
  • 专业文件比对辅助软件
  • 2025年八大员(标准员)考试题库及答案