网格搜索法

网格搜索法是指定参数值的一种穷举搜索方法,通过将估计函数的参数通过交叉验证的方法进行优化来得到最优的学习算法。

即,将各个参数可能的取值进行排列组合,列出所有可能的组合结果生成“网格”。然后将各组合用于SVM训练,并使用交叉验证对表现进行评估。在拟合函数尝试了所有的参数组合后,返回一个合适的分类器,自动调整至最佳参数组合,可以通过clf.best_params_获得参数值

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_32547403/article/details/73008127

交叉验证与网格搜索

交叉验证与网格搜索是机器学习中的两个非常重要且基本的概念,但是这两个概念在刚入门的时候并不是非常容易理解与掌握,自己开始学习的时候,对这两个概念理解的并不到位,现在写一篇关于交叉验证与网格搜索的文章,将这两个基本的概念做一下梳理。

网格搜索

网格搜索(Grid Search)名字非常大气,但是用简答的话来说就是你手动的给出一个模型中你想要改动的所用的参数,程序自动的帮你使用穷举法来将所用的参数都运行一遍。决策树中我们常常将最大树深作为需要调节的参数;AdaBoost中将弱分类器的数量作为需要调节的参数。

评分方法

为了确定搜索参数,也就是手动设定的调节的变量的值中,那个是最好的,这时就需要使用一个比较理想的评分方式(这个评分方式是根据实际情况来确定的可能是accuracy、f1-score、f-beta、pricise、recall等)

交叉验证

有了好的评分方式,但是只用一次的结果就能说明某组的参数组合比另外的参数组合好吗?这显然是不严谨的,上小学的时候老师就告诉我们要求平均��。所以就有了交叉验证这一概念。下面以K折交叉验证为例介绍这一概念。

  1. 首先进行数据分割 
    将原始数据集分为训练集和测试集。如下图以8:2的方式分割: 
    png 
    训练集使用来训练模型,测试集使用来测试模型的准确率。 
    注意:绝对不能使用测试集来训练数据,这相当于考试的时候先让你把考试的答案背过了,又让你参加考试。
  2. 数据验真 
    在k折交叉验证方法中其中K-1份作为训练数据,剩下的一份作为验真数据:

png1 
这个过程一共需要进行K次,将最后K次使用实现选择好的评分方式的评分求平均返回,然后找出最大的一个评分对用的参数组合。这也就完成了交叉验证这一过程。

### 举例 下面使用一个简单的例子(预测年收入是否大于5万美元)来进行说明网格搜索与交叉验证的使用。 数据集来自[UCI机器学习知识库](https://archive.ics.uci.edu/ml/datasets/Census+Income)。

import numpy as np
import pandas as pd
from IPython.display import display
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import make_scorer, fbeta_score, accuracy_score
from sklearn.model_selection import GridSearchCV, KFold

%matplotlib inline 

data = pd.read_csv("census.csv")

# 将数据切分成特征和标签
income_raw = data['income']
features_raw = data.drop('income', axis=1)

# 显示部分数据
# display(features_raw.head(n=1))

# 因为原始数据中的,capital-gain 和 capital-loss的倾斜度非常高,所以要是用对数转换。
skewed = ['capital-gain', 'capital-loss']
features_raw[skewed] = data[skewed].apply(lambda x: np.log(x + 1))

# 归一化数字特征,是为了保证所有的特征均被平等的对待
scaler = MinMaxScaler()
numerical = ['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week']
features_raw[numerical] = scaler.fit_transform(data[numerical])
# display(features_raw.head(n=1))

# 独热编码,将非数字的形式转化为数字
features = pd.get_dummies(features_raw)
income = income_raw.replace(['>50K', ['<=50K']], [1, 0])

# 切分数据集
X_train, X_test, y_train, y_test = train_test_split(features, income, test_size=0.2, random_state=0)

# Adaboost
from sklearn.ensemble import AdaBoostClassifier
clf_Ada = AdaBoostClassifier(random_state=0)

