使用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的样本数对不上了。
你代码里其实已经注释了转置的代码,只是没启用,这正是关键的修复点!
具体修复步骤
- 启用数据转置,把
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))
- 验证数据形状(可选但推荐),在
predict开头加一行形状打印,方便你确认数据维度是否正确:
print(f"data shape: {np.array(data).shape}, answers shape: {np.array(answers).shape}")
转置后data的形状应该是(499, 20),和answers的(499,)对应上。
- 检查特征切割函数,确保
rLeft()、rMid()、rRight()返回的特征组合仍然保持[特征数, 样本数]的结构,这样转置后才能继续正常使用。
为什么你之前检查长度没发现问题?
你检查的是"每个特征的样本数和标签一致",但len(data)返回的是特征的数量,不是样本数量——所以你以为的"长度一致"其实是每个特征的样本数和标签数一致,但train_test_split看的是data的第一维度长度(也就是样本数),这才是问题所在。
内容的提问来源于stack exchange,提问作者Jackson Ennis
相关产品推荐
相关产品推荐

