逻辑回归-网格搜索最优参数总结

914 阅读3分钟

引言

  • 前几天使用 LR 作为 baseline 模型进行参数调优时,使用到了交叉验证和网格搜索的方法意外发现了GridSearchCV和cross_val_score的不同用法,本文作为学习记录,仅供参考。
  • GridSearchCV 主要用于对给定模型的超参数进行穷举搜索和选择。它会尝试不同的超参数组合,并根据交叉验证的结果选择最优的超参数组合
  • cross_val_score 主要用于对给定的模型和固定的参数,进行交叉验证并计算评估指标得分
    • cv: 交叉验证折数或可迭代的次数,默认None,使用三折交叉验证。即fold数量默认为3,参数也可以是yield生成的迭代器
    • n_jobs: 同时工作的cpu个数
      • 1 作用:确定计算cpu内核的使用数量
      • 2 默认n_jobs = 1,表示使用计算机的一个核进行处理;
      • 3 n_job = 2/3/4,表示使用2/3/4个核同时处理,提高运行效率
      • 4 n_jobs = -1,表示计算机有几个核就使用几个核进行运算
    • fit_params:拟合方法的参数

cross_val_score 示例如下

from sklearn import datasets
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt

iris = datasets.load_iris()
X = iris.data
y = iris.target
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=12)
# 聚类类别数目
k_range = range(1,10)
# 存放每个模型的结果值
cv_scores = []  
for n in k_range:
    # knn模型只有一个超参数,如果模型有多个超参数时可以考虑使用GridSearchCV
    knn = KNeighborsClassifier(n)  
    # cv:训练集划分数量  选取accuracy作为评价指标
    scores = cross_val_score(knn,x_train,y_train,cv=4,scoring='accuracy')  
    print(n,scores)
    cv_scores.append(scores.mean())

plt.plot(k_range,cv_scores)
plt.xlabel('K')
plt.ylabel('Accuracy')    
plt.show()

#通过图像选择最好的参数 K = 5
best_knn = KNeighborsClassifier(n_neighbors=5) 
best_knn.fit(x_train,y_train) 
print("最优指标:", best_knn.score(x_test,y_test))

image.png

GridSearchCV示例如下

  • param_grid – 需要优化的参数字典组合
  • scoring = None :模型评价指标,默认为None;或者如scoring = ‘roc_auc’
  • cv,n_jobs同上
  • verbose:控制输出的详细程度:
    • verbose=0 通常表示几乎不输出任何信息,只在必要时输出关键的错误或警告
    • verbose=1 可能会输出一些基本的进度信息或重要的步骤描述。
    • verbose=2及以上 会提供更详细的每一步的信息。
  • best_score_:交叉验证中最优解
  • best_estimator_:最优参数模型
  • best_params_:最优参数
  • estimator.cv_results_: dict of numpy (masked) ndarrays,每次交叉验证后的验证集准确率结果和训练集准确率结果
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
from  sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=24)
# 实例化模型对象
estimator = KNeighborsClassifier()

# 配置超参数(对应上面的 for 循环),cv 参数与上面一致
param_dict = {"n_neighbors": range(1,10)}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=4)

estimator.fit(x_train, y_train)
score = estimator.score(x_test, y_test)
print("准确率:\n", score)
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)

image.png

总结

  • GridSearchCV :除了自行完成叉验证外,还返回了最优的超参数及对应的最优模型,使用更为方便;
  • cross_val_score :一般用于获取每个 fold的交叉验证的得分,然后根据这个得分为模型选择合适的超参数,但是通常需要编写循环手动完成交叉验证过程。