目录
一、基础理论
超参数搜索/网格搜索目的:得到最佳参数。
1、交叉验证
交叉验证目的:为了让被评估的模型更加准确可信。
为了让结果更加准确,做以下处理:
训练集:训练集+验证集
测试集:测试集
2、模型选择与调优(超参数搜索/网格搜索) -- k的取值
有一些算法是需要手动指定的,这些手动指定的算法叫做超参数(如KNN算法中的k值)。
3、模型选择与调优API
sklearn.model_selection.GridSearchCV
和预估器的使用方法一样。
二、模型选择与调优(超参数搜索/网格搜索)
得到预估器后:
1、首先进行参数准备
# 1、参数准备
param_dict = {'n_neighbors':[1,3,5,7,9,11]}
#n_neighbors:是GridSearchCV的参数param_dict的子参数
2、开始搜索
# 2、开始搜索
estimator = GridSearchCV(estimator, param_dict, cv=10)
# 预估器 参数范围 选择次数
3、训练
# 4-3、训练(用预估器对训练值进行训练)
estimator.fit(train_data, train_target)
查看结果
# 查看超参数搜索结果
print('最佳参数:', estimator.best_params_)
print('最佳结果:', estimator.best_score_)
print('最佳估计器:', estimator.best_estimator_)
print('交叉验证结果:', estimator.cv_results_)
总代码
# 模型选择与调优(超参数搜索/网格搜索)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
# KNN算法
def KNN():
# 1、获取数据
iris = load_iris()
# 2、划分数据集
train_data, test_data, train_target, test_target = train_test_split(iris.data, iris.target)
# 特征集训练值 特征集测试值 目标集训练值 目标值测试值
# 3、特征工程(标准化)
transfer = StandardScaler()
train_data = transfer.fit_transform(train_data)
test_data = transfer.transform(test_data)
# 注:不进行fit处理:测试集要用训练集的特征值和标准差(否则测试集就是在自己对自己进行测试,没有意义)
# 注:target是目标值,不能进行标准化(所以train_target和test_target不进行标准化)
# 4、KNN算法预估器
# 4-1、得到预估器
estimator = KNeighborsClassifier() #后面会有超参数搜索,这里先不用设置k值
# 4-2、超参数搜索(模型选择与调优):得到最佳k值(最佳预估器)
# 1、参数准备
param_dict = {'n_neighbors':[1,3,5,7,9,11]} #n_neighbors:是GridSearchCV的参数param_dict的子参数
# 2、开始搜索
estimator = GridSearchCV(estimator, param_dict, cv=10)
# 预估器 参数范围 选择次数
# 4-3、训练(用预估器对训练值进行训练)
estimator.fit(train_data, train_target)
# 5、模型评估
# 方法一:对比预测值和测量目标值
predict = estimator.predict(test_data) # 得到预测结果
print(predict)
print("直接比对预测值和测量目标值:\n", predict == test_target)
# 方法二:得到准确率(对比特征集和目标集测试值)
score = estimator.score(test_data, test_target)
print("准确率:\n", score)
# 查看超参数搜索结果
print('最佳参数:', estimator.best_params_)
print('最佳结果:', estimator.best_score_)
print('最佳估计器:', estimator.best_estimator_)
print('交叉验证结果:', estimator.cv_results_)
if __name__ == '__main__':
KNN() #KNN算法