# 决策树
from sklearn.tree import DecisionTreeClassifier
clf_Tree = DecisionTreeClassifier(random_state=0)

# KNN
from sklearn.neighbors import KNeighborsClassifier
clf_KNN = KNeighborsClassifier()

# SVM
from sklearn.svm import SVC
clf_svm = SVC(random_state=0)

# Logistic
from sklearn.linear_model import LogisticRegression
clf_log = LogisticRegression(random_state=0)

# 随机森林
from sklearn.ensemble import RandomForestClassifier
clf_forest = RandomForestClassifier(random_state=0)

# GBDT
from sklearn.ensemble import GradientBoostingClassifier
clf_gbdt = GradientBoostingClassifier(random_state=0)

# GaussianNB
from sklearn.naive_bayes import GaussianNB
clf_NB = GaussianNB()

scorer = make_scorer(accuracy_score)

# 参数调优

kfold = KFold(n_splits=10)
# 决策树
parameter_tree = {'max_depth': xrange(1, 10)}
grid = GridSearchCV(clf_Tree, parameter_tree, scorer, cv=kfold)
grid = grid.fit(X_train, y_train)

print "best score: {}".format(grid.best_score_)
display(pd.DataFrame(grid.cv_results_).T)

best score: 0.855737070514.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }

 012345678
