机器学习交叉验证和网格搜索

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习交叉验证和网格搜索相关的知识,希望对你有一定的参考价值。

交叉验证和网格搜索

交叉验证:

之前学习算法的时候,去验证一个模型泛化能力(好坏),都只验证一次,这肯定是不行的。因此我们可以把一份数据集分成多份,然后交叉进行验证,然后最后再把每次交叉验证后的得分求平均值,这样的得分才更有说服力。

K折交叉验证,初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10折交叉验证是最常用的。

例如:5折交叉验证,全部可用数据集分成五个集合,每次迭代都选其中的1个集合数据作为验证集,另外4个集合作为训练集,经过5组的迭代过程。交叉验证的好处在于,可以保证所有数据都有被训练和验证的机会,也尽最大可能让优化的模型性能表现的更加可信。

交叉验证我们可以使用sklearn.cross_validation.cross_val_score来实现:

def cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
  """
  :param estimator:模型估计器
  :param X:特征变量集合
  :param y:目标变量
  :param cv:int,使用默认的3折交叉验证,整数指定一个(分层)KFold中的折叠数
  :return :预估系数
  """

网格搜索:

一般我们的一个模型好坏,是可以通过调节“超参数”来进行改进的,但是一个“超参数”都可能有多种选择,具体哪种选择更好,我们可以使用网格搜索来实现。网格搜索会根据你提供的参数,分别进行匹配,以查找到最佳的参数组合。底层的代码,就用到了交叉验证。网格搜索可以用sklearn.model_selection.GridSearchCV来实现。

knn = KNeighborsClassifier()
# 通过网格搜索,n_neighbors为参数列表
param = {"n_neighbors": [3, 5, 7]}
gs = GridSearchCV(knn, param_grid=param, cv=10)
# 建立模型
gs.fit(x_train,y_train)
# print(gs)
# 预测数据
print(gs.score(x_test,y_test))
titanic = pd.read_csv("data/titanic.txt")
features = titanic[['pclass','age','sex']]
# 处理年龄的缺失值,用平均年龄来代替
features['age'].fillna(features['age'].mean(),inplace=True)
targets = titanic['survived']

vect = DictVectorizer()
features = vect.fit_transform(features.to_dict(orient="records"))

classifier = DecisionTreeClassifier()
grid = GridSearchCV(classifier,param_grid={
    "max_depth":[5,6,7,8],
    "criterion":['gini'],
    "max_leaf_nodes":[25],
    "min_impurity_decrease": [0],
    "min_samples_leaf": [2],
    ""
},cv=10)

grid.fit(features,targets)

print("最好的得分:",grid.best_score_)
print("最好的模型:",grid.best_estimator_)
print("最好的参数:",grid.best_params_)

请参考: 【K-近邻算法】交叉验证,网格搜索


加油!

感谢!

努力!

以上是关于机器学习交叉验证和网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

交叉验证与网格搜索

机器学习:交叉验证,网络搜索

机器学习之交叉验证和网格搜索

libsvm交叉验证与网格搜索(参数选择)

使用网格搜索的交叉验证返回的结果比默认值差

交叉验证和网格搜索有啥区别?