在scikit-learn中为knn分类器提供用户定义的样本权重

6
我正在使用scikit-learn KNeighborsClassifier对一个有4个输出类的数据集进行分类。以下是我使用的代码:
knn = neighbors.KNeighborsClassifier(n_neighbors=7, weights='distance', algorithm='auto', leaf_size=30, p=1, metric='minkowski')
该模型可以正常工作。但是,我想为每个样本点提供用户定义的权重。目前的代码使用距离的倒数进行缩放,使用metric='distance'参数。
我仍然希望保持倒数距离缩放,但对于每个样本点,我也有一个概率权重。我希望将其应用为距离计算中的权重。例如,如果x是测试点,y、z是正在计算距离的两个最近邻居,则我希望分别计算距离为(sum|x-y|)*wy和(sum|x-z|)*wz
我尝试定义一个函数,传递给weights参数,但我还希望除了用户定义的权重之外,保留倒数距离缩放,并且我不知道倒数距离缩放函数。我在文档中找不到答案。
有什么建议吗?
3个回答

3

在sklearn中,KNN算法不支持样本权重,与其他估计器(如DecisionTree)不同。就个人而言,我认为这是一种失望。由于预测标签是邻居投票的多数,因此让KNN支持样本权重并不困难。 一种愚蠢的解决方法是根据样本权重自己生成样本。例如,如果一个样本的权重为2,则使其出现两次。


0

由于sklearn实现不包括样本权重,因此您可以使用重新采样来调整K-邻居的样本权重。以下是您可以执行此操作的方法:

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

# Get training and testing data
Xtrain, ytrain, sample_weight_train = get_train_data() 
Xtest, ytest, sample_weight_test = get_test_data()

# Derive probability values from your sample weights
prob_train = np.asarray(sample_weight_train) / np.sum(sample_weight_train)
upsample_size = int(np.max(prob_train) / np.min(prob_train) * len(ytrain))
newids = np.random.choice(range(len(ytrain)), size=upsample_size, p=prob_train, replace=True)

# Upsample training data using sample weights as probabilities
# so that the data distribution is upsampled to fit the corresponding sample weights
Xtrain, ytrain = Xtrain[newids,:], ytrain[newids]

# Fit your model
model = KNeighborsClassifier()
model = model.fit(Xtrain, ytrain)
ypred = model.predict(Xtest)


-1

sklearn.neighbors.KNeighborsClassifier.score() 方法有一个 sample_weight 参数。这是您要找的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接