如何用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
相关产品推荐
相关产品推荐

