本文主要内容包括两方面:KNN模型建立、BY-KNN模型建立。
KNN是一种简单但有效的分类算法,它根据数据点在特征空间中的距离来进行分类。在本文中,我们将KNN作为基线模型,用默认参数进行训练。其次使用贝叶斯优化算法对KNN超参数进行优化。
关注公众号【小Z的科研日常】
后台回复关键词[贝叶斯优化]获取【数据 + 代码】。
本次使用某药物数据集进行多分类,首先从数据集中进行读取数据:
# 读取数据
data = pd.read_csv("drug200.csv")
df = data
数据预览:观察数据集的基本情况等信息。
# 数据预览
print("数据集维度:", df.shape)
print("前几行数据:")
print(df.head())
数据预处理是一个至关重要的步骤,它可以确保模型在训练过程中能够正常工作。在本文中,我们进行了以下数据预处理步骤:
特征工程:我们创建了一个新的特征"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)
此小节中,我们将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))
贝叶斯优化是一种用于优化黑盒函数的强大方法,它在超参数优化中表现出色。在这一章节中,我们将详细介绍如何使用贝叶斯优化来寻找最佳的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())
在贝叶斯优化完成后,我们得到了最佳的KNN超参数组合。接下来,我们使用这些最佳超参数来训练新的KNN模型,并进行了性能评估。
# 输出最佳超参数
print("Best Parameters:", opt.best_params_)
# 使用最佳超参数的KNN模型进行训练
best_knn = KNeighborsClassifier(**opt.best_params_)
best_knn
后台回复关键词[贝叶斯优化]。