在完成特征选择之后,我们就可以用选择的特征来训练算法了,且能够得出准确度比较高的模型。现在的问题是,训练得到的模型,如何评估是好是坏呢?

这就牵涉到本篇涉及的话题:模型选择。

建立完模型,要去评估模型,这是机器学习流程必不可少的一部分,本篇就来讲讲如何评估模型的性能。

在这里有个关键词叫重采样,其实含义就是用新的数据集来评估算法,也即训练集之外的数据,这实在太熟悉,也讲了太多次,从各个角度讲过。

这里直接讲四种不同的分离数据集的方法:

  • 直接分离训练集和测试集
  • K折交叉验证分离
  • 留一法交叉验证分离
  • 重复随机采样分离

直接分离

这是最简单的方法,即将数据集完全分为训练集和测试集,并用测试集来评估模型。一般会将数据分为67%和33%,前者训练,后者评估,其实是挺浪费的分法。

# 算法评估
# 直接分离数据集
from pandas import read_csv
from sklearn.model_selection import train_test_split # 数据集分割是为了模型选择,所以可以反向思考包划分的原因
from sklearn.linear_model import LogisticRegression# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 数据分割
array = data.values
X = array[:, 0:8]
y = array[:, 8]
test_size = 0.33
seed = 4 # 人工指定随机种子是保证每次执行效果都一样
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=test_size, random_state=seed)# 定义模型
model = LogisticRegression()
model.fit(X_train, y_train)# result = model.predict(X_test)
result = model.score(X_test, y_test)
print("算法评估结果:%.3f%%" % (result * 100))# 算法评估结果:80.315%

所以可以看出来,这个执行的流程非常清晰,值得细细品味,举一反三,其他模型的使用也是一样的道理。

K折交叉验证

也称之为循环估计。

K折交叉验证的方法是将原始数据分成K组,每组都会用做一次测试集,其余的K-1组作为训练集,这样的话,就意味着我们会训练K次,验证K次,得到K个模型。得出的K个准确率,做一下平均 ,就作为最终的此模型的性能指标。

实际运用时,K的取值大于2,一般从3开始取值,数据量比较小时,可以考虑取2看看。

通常会取值为3,5,10等。

#### K折交叉验证
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score # 交叉验证
from sklearn.linear_model import LogisticRegression# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 数据划分
array = data.values
X = array[:, 0:8]
y = array[:, 8]
num_folds = 10 # 10折
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed)model = LogisticRegression()
result = cross_val_score(model, X, y, cv=kfold) # 传递模型,特征,目标值,k折对象print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))
# 算法评估结果:76.951% (4.841%)result.shape # 10折意味着10个结果
# (10,)

留一法交叉验证

这是K交叉验证的特例,也即数据有N个样本,需要搞N轮,每轮一个数据样本用来测试,N-1个样本用来训练。也是用N个模型的均值作为总体的性能评估。

好处是:

  • 每个回合几乎所有样本都用来训练
  • 实验结果可以被复制

缺点就是计算成本高。

#### 留一法交叉验证
from pandas import read_csv
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score # 交叉验证
from sklearn.linear_model import LogisticRegression# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 数据划分
array = data.values
X = array[:, 0:8]
y = array[:, 8]
num_folds = 10 # 10折
seed = 7
loocv = LeaveOneOut()model = LogisticRegression()
result = cross_val_score(model, X, y, cv=loocv) # 传递模型,特征,目标值,留一对象
print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))# 算法评估结果:76.823% (42.196%)

留一法得出的结果里,方差很大。

随机分离

现在讲最后的这种分离方法,和K折交叉验证效果相同。

#### 随机分离
from pandas import read_csv
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score # 交叉验证
from sklearn.linear_model import LogisticRegression# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 数据划分
array = data.values
X = array[:, 0:8]
y = array[:, 8]
n_splits = 10 # 10折
test_size = 0.33
seed = 7
kfold = ShuffleSplit(n_splits=n_splits, test_size=test_size, random_state=seed)model = LogisticRegression()
result = cross_val_score(model, X, y, cv=kfold)print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))# 算法评估结果:76.535% (1.672%)

总结

选择数据分离的指导准则:

  • K折交叉分割优先,一般取值3,5,10
  • 最简单的分离方法在数据量大或者算法执行效率低的场景下使用
  • 最后两种可以用来评估模型训练速度以及数据集大小 –

最黄金的准则是:不知道用什么时用K折交叉验证,不知道K值设置为多少时,设置为10。

具体的JupterNotebook: https://github.com/Bingyy/MachineLearning/blob/master/FeatureEngineeringAndModelSelection.ipynb

