1. 项目背景与目标
很多初创公司拥有用户数据,但缺乏挖掘价值的能力。本项目的目标是构建一个 MVP(最小可行性产品),实现以下功能:
-
数据接入:模拟生成电商/应用的用户行为日志(点击量、停留时长、消费金额等)。
-
机器学习分析:使用 K-Means 算法对用户进行自动画像分层(如:高价值用户、流失风险用户)。
-
全栈展示:通过 Web 界面可视化展示聚类结果。
2. 技术栈选型
-
语言:Python 3.9+
-
Web框架:Flask (轻量级,适合快速开发)
-
机器学习:Scikit-learn (K-Means聚类), Pandas (数据处理)
-
前端可视化:HTML + ECharts (强大的图表库)
3. 系统架构设计
graph LR
A[数据生成器] -->|生成CSV| B(本地数据仓库)
B --> C{ML 模型引擎}
C -->|训练/预测| D[K-Means 算法]
D -->|聚类结果| E[Flask API]
E -->|JSON响应| F[前端 ECharts 仪表盘]
4. 核心功能与代码实现
4.1 数据生成与特征工程
我们主要关注三个指标(RFM模型的简化版):active_time (活跃时长), clicks (点击次数), amount (消费金额)。为了让模型有规律可循,我们使用 Numpy 的正态分布生成三类典型人群。
核心代码 (data_generator.py):
def generate_mock_data(num_users=500):
# 1. 高价值用户:时间长、点击多、消费高
group1 = {
'active_time': np.random.normal(60, 15, 150),
'clicks': np.random.normal(50, 10, 150),
'amount': np.random.normal(200, 50, 150)
}
# 2. 潜在流失用户:各项指标均低
group3 = {
'active_time': np.random.normal(5, 2, 150),
'clicks': np.random.normal(5, 2, 150),
'amount': np.random.normal(0, 5, 150)
}
# ... 合并数据并保存为 CSV
4.2 机器学习引擎 (K-Means)
我们使用 Scikit-learn 的 KMeans 算法将用户聚类为 3 类。为了让结果具备业务价值,我们在聚类后根据“平均消费金额”对 Cluster ID 进行排序,从而自动打上“高价值”、“普通”或“流失风险”的标签。
核心代码 (ml_engine.py):
class UserClusterModel:
def train_and_predict(self):
# ... 数据读取 ...
# 1. 数据标准化 (K-Means 对尺度敏感,必须缩放)
scaled_features = self.scaler.fit_transform(features)
# 2. 训练模型 (k=3)
self.model = KMeans(n_clusters=3, random_state=42)
df['cluster'] = self.model.fit_predict(scaled_features)
# 3. 智能标签映射 (按消费金额排序)
# 算出每个簇的平均消费,从高到低排序
cluster_stats = df.groupby('cluster')['amount'].mean().sort_values(ascending=False)
sorted_ids = cluster_stats.index.tolist()
labels_map = {
sorted_ids[0]: '高价值用户 (High Value)',
sorted_ids[1]: '普通用户 (Normal)',
sorted_ids[2]: '流失风险 (Churn Risk)'
}
df['label'] = df['cluster'].map(labels_map)
return df
4.3 Flask 后端接口
后端主要负责调度 ML 引擎,并将处理好的数据格式化为 ECharts 散点图所需的 JSON 结构。
核心代码 (app.py):
@app.route('/api/analyze')
def api_analyze():
# 调用引擎进行训练和预测
df = model_engine.train_and_predict()
# 构造 ECharts 散点图数据结构
scatter_data = []
for label in df['label'].unique():
subset = df[df['label'] == label]
scatter_data.append({
"name": label,
"data": subset[['active_time', 'amount', 'clicks', 'user_id']].values.tolist()
})
return jsonify({
"scatter_data": scatter_data,
"summary": model_engine.get_statistics(df)
})
5. 快速启动指南
环境准备
确保已安装 Python 3.8 或以上版本。
安装依赖
pip install -r requirements.txt
运行项目
-
启动 Flask 服务器:
python app.py注意:首次运行时,系统会自动调用生成器创建 500 条模拟数据。
-
打开浏览器访问:
http://127.0.0.1:5000 -
在网页中,你可以查看自动分层的散点图,点击右上角的“重新生成数据”按钮可以模拟新的数据流入并实时重新训练模型。
6. 总结
通过不到 300 行代码,我们实现了一个打通数据生产、模型训练、后端接口和前端展示的闭环系统。这不仅是一个 Demo,更是迈向 AIOps 和数据中台的第一步。
项目代码:
1586

被折叠的 条评论
为什么被折叠?



