【数据+代码】贝叶斯优化KNN算法

1、引言

本文主要内容包括两方面:KNN模型建立、BY-KNN模型建立。

KNN是一种简单但有效的分类算法,它根据数据点在特征空间中的距离来进行分类。在本文中,我们将KNN作为基线模型,用默认参数进行训练。其次使用贝叶斯优化算法对KNN超参数进行优化。

关注公众号【小Z的科研日常】

后台回复关键词[贝叶斯优化]获取【数据 + 代码】

2、读取并理解数据

本次使用某药物数据集进行多分类,首先从数据集中进行读取数据:

# 读取数据
data = pd.read_csv("drug200.csv")
df = data

数据预览:观察数据集的基本情况等信息。

# 数据预览
print("数据集维度:", df.shape)
print("前几行数据:")
print(df.head())

3、数据预处理

数据预处理是一个至关重要的步骤,它可以确保模型在训练过程中能够正常工作。在本文中,我们进行了以下数据预处理步骤:

特征工程:我们创建了一个新的特征"Na_to_K_Bigger_Than_15",该特征用于指示Na_to_K值是否大于等于15.015。此特征可能对我们的模型性能有一定影响。

# 特征工程
df['Na_to_K_Bigger_Than_15'] = [1 if i >= 15.015 else 0 for i in df.Na_to_K]

分类编码:我们将数据集中的文本类别数据(如性别、血压、胆固醇水平、药物类型等)转换成数字形式,以便模型能够处理。

# 分类编码
def label_encoder(y):
    le = LabelEncoder()
    df[y] = le.fit_transform(df[y])

label_list = ["Sex", "BP", "Cholesterol", "Na_to_K", "Na_to_K_Bigger_Than_15", "Drug"]
for l in label_list:
    label_encoder(l)

4、KNN基线模型

此小节中,我们将KNN作为基线模型,用默认参数进行训练,并将数据集拆分为训练集和测试集。我们评估了模型在训练和测试集上的准确性,以作为后续优化的基准。

# KNN基线模型
x = df.drop(["Drug"], axis=1)
y = df.Drug
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42, shuffle=True)
y_train = y_train.values.reshape(-1, 1)
y_test = y_test.values.reshape(-1, 1)

knn = KNeighborsClassifier()
accuracies = cross_val_score(knn, x_train, y_train.ravel(), cv=5)
knn.fit(x_train, y_train.ravel())
print("Train Score:", np.mean(accuracies))
print("Test Score:", knn.score(x_test, y_test))

5、贝叶斯优化KNN超参数

贝叶斯优化是一种用于优化黑盒函数的强大方法,它在超参数优化中表现出色。在这一章节中,我们将详细介绍如何使用贝叶斯优化来寻找最佳的KNN超参数。具体来说,我们做了以下步骤:

定义超参数搜索空间:我们明确定义了KNN模型的超参数搜索空间,包括K值、距离度量方式以及权重类型等。

# 定义KNN的超参数搜索空间
param_space = {
    'n_neighbors': np.arange(1, 120),  # K值的范围
    'p': np.arange(1, 3),
    'weights': ['uniform', 'distance']
}

创建BayesSearchCV对象:我们使用了BayesSearchCV对象,它是一个用于超参数优化的工具。我们设置了迭代次数和交叉验证折数,以及选择了梯度提升回归树(GBRT)作为概率模型来进行优化。

# 创建BayesSearchCV对象,用于超参数优化
opt = BayesSearchCV(
    knn,                        # 使用的模型
    param_space,                # 超参数搜索空间
    n_iter=30,                  # 迭代次数
    cv=5,                       # 交叉验证折数
    optimizer_kwargs={'base_estimator': 'GBRT'}  # 使用梯度提升回归树作为概率模型
)

拟合BayesSearchCV:我们使用BayesSearchCV对象来拟合模型,寻找最佳的超参数组合。

# 拟合BayesSearchCV来寻找最佳超参数
opt.fit(x_train, y_train.ravel())

6、实验结果

在贝叶斯优化完成后,我们得到了最佳的KNN超参数组合。接下来,我们使用这些最佳超参数来训练新的KNN模型,并进行了性能评估。

# 输出最佳超参数
print("Best Parameters:", opt.best_params_)

# 使用最佳超参数的KNN模型进行训练
best_knn = KNeighborsClassifier(**opt.best_params_)
best_knn

后台回复关键词[贝叶斯优化]

你可能感兴趣的:(启发式算法,性能优化,机器学习,深度学习)