mean_fit_time0.05625350.06921330.08851260.1102330.1283370.1587190.171240.1936370.223979
mean_score_time0.002404740.002282120.002215290.00260470.002267720.002542970.002314810.002466960.00256622
mean_test_score0.751140.8238110.8393450.8399260.8466710.8523920.8515080.8531390.855737
mean_train_score0.751140.824210.8396280.8405030.8478780.8533290.8552640.8592020.863667
param_max_depth123456789
params{u’max_depth’: 1}{u’max_depth’: 2}{u’max_depth’: 3}{u’max_depth’: 4}{u’max_depth’: 5}{u’max_depth’: 6}{u’max_depth’: 7}{u’max_depth’: 8}{u’max_depth’: 9}
rank_test_score987653421
split0_test_score0.7606410.82670.8438360.8446660.8515750.8557210.8554450.860420.859038
split0_train_score0.7500840.8238280.8391840.839430.8475380.8529130.8542950.8599470.863233
split1_test_score0.7581540.8211720.8391380.8424540.8452180.8496410.8477060.8507460.852957
split1_train_score0.7503610.8244420.8397060.8459110.8500880.8542030.8558310.8614820.864984
split2_test_score0.7548370.8242120.8402430.840520.84660.8546160.8543390.8540630.856551
split2_train_score0.7507290.8247180.8390310.8393070.8473230.8522370.8542030.8595780.86397
split3_test_score0.731620.8206190.8380320.8383080.84660.8507460.8485350.8468770.852957
split3_train_score0.7533090.8245030.8398290.8401060.8483370.8537420.855370.8581040.863171
split4_test_score0.7465450.8186840.833610.8338860.839690.8479820.8454950.850470.848811
split4_train_score0.7516510.8247180.8403210.8405970.8448970.8535580.8583190.8619120.864922
split5_test_score0.7542840.8261470.8449420.8452180.8540630.8590380.857380.8582090.861802
split5_train_score0.7507910.8238890.8390610.8393380.8473230.8527290.8541110.8569670.862741
split6_test_score0.7542840.8253180.8380320.8377560.8454950.8485350.8485350.8521280.857103
split6_train_score0.7507910.8239810.8398290.8401670.8484290.8537730.8556470.8577660.863141
split7_test_score0.7497930.8213990.8354990.8354990.8446230.852640.8520870.8537460.85264
split7_train_score0.751290.8244160.8401110.8404180.8483720.8535010.8549450.8608110.863882
split8_test_score0.7533870.8263750.8382640.838540.844070.8520870.8529170.8523640.858446
split8_train_score0.7508910.8238640.8398030.840080.8483720.8530710.8549450.8578010.863391
split9_test_score0.7478570.8274810.8418580.8424110.848770.8529170.852640.8523640.857064
split9_train_score0.7515050.8237410.8394040.8396810.8480960.8535630.8549750.8576470.863237
std_fit_time0.01235830.004427880.005520260.006316910.00531950.01570110.004769910.006228540.0147429
std_score_time0.0005292140.0004670910.0003550280.0007606240.0004608290.0005046270.0004462890.0004452560.000449312
std_test_score0.007698980.002924640.003331180.003587760.003824960.003244060.003604140.003663890.00363761
std_train_score0.0008554820.0003661660.0004189730.001852640.001246980.0005531710.001161510.001687320.000726325
  • 84
    点赞
  • 408
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 网格搜索是一种常用的参数优化方,它通过遍历给定的参数范围,确定最佳的参数组合,以提高算性能。在matlab中,可以利用内置函数gridsearch来实现网格搜索。该函数接受输入参数,包括被调用函数句柄、参数范围、步长以及数据输出方式等。在执行过程中,网格搜索会遍历所给参数范围,并依次按照步长进行取值,再将所得参数组合作为输入对被调用函数进行计算,得到相应的结果。最后,根据所设定的输出方式(例如,最优参数组合、最大值、最小值等),确定最佳的参数组合及其对应的结果,并将其输出。 网格搜索在matlab中可以广泛应用于各种算的调参过程,例如,支持向量机、决策树、神经网络等。其优点在于能够充分利用计算资源,遍历所有可能的参数组合,找到最佳组合,从而提高算性能。缺点是计算耗时较长,需要根据实际情况选择参数范围和步长,以充分发挥其优点。 在使用网格搜索时,需要注意以下几点:首先,必须确定参数范围和步长,以充分覆盖所有参数组合;其次,需要指定被调用函数和输出格式;最后,要检验得到的结果是否可靠,通常可以通过交叉验证等方进行评估。 ### 回答2: 网格搜索是一种常见的参数优化算,通常用于确定机器学习模型的最佳参数。在 MATLAB 中,可以使用 GridSearch 函数来实现网格搜索网格搜索的基本思想是在预定义的参数范围内生成所有可能的参数组合,并通过交叉验证使用这些参数组合来评估模型的性能。在 GridSearch 函数中,使用参数数组来定义要搜索的参数及其取值范围。此外,还需要定义要优化的评估指标,例如准确性、平均方差等。然后,函数会在所有可能的参数组合中进行搜索,并返回最佳的参数组合和相应的评估结果。在使用 GridSearch 函数时,需要注意搜索范围不应太大,否则可能会导致运行时间过长,甚至出现过拟合的问题。此外,由于网格搜索是一种暴力搜索算,因此在搜索范围较大时可能无获得全局最优解。为了避免此类情况,可以使用其他优化算或启发式算,例如模拟退火、遗传算等。网格搜索是一种简单而强大的参数优化策略,可以帮助我们针对特定问题找到最佳的模型参数组合。 ### 回答3: 网格搜索(matlab)是一种用于优化参数选择的算,又称为暴力求解。其基本思想是,将一定范围的参数值分为若干个网格,然后枚举每个网格中的参数值进行计算,最终找出最佳的参数组合。在matlab中,可以使用gridsearch函数来实现网格搜索。其使用方为:首先定义待优化的参数及其取值范围,然后调用gridsearch函数,将计算函数和参数值输入即可。输出结果为最优参数组合及相应的函数值。 网格搜索(matlab)的优点在于易于实现和理解,能够有效地搜索参数空间,适用于参数空间小而维度高的问题。但其缺点也显而易见,即计算量巨大且随着参数维度增加呈指数级增长,导致计算时间长且不适宜处理高维空间的问题。 在实际应用中,网格搜索(matlab)常用于机器学习和数据挖掘中的模型选择和调参过程中。通过对不同参数组合进行大量测试,可以找到最优的参数设置,从而提高模型性能和预测准确率。总之,网格搜索(matlab)是一种简单而有效的算,对于小规模参数空间的问题具有优良的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值