机器学习系列12丨交叉验证和网格搜索

一.交叉验证

1.定义

将拿到的训练数据,分为训练和验证集。如果我们将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集,即得到4组模型的结果,即平均值作为最终结果,又称4折交叉验证。当然可以按照实际需求来划分份数。

2.分割方式

为了让训练得到模型结果更加准确,我们可以做如下处理。

训练集:训练集+验证集

测试集:测试集

20211014103423

3.交叉验证目的:

为了让被评估的模型更加准确可信,而不是提高模型准确率

1.定义

一般来说,有很多参数需要手动指定(比如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

20211014105939

2.交叉验证,网格搜索(模型选择与调优)API

20211014110254

代码演示:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 1.获取数据集
iris = load_iris()

# 2.数据基本处理
# 2.1 数据分割
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)

# 3.特征工程
# 3.1 实例化一个转换器
transfer = StandardScaler()
# 3.2 调用fit_transform方法
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)


# 4.机器学习(模型训练)
# 4.1 实例化一个估计器
estimator = KNeighborsClassifier()

# 4.2 调用交叉验证网格搜索模型
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
# cv=10 代表运行10次交叉验证  n_jobs=-1 满cpu负荷
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=10, n_jobs=1)

# 4.3 模型训练
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 输出预测值
y_pre = estimator.predict(x_test)
print("预测值是:\n", y_pre)
print("预测值和真实值对比:\n", y_pre == y_test)

# 5.2 输出准确率
ret = estimator.score(x_test, y_test)
print("准确率是:\n", ret)

# 5.3 其他评价指标
print("最好的模型:\n", estimator.best_estimator_)
print("最好的结果:\n", estimator.best_score_)
print("整体模型结果:\n", estimator.cv_results_)

运行结果如下图,看到n_neighbors=5是最好的

20211014133617