使用交叉验证对鸢尾花分类模型进行调参(超参数)

如何选择超参数:

交叉验证:

如图,

  1. 大训练集分块,使用不同的分块方法分成N对小训练集验证集
  2. 使用小训练集进行训练,使用验证集进行验证,得到准确率,求N个验证集上的平均正确率
  3. 使用平均正确率最高的超参数,对整个大训练集进行训练,训练出参数。
  4. 训练集上训练。

十折交叉验证

网格搜索

诸如你有多个可调节的超参数,那么选择超参数的方法通常是网格搜索,即固定一个参、变化其他参,像网格一样去搜索。

# 人工智能数据源下载地址:https://video.mugglecode.com/data_ai.zip,下载压缩包后解压即可(数据源与上节课相同)
# -*- coding: utf-8 -*-

"""
    任务:鸢尾花识别
"""
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

DATA_FILE = ‘./data_ai/Iris.csv‘

SPECIES_LABEL_DICT = {
    ‘Iris-setosa‘:      0,  # 山鸢尾
    ‘Iris-versicolor‘:  1,  # 变色鸢尾
    ‘Iris-virginica‘:   2   # 维吉尼亚鸢尾
}

# 使用的特征列
FEAT_COLS = [‘SepalLengthCm‘, ‘SepalWidthCm‘, ‘PetalLengthCm‘, ‘PetalWidthCm‘]

def main():
    """
        主函数
    """
    # 读取数据集
    iris_data = pd.read_csv(DATA_FILE, index_col=‘Id‘)
    iris_data[‘Label‘] = iris_data[‘Species‘].map(SPECIES_LABEL_DICT)

    # 获取数据集特征
    X = iris_data[FEAT_COLS].values

    # 获取数据标签
    y = iris_data[‘Label‘].values

    # 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)

    model_dict = {‘kNN‘:
                      (
                          KNeighborsClassifier(),
                          {‘n_neighbors‘: [5, 15, 25], ‘p‘: [1, 2]}
                       ),
                  ‘Logistic Regression‘:
                      (
                          LogisticRegression(),
                          {‘C‘: [1e-2, 1, 1e2]}
                      ),
                  ‘SVM‘:
                      (
                          SVC(),
                          {‘C‘: [1e-2, 1, 1e2]}
                      )
                  }   # 名称+元组

    for model_name, (model, model_params) in model_dict.items():
        # 训练模型
        clf = GridSearchCV(estimator=model, param_grid=model_params, cv=5) #模型、参数、折数
        clf.fit(X_train, y_train)   #训练
        best_model = clf.best_estimator_   #最佳模型的对象

        # 验证
        acc = best_model.score(X_test, y_test)
        print(‘{}模型的预测准确率:{:.2f}%‘.format(model_name, acc * 100))
        print(‘{}模型的最优参数:{}‘.format(model_name, clf.best_params_))       #最好的模型名称和参数

if __name__ == ‘__main__‘:
    main()

运行结果:

kNN模型的预测准确率:96.00%
kNN模型的最优参数:{‘n_neighbors‘: 15, ‘p‘: 2}
Logistic Regression模型的预测准确率:96.00%
Logistic Regression模型的最优参数:{‘C‘: 100.0}
SVM模型的预测准确率:98.00%
SVM模型的最优参数:{‘C‘: 1}

练习

练习:使用交叉验证对水果分类模型进行调参

  • 题目描述:为模型选择最优的参数并进行水果类型识别,模型包括kNN,逻辑回归及SVM。对应的超参数为:
  • kNN中的近邻个数n_neighbors及闵式距离的p值
  • 逻辑回归的正则项系数C值
  • SVM的正则项系数C值
  • 题目要求:
  • 使用3折交叉验证对模型进行调参
  • 使用scikit-learn提供的方法为模型调参
  • 数据文件:
  • 数据源下载地址:https://video.mugglecode.com/fruit_data.csv(数据源与上节课相同)
  • fruit_data.csv,包含了59个水果的的数据样本。
  • 共5列数据
  • fruit_name:水果类别
  • mass: 水果质量
  • width: 水果的宽度
  • height: 水果的高度
  • color_score: 水果的颜色数值,范围0-1。
  • 0.85 - 1.00:红色
  • 0.75 - 0.85: 橙色
  • 0.65 - 0.75: 黄色
  • 0.45 - 0.65: 绿色

    image

可能的代码

import pandas as pd
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

#读取数据
data = pd.read_csv(‘./data_ai/fruit_data.csv‘)

#数据处理
fruit_dict = {
    ‘apple‘:    0,
    ‘lemon‘:    1,
    ‘mandarin‘: 2,
    ‘orange‘:   3
}

data[‘label‘] = data[‘fruit_name‘].map(fruit_dict)

feat_cols = [‘mass‘,‘width‘,‘height‘,‘color_score‘]

#数据提取
X = data[feat_cols].values
y = data[‘label‘].values

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=1/5, random_state= 3)

model_dict = {
    ‘KNN‘: ( KNeighborsClassifier(), {‘n_neighbors‘: [5,15,25], ‘p‘ : [1,2]} ),
    ‘Logestic Regression‘: (LogisticRegression(), {‘C‘:[1e02, 1, 1e2] }),
    ‘SVM‘: (SVC(), {‘C‘:[1e02, 1, 1e2]})
}

