分别采用网格搜索和随机搜索方法对KNN模型中的k值进行优化,具体解决鸢尾花分类问题,k取1到20之内的所有奇数。最后输出最优的模型、k值和多分类的各项性能指标、PR 曲线和 ROC 曲线
时间: 2024-03-25 14:41:49 浏览: 15
好的,针对您的问题,我将分为以下几个步骤进行回答:
1. 加载数据集并进行预处理
2. 分别使用网格搜索和随机搜索方法对KNN模型中的k值进行优化
3. 输出最优的模型、k值和多分类的各项性能指标、PR 曲线和 ROC 曲线
下面开始逐步回答您的问题。
1. 加载数据集并进行预处理
首先,我们需要加载鸢尾花数据集,并进行预处理。这里我们使用 Scikit-learn 中的数据集。
```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
iris = load_iris()
X = iris.data
y = iris.target
# 数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
```
2. 分别使用网格搜索和随机搜索方法对KNN模型中的k值进行优化
接下来,我们将分别使用网格搜索和随机搜索方法对 KNN 模型中的 k 值进行优化。首先,我们需要定义 KNN 模型。
```python
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
```
然后,我们使用网格搜索方法对 KNN 模型中的 k 值进行优化。这里我们需要定义搜索的参数范围。
```python
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'n_neighbors': range(1, 20, 2)}
# 网格搜索
grid_search = GridSearchCV(knn, param_grid=param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 输出最优参数和模型
print('Grid search best parameters:', grid_search.best_params_)
print('Grid search best score:', grid_search.best_score_)
```
接下来,我们使用随机搜索方法对 KNN 模型中的 k 值进行优化。同样需要定义搜索的参数范围。
```python
from sklearn.model_selection import RandomizedSearchCV
# 定义参数范围
param_dist = {'n_neighbors': range(1, 20, 2)}
# 随机搜索
random_search = RandomizedSearchCV(knn, param_distributions=param_dist, cv=5, scoring='accuracy', n_iter=10)
random_search.fit(X_train, y_train)
# 输出最优参数和模型
print('Random search best parameters:', random_search.best_params_)
print('Random search best score:', random_search.best_score_)
```
3. 输出最优的模型、k值和多分类的各项性能指标、PR 曲线和 ROC 曲线
最后,我们输出最优的模型、k 值和多分类的各项性能指标、PR 曲线和 ROC 曲线。这里我们使用网格搜索得到的最优模型。
```python
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
from sklearn.metrics import precision_recall_curve, roc_curve, roc_auc_score
import matplotlib.pyplot as plt
# 最优模型
best_model = grid_search.best_estimator_
# 预测测试集
y_pred = best_model.predict(X_test)
# 计算各项性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')
confusion = confusion_matrix(y_test, y_pred)
report = classification_report(y_test, y_pred)
print('Accuracy:', accuracy)
print('Precision:', precision)
print('Recall:', recall)
print('F1 score:', f1)
print('Confusion matrix:\n', confusion)
print('Classification report:\n', report)
# 绘制 PR 曲线
y_proba = best_model.predict_proba(X_test)
precision, recall, thresholds = precision_recall_curve(y_test, y_proba[:, 1])
plt.plot(recall, precision, label='PR curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.legend()
plt.show()
# 绘制 ROC 曲线
fpr, tpr, thresholds = roc_curve(y_test, y_proba[:, 1])
plt.plot(fpr, tpr, label='ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()
# 计算 AUC 值
auc = roc_auc_score(y_test, y_proba[:, 1])
print('AUC:', auc)
```
以上就是使用网格搜索和随机搜索方法对 KNN 模型中的 k 值进行优化,并输出最优的模型、k 值和多分类的各项性能指标、PR 曲线和 ROC 曲线的完整过程。