SVM参数调优与网格搜索实战:提升分类模型性能
import\u0020numpy\u0020as\u0020np\nimport\u0020pandas\u0020as\u0020pd\nimport\u0020matplotlib.pyplot\u0020as\u0020plt\nfrom\u0020sklearn\u0020import\u0020datasets\nfrom\u0020sklearn.model_selection\u0020import\u0020train_test_split\nfrom\u0020sklearn.svm\u0020import\u0020SVC\nfrom\u0020sklearn.metrics\u0020import\u0020accuracy_score\ndata\u0020=\u0020pd.read_excel('处理后的数据.xlsx')\nX\u0020=\u0020data[['特征1',\u0020'特征2',\u0020'特征3',\u0020'特征4',\u0020'特征5',\u0020'特征6',\u0020'特征7',\u0020'特征8','特征9']]\ny\u0020=\u0020data['类别']\nX_train, X_test, y_train, y_test\u0020=\u0020train_test_split(X, y, test_size=0.3, random_state=0)\nbest_score\u0020=\u00200\u0020#\u0020最佳成绩\n\n#\u0020对每种参数组合都训练一个模型,评估其成绩,找到最佳参数组合\nfor\u0020gamma\u0020in\u0020[0.001, 0.01, 0.1, 1, 10, 100]:\u0020\u0020\u0020\u0020for\u0020C\u0020in\u0020[0.001, 0.01, 0.1, 1, 10, 100]:\u0020\u0020\u0020\u0020\u0020svm\u0020=\u0020SVC(gamma=gamma, C=C).fit(X_train, y_train)\u0020\u0020\u0020\u0020\u0020score\u0020=\u0020svm.score(X_test, y_test)\u0020#\u0020在测试集上评估SVC\u0020\u0020\u0020\u0020\u0020#\u0020如果得到了更高的分数,则保存该分数和对应的参数\u0020\u0020\u0020\u0020\u0020if\u0020score\u0020>\u0020best_score:\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020best_score\u0020=\u0020score\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020best_parameters\u0020=\u0020{'C': C, 'gamma': gamma}\u0020\u0020\u0020\u0020\u0020\n\nprint("Best score: {:.2f}".format(best_score))\u0020#\u0020输出最佳成绩\nprint("Best parameters: {}".format(best_parameters))\u0020#\u0020输出最佳参数组合\n#\u0020首先,将数据拆分为(训练+验证集)与测试集\nX_train_valid, X_test, y_train_valid, y_test\u0020=\u0020train_test_split(X, y, random_state=0)\n\n#\u0020然后,将(训练+验证集)拆分为训练集与验证集\nX_train, X_valid, y_train, y_valid\u0020=\u0020train_test_split(X_train_valid, y_train_valid, random_state=1)\nbest_score\u0020=\u00200\n\n#\u0020对每种参数组合都训练一个模型,评估其成绩,找到最佳参数组合\nfor\u0020gamma\u0020in\u0020[0.001, 0.01, 0.1, 1, 10, 100]:\u0020\u0020\u0020\u0020for\u0020C\u0020in\u0020[0.001, 0.01, 0.1, 1, 10, 100]:\u0020\u0020\u0020\u0020\u0020svm\u0020=\u0020SVC(gamma=gamma, C=C).fit(X_train, y_train)\u0020\u0020\u0020\u0020\u0020score\u0020=\u0020svm.score(X_valid, y_valid)\u0020#\u0020注意!这里改为在验证集上评估模型\u0020\u0020\u0020\u0020\u0020if\u0020score\u0020>\u0020best_score:\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020best_score\u0020=\u0020score\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020best_parameters\u0020=\u0020{'C': C, 'gamma': gamma}\n\nprint("Training_set size: {} , Validation_set size: {} , Test_set size: {}"\n .format(X_train.shape[0], X_valid.shape[0], X_test.shape[0]))\n\n#\u0020利用调参得到的最佳参数组合,在(训练+验证集)上重新构建一个模型,并在测试集上进行评估\nsvm\u0020=\u0020SVC(**best_parameters)\nsvm.fit(X_train_valid, y_train_valid)\ntest_score\u0020=\u0020svm.score(X_test, y_test)\u0020#\u0020测试集只用做最终评估,不参与调参,保证测试的客观性\n\nprint("Best score on validation_set: {:.2f}".format(best_score))\nprint("Best parameters: ", best_parameters)\nprint("Test_set score with best parameters: {:.2f}".format(test_score))\u0020#\u0020输出测试成绩\nfrom\u0020sklearn.model_selection\u0020import\u0020GridSearchCV\u0020#\u0020引入网格搜索类\n\n#\u0020定义参数列表\nparam_grid\u0020=\u0020{'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}\n\n#\u0020定义GridSearchCV对象,注意参数\n#\u0020参数1-模型\n#\u0020参数2-参数列表\n#\u0020参数3-交叉验证次数(网格搜索具有交叉验证功能)\ngrid_search\u0020=\u0020GridSearchCV(SVC(), param_grid, cv=10)\n\n#\u0020拆分数据集\nX_train, X_test, y_train, y_test\u0020=\u0020train_test_split(X, y, random_state=0)\ngrid_search.fit(X_train, y_train)\u0020#\u0020将训练数据交给GridSearchCV对象\n\n#\u0020输出最佳参数组合及最佳成绩(利用.best_params_和.best_score_属性)\nprint("Best parameters: {}".format(grid_search.best_params_))\nprint("Best cross-validation score: {:.2f}".format(grid_search.best_score_))\n用中文详细解释下每行代码的意思内容:这段代码是使用支持向量机(SVM)模型对数据进行分类的示例。下面是每行代码的详细解释:\n\n1. 导入必要的库:\n - numpy:用于数值计算和数组操作。\n - pandas:用于数据处理和操作。\n - matplotlib.pyplot:用于数据可视化。\n - sklearn.datasets:用于加载示例数据集。\n - sklearn.model_selection:用于模型选择和调参。\n - sklearn.svm:支持向量机模型。\n - sklearn.metrics:用于评估模型性能的指标。\n\n2. 读取Excel文件数据并存储到data变量中。\n\n3. 从数据中提取特征和标签,并分别存储到X和y变量中。\n\n4. 将数据集拆分为训练集和测试集,其中测试集占总样本的30%。\n\n5. 初始化最佳成绩为0。\n\n6. 使用嵌套循环对每种参数组合都训练一个SVM模型,并在测试集上评估其性能。\n\n7. 如果得到更高的分数,则更新最佳成绩和最佳参数组合。\n\n8. 输出最佳成绩和对应的最佳参数组合。\n\n9. 将数据集进一步拆分为(训练+验证集)和测试集。\n\n10. 将(训练+验证集)进一步拆分为训练集和验证集。\n\n11. 初始化最佳成绩为0。\n\n12. 使用嵌套循环对每种参数组合都训练一个SVM模型,并在验证集上评估其性能。\n\n13. 如果得到更高的分数,则更新最佳成绩和最佳参数组合。\n\n14. 输出训练集、验证集和测试集的样本数量。\n\n15. 使用得到的最佳参数组合在(训练+验证集)上重新构建一个SVM模型,并在测试集上评估其性能。\n\n16. 输出在验证集上的最佳分数、最佳参数组合和在测试集上的性能。\n\n17. 导入网格搜索类GridSearchCV。\n\n18. 定义参数列表,包括不同的C和gamma值。\n\n19. 定义一个GridSearchCV对象,指定模型为SVM,参数列表为定义的参数列表,交叉验证次数为10。\n\n20. 将数据集拆分为训练集和测试集。\n\n21. 将训练数据交给GridSearchCV对象进行网格搜索。\n\n22. 输出最佳参数组合和最佳交叉验证分数。\n\n这段代码主要展示了如何使用SVM模型进行分类,并通过调参和网格搜索来找到最佳的参数组合,以提高模型的性能。
原文地址: http://www.cveoy.top/t/topic/qgnS 著作权归作者所有。请勿转载和采集!