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

如何解决KNeighborsClassifier样本数不一致及准确率不达标的问题

核心问题根因

你当前使用的数据集仅126行,属于极小样本场景,KNN作为惰性学习模型,本身对数据规模、特征尺度、训练测试分布一致性敏感度很高;调大测试集占比会进一步压缩训练集样本量,导致模型无法学习到有效分布,你提到的样本数量不一致大概率是训练测试切分时未固定规则,导致每次运行的样本分布、样本量出现随机波动。

具体解决方案

  • 规范训练测试切分逻辑
    小样本场景下测试集占比不要超过0.3,你设置0.4会导致训练集仅剩余70条左右数据,不足以支撑KNN拟合分布。切分时增加stratify=y参数保证训练、测试集的正负样本比例和原数据集完全一致,同时设置random_state固定随机种子,避免每次运行切分结果不一致的问题:
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size = 0.2, stratify=y, random_state=42)
  • 优化KNN的前置处理与参数调优
    KNN的距离计算对特征量纲高度敏感,未做标准化的特征会直接导致距离计算失效,其次默认参数(k=5,均匀权重等)未必适配你的数据集,可按如下逻辑优化:
# 特征标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
xtrain_scaled = scaler.fit_transform(xtrain)
xtest_scaled = scaler.transform(xtest)

# 网格搜索最优参数
from sklearn.model_selection import GridSearchCV
params = {
    "n_neighbors": range(3, 15),
    "weights": ["uniform", "distance"],
    "metric": ["euclidean", "manhattan"]
}
grid = GridSearchCV(KNeighborsClassifier(), params, cv=5, scoring="accuracy")
grid.fit(xtrain_scaled, ytrain)
best_knn = grid.best_estimator_
# 输出测试集准确率
print(best_knn.score(xtest_scaled, ytest))
  • 用交叉验证替代单次切分评估准确率
    极小样本场景下单次train_test_split的结果波动极大,建议用K折交叉验证得到更稳定的准确率评估结果:
from sklearn.model_selection import cross_val_score
# 全数据集做标准化后跑10折交叉验证
x_scaled = StandardScaler().fit_transform(x)
scores = cross_val_score(best_knn, x_scaled, y, cv=10, scoring="accuracy")
print("交叉验证平均准确率:", scores.mean())
  • 处理类别不平衡问题
    如果你的Y列0、1两类的样本占比差超过3:1,可通过SMOTE过采样少数类、或者欠采样多数类的方式均衡样本分布,避免模型偏向多数类导致准确率偏低。
  • 替换适配小样本的模型
    KNN对小样本的拟合能力有限,你可以尝试逻辑回归、线性SVM这类更适配小样本场景的模型,通常能得到更稳定的效果,比如线性SVM的实现:
from sklearn.svm import SVC
svc_model = SVC(kernel="linear", random_state=42)
print(cross_val_score(svc_model, x_scaled, y, cv=10).mean())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:18:01