for model_name, (model, model_para) in model_dict.items():
    #训练
    clf = GridSearchCV(estimator=model, param_grid=model_para, cv=5)  # 模型、参数、折数
    clf.fit(X_train,y_train)
    best_model = clf.best_estimator_

    #验证
    acc = best_model.score(X_test, y_test)
    print(f‘{model_name}中选择{clf.best_params_}为参数的预测准确率最好,准确率可达{acc*100}%‘)

运行结果:

KNN中选择{‘n_neighbors‘: 5, ‘p‘: 1}为参数的预测准确率最好,准确率可达66.66666666666666%
Logestic Regression中选择{‘C‘: 100.0}为参数的预测准确率最好,准确率可达91.66666666666666%
SVM中选择{‘C‘: 100.0}为参数的预测准确率最好,准确率可达50.0%

作者:夏威夷的芒果
链接:https://www.jianshu.com/p/790ac622dc18
來源:简书

原文地址:https://www.cnblogs.com/caiyishuai/p/9649474.html

时间: 2024-11-08 03:20:16

使用交叉验证对鸢尾花分类模型进行调参(超参数)的相关文章

Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优

Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross validation),将数据集分成10份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法精度的估计. 10折交叉检验最常见,是因为通过利用大量数据集.使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点.但这并非最终结论,争议仍然存在.而且似

评分卡系列(四):泛化误差估计与模型调参

作者:JSong,时间:2017.10.21 本文大量引用了 jasonfreak ( http://www.cnblogs.com/jasonfreak ) 的系列文章,在此进行注明和感谢. 广义的偏差(bias)描述的是预测值和真实值之间的差异,方差(variance)描述距的是预测值作为随机变量的离散程度.<Understanding the Bias-Variance Tradeoff>当中有一副图形象地向我们展示了偏差和方差的关系: 一.Bias-variance 分解 我们知道算法

【scikit-learn】交叉验证及其用于參数选择、模型选择、特征选择的样例

?? 内容概要? 训练集/測试集切割用于模型验证的缺点 K折交叉验证是怎样克服之前的不足 交叉验证怎样用于选择调节參数.选择模型.选择特征 改善交叉验证 1. 模型验证回想? 进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就须要模型验证这一过程来体现不同的模型对于未知数据的表现效果. 最先我们用训练精确度(用所有数据进行训练和測试)来衡量模型的表现,这样的方法会导致模型过拟合:为了解决这一问题,我们将所有数据分成训练集和測试集两部

模型评估---交叉验证

1.原始交叉验证 # Import the linear regression class from sklearn.linear_model import LinearRegression # Sklearn also has a helper that makes it easy to do cross validation from sklearn.cross_validation import KFold import numpy as np # The columns we'll us

一篇文章,带你明白什么是过拟合,欠拟合以及交叉验证

误差模型:过拟合,交叉验证,偏差-方差权衡 作者Natasha Latysheva;Charles Ravarani 发表于cambridgecoding 介绍 ??在本文中也许你会掌握机器学习中最核心的概念:偏差-方差权衡.其主要想法是,你想创建尽可能预测准确并且仍能适用于新数据的模型(这是泛化).危险的是,你可以轻松的在你制定的数据中创建过度拟合本地噪音的模型,这样的模型是无用的,并且导致弱泛化能力,因为噪声是随机的,故而在每个数据集中是不同的.从本质上讲,你希望创建仅捕获数据集中有用成份的

交叉验证(Cross Validation)

假设我们需要从某些候选模型中选择最适合某个学习问题的模型,我们该如何选择?以多元回归模型为例:,应该如何确定k的大小,使得该模型对解决相应的分类问题最为有效?如何在偏倚(bias)和方差(variance)之间寻求最佳的平衡点?更进一步,我们同样需要知道如何在加权回归模型中选择适当的波长参数,或者在基于范式的SVM模型中选择适当的参数C? 我们假设模型集合为有限集,我们的目的就是从这d个模型中,选择最有效的模型. 假设样本集为S,根据经验风险最小化原则(ERM),可能会使用这样的算法: 1.在S

分类模型的评估和模型选择与调优

模型的评估标准 准确率 estimator.score() 最常见,预测结果的正确百分比 混淆矩阵 在分类任务下,预测结果与正确标记之间存在四种不同的组合,构成了混淆矩阵(适用于多分类) 精确率 预测结果为正例样本中真实为正例的比例,也就是查得准 召回率 真实为正例的样本中预测结果为正例的比例,查的全,对正样本的区分能力 其他分类标准 F1-score , 反映了模型的稳健性.具体会在代码运行结果中会显示. 以上都是对模型评估的一个标准.一些基础. 分类模型的评估API sklearn.metr

MXNET:分类模型

线性回归模型适用于输出为连续值的情景,例如输出为房价.在其他情景中,模型输出还可以是一个离散值,例如图片类别.对于这样的分类问题,我们可以使用分类模型,例如softmax回归. 为了便于讨论,让我们假设输入图片的尺寸为2×2,并设图片的四个特征值,即像素值分别为\(x_1,x_2,x_3,x_4\).假设训练数据集中图片的真实标签为狗.猫或鸡,这些标签分别对应离散值\(y_1,y_2,y_3\). 单样本分类的矢量计算表达式 针对上面的问题,假设分类模型的权重和偏差参数分别为: \[W=\beg

cross_val_score 交叉验证与 K折交叉验证,嗯都是抄来的,自己作个参考

因为sklearn cross_val_score 交叉验证,这个函数没有洗牌功能,添加K 折交叉验证,可以用来选择模型,也可以用来选择特征 sklearn.model_selection.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') 这里的cv 可以用下面的kf 关于s