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

带权重数据集的kNN分类器使用:能否直接传入权重列?

关于kNN结合样本权重分类的问题解答

不能直接将df.weighting传给KNeighborsClassifier的weight参数——这个参数的作用是控制邻居投票时的权重规则(比如按距离加权或平等投票),而非给训练集中的每个样本分配固定的重要性权重。

要实现基于weighting列的样本权重分类,有两种可行方案:

方案一:重复样本(简单直接)

根据每个样本的weighting值,将对应样本重复对应次数,之后用默认的平等投票(weights='uniform')训练kNN。这种方法相当于让权重大的样本在投票时拥有更多“票数”。

示例代码:

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier

# 按权重重复样本
weighted_df = df.loc[df.index.repeat(df['weighting'])]

# 拆分特征与标签
X = weighted_df.drop(['country', 'weighting'], axis=1)
y = weighted_df['country']

# 训练kNN分类器
knn = KNeighborsClassifier(n_neighbors=3, weights='uniform')
knn.fit(X, y)

缺点:如果weighting数值较大,数据集会急剧膨胀,导致训练和预测效率下降。

方案二:自定义加权投票(高效灵活)

不修改原始数据集,而是在预测阶段结合邻居的weighting值进行加权投票,避免数据集膨胀。

示例代码:

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

# 拆分原始数据集的特征、标签与权重
X_train = df.drop(['country', 'weighting'], axis=1)
y_train = df['country']
sample_weights = df['weighting'].values

# 初始化并训练基础kNN模型
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 自定义加权预测函数
def weighted_knn_predict(knn_model, X_test, train_weights):
    # 获取每个测试样本的k个邻居索引
    neighbor_indices = knn_model.kneighbors(X_test, return_distance=False)
    predictions = []
    
    for indices in neighbor_indices:
        # 取出邻居的权重和对应标签
        neigh_weights = train_weights[indices]
        neigh_labels = y_train.iloc[indices].values
        
        # 计算每个标签的加权得分
        label_score = {}
        for label, weight in zip(neigh_labels, neigh_weights):
            label_score[label] = label_score.get(label, 0) + weight
        
        # 选择得分最高的标签作为预测结果
        predictions.append(max(label_score, key=label_score.get))
    
    return np.array(predictions)

# 测试示例:用训练集中的第一条数据做测试
X_test = X_train.iloc[[0]]
print(weighted_knn_predict(knn, X_test, sample_weights))

优点:不会增加数据集规模,适合权重数值较大的场景,且投票逻辑可根据需求调整。

内容的提问来源于stack exchange,提问作者MC Jong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:35:15