目录
模型选择与调优
1、介绍
模型选择(Model Selection):
调优(Hyperparameter Tuning):
本章重点
2、交叉验证
介绍
为什么需要交叉验证
数据处理
3、⭐超参数搜索-网格搜索(Grid Search)
介绍
API
Facebook签到位置预测K值调优
作者介绍:准大三网络工程专业在读,努力学习Java,涉猎深度学习,积极输出优质文章
⭐分类算法系列①:初识概念
⭐分类算法系列②:KNN(K-近邻)算法
您的三连支持,是我创作的最大动力
在机器学习中,模型选择(Model Selection)和调优(Hyperparameter Tuning)是优化模型性能的关键步骤。模型选择涉及选择合适的算法或模型架构,而调优则涉及调整模型的超参数以达到最佳性能。以下是关于这两个步骤的详细介绍:
模型选择是选择在给定任务中使用哪种算法或模型的过程。不同的算法适用于不同的问题,因此选择适当的算法对于取得良好的性能至关重要。模型选择通常涉及以下步骤:
调优是指为机器学习模型选择最佳的超参数,以优化模型的性能。超参数是在训练过程之外设置的参数,它们决定了模型的结构和行为,如学习率、正则化参数、树的深度等。调优的目标是找到使模型在验证集上表现最佳的超参数组合。调优通常包括以下步骤:
模型选择和调优是迭代过程,可能需要多次尝试不同的模型和超参数组合,以找到最适合任务的模型并达到最佳性能。使用交叉验证、可视化工具和自动化调优库(如scikit-learn中的GridSearchCV和RandomizedSearchCV)可以帮助更有效地进行模型选择和调优。
本章重点是交叉验证!结合的示例是之前的Facebook签到位置问题,对之前使用KNN算法完成的Facebook签到位置预测进行调优,使其结果更加准确。
交叉验证(Cross-Validation)是一种用于评估机器学习模型性能的技术,它有助于更准确地估计模型在未知数据上的表现。交叉验证通过在不同的数据子集上进行多次训练和验证,提供了对模型泛化性能的更稳定估计。
在传统的训练-测试集划分中,数据被划分为训练集和测试集,然后使用训练集训练模型,使用测试集评估模型性能。然而,这种方法可能因为数据的划分方式而导致评估结果不稳定,特别是在数据量有限的情况下。交叉验证通过将数据划分为多个折(folds),多次进行训练和测试,从而克服了这些问题。
以下是交叉验证的常见方法:
交叉验证的优势在于它能够提供更可靠的模型性能估计,因为每个样本都会被用于训练和验证,减少了数据划分可能引发的偶然性影响。交叉验证还有助于选择合适的模型和调整超参数,从而提高模型的泛化性能。在实际应用中,k折交叉验证是最常用的方法之一,但根据问题的特点和数据集的大小,选择适当的交叉验证方法非常重要。
交叉验证目的:为了让被评估的模型更加准确可信
一般情况下,数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。
做以下处理:
那么对于之前的Facebook签到位置预测问题的k值,如何取得一个合理的值?下面使用超参数搜索-网格搜索(Grid Search)
超参数网格搜索(Grid Search)是一种常用的超参数调优方法,用于寻找最佳的超参数组合,从而优化机器学习模型的性能。它通过在预定义的超参数空间中搜索所有可能的组合,然后评估每个组合的性能,最终选择性能最佳的组合作为最终的超参数设置。
以下是超参数网格搜索的步骤和原理:
超参数网格搜索的优点在于它是一种简单而有效的方法,可以在有限的计算资源下尝试多种超参数组合。然而,网格搜索的缺点是它可能会对计算资源造成较大的负担,特别是在超参数空间较大时。为了提高效率,可以使用随机搜索等方法来在超参数空间中采样,以更快地找到性能较好的超参数组合。
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
对估计器的指定参数值进行详尽搜索
estimator:估计器对象
param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
cv:指定几折交叉验证
fit:输入训练数据
score:准确率
结果分析:
bestscore:在交叉验证中验证的最好结果
bestestimator:最好的参数模型
cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
使用网格搜索估计器,在原来的KNN算法实现Facebook签到位置预测的代码基础上,新的修改如下代码:
# 使用网格搜索和交叉验证找到合适的参数
knn = KNeighborsClassifier()
param = {"n_neighbors": [3, 5, 10]}
gc = GridSearchCV(knn, param_grid=param, cv=2)
gc.fit(x_train, y_train)
print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))
# 训练验证集的结果
print("在交叉验证当中验证的最好结果:", gc.best_score_)
print("gc选择了的模型K值是:", gc.best_estimator_)
print("每次交叉验证的结果为:", gc.cv_results_)
代码解释:
创建KNN分类器:knn = KNeighborsClassifier()
定义超参数空间:param = {"n_neighbors": [3, 5, 10]}
创建GridSearchCV实例,传入KNN分类器实例和定义好的超参数空间,cv=2表示使用2折交叉验证:gc = GridSearchCV(knn, param_grid=param, cv=2)
执行网格搜索和交叉验证:gc.fit(x_train, y_train)
评估测试集性能,使用训练好的网格搜索模型在测试集上进行预测并输出准确率:print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))
打印交叉验证结果:
- gc.best_score_:输出在交叉验证中获得的最佳性能指标。
- gc.best_estimator_:输出最佳性能对应的模型,包括超参数设置。
- gc.cv_results_:输出每次交叉验证的结果,包括参数设置和性能指标。
回顾k值交叉验证:
KNN调优全部代码:
# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/8/30 23:48
import pandas as pd
from sklearn.model_selection import train_test_split # 将数据集分割为训练集和测试集。
from sklearn.neighbors import KNeighborsClassifier # 实现KNN分类器
from sklearn.preprocessing import StandardScaler # 特征标准化
from sklearn.model_selection import GridSearchCV # 网格搜索
'''
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
对估计器的指定参数值进行详尽搜索
estimator:估计器对象
param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
cv:指定几折交叉验证
fit:输入训练数据
score:准确率
结果分析:
bestscore:在交叉验证中验证的最好结果_
bestestimator:最好的参数模型
cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
'''
def knn_GridSearch():
"""
K近邻算法预测入住位置类别
:return:
"""
# 一、处理数据以及特征工程
# 1、读取收,缩小数据的范围
data = pd.read_csv("./data/FBlocation/train.csv")
# 数据逻辑筛选操作 df.query()
data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
# 删除time这一列特征
data = data.drop(['time'], axis=1)
print(data)
# 删除入住次数少于三次位置
place_count = data.groupby('place_id').count()
tf = place_count[place_count.row_id > 3].reset_index()
data = data[data['place_id'].isin(tf.place_id)]
# 3、取出特征值和目标值
y = data['place_id']
# y = data[['place_id']]
x = data.drop(['place_id', 'row_id'], axis=1)
# 4、数据分割与特征工程?
# (1)、数据分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
# (2)、标准化
std = StandardScaler()
# 队训练集进行标准化操作
x_train = std.fit_transform(x_train)
print(x_train)
# 进行测试集的标准化操作
x_test = std.fit_transform(x_test)
# 二、算法的输入训练预测
# K值:算法传入参数不定的值 理论上:k = 根号(样本数)
# K值:后面会使用参数调优方法,去轮流试出最好的参数[1,3,5,10,20,100,200]
# 使用网格搜索和交叉验证找到合适的参数
knn = KNeighborsClassifier()
param = {"n_neighbors": [3, 5, 10]}
gc = GridSearchCV(knn, param_grid=param, cv=2)
gc.fit(x_train, y_train)
print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))
# 训练验证集的结果
print("在交叉验证当中验证的最好结果:", gc.best_score_)
print("gc选择了的模型K值是:", gc.best_estimator_)
print("每次交叉验证的结果为:", gc.cv_results_)
if __name__ == '__main__':
knn_GridSearch()
执行结果: