.Grid Search
- 网格搜索,在所有候选的参数选择中,通过循环遍历,对每一种可能的参数在训练集上训练一个模型,在测试集上表现最好的参数就是最优的参数。
- 模型最终的表现好坏与初始数据训练集和测试集的划分有很大的关系(测试集数据没有被训练,可能有偏差)。
- Grid Search 调参方法存在的共性弊端就是:耗时;参数越多,候选值越多,耗费时间越长!所以,一般情况下,先定一个大范围,然后再细化。
.GridSearchCV
- grid search with cross validation,将网格搜索与交叉验证结合,交叉验证将数据集划分为训练集、验证集和测试集,其中训练集用来模型训练,验证集用来调整参数,而测试集用来衡量模型表现好坏,对循环遍历的每个可能的参数,采用交叉验证的方式评价参数质量。
- Python实现:Hold-Out、k折交叉验证、分层k折交叉验证、留一交叉验证
scikit-learn库中的GridSearchCV
class sklearn.model_selection.GridSearchCV
穷举搜索指定的参数值的估计。
参数
estimator
:estimator object
- scikit-learn估计器接口。估计器需要提供一个评分函数,或者必须通过评分。
param_grid
:dict or list of dictionaries
- 以参数名(str)作为键、以尝试的参数设置列表作为值的字典,或这类字典的列表,在这种情况下,研究列表中每个字典所跨越的网格,这允许搜索任何参数设置序列。
scoring
:str, callable, list/tuple or dict, default=None
- 一个单独的 str 或一个callable来评估测试集上的预测。
- 为了评估多个指标,可以给出一个(唯一的)字符串列表或一个dict,其中名称作为键,可调用项作为值。
- 注意,在使用自定义得分器时,每个得分器应该返回一个值。返回值列表/数组的度量函数可以包装到多个打分器中,每个打分器返回一个值。
- 如果为None,则使用估计器自带的评分方法。
n_jobs
:int, default=None
- 要并行运行的作业数量。None表示一个,除非在joblib.parallel_backend环境下。-1表示使用所有处理器。更多细节请参见 Glossary 。
pre_dispatch
:int, or str, default=n_jobs
- 控制并行执行期间分派的作业的数量。当分配的作业多于cpu能够处理的任务时,减少这个数量有助于避免内存消耗激增。该参数可以为:
- None:在这种情况下,将立即创建并派生所有作业。将此用于轻量级和快速运行的作业,以避免由于随需生成作业而造成的延迟;
- int:给出生成的作业总数的确切数目;
- str:给定一个n_jobs的函数,如’ 2*n_jobs ’
iid
:bool, default=False
- 如果为True,则返回跨folds的平均得分,以每个测试集的样本数为权重。在这种情况下,假设数据跨folds分布相同,最小的损失是每个样本的总损失,而不是跨folds的平均损失。
自版本0.22以来已弃用:参数iid在0.22中已弃用,将在0.24中删除
cv
:int, cross-validation generator or an iterable, default=None
- 确定交叉验证分割策略。cv可能的输入有:
- None:使用默认的5折交叉验证;
- integer:指定(分层的)KFold中的折叠数;
- CV splitter;
- 可迭代生成(训练、测试)分割为索引数组。
- 对于None或integer,如果估计器是一个分类器,并且y是二分类的或多类的,则使用StratifiedKFold,在所有其他情况下,使用KFold。参考用户指南,了解这里可以使用的各种交叉验证策略。
refit
:bool, str, or callable, default=True
- 使用找到的最佳参数在整个数据集上重新构造一个估计器。
- 对于多指标评估,这需要是一个str,表示用于在最后重新构建评估器的最佳参数的记分员。
- 在选择最佳估计器时除了考虑最大得分之外,可以将refit设置为一个函数,该函数返回所选的best_index_给定cv_results_。在这种情况下,best_estimator_和best_params_将根据返回的best_index_设置,而best_score_属性将不可用。
- 修改后的估计器可以在best_estimator_属性处使用,并允许在这个GridSearchCV实例上直接使用predict。
- 同样,对于多重度量评估,属性best_index_、best_score_和best_params_只有在refit被设置并且它们都将被确定为w.r时才可用。就是这个特定的得分手。
verbose
:integer
- 控制冗长:越高,消息越多。
error_score
:‘raise’ or numeric, default=np.nan
- 在估计量拟合中出现错误时分配给分数的值。如果设置为“raise”,则会引发错误。如果给定数值,则会发出FitFailedWarning。此参数不会影响refit步骤,因为它总是会引发错误。
return_train_score
:bool, default=False
- 如果为False,则cv_results_属性将不包含训练分数。计算训练分数是用来了解不同的参数设置如何影响过拟合/不拟合的权衡。然而,计算训练集上的分数可能会有很高的计算成本,并且不需要严格地选择能产生最佳泛化性能的参数。
属性
cv_results_
:dict of numpy (masked) ndarrays
-
一种dict,以键作为列标题,以值作为列元素,可以导入到pandas DataFrame中。
-
键值“params”用于存储所有候选参数的参数设置列表。
-
mean_fit_time、std_fit_time、mean_score_time和std_score_time的单位都是秒。
-
- 对于多度量评估,所有记分者的分数都在cv_results_ dict中以记分者名字结尾的键处可用(’_<scorer_name>’),而不是上面显示的’_score’。(“split0_test_precision”,“mean_train_precision”等等)。
best_estimator_
:estimator
- 最优模型。由搜索选择的估计量,即对left out数据给出最高分数(或指定的最小损失)的估计量。如果refit=False,则不可用。
best_score_
:float
- best_estimator的交叉验证平均得分。对于多度量评价,这只有在refit被指定时才会出现。
- 如果refit是一个函数,则此属性不可用。
best_params_
:dict
- 给出hand out 数据集上最好的结果的参数。
- 对于多度量评价,这只有在refit被指定时才会出现。
best_index_
:int
- 对应于最佳候选参数设置的(cv_results_数组的)索引。在search.cv_results_[‘params’][search.best_index_]给出最佳模型的参数设置,从而给出最高的平均分数(search.best_score_)。
- 对于多度量评价,这只有在refit被指定时才会出现。
scorer_
:function or a dict
- 记分器函数用于为模型选择最佳的参数。
- 对于多度量评估,此属性持有已验证的评分dict,该dict将得分者键映射到得分者可调用。
n_splits_
:int
- 交叉验证拆分(折叠/迭代)的次数。
方法
decision_function(self, X)
- 在最佳参数估计器上调用decision_function。
fit(self, X[, y, groups])
- 使用所有参数集运行fit。
get_params(self[, deep])
- 获取这个估计器的参数。
inverse_transform(self, Xt)
- 对找到最佳参数的估计器调用inverse_transform。
predict(self, X)
- 使用找到的最佳参数调用预估器。
predict_log_proba(self, X)
- 使用找到的最佳参数对估计器调用predict_log_proba。
predict_proba(self, X)
- 使用找到的最佳参数对估计器调用predict_proba。
score(self, X[, y])
- 返回给定数据上的分数,如果评估器已经被重新配置。
set_params(self, \*\*params)
-设置这个估计器的参数。
transform(self, X)
- 对具有最佳找到参数的估计器调用变换。
示例1
# 导入库
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn import metrics
# 数据集
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data,iris.target, test_size=0.3, random_state=42)
# 训练模型
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = svm.SVC()
clf = GridSearchCV(svc, parameters,cv=10, scoring="f1_micro")
clf.fit(X_train, y_train)
# 查看最佳分数、最佳参数
clf.best_score_
clf.best_params_
# 获取最佳模型
best_model=clf.best_estimator_
# 利用最佳模型进行预测
y_predict=best_model.predict(X_test)
metrics.f1_score(y_test, y_predict,average='micro')
示例2(pipline)
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline
from sklearn.metrics import precision_score, recall_score, accuracy_score
pipeline = Pipeline([
('vect', TfidfVectorizer(stop_words='english')),
('clf', LogisticRegression())
])
parameters = {
'vect__max_df': (0.25, 0.5, 0.75),
'vect__stop_words': ('english', None),
'vect__max_features': (2500, 5000, None),
'vect__ngram_range': ((1, 1), (1, 2)),
'vect__use_idf': (True, False),
'clf__penalty': ('l1', 'l2'),
'clf__C': (0.01, 0.1, 1, 10),
}
df = pd.read_csv('./sms.csv')
X = df['message']
y = df['label']
label_encoder = LabelEncoder()
y = label_encoder.fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y)
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, scoring='accuracy', cv=3)
grid_search.fit(X_train, y_train)
print('Best score: %0.3f' % grid_search.best_score_)
print('Best parameters set:')
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print('\t%s: %r' % (param_name, best_parameters[param_name]))
predictions = grid_search.predict(X_test)
print('Accuracy: %s' % accuracy_score(y_test, predictions))
print('Precision: %s' % precision_score(y_test, predictions))
print('Recall: %s' % recall_score(y_test, predictions))
df = pd.read_csv('./sms.csv')
X_train_raw, X_test_raw, y_train, y_test = train_test_split(df['message'], df['label'], random_state=11)
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(X_train_raw)
X_test = vectorizer.transform(X_test_raw)
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
scores = cross_val_score(classifier, X_train, y_train, cv=5)
print('Accuracies: %s' % scores)
print('Mean accuracy: %s' % np.mean(scores))
precisions = cross_val_score(classifier, X_train, y_train, cv=5, scoring='precision')
print('Precision: %s' % np.mean(precisions))
recalls = cross_val_score(classifier, X_train, y_train, cv=5, scoring='recall')
print('Recall: %s' % np.mean(recalls))
f1s = cross_val_score(classifier, X_train, y_train, cv=5, scoring='f1')
print('F1 score: %s' % np.mean(f1s))
Python机器学习笔记:Grid SearchCV(网格搜索)
调参必备—GridSearch网格搜索
GridSearchCV官方文档