自定义KNN分类器用于回归任务时遇numpy.float64不可调用错误求助
问题1:KNeighborsClassifier能否用于回归任务?
不能。KNeighborsClassifier(无论是sklearn官方实现还是你自定义的这个类)是专门为分类任务设计的:它通过选取k近邻的众数来预测离散类别,完全不适用于连续值的回归场景。
如果要做回归任务,应该使用KNN回归器:
- 官方sklearn实现是
KNeighborsRegressor,它通过计算k近邻的**均值(或加权均值)**来预测连续值。 - 你自定义的类也需要修改核心预测逻辑,把取众数的逻辑替换为计算均值。
问题2:解决TypeError: 'numpy.float64' object is not callable
错误根源
你的错误出现在most_common函数中,本质是用分类逻辑处理回归任务导致的类型兼容问题:
- 回归任务的标签是连续的
numpy.float64类型,当你尝试对连续值取众数时,每个近邻的标签大概率唯一,set(lst)中的元素与原列表元素一一对应。 - 列表的
count方法在查找numpy.float64类型元素时,出现了类型匹配异常,触发了“不可调用”的错误。
修复方案
将自定义类改为KNN回归器,同时修正代码中的逻辑错误,完整修复后的代码如下:
import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import math def euclidean(point, data): return np.sqrt(np.sum((point - data)**2, axis=1)) class KNeighborsRegressor: def __init__(self, k=5, dist_metric=euclidean): self.k = k self.dist_metric = dist_metric def fit(self, X_train, y_train): # 存储训练集,符合标准API逻辑 self.X_train = X_train self.y_train = y_train def predict(self, X_test): predictions = [] for x in X_test: distances = self.dist_metric(x, self.X_train) # 按距离排序,取前k个近邻的标签 y_sorted = [y for _, y in sorted(zip(distances, self.y_train))] k_neighbors = y_sorted[:self.k] # 用均值替代众数,适配回归任务 predictions.append(np.mean(k_neighbors)) return np.array(predictions) def evaluate(self, X_test, y_test): y_pred = self.predict(X_test) sse = np.sum((y_pred - y_test)**2) rmse = math.sqrt(sse / len(y_test)) return sse, rmse # 1. 数据预处理与拆分 X = dataset.values[:, 0:-1] y = dataset.values[:, -1] # 先拆分数据集再标准化,避免数据泄露 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) ss = StandardScaler().fit(X_train) X_train_scaled = ss.transform(X_train) X_test_scaled = ss.transform(X_test) # 2. 初始化并训练回归器 Model_KNN = KNeighborsRegressor(k=5, dist_metric=euclidean) Model_KNN.fit(X_train_scaled, y_train) # 3. 预测与评估 predicted = Model_KNN.predict(X_test_scaled) sse, rmse = Model_KNN.evaluate(X_test_scaled, y_test) print("SSE score KNN on Data = ", sse) print("RMSE score KNN on Data = ", rmse)
关键修改说明
- 核心逻辑替换:用
np.mean(k_neighbors)替代取众数的逻辑,适配连续值回归任务。 - 修正fit方法:原
fit方法忽略传入的训练集,直接用初始化时的数据集拆分,现在改为存储传入的训练集,符合标准机器学习API规范。 - 调整代码顺序:原代码在创建模型前就调用
Model_KNN.X_test会导致NameError,现在先拆分数据集再初始化模型。 - 修正评估计算:原RMSE计算错误地用类实例做除法,现在改为用SSE除以样本数再开平方。
内容的提问来源于stack exchange,提问作者Saloni Bhutada
相关产品推荐
相关产品推荐

