分别采用网格搜索和随机搜索方法对KNN模型中的k值进行优化,具体解决鸢尾花分类问题,k取1到20之内的所有奇数。最后输出最优的模型、k值和多分类的各项性能指标、PR曲线和ROC曲线。
时间: 2024-04-23 12:22:57 浏览: 124
好的,接下来我会给您提供一个代码示例来完成这个任务,代码中使用的数据集是sklearn自带的鸢尾花数据集,您可以根据您的数据集进行相应的修改。
首先,我们需要导入必要的库和数据集:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, precision_recall_curve, roc_curve
# 载入数据集
iris = load_iris()
X = iris.data
y = iris.target
```
然后,我们定义一个函数来绘制PR曲线和ROC曲线:
```python
def plot_pr_roc_curve(y_true, y_score):
"""
绘制PR曲线和ROC曲线
"""
# 计算PR曲线和ROC曲线的参数
precision, recall, _ = precision_recall_curve(y_true, y_score)
fpr, tpr, _ = roc_curve(y_true, y_score)
# 绘制PR曲线和ROC曲线
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(recall, precision, 'r-', label='PR Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, 'b-', label='ROC Curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()
```
然后,我们使用网格搜索法对KNN模型中的k值进行优化:
```python
# 定义参数空间
param_grid = {'n_neighbors': np.arange(1, 20, 2)}
# 实例化KNN模型
knn = KNeighborsClassifier()
# 实例化网格搜索法
grid_search = GridSearchCV(knn, param_grid, cv=5)
# 训练模型
grid_search.fit(X, y)
# 输出最优模型和最优参数
print("Best Model:", grid_search.best_estimator_)
print("Best Parameters:", grid_search.best_params_)
# 预测结果
y_pred = grid_search.predict(X)
# 输出分类报告和混淆矩阵
print("Classification Report:")
print(classification_report(y, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y, y_pred))
# 绘制PR曲线和ROC曲线
y_score = grid_search.predict_proba(X)
plot_pr_roc_curve(y, y_score[:, 1])
```
接下来,我们使用随机搜索法对KNN模型中的k值进行优化:
```python
# 定义参数空间
param_dist = {'n_neighbors': np.arange(1, 20, 2)}
# 实例化KNN模型
knn = KNeighborsClassifier()
# 实例化随机搜索法
random_search = RandomizedSearchCV(knn, param_distributions=param_dist, cv=5, n_iter=10)
# 训练模型
random_search.fit(X, y)
# 输出最优模型和最优参数
print("Best Model:", random_search.best_estimator_)
print("Best Parameters:", random_search.best_params_)
# 预测结果
y_pred = random_search.predict(X)
# 输出分类报告和混淆矩阵
print("Classification Report:")
print(classification_report(y, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y, y_pred))
# 绘制PR曲线和ROC曲线
y_score = random_search.predict_proba(X)
plot_pr_roc_curve(y, y_score[:, 1])
```
以上就是使用网格搜索和随机搜索优化KNN模型中的k值,并输出分类性能指标、PR曲线和ROC曲线的完整代码示例。
阅读全文