【问题标题】:Scikit-learn - user-defined weights function for KNeighborsClassifierScikit-learn - KNeighborsClassifier 的用户定义权重函数
【发布时间】:2013-06-24 01:16:36
【问题描述】:

我有一个 KNeighborsClassifier,它根据 4 个属性对数据进行分类。我想手动加权这 4 个属性,但总是遇到“操作数不能与形状 (1,5) (4) 一起广播”。

关于weights : [callable] : a user-defined function which accepts an array of distances, and returns an array of the same shape containing the weights.(来自here)的文档很少

这是我现在拥有的:

    for v in result:
        params = [v['a_one'], v['a_two'], v['a_three'], v['a_four']]
        self.training_data['data'].append(params)
        self.training_data['target'].append(v['answer'])

    def get_weights(array_weights):
        return [1,1,2,1]

    classifier = neighbors.KNeighborsClassifier(weights=get_weights)

【问题讨论】:

  • 链接不是真正的主页。你是通过谷歌找到的吗?那我应该把它拿下来了。我认为,权重用于重新调整距离。我想重新缩放特征,为什么不在输入空间重新缩放它们?
  • 是的,通过谷歌找到 - 文档似乎有点到处都是。我应该看哪个页面?

标签: machine-learning scikit-learn nearest-neighbor


【解决方案1】:

sklearn 权重可调用的解释

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

为模型训练创建样本数据

df = pd.DataFrame({'feature1':[1,3,3,4,5], 'response':[1,1,1,2,2]})

y = df.response
# [1,1,1,2,2]

X_train = df[['feature1']]
# [1,3,3,4,5]

定义自定义距离函数(打印输入数据结构)

def my_distance(weights):
    print(weights)
    return weights

将传入 my_distance 的模型定义为可调用权重

knn = KNeighborsClassifier(n_neighbors=3, weights=my_distance)

knn.fit(X_train,y)

knn.predict([[1]])
# [[ 0.  2.  2.]]
# array([1])

说明:显示3个最近邻(n_neighbors=3)到预测值1

X_train 中最接近 1 的三个邻居:

1, 3, 3 

距离:

[[ 0.  2.  2.]]

1 - 1 = 0 
3 - 1 = 2
3 - 1 = 2

预测类别:

array([1])

【讨论】:

  • 您能否提供一个使用高斯函数的示例,以 sigma 作为参数,好吗? =)
【解决方案2】:

对于高斯 ##gamma 在这里是一个超参数——我们需要选择最合适的。

def gaussian_kernel(distance):
     weights = np.exp(-gamma*(distance**2))
     return weights/np.sum(weights)

【讨论】:

  • 你的回答不是很清楚。它是如何解决问题的?
  • 我认为这是对另一个答案下方评论的回应。 @Nostradamnit
猜你喜欢
  • 2016-03-12
  • 2019-03-14
  • 2020-10-31
  • 2019-06-13
  • 2021-05-08
  • 2015-10-14
  • 2015-09-16
  • 2019-06-13
  • 2013-07-10
相关资源
最近更新 更多