内容概要¶
- 如何使用K折交叉验证来搜索最优调节参数
- 如何让搜索参数的流程更加高效
- 如何一次性的搜索多个调节参数
- 在进行真正的预测之前,如何对调节参数进行处理
- 如何削减该过程的计算代价
1. K折交叉验证回顾¶
交叉验证的过程
- 选择K的值(一般是10),将数据集分成K等份
- 使用其中的K-1份数据作为训练数据,另外一份数据作为测试数据,进行模型的训练
- 使用一种度量测度来衡量模型的预测性能
交叉验证的优点
- 交叉验证通过降低模型在一次数据分割中性能表现上的方差来保证模型性能的稳定性
- 交叉验证可以用于选择调节参数、比较模型性能差别、选择特征
交叉验证的缺点
- 交叉验证带来一定的计算代价,尤其是当数据集很大的时候,导致计算过程会变得很慢
2. 使用GridSearchCV进行高效调参¶
GridSearchCV根据你给定的模型自动进行交叉验证,通过调节每一个参数来跟踪评分结果,实际上,该过程代替了进行参数搜索时的for循环过程。
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
iris = load_iris()# create X (features) and y (response)
X = iris.data
y = iris.target
# define the parameter values that should be searched
k_range =[i for i in range(1, 31)]
# create a parameter grid: map the parameter names to the values that should be searched
# 下面是构建parameter grid,其结构是key为参数名称,value是待搜索的数值列表的一个字典结构
param_grid = dict(n_neighbors=k_range)
knn = KNeighborsClassifier(n_neighbors=5)
# instantiate the grid
# 这里GridSearchCV的参数形式和cross_val_score的形式差不多,其中param_grid是parameter grid所对应的参数
# GridSearchCV中的n_jobs设置为-1时,可以实现并行计算(如果你的电脑支持的情况下)
grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy')
# 我们可以知道,这里的grid search针对每个参数进行了10次交叉验证,并且一共对30个参数进行相同过程的交叉验证
grid.fit(X, y)
# create a list of the mean scores only
print(grid.best_estimator_)
3. 同时对多个参数进行搜索¶
这里我们使用knn的两个参数,分别是n_neighbors和weights,其中weights参数默认是uniform,该参数将所有数据看成等同的,而另一值是distance,它将近邻的数据赋予更高的权重,而较远的数据赋予较低权重。
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
iris = load_iris()# create X (features) and y (response)
X = iris.data
y = iris.target
# define the parameter values that should be searched
k_range =[i for i in range(1, 31)]
weight_options=['uniform','distance']
# create a parameter grid: map the parameter names to the values that should be searched
# 下面是构建parameter grid,其结构是key为参数名称,value是待搜索的数值列表的一个字典结构
param_grid = dict(n_neighbors=k_range,weights=weight_options)
knn = KNeighborsClassifier(n_neighbors=5)
# instantiate the grid
# 这里GridSearchCV的参数形式和cross_val_score的形式差不多,其中param_grid是parameter grid所对应的参数
# GridSearchCV中的n_jobs设置为-1时,可以实现并行计算(如果你的电脑支持的情况下)
grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy')
# 我们可以知道,这里的grid search针对每个参数进行了10次交叉验证,并且一共对30个参数进行相同过程的交叉验证
grid.fit(X, y)
# create a list of the mean scores only
print(grid.best_estimator_)
4. 使用最佳参数做出预测¶
knn = KNeighborsClassifier(n_neighbors=13, weights='uniform')
knn.fit(X, y)# make a prediction on out-of-sample data
knn.predict([3, 5, 4, 2])
5. 使用RandomizeSearchCV来降低计算代价¶
- RandomizeSearchCV用于解决多个参数的搜索过程中计算代价过高的问题
- RandomizeSearchCV搜索参数中的一个子集,这样你可以控制计算代价
当你的调节参数是连续的,比如回归问题的正则化参数,有必要指定一个连续分布而不是可能值的列表,这样RandomizeSearchCV就可以执行更好的grid search。