You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用KMeans聚类提升Logistic Regression模型准确率及相关疑问

二分类模型优化与KMeans使用疑问解答

问题背景

我是Python机器学习领域的新手,正在处理一个二分类问题。实现的Logistic Regression模型平均准确率约为75%,尝试了独热编码分类变量、缩放连续变量、网格搜索最优参数等多种方法提升准确率,但均未奏效,因此尝试用无监督学习方法优化。

我使用n_clusters=2的KMeans聚类,先基于X_train和y_train训练Logistic Regression模型,随后用KMeans预测的标签作为交叉验证的目标,代码如下:

kmeans = KMeans(n_clusters = 2)
kmeans.fit(X_train)

logreg = LogisticRegression().fit(X_train, y_train)

cross_val_score(logreg, X_train, kmeans.labels_, cv = 5)

使用cross_val_score得到的平均准确率超过95%,但用.score()方法logreg.score(X_train, kmeans.labels_)得到的准确率仅为60%左右。我有以下疑问:

  • 用模型预测KMeans生成的标签得到的分数有什么意义?
  • 如何正确使用KMeans聚类提升模型准确率?我尝试将聚类标签作为新特征加入训练数据后训练模型,但准确率仍未提升。
  • 为什么cross_val_score和.score()方法得到的分数差异巨大?

解答

1. 预测KMeans标签的分数意义

这个分数仅能衡量你的逻辑回归模型是否能捕捉到KMeans基于特征相似度划分出的数据簇模式,和你原本要解决的二分类任务(预测真实标签y_train)没有任何直接关联。KMeans的标签是无监督生成的“相似度分组标识”,不是业务场景下的分类目标。分数高只能说明模型学到的特征模式和KMeans的聚类逻辑有重叠,但对提升原任务的准确率没有实际价值。

2. 正确使用KMeans提升模型准确率的方式

直接加入聚类标签没效果,大概率是使用方式不对,可以试试这些方向:

  • 分簇训练模型:将X_train按KMeans的簇划分成子集,为每个子集单独训练逻辑回归模型。预测时先判断样本所属的簇,再调用对应模型输出结果。这种方式适合数据本身存在明显簇间差异,且不同簇的分类规律不一致的场景。
  • 生成聚类距离特征:不要直接用簇标签,而是计算每个样本到所有KMeans聚类中心的距离,将这些距离作为新特征加入训练数据。聚类中心是簇的特征浓缩,距离特征能更细腻地反映样本与各簇的相似程度,比单一标签更具信息量。
  • 先验证聚类与任务的相关性:先用混淆矩阵查看KMeans生成的簇标签和真实分类标签y_train的对应关系。如果簇划分和真实分类完全无关,说明KMeans不适合你的数据,没必要继续在这上面花精力,得换其他优化思路。

3. cross_val_score与.score()分数差异的核心原因

你的代码存在严重的数据泄露问题,导致交叉验证的分数完全失真:

  • 你先在全量X_train上拟合了KMeans,得到全局的簇标签。当调用cross_val_score时,每个交叉验证折的验证集数据已经参与了KMeans簇的生成过程,相当于模型在验证时提前“见过”验证数据的簇特征,这会让验证分数虚高到不真实的程度。
  • 而.score()是用在全量X_train上训练好的logreg,直接预测同样基于全量X_train生成的簇标签,模型没有任何泛化压力,但因为logreg是基于真实y_train训练的,它的目标和KMeans的簇标签不匹配,所以分数仅为60%左右,这才是更贴近真实情况的结果。
  • 正确的交叉验证逻辑应该是:在每个交叉验证折内,先在训练子集上拟合KMeans,生成训练子集和验证子集的簇标签,再用训练子集训练模型并在验证子集上评估,这样才能避免数据泄露,得到可靠的分数。

内容的提问来源于stack exchange,提问作者Laith Omari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:40:26