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

自定义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)

关键修改说明

  1. 核心逻辑替换:用np.mean(k_neighbors)替代取众数的逻辑,适配连续值回归任务。
  2. 修正fit方法:原fit方法忽略传入的训练集,直接用初始化时的数据集拆分,现在改为存储传入的训练集,符合标准机器学习API规范。
  3. 调整代码顺序:原代码在创建模型前就调用Model_KNN.X_test会导致NameError,现在先拆分数据集再初始化模型。
  4. 修正评估计算:原RMSE计算错误地用类实例做除法,现在改为用SSE除以样本数再开平方。

内容的提问来源于stack exchange,提问作者Saloni Bhutada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:59:56