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

使用Scikit-learn KNN时遇样本数量不匹配错误求助

解决Scikit-learn train_test_split样本数不匹配问题

我看你用Scikit-learn的KNN做预测,写了recurse()遍历特征组合、predict()处理预测逻辑,但运行时卡在train_test_split那步,报了样本数不一致的错:

ValueError: Found input variables with inconsistent numbers of samples: [20, 499]

你说已经检查过特征和标签长度一致,那问题大概率出在数据形状的维度搞反了,我帮你捋捋:

问题根源

Scikit-learn的train_test_split要求输入的特征数据data必须是**[样本数, 特征数]的形状,但从报错里的[20,499]来看,你传入的data是[特征数, 样本数]**的结构——也就是len(data)是特征数量20,而answers的长度是样本数量499。这时候train_test_split会把data里的每个特征数组当成一个"样本",自然就和answers的样本数对不上了。

你代码里其实已经注释了转置的代码,只是没启用,这正是关键的修复点!

具体修复步骤

  1. 启用数据转置,把data从[特征数, 样本数]转成[样本数, 特征数],然后用转置后的数组去做拆分:
def predict(self, data, answers):
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.model_selection import train_test_split as tts
    import numpy as np
    if len(data) > 1:
        print("length before transposition {}".format(len(data)))
        # 取消注释转置代码
        n_data = np.transpose(data)
        print("length after transposition {}".format(len(n_data)))
        knn = KNeighborsClassifier(n_neighbors=1)
        # 用n_data代替原data传入tts
        xTrain, xTest, yTrain, yTest = tts(n_data, answers)
        print("xTrain data: {}".format(len(xTrain)))
        knn.fit(xTrain, yTrain)
        print(knn.score(xTest, yTest))
  1. 验证数据形状(可选但推荐),在predict开头加一行形状打印,方便你确认数据维度是否正确:
print(f"data shape: {np.array(data).shape}, answers shape: {np.array(answers).shape}")

转置后data的形状应该是(499, 20),和answers的(499,)对应上。

  1. 检查特征切割函数,确保rLeft()、rMid()、rRight()返回的特征组合仍然保持[特征数, 样本数]的结构,这样转置后才能继续正常使用。

为什么你之前检查长度没发现问题?

你检查的是"每个特征的样本数和标签一致",但len(data)返回的是特征的数量,不是样本数量——所以你以为的"长度一致"其实是每个特征的样本数和标签数一致,但train_test_split看的是data的第一维度长度(也就是样本数),这才是问题所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:55:01