csv文件下载
CSV(indian_pines.csv)文件在本人博客另外连接可自由下载,怎么生成的这个文件在SVM那篇文章写了
网格搜索法
网格搜索法是指定参数值的一种穷举搜索方法,通过将估计函数的参数通过交叉验证的方法进行优化来得到最优的学习算法。
即,将各个参数可能的取值进行排列组合,列出所有可能的组合结果生成“网格”。然后将各组合用于SVM训练,并使用交叉验证对表现进行评估。在拟合函数尝试了所有的参数组合后,返回一个合适的分类器,自动调整至最佳参数组合。
网格通俗理解
遍历各种组合参数,得到最佳得分的分类参数,最后使用该组参数
交叉验证理解
遍历每一种参数组合,使用一下两种方法进行验证最佳参数组合
- 最基础的验证方法:将样本按比例分成不重叠的两部分,即训练集跟验证集,验证集数据不能拿去训练,就像不能看过答案后拿这道题去考试,因为只用了一次,所以数据利用率比较低;
- K折交叉验证:将样本量分成K等分,每次将其中的一等分作为验证集,其余(k-1)份作为训练集,进行K次训练和验证,将验证准确率取平均数,作为该组参数的准确率
交叉验证函数—cross_val_score
scikit-learn中的cross_val_score
导入
from sklearn.model_selection import cross_val_score
函数定义
sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’)
下面用到的几个参数:
estimator: 需要使用交叉验证的算法(本文使用SVM)
X: 输入样本数据
y: 样本标签
cv: 交叉验证折数(K值)
scoring: 交叉验证最重要的就是他的验证方式,选择不同的评价方法,会产生不同的评价结果。(https://scikitlearn.org/stable/modules/model_evaluation.html#scoring-parameter)
搜索法2代码
循环遍历几种参数,拿去训练,然后比较最佳得分
# # 网格搜索法2
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split,cross_val_score
import pandas as pd
best_parameters = {}
data = pd.read_csv(r'E:/xulu备份/高光谱/Indian_pine.csv', header=None)
data = data.values
data_D = data[:, :-1]
data_L = data[:, -1]
#test_size表示验证集占原始数据的比例
X_trainval, X_test, y_trainval, y_test = train_test_split(data_D, data_L, test_size=0.2)
# grid search start
best_score = 0
for gamma in [0.001]: # ,0.01,1,10,100,列表可以很多参数,基于时间太长只选一个[0.01,1,10,100]
for c in [1]: # 0.001,0.01,,10,100,列表可以很多参数,基于时间太长直选一个[0.001,0.01,,10,100]
# 对于每种参数可能的组合,进行一次训练
svm = SVC(gamma=gamma, C=c)
# 3 折(cv = 3)交叉验证
scores = cross_val_score(svm, X_trainval, y_trainval, cv=3)
score = scores.mean()
# 找到表现最好的参数
if score > best_score:
best_score = score
best_parameters = {'gamma': gamma, "C": c}
# 使用最佳参数,构建新的模型
svm = SVC(gamma=best_parameters['gamma'],C=best_parameters['C'])
# 使用训练集和标签进行训练
svm.fit(X_trainval, y_trainval)
# evalyation 实际模型评估
test_score = svm.score(X_test, y_test)
print('Best socre:{:.2f}'.format(best_score))
print('Best parameters:{}'.format(best_parameters))
print('Best score on test set:{:.2f}'.format(test_score))