博文配套视频课程:24小时实现从零到AI人工智能
为什么使用交叉验证
- 交叉验证用于评估模型的性能预测,尤其是训练好的模型在新数据上的表现
- 可以在一定程度上减少过拟合 可以从有限的数据中获取尽可能多的有效信息
- 评估的正确率相对更稳定
交叉验证原理分析
交叉验证,将拿到的训练数据,分为训练集和验证集 (总数据 = (训练集 (训练集 + 验证集) + 测试集),例如:可以将数据分成5份,其中一份作为验证集。然后经过5次(5组)的测试,每次更换不同的验证集,得到5组模型的结果。取平均值作为最终结果。又称为5折交叉验证
交叉验证与网格搜索
网格搜索法是指定参数值的一种穷举搜索方法,通过将估计函数的参数通过交叉验证的方法进行优化来得到最优的学习算法。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
plt.rcParams['font.sans-serif']=['SimHei']
digits = datasets.load_digits()
X = digits['data']
y = digits['target']
pca = PCA(n_components=5) # 直接降低到30特征值
X = pca.fit_transform(X)
# # 它代表降维后的各主成分的方差值占总方差值的比例(从大到小排序),这个比例越大,则越是重要的主成分
pevr = pca.explained_variance_ratio_
print(f'每个特征方差为{pevr},降维后的特征数量为{len(pevr)},保留特征百分比为{np.sum(pevr)}')
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=1)
print(X_train.shape)
# 通过交叉验证与网格搜索来提升正确率
knn = KNeighborsClassifier()
from sklearn.model_selection import GridSearchCV
gc:GridSearchCV = GridSearchCV(estimator=knn,param_grid={'n_neighbors':[1,5,10]},cv=3)
# 训练模型
gc.fit(X_train,y_train)
# 传入测试集,返回预测结果
y_predict = gc.predict(X_test)
# 交叉验证与网格搜索的相关结果如下 (训练集又分为训练和测试数据)
print('交叉验证中最好的结果', gc.best_estimator_)
print('交叉验证中最好的模型', gc.best_score_)
print('每个超参数每次交叉验证的结果', gc.cv_results_)