机器学习调参
- 常用调参方法举例
- K邻近算法(最常规版本)
- 加入交叉验证
- 加上网格搜索
- GridSearchCV
- 函数介绍
- GridSearchCV
- cross_val_score
常用调参方法举例
sklearn使得我们在很多编写代码的时候更多的工作倾向于调参数而不是去写算法本身,本篇文章整理了一下常用的调参方式。
K邻近算法(最常规版本)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 导入鸢尾花数据
iris=datasets.load_iris()
iris_X=iris.data
iris_y=iris.target
#查看前两行数据
print(iris_X[:2,:])
#[[5.1 3.5 1.4 0.2]
#[4.9 3. 1.4 0.2]]
#查看结果集
print(iris_y)
#划分数据
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3,random_state=3)
#训练模型
knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train,y_train)
#预测值
print(knn.predict(X_test))
#查看模型得分
print(knn.score(X_test,y_test))
# 0.9555555555555556
加入交叉验证
注意因为代码是在jupyter中运行,所以变量我就不重新定义了。
cross_val_score详细介绍放在文章末尾。
from sklearn.model_selection import cross_val_score
#cross_val_score函数一般用到的参数(对照下面):模型 训练数据测试数据 分为几份 计分方式下面的accu为准确的值划分
sorces=cross_val_score(knn,iris_X,iris_y,cv=5,scoring='accuracy')
print(sorces)
#[0.96666667 1. 0.93333333 0.96666667 1. ]
print(sorces.mean()) #求得分均值
#0.9733333333333334
加上网格搜索
不知道这里写的对不对
import matplotlib.pyplot as plt
k_range=range(1,31)
k_sorces=[]
for k in k_range:
knn=L=KNeighborsClassifier(n_neighbors=k)
sorces=cross_val_score(knn,iris_X,iris_y,cv=10,scoring='accuracy')
k_sorces.append(sorces.mean())
#下面两行是因为横纵坐标会因为汉字报错
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.plot(k_range,k_sorces)
plt.xlabel('对应k值')
plt.ylabel('k值对应分数')
plt.show()
结果为
GridSearchCV
这个其实就是交叉验证和网格搜索的结合,直接得出最优的参数。GridSearchCV的函数信息放在文章末尾(只写了几个常用的参数)
from sklearn.model_selection import GridSearchCV
k_range=range(1,31)
params = {'n_neighbors':k_range}
grid_search = GridSearchCV(knn,params,cv=10,scoring='accuracy')
grid_search.fit(X_train, y_train)
print('模型最高分:{:.3f}'.format(grid_search.score(X_test, y_test)))
print('最优参数:{}'.format(grid_search.best_params_))
#模型最高分:0.956
#最优参数:{'n_neighbors': 5}
函数介绍
GridSearchCV
class sklearn.model_selection.GridSearchCV(estimator, param_grid, , scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2n_jobs’, error_score=nan, return_train_score=False)
参数 | 解释 |
---|---|
estimator | 定义好的模型或者分类器 |
param_grid | 需要最优化的参数的取值,值为字典或者列表 |
scoring | 模型评价标准 |
n_jobs | 并行数,默认为1,最多就是你的cpu核数 |
cv | 交叉验证参数,默认None,上文我用的就是常说的10倍交叉验证 |
cross_val_score
sklearn.model_selection.cross_val_score(estimator, X, y=None, , groups=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2n_jobs’, error_score=nan)
参数 | 解释 |
---|---|
estimator | 估计器,也就是模型 |
X, y | 数据源 数据,标签值 |
scoring | 调用的方法 |
n_jobs | 同时工作的cpu个数(-1代表全部) |
cv | 交叉验证生成器或可迭代的次数 |