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

使用KNN寻找最优K值以提升准确率:结果不符求助

KNN最优K值不符预期的问题排查与解决方案

1. 优先检查数据标签分布

KNN对类别不平衡数据极度敏感:如果failure列中某一类样本占比过高(比如90%都是未倒闭银行),准确率指标会偏向多数类,导致最优K值偏离预期。执行以下代码查看分布:

print(merged_df['failure'].value_counts(normalize=True))

如果不平衡,放弃用准确率选K,改用F1-score或ROC-AUC这类更适合不平衡数据的指标,修改交叉验证代码:

scores = cross_val_score(estimator=knn, X=X, y=y, cv=kfold, scoring='f1')

2. 修正预处理顺序(关键错误)

你的代码先做归一化再处理缺失值,这会导致缺失值被归一化污染后再填充0,完全破坏特征分布。正确顺序是先补缺失值,再归一化:

# 先处理缺失值
imputer = SimpleImputer(missing_values=np.nan, strategy="constant", fill_value=0)
merged_df[features] = imputer.fit_transform(merged_df[features])

# 再做归一化
scaler = MinMaxScaler()
merged_df[features] = scaler.fit_transform(merged_df[features])

3. 调整KNN参数与交叉验证策略

  • 尝试加权KNN:默认weights='uniform'是平等看待邻居,改成weights='distance'让近邻居权重更高,可能改变最优K值:
    knn = KNeighborsClassifier(n_neighbors=k, weights='distance')
    
  • 增加交叉验证折数:4折的随机性较强,改成10折验证结果更稳定:
    kfold = KFold(n_splits=10, shuffle=True, random_state=0)
    

4. 可视化验证结果

把每个K值的准确率可视化,直观确认是否K=7确实是峰值:

import matplotlib.pyplot as plt

plt.figure(figsize=(8,4))
plt.plot(k_values, accuracy_results, marker='o', color='#2ecc71')
plt.xlabel('K值')
plt.ylabel('4折交叉验证平均准确率')
plt.title('K值与模型准确率的关系')
plt.xticks(k_values)
plt.grid(axis='y', linestyle='--')
plt.show()

如果图中K=12的准确率和K=7接近,说明是交叉验证的随机波动;如果K=7确实是明显峰值,那你的预期可能和数据实际规律不符。

5. 验证数据合并正确性

检查cert是否为唯一标识,避免重复合并导致数据冗余:

print(f"重复cert数量:{merged_df.duplicated(subset='cert').sum()}")

如果有重复,合并时需去重或确认合并逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:05:29