8.非监督学习与关系挖掘:聚类分析、客户细分、关联规则与协同过滤的全面解析——Python数据挖掘代码实践
一、引言
在当今数据爆炸的时代,企业面临着海量的用户、交易、行为等数据。如何从这些无标签数据中提取有意义的信息,成为了数据科学家和商业决策者的重要任务。非监督学习与关系挖掘提供了一系列算法和技术,能够自动发现数据中的隐藏模式与结构。
本博客主要围绕以下两个方向展开:
- 聚类分析与客户细分:通过聚类方法,我们可以将客户按照行为、偏好、地理位置等划分为不同群体,从而为精准营销、产品优化和风险管理提供数据支持。
- 关联规则与协同过滤:通过挖掘数据中项与项之间的关联规则,企业可以进行市场篮子分析、个性化推荐以及交叉销售策略制定。
此外,本文还将详细介绍各种常见聚类方法(包括层次聚类与非层次聚类)及其距离度量方法,同时讨论关联规则的挖掘和协同过滤在实际应用中的优势、局限与调优策略。通过理论讲解与代码实践,我们力求构建一套完整的知识体系,帮助读者从数据预处理到模型评估,建立科学的数据挖掘流程。
文章目录
- 一、引言
- 二、聚类分析与客户细分
- 2.1 聚类分析概述
- 2.2 实践示例:K-Means 聚类
- 2.3 实践示例:层次聚类与树状图
- 2.4 距离度量方法
- 三、 关联规则与协同过滤
- 3.1 关联规则挖掘
- 3.2 协同过滤
- 四、 综合案例与实践流程
- 五、 综合模型调优与评估
- 5.1 聚类模型评估
- 5.2 关联规则评估
- 5.3 超参数调优与验证曲线
- 六、 个人观点与最佳实践
- 推荐博客
二、聚类分析与客户细分
2.1 聚类分析概述
聚类分析(Clustering)是非监督学习中的一种重要方法,其目标是将数据集中的对象根据相似性分为若干个簇。常用的聚类方法大致可以分为两类:
- 非层次聚类:如 K 均值算法(K-Means),通过迭代优化簇中心的方式实现数据分群。
- 层次聚类:包括凝聚层次聚类(Agglomerative Clustering)和分裂层次聚类(Divisive Clustering),可利用不同的链接方式(单链接、完全链接、Ward法)构建树状结构,从而对数据进行分层次的划分。
聚类分析在客户细分、市场分割、图像分割以及异常检测等领域有广泛应用。通过聚类,我们不仅能将客户分为高价值与低价值群体,还能发现隐藏的消费模式和行为偏好。
2.2 实践示例:K-Means 聚类
下面是一个使用 K-Means 进行聚类的示例代码。我们生成一些随机数据,并利用 K-Means 将数据分为 3 类,同时绘制聚类结果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成模拟二维数据(300 个样本,分布在 0 到 10 之间)
np.random.seed(42)
X = np.random.rand(300, 2) * 10
# 训练 K-Means 模型,设置簇数为 3
kmeans = KMeans(n_clusters=3, random_state=42)
y_pred = kmeans.fit_predict(X)
# 绘制聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', alpha=0.6, edgecolor='k', s=50)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
c='red', marker='x', s=200, label='簇中心')
plt.title("K-Means 聚类示例", fontsize=16)
plt.xlabel("特征 1", fontsize=14)
plt.ylabel("特征 2", fontsize=14)
plt.legend()
plt.show()
代码解析:
- 通过
np.random.rand
生成 300 个二维样本。 - 利用
KMeans
进行聚类,并返回每个样本的簇标号。 - 使用
plt.scatter
绘制数据点和簇中心,从而直观展示聚类结果。
2.3 实践示例:层次聚类与树状图
层次聚类可以帮助我们从全局视角理解数据结构,下面的示例使用 scipy
的 linkage
方法计算聚类,然后绘制树状图。
from scipy.cluster.hierarchy import dendrogram, linkage
# 使用 Ward 法进行层次聚类
Z = linkage(X, method='ward')
# 绘制聚类树状图(dendrogram)
plt.figure(figsize=(10, 5))
dendrogram(Z, color_threshold=5)
plt.title("层次聚类树状图(Ward 法)", fontsize=16)
plt.xlabel("样本索引", fontsize=14)
plt.ylabel("距离", fontsize=14)
plt.show()
代码解析:
linkage
函数使用 Ward 方法计算样本之间的距离,生成层次聚类所需的聚类树数据。dendrogram
绘制树状图,通过观察树状图可以发现哪些样本先被聚合到一起,从而为客户细分提供依据。
2.4 距离度量方法
聚类的效果在很大程度上依赖于距离度量的选择。常见的距离度量包括:
- 欧几里得距离(Euclidean Distance):适用于连续数值数据,直观计算样本之间的直线距离;
- 曼哈顿距离(Manhattan Distance):适用于高维数据,计算样本之间的绝对差;
- 马氏距离(Mahalanobis Distance):考虑数据协方差,用于判断样本的异常性;
- 混合距离度量:对于包含数值和类别的混合数据,可使用混合距离或专门设计的相似性度量。
下面是一个简单的距离计算示例:
from scipy.spatial.distance import euclidean, cityblock
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print("欧几里得距离:", euclidean(a, b))
print("曼哈顿距离:", cityblock(a, b))
三、 关联规则与协同过滤
关联规则挖掘与协同过滤是市场篮子分析和个性化推荐中的核心技术。关联规则挖掘旨在发现数据中各项之间的潜在共现关系,而协同过滤则侧重于计算用户或物品之间的相似度,从而实现精准推荐。
3.1 关联规则挖掘
Apriori 算法简介
- 核心思想:
Apriori 算法通过迭代生成候选项集,利用“支持度”筛选频繁项集,再根据“置信度”与“提升度”生成关联规则。 - 关键指标:
- 支持度(Support):某一项集在所有交易中出现的频率;
- 置信度(Confidence):在含有前项的交易中同时包含后项的比例;
- 提升度(Lift):衡量规则效果与随机事件的偏差,提升度大于 1 表示规则具有较强的解释力。
实践示例
使用 mlxtend 库实现 Apriori 算法。请确保已安装 mlxtend:
pip install mlxtend
示例代码如下:
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules
# 模拟交易数据(0/1 表示是否购买)
data = pd.DataFrame({
'牛奶': [1, 0, 1, 1, 0],
'面包': [1, 1, 0, 1, 1],
'鸡蛋': [0, 1, 1, 1, 0],
'黄油': [0, 1, 0, 1, 1]
})
# 计算频繁项集,最小支持度设为 0.5
frequent_itemsets = apriori(data, min_support=0.5, use_colnames=True)
# 生成关联规则,最小提升度设为 1
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.0)
print("关联规则结果:")
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
代码解析:
- 使用
apriori()
函数计算频繁项集; - 使用
association_rules()
生成关联规则; - 根据支持度、置信度和提升度判断规则的有效性,指导市场篮子分析和推荐系统设计。
3.2 协同过滤
协同过滤简介
- 基于用户的协同过滤:
利用用户之间的相似性推荐其他用户喜欢的物品。 - 基于物品的协同过滤:
利用物品之间的相似性,推荐与用户过去购买或浏览过的物品相似的其他物品。 - 常用相似性度量:
余弦相似度、皮尔逊相关系数等。
实践示例:余弦相似度
下面代码示例展示如何利用余弦相似度计算用户评分矩阵中的相似性,并简单实现基于物品的协同过滤推荐:
from sklearn.metrics.pairwise import cosine_similarity
# 构造示例评分矩阵(行:用户,列:物品)
ratings = pd.DataFrame({
'Item1': [5, 4, 0, 0],
'Item2': [3, 0, 4, 5],
'Item3': [0, 0, 5, 3],
'Item4': [1, 2, 0, 0]
}, index=['User1', 'User2', 'User3', 'User4'])
# 计算物品之间的余弦相似度
item_similarity = cosine_similarity(ratings.T)
item_similarity_df = pd.DataFrame(item_similarity, index=ratings.columns, columns=ratings.columns)
print("物品相似度矩阵:")
print(item_similarity_df)
代码解析:
- 将评分矩阵转置后,计算物品间的余弦相似度;
- 通过相似度矩阵,可以为每个物品找到相似度高的其他物品,从而进行个性化推荐。
四、 综合案例与实践流程
在实际商业应用中,聚类分析与关联规则挖掘往往结合在一起,为客户细分、推荐系统、市场营销等提供决策依据。下面给出一个综合案例流程示例,展示如何将聚类和关联规则挖掘有机结合:
综合案例背景
假设我们有一个电商平台的交易数据,包含用户购买记录、商品类别、交易时间等信息。目标是:
- 通过聚类分析对用户进行细分,识别出高价值客户和潜在流失客户;
- 利用关联规则挖掘找出常见的商品组合,为交叉销售和推荐系统提供数据支持。
数据预处理与聚类
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
# 模拟电商交易数据
np.random.seed(42)
data = pd.DataFrame({
'用户ID': np.arange(1, 301),
'购买频次': np.random.randint(1, 20, 300),
'平均花费': np.random.uniform(20, 200, 300),
'回访率': np.random.uniform(0, 1, 300)
})
# 选取用于聚类的特征,并标准化
from sklearn.preprocessing import StandardScaler
features = data[['购买频次', '平均花费', '回访率']]
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)
# 使用 K-Means 进行聚类,假设分为 3 类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(features_scaled)
data['聚类类别'] = clusters
# 可视化聚类结果
plt.figure(figsize=(8, 6))
sns.scatterplot(x='购买频次', y='平均花费', hue='聚类类别', data=data, palette='viridis', s=60)
plt.title("电商用户聚类示例")
plt.xlabel("购买频次")
plt.ylabel("平均花费")
plt.show()
说明:
- 本示例对用户的购买频次、平均花费和回访率进行了聚类,划分为 3 个群体;
- 标准化步骤是必不可少的,以保证不同尺度特征能够公平参与聚类。
关联规则挖掘
假设我们还拥有一份交易记录数据,记录每个交易中用户购买的商品列表。下面使用 Apriori 算法挖掘关联规则。
from mlxtend.frequent_patterns import apriori, association_rules
# 模拟交易数据,行代表交易记录,列代表商品(0/1 表示是否购买)
transaction_data = pd.DataFrame({
'牛奶': [1, 0, 1, 1, 0, 1, 0, 1, 0, 1],
'面包': [1, 1, 0, 1, 1, 0, 1, 1, 1, 0],
'鸡蛋': [0, 1, 1, 0, 1, 1, 0, 0, 1, 1],
'黄油': [0, 0, 1, 1, 1, 0, 1, 0, 0, 1]
})
# 计算频繁项集,最小支持度设为 0.3
frequent_itemsets = apriori(transaction_data, min_support=0.3, use_colnames=True)
# 生成关联规则,最小提升度设为 1.0
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.0)
print("关联规则挖掘结果:")
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
说明:
- 关联规则挖掘能帮助我们识别出哪些商品经常一起购买,从而为个性化推荐和交叉销售提供依据。
- 关键指标:支持度、置信度和提升度分别衡量商品组合的普遍性、条件概率和关联强度。
协同过滤应用
在电商推荐系统中,协同过滤可基于用户或物品的相似度计算推荐列表。下面以物品为例,使用余弦相似度计算商品相似性。
from sklearn.metrics.pairwise import cosine_similarity
# 构造示例评分矩阵(行:用户,列:商品)
ratings = pd.DataFrame({
'牛奶': [5, 4, 0, 0, 3],
'面包': [3, 0, 4, 5, 2],
'鸡蛋': [0, 0, 5, 3, 1],
'黄油': [1, 2, 0, 0, 4]
}, index=['User1', 'User2', 'User3', 'User4', 'User5'])
# 计算物品之间的余弦相似度
item_similarity = cosine_similarity(ratings.T)
item_similarity_df = pd.DataFrame(item_similarity, index=ratings.columns, columns=ratings.columns)
print("物品相似度矩阵:")
print(item_similarity_df)
说明:
- 余弦相似度可以有效捕捉用户评分数据中商品之间的相似度。
- 根据物品相似度矩阵,可以构建推荐系统,向用户推荐相似度较高的其他商品。
五、 综合模型调优与评估
在非监督学习与关系挖掘的实践中,模型调优和评估同样重要。针对聚类和关联规则挖掘,虽然传统意义上没有“超参数”如监督学习中那样的概念,但实际应用中仍需调节聚类数、距离度量、支持度阈值、置信度和提升度等参数。下面介绍如何使用交叉验证、验证曲线和学习曲线评估聚类与关联规则模型。
5.1 聚类模型评估
- 轮廓系数(Silhouette Score):衡量聚类结果的紧密度和分离度,取值范围 [-1, 1]。
- Davies-Bouldin 指数:越低越好,表示簇之间的分离度越大。
- Calinski-Harabasz 指数:分子为簇间离差平方和,分母为簇内离差平方和,值越大聚类效果越好。
实践示例:计算轮廓系数
from sklearn.metrics import silhouette_score
score = silhouette_score(features_scaled, y_pred)
print("轮廓系数:", score)
5.2 关联规则评估
- 支持度、置信度和提升度 是关联规则最常用的评估指标。
- 排列检验:通过打乱数据后重新计算指标,检验规则的显著性。
实践示例:排列检验(简化版)
# 示例:对规则的置信度进行简单排列检验
original_confidence = rules['confidence'].mean()
print("原始平均置信度:", original_confidence)
# 随机打乱后重新计算置信度(模拟排列检验)
import random
shuffled_confidences = [random.random() for _ in range(len(rules))]
print("随机置信度平均值:", np.mean(shuffled_confidences))
5.3 超参数调优与验证曲线
对于某些需要参数调优的聚类方法(如 DBSCAN 的 eps、min_samples)或关联规则的参数(如 min_support、min_threshold),可以使用验证曲线来判断参数变化对模型表现的影响。
实践示例:验证曲线绘制
from sklearn.model_selection import validation_curve
# 示例:使用 K-Means 的簇数作为参数绘制验证曲线
param_range = [2, 3, 4, 5, 6, 7]
# 这里用轮廓系数作为评分指标(自定义评分函数)
scores = []
for k in param_range:
kmeans = KMeans(n_clusters=k, random_state=42)
labels = kmeans.fit_predict(features_scaled)
score = silhouette_score(features_scaled, labels)
scores.append(score)
plt.figure(figsize=(8, 6))
plt.plot(param_range, scores, marker='o')
plt.xlabel("聚类数")
plt.ylabel("轮廓系数")
plt.title("K-Means 聚类参数验证曲线")
plt.show()
六、 个人观点与最佳实践
构建自动化调优管道
在实际项目中,我始终主张构建一个自动化的模型调优系统,这样可以实现:
- 持续监控与反馈:模型部署后,定期通过学习曲线和验证曲线监控模型表现,捕捉数据漂移(Data Drift);
- 自动超参数优化:结合 Grid Search、Random Search 以及贝叶斯优化,实现自动化参数调优,减少人为主观干预;
- 与数据治理结合:调优过程中不断反馈数据预处理与特征工程的不足,形成闭环的模型优化流程。
参数调优的综合考虑
模型参数的选择不仅仅是技术问题,还应结合业务背景。例如,在金融风控中,处理类别不平衡的参数(如 scale_pos_weight)必须与业务部门沟通,确保参数设定符合实际风险比例。此外,对于神经网络模型,隐藏层数、激活函数、优化器选择等都应通过大量实验确定,同时结合领域专家意见进行调整。
多角度评估模型表现
我认为,模型评估应从以下几个角度入手:
- 交叉验证:确保模型在不同数据子集上的稳定性;
- 验证曲线:观察单一超参数变化对模型表现的影响,帮助确定最佳参数区间;
- 学习曲线:判断是否需要更多数据,评估模型的泛化能力;
- 业务指标:结合实际业务需求,选择合适的评估指标(如 F1 值、ROC AUC、MSE、R² 等)。
通过多角度评估,我们能更全面地理解模型的优势与局限,做出更科学的选择。
结语
构建一个高效且稳定的监督学习模型,是一个系统工程,涉及数据预处理、特征工程、模型选择、超参数调优以及多角度评估。本文详细介绍了模型选择与评估的全过程,从交叉验证到超参数调优、验证曲线与学习曲线,再到具体的案例实践与个人经验总结,旨在为您提供一个全面且深入的指导。
模型调优绝不仅仅是一个技术环节,而是一个与业务深度融合的科学决策过程。只有建立起自动化调优与持续监控的闭环体系,并不断反馈与调整,才能真正提升模型在实际环境中的表现。希望这篇博客能为您在项目中构建高性能机器学习模型提供有力支持,并激发您对模型评估与调优的进一步探索与实践。
推荐博客
7.模型选择与评估:构建科学的参数调优与性能评估体系——Python数据挖掘代码实践
近期博客一览:
封面: