文章目录
1.网格搜索寻找最优超参数
- 1.什么是网格搜索法?
答:网格搜索法是指参数值的一种穷举搜索方法,通过交叉验证的方式来优化得到最优的参数。通俗来说就是你给定一个参数p的范围(1,11),他会在这个范围里面将p的所有可能都进行计算,然后的到一个最优的p. - 2.怎么使用网格搜索?
方法如下:
代码中的我们有一个变量是param_grid,表示的意思是:参数名称作为键的字典以及用作值的参数设置列表,可以搜索任何参数设置序列;
其实就可以理解为我们需要优化的超参数就放到param_grid里面,然后再给超参数一个范围,后面把它传入网格搜索中,找到更优的参数
from sklearn.model_selection import GridSearchCV
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
digits = datasets.load_digits()
x = digits.data
y = digits.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)
# 因为weights有两种形式,所以我们用两个字典来分别添加超参数
# 当weights='uniform'时,只用优化n_neighbors,给定n_neighbors的范围
# 当weights='distance'时,用优化n_neighbors,p,给定n_neighbors,p的范围
param_grid = [{'weights': ['uniform'],
'n_neighbors': [i for i in range(1, 11)]},
{'weights': ['distance'],
'n_neighbors': [i for i in range(1, 11)],
'p':[i for i in range(1, 6)]}]
knn_clf = KNeighborsClassifier()
# n_jobs表示并行处理,默认为1,主要看电脑是几核的
# knn_clf 表示要进行交叉验证的模型
# verbose表示显示交叉搜素的过程,有利于了解搜索状态,数值越大,输出信息月详细
# 1.创建网格,将模型和超参数序列(param_grid)传入
grid_search = GridSearchCV(knn_clf, param_grid, n_jobs=-1, verbose=2) # 交叉验证
# 2.将训练集传入训练
grid_search.fit(x_train, y_train)
print('最佳的准确率:', grid_search.best_score_)
print('最佳的参数:', grid_search.best_params_)
2.数据归一化
-
(1)什么是数据归一化?
答:数据归一化就是将数据压缩到一个单位,使数据的值处于【0,1】之间或者【-1,1】 -
(2)为什么要数据归一化?
答:将数据归一化之后,可以加快训练数据的速度,加快收敛速度。 -
(3)归一化的方式:
最值归一化:x = (x-minA) / (maxA-minA)
均值归一化:x = (x-meanA) / std
mean 表示给定数据的平均值, std 表示方差 -
(4)什么时候用最值,什么时候用均值归一化?
答:最值归一化,将所有数据映射到0-1之间 X_scale = (X - X_min)/(X_max - X_min),适用于有明显边界的情况,例如成绩0-100, 但是受外界较大,比如工资,是没有明显边界的,所以不适合用最值归一化。
均值方差归一化:所有数据归一到均值为0,方差为1, 适合使用数据没有明显分布的情况,一般都是用均值方差归一化。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
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=666)
standarscaler = StandardScaler()
standarscaler.fit(x_train)
# 对训练数据进行归一化处理
x_train = standarscaler.transform(x_train)
# 对测试数据也进行归一化
x_test_standard = standarscaler.transform(x_test)
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(x_train, y_train)
score = knn_clf.score(x_test_standard, y_test)
print(score)