KNN算法-搜索最优超参数:n_neighbors /weight/p

在本文中,将选取正确率作为衡量标准,自行实现搜索最优超参数,而非直接调用sklearn中的GridSearchCV。

先简单介绍KNN中的三个超参数:

超参数为:n_neighbors /weight/p(只有当weight=distance的时候,p值才有意义)

  1. n_neighbors:取邻近点的个数k。k取1-9测试
  2. weight:距离的权重;uniform:一致的权重;distance:距离的倒数作为权重
  3. p:闵可斯基距离的p值; p=1:即欧式距离;p=2:即曼哈顿距离;p取1-6测试
#超参数为:n_neighbors /weight/p
# n_neighbors:取邻近点的个数k。k取1-9测试
#weight:距离的权重;uniform:一致的权重;distance:距离的倒数作为权重
#p:闵可斯基距离的p值; p=1:即欧式距离;p=2:即曼哈顿距离;p取1-6测试
#只有当weight=distance的时候,p值才有意义

def searchBestPar():
    bestScore=0
    bestK=-1
    bestWeight=""

    # weight==uniform时
    for k in range(1,10):
        clf = KNeighborsClassifier(n_neighbors=k,weights="uniform")
        clf.fit(trainX,trainY)
        scor=clf.score(testX,testY)
        if scor > bestScore:
            bestScore=scor
            bestK=k
            bestWeight="uniform"

    # weight==distance时
    for k in range(1,10):
        for p in range(1,7):
            clf=KNeighborsClassifier(n_neighbors=k,weights="distance",p=p)
            clf.fit(trainX,trainY)
            scor = clf.score(testX, testY)
            if scor > bestScore:
                bestScore = scor
                bestK = k
                bestWeight = "distance"

    print("the best n_neighbors", bestK)
    print("the best weights", bestWeight)
    print("the best p", p)

if __name__ == '__main__':
    iris=datasets.load_iris()
    trainX, testX, trainY, testY = train_test_split(iris.data,iris.target)
    searchBestPar()
 

 

 

 

 

 

### KNN算法中的类权重参数 在K近邻(KNN)算法中,`class_weight` 参数并不是标准配置的一部分。通常情况下,KNN通过计算距离来进行分类决策,而不会直接应用类别权重调整机制[^1]。 不过,在某些特定实现版本里(比如scikit-learn库),可以间接地处理不平衡的数据集问题: 对于sklearn.neighbors.KNeighborsClassifier而言,并不存在名为 `class_weight` 的参数设置选项。但是可以通过自定义距离度量方式或采用加权投票的方法来影响最终的结果判定过程。具体来说,当初始化该分类器对象时,可以选择传递一个函数给 `weights` 参数,此函数接收邻居的距离作为输入并返回相应的权重值;另一种方法是在构建模型之前对少数类样本进行过采样或者多数类样本欠采样的预处理操作以平衡各类别的数量比例[^2]。 如果确实希望引入类似于 `class_weight` 功能,则可能需要考虑其他支持此类特性的机器学习算法,例如随机森林(RandomForest),它允许指定不同类别的相对重要程度从而更好地应对不均衡标签分布的情况。 ```python from sklearn.neighbors import KNeighborsClassifier import numpy as np # 定义带有自定义权重功能的KNN分类器 def custom_weights(distances): # 这里的逻辑可以根据实际需求定制化修改 weights = 1 / distances ** 2 # 倒数平方距离作为权重 return weights knn_with_custom_weighting = KNeighborsClassifier(n_neighbors=5, weights=custom_weights) # 创建虚拟训练数据用于演示目的 X_train = np.array([[0], [1], [2], [3]]) y_train = np.array([0, 0, 1, 1]) # 训练模型 knn_with_custom_weighting.fit(X_train, y_train) ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值