KNN预测报TypeError及数据标准化合理性咨询
KNN预测功能报错的解决
你代码里的错误原因很直接:变量名不匹配。你训练的模型实例是knn_model,但调用预测方法时写了knn.predict(),Python找不到knn这个变量,因此抛出了看似缺少参数的错误(本质是调用对象不存在导致的语法误解)。
修正后的代码:
from sklearn.neighbors import KNeighborsClassifier knn_model = KNeighborsClassifier(n_neighbors=3, metric='euclidean') knn_model.fit(train_val_process, merge_labels.label) y_pred_knn = knn_model.predict(test_data_process) # 将knn改为knn_model
数据标准化代码的问题分析
你的标准化代码存在两个关键问题:
- StandardScaler的默认行为不符合你的需求:
StandardScaler默认会把数据转换为均值0、标准差1的分布。如果你确实需要均值1、标准差0,这个类无法实现(标准差为0意味着所有数据值完全相同,几乎没有业务意义)。如果是笔误,实际需要的是均值0、标准差1的标准化,那拟合逻辑没问题,但后续拼接步骤存在错误。 train_val_process未使用标准化后的数据:
你拼接的是原始的train_data和val_data,但训练模型时用的就是这个未标准化的数据集,和后续测试用的标准化数据不匹配,会直接导致模型预测失效。
修正后的标准化代码(假设你实际需要均值0、标准差1的标准化):
from sklearn.preprocessing import StandardScaler import pandas as pd scaler = StandardScaler() # 拟合训练+验证的原始数据 scaler.fit(pd.concat([train_data, val_data])) # 转换各数据集为标准化后的数据 train_data_process = pd.DataFrame(scaler.transform(train_data), columns=train_data.columns) val_data_process = pd.DataFrame(scaler.transform(val_data), columns=val_data.columns) # 拼接标准化后的训练+验证数据,用于模型训练 train_val_process = pd.concat([train_data_process, val_data_process]) test_data_process = pd.DataFrame(scaler.transform(test_data), columns=test_data.columns) y_test = test_labels.label
如果确实需要均值1、标准差0(注意:仅当所有样本值完全相同时标准差为0,无实际业务价值),可以手动实现:
# 以train_data为例 data_process = 1 + 0 * (train_data - train_data.mean())/train_data.std()
内容的提问来源于stack exchange,提问作者Junwiss
相关产品推荐
相关产品推荐

