sklearn交叉验证报错:输入变量样本数不一致[7111,1778]求解决
解决KNeighborsClassifier样本数不一致的问题
嘿,这个错误我可太熟了!一眼就看到问题出在哪——你调用cross_validation.train_test_split的时候把返回值的顺序搞反了!
错误根源
sklearn的train_test_split函数的标准返回顺序是:X_train, X_test, y_train, y_test
而你写成了:X_train, y_train, X_test, y_test
这就导致你把测试集的特征数据赋值给了y_train,测试集的标签数据赋值给了y_test。你的总样本数是8889,测试集占20%就是1778个样本,训练集是7111个样本,自然X_train(7111个)和错误的y_train(1778个)样本数不匹配,触发了这个ValueError。
额外的潜在问题
除了这个核心错误,你的代码还有两个小问题需要修正:
- 你调用
rock_rap.reset_index(drop=True)但没有重新赋值给rock_rap,这会导致后续数据的索引还是原来的,可能引发意想不到的问题,需要改成rock_rap = rock_rap.reset_index(drop=True)。 - 创建
label_genres时,你写了len(label_genres)但此时label_genres还未定义,会触发NameError。用reshape(-1, 1)可以自动计算行数,更安全。
修正后的关键代码段
# 筛选目标流派并修正索引 rock_rap = audio_features.loc[(audio_features['genres'] == 'rock') | (audio_features['genres'] == 'rap')] rock_rap = rock_rap.reset_index(drop=True) # 修正标签数组的重塑方式 label_genres = np.array(rock_rap['genres']).reshape(-1, 1) final_features = rock_rap.drop('genres',axis = 1).astype(float) final_features['speechiness'].fillna(final_features['speechiness'].mean(),inplace=True) knn = neighbors.KNeighborsClassifier(n_neighbors = 3) standard_scaler = preprocessing.StandardScaler() final_features = standard_scaler.fit_transform(final_features) # 修正train_test_split的变量顺序 X_train, X_test, y_train, y_test = cross_validation.train_test_split(final_features, label_genres, test_size=0.2) knn.fit(X_train, y_train)
验证修正效果
修正后,X_train和y_train的样本数应该一致(都是总样本的80%),X_test和y_test的样本数也一致(总样本的20%),这样knn.fit()就能正常运行了。
内容的提问来源于stack exchange,提问作者Ha An Tran
相关产品推荐
相关产品推荐

