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

本文介绍了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()

 

 


 

 


 

 

<think>好的,用户现在想在处理好的鸢尾花二分类数据集上,使用KNNSVM分类器,并通过网格搜索优化超参数,输出最佳分数参数。我需要结合之前的回答提供的引用内容来设计解决方案。 首先,用户已经将数据集转化为二分类问题,versicolor为正类,其他为负类。接下来需要分别对KNNSVM应用网格搜索。根据引用[2]中的信息,GridSearchCV的参数包括estimator、param_grid、scoring等,需要正确设置这些参数。 对于KNN来说,关键的超参数是n_neighborsweights。引用[1]提到KNN在鸢尾花数据集表现良好,所以可能需要尝试不同的邻居数权重类型。而SVM的主要参数是Cgamma,如引用[2]中的例子,需要设置合适的参数范围。 然后,需要确保在网格搜索中使用正确的评估指标。用户可能需要准确率或其他指标,但考虑到二分类可能存在不平衡,引用[3]提到使用不同的算法解决同一问题,这里可能需要考虑使用AUC-ROC或者F1分数作为评估标准。不过用户之前的回答中使用了分类报告AUC-ROC,但此处用户明确要求输出最佳分数,所以可能需要指定scoring参数为准确率或其他。 另外,引用[3]提到不同算法的选择,比如Lasso的不同求解方法,但这里可能不相关。需要专注于KNNSVM的参数调整。 在代码实现部分,需要导入相应的分类器,设置参数网格,应用GridSearchCV,然后输出结果。同时,要确保使用之前处理好的二分类数据集,即X_trainy_train。 可能需要注意交叉验证的设置,比如cv=5,以及是否要使用分层交叉验证来保持类别比例。用户之前的步骤中在划分训练测试集时用了stratify,所以在网格搜索中也应该保持一致性。 最后,用户可能需要比较两种模型的性能,因此需要分别对KNNSVM进行网格搜索,并输出各自的最佳参数分数。同时,可能需要提醒用户注意类别不平衡问题,如使用class_weight参数或调整评估指标。 总结步骤:1. 准备二分类数据;2. 定义KNNSVM的模型及参数网格;3. 使用GridSearchCV进行搜索;4. 输出最佳参数分数;5. 可能的评估指标选择建议。</think>以下是使用KNNSVM分类器在鸢尾花二分类任务中通过网格搜索优化超参数的完整实现步骤: --- ### **1. 数据预处理与划分** ```python import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据并转换为二分类标签(versicolor=1,其他=0) iris = load_iris() X, y = iris.data, iris.target y_binary = np.where(y == 1, 1, 0) # 划分训练集测试集(保持类别比例) X_train, X_test, y_train, y_test = train_test_split( X, y_binary, test_size=0.3, stratify=y_binary, random_state=42 ) ``` --- ### **2. KNN分类器优化** #### **参数网格设置** ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCV # 定义KNN模型参数空间 knn = KNeighborsClassifier() param_grid_knn = { 'n_neighbors': [3, 5, 7, 9], # 邻居数 'weights': ['uniform', 'distance'], # 权重计算方式 'metric': ['euclidean', 'manhattan'] # 距离度量 } # 网格搜索配置(使用准确率作为评估指标) grid_knn = GridSearchCV( estimator=knn, param_grid=param_grid_knn, scoring='accuracy', cv=5, n_jobs=-1, verbose=1 ) grid_knn.fit(X_train, y_train) ``` #### **输出最佳参数与性能** ```python print("KNN最优参数:", grid_knn.best_params_) print("KNN最高验证分数:", grid_knn.best_score_) # 测试集性能验证 print("KNN测试集准确率:", grid_knn.score(X_test, y_test)) ``` --- ### **3. SVM分类器优化** #### **参数网格设置** ```python from sklearn.svm import SVC # 定义SVM模型参数空间 svm = SVC(probability=True, random_state=42) param_grid_svm = { 'C': [0.1, 1, 10], # 正则化强度 'gamma': ['scale', 'auto', 0.01, 0.1], # 核函数参数 'kernel': ['rbf', 'linear'] # 核函数类型 } # 网格搜索配置(优先使用AUC-ROC评估) grid_svm = GridSearchCV( estimator=svm, param_grid=param_grid_svm, scoring='roc_auc', # 针对类别不均衡更敏感的指标 cv=5, n_jobs=-1, verbose=1 ) grid_svm.fit(X_train, y_train) ``` #### **输出最佳参数与性能** ```python print("SVM最优参数:", grid_svm.best_params_) print("SVM最高验证AUC-ROC:", grid_svm.best_score_) # 测试集性能验证 y_proba_svm = grid_svm.predict_proba(X_test)[:, 1] print("SVM测试集AUC-ROC:", roc_auc_score(y_test, y_proba_svm)) ``` --- ### **4. 关键说明** 1. **评估指标选择**: - KNN使用`scoring='accuracy'`,适用于类别较平衡的场景(versicolor占33%)[^1] - SVM使用`scoring='roc_auc'`,更关注正类的识别能力(适合二分类任务)[^2] 2. **参数优化范围**: - KNN关注邻居数(`n_neighbors`)距离权重(`weights`) - SVM关注正则化参数(`C`)核函数配置(`gamma``kernel`) 3. **交叉验证**:通过`cv=5`确保泛化性,避免过拟合[^3] --- ### **示例输出结果** ``` KNN最优参数: {'metric': 'manhattan', 'n_neighbors': 5, 'weights': 'distance'} KNN最高验证分数: 0.9619 KNN测试集准确率: 0.9556 SVM最优参数: {'C': 10, 'gamma': 0.1, 'kernel': 'rbf'} SVM最高验证AUC-ROC: 0.998 SVM测试集AUC-ROC: 0.994 ``` --- ### **相关问题** 1. 网格搜索中如何选择`scoring`参数以匹配具体任务需求? 2. SVM的核函数选择对分类性能有什么影响? 3. KNN算法在高维数据中可能遇到什么问题?如何缓解?
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值