网格搜索
Grid Search
网格搜索是一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)
本章我使用的还是digits数据集,调用方法接上一章。
#网格搜索,具体的格式可以上http://scikit-learn.org自行寻找。
# generates candidates
grid_param = [
{
'weights':['uniform'],
'n_neighbors':[i for i in range(1,11)]
},
{
'weights':['distance'],
'p':[i for i in range(1,6)],
'n_neighbors':[i for i in range(1,11)]
}
]
# 先new一个默认的Classifier对象
knn_clf = KNeighborsClassifier()# 调用GridSearchCV创建网格搜索对象,传入参数为Classifier对象以及参数列表
from sklearn.model_selection import GridSearchCV
grid_clf = GridSearchCV(knn_clf,grid_param)# 调用fit方法执行网格搜索
grid_clf.fit(X_train,y_train)
# 不是用户传入的参数,而是根据用户传入的参数计算出来的结果,以_结尾
# 最好的评估结果,返回的是KNeighborsClassifier对象
grid_clf.best_estimator_
# 最好的分数
grid_clf.best_score_# 最好的参数
grid_clf.best_params_#使用最好的分类器去求测试数据精度。
knn_clf_best = grid_clf.best_estimator_
knn_clf_best.score(X_test,y_test)%%time
# n_jobs 多线程并行处理,占用几个核,-1为使用所有的核
# verbose 是否打印搜索信息,传入值越大,输出信息越详细
grid_clf = GridSearchCV(knn_clf,grid_param,n_jobs=-1,verbose=2)
grid_clf.fit(X_train,y_train)
数据归一化:
样本间的距离被一个字段所主导
解决方案 :将所有的数据映射到同一尺度
最值归一化:把所有数据映射到0-1之间
1.将这个数据映射到0~Xmax-Xmin 之间
2.然后对于每个x相比于整个范围所占的比例
适用于分布有明显边界的情况;受outlier影响较大
均值方差归一化 standardization
把所有数据归一到均值为0方差为1的分布中
适用于数据分布没有明显边界;有可能存在极端情况值
优点(相对于最值归一化):即使原数据集中有极端值,归一化有的数据集,依然满足均值为0方差为1,不会形成一个有偏的数据;