END.

【机器学习】选择模型相关推荐

  1. 机器学习也能套模版:在线选择模型和参数,一键生成demo

    木易 发自 凹非寺  量子位 报道 | 公众号 QbitAI 连机器学习的代码,也可以套模(tou)版(lan)了. 现在,有一个Web应用程序,可以生成用于机器学习的模板代码(demo),目前支持P ...

  2. 机器学习如何选择模型 机器学习与数据挖掘区别 深度学习科普

    今天看到这篇文章里面提到如何选择模型,觉得非常好,单独写在这里. 更多的机器学习实战可以看这篇文章:http://www.cnblogs.com/charlesblc/p/6159187.html 另 ...

  3. 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)

    本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26  ...

  4. 机器学习笔记——模型选择与正则化

    机器学习笔记--模型选择与正则化 一.模型选择 1.方差与偏差 2.过拟合与欠拟合 3.模型选择的平衡 4.欠.过拟合解决方法 二.正则化 1.正则化线性回归 2.正则化对数回归 3.训练集规模对误差 ...

  5. 系统学习机器学习之模型选择

    1 问题 模型选择问题:对于一个学习问题,可以有多种模型选择.比如要拟合一组样本点,可以使用线性回归,也可以用多项式回归.那么使用哪种模型好呢(能够在偏差和方差之间达到平衡最优)? 还有一类参数选择问 ...

  6. 【机器学习】模型评估与选择--西瓜书第二章

    2.1 经验误差与过拟合 2.2 评估方法 2.3 性能度量 2.5 偏差与方差 2.1 经验误差与过拟合 错误率(error rate):分类错误的样本占总样本的比率 精度(accuracy):分类 ...

  7. 万字长文总结机器学习的模型评估与调参 | 附代码下载

    作者 | Sebastian Raschka 翻译&整理 | Sam 来源 | SAMshare 目录 一.认识管道流 1.1 数据导入 1.2 使用管道创建工作流 二.K折交叉验证 2.1 ...

  8. 万字长文总结机器学习的模型评估与调参

    作者 | Sebastian Raschka 翻译&整理 | Sam 来源 | SAMshare 目录 一.认识管道流 1.1 数据导入 1.2 使用管道创建工作流 二.K折交叉验证 2.1 ...

  9. python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...

    算法 数据结构 机器学习笔记--模型调参利器 GridSearchCV(网格搜索)参数的说明 GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数.但是这个 ...

  10. 机器学习常用模型:决策树_fairmodels:让我们与有偏见的机器学习模型作斗争

    机器学习常用模型:决策树 TL; DR (TL;DR) The R Package fairmodels facilitates bias detection through model visual ...

最新文章

  1. [异常笔记] spring boot 启动-2018040201
  2. Android中文输入的新选择——搜狗拼音输入法
  3. helm命令的基本使用
  4. 面试题目_经典面试题目「回溯算法」解数独
  5. 微信也许会有重大变化
  6. bat 修改txt_善用bat命令提高办公效率
  7. 信息学奥赛一本通 1021:打印字符 | OpenJudge NOI 1.2 08
  8. 总结 | “卷积”其实没那么难以理解
  9. android内存置换,课内资源 - 基于Android实现的页面置换模拟
  10. Mac VS code latex pdf 安装教程
  11. 行军导航过程中导向箭头
  12. 3 个很酷的 Python 库,可以节省您的时间和精力
  13. Axure中引入Echarts图表并制作元件库
  14. Echarts美国地图
  15. 青春散场,永远的天王!
  16. Renascence架构介绍——目录
  17. AutoIt-v3的安装,和robotframework-autoitlibrary的导入
  18. 百度引流推广怎么做?个人如何做百度推广
  19. linux 文件锁 超时,Linux中的两种文件锁——协同锁与强制锁
  20. 让机房温度可视化:物联网下的数据中心环境运维新方式

热门文章

  1. 数据结构上机实践第14周项目1(4) - 验证算法(平衡二叉树)
  2. stl之vector的应用
  3. 华为鸿蒙HarmonyOS,华为鸿蒙HarmonyOS-系统概述
  4. python正则表达式提取字符串密码_用python正则表达式提取字符串
  5. ppt设置外观样式_PPT办公技巧:PPT内置主题样式的3种运用办法
  6. inno setup安装之前关闭mysql_innosetup安装之前关闭进程
  7. 在Ubuntu 18.04上安装MongoDB
  8. 在Ubuntu 18.04上安装Nginx
  9. 使用Kotlin的Android SeekBar
  10. python集合_Python集