掌握python机器学习-读书笔记 5 (评估算法)


声明:本文转载自https://my.oschina.net/sizhe/blog/1588788,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

9.1 评估机器学习方法

首先, 是不是可以用训练过的数据来预测呢, 答案是不行的, 因为过拟合。 试想一下用同样的数据集来训练数据, 然后用同样的数据来做评估, 那么显而易见结果会很好。 但是在未知的数据集呢, 结果就可能差很多了。 所以我们不能这样做,必须寻找更好的办法。 我们会探讨四种方法:

  • 分离训练测试集
  • k份交叉验证
  • 留一交叉验证
  • 重试随机测试训练分组

9.2 分离训练测试集

最简单的办法就是用不同的训练集和测试集。 具体操作上我们可以把数据集分成两部分, 一般的实践是分成两份67%对33%。 第一部分训练, 第二部分来测试。 这个估计算法呢速度快, 1) 适合大量数据,比如百万以上的级别, 要求测试集和训练集都应该有符合这个问题的数据特征或者说规律。 2) 因为速度快, 所以当算法计算慢的时候尤其适用。 不好的点是说它不稳定。 就是说当你选择的不同的训练集和测试集会导致结果有很大的不确定性。 如下:

# Evaluate using a train and a test set from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] test_size = 0.33 seed = 7 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.score(X_test, Y_test) print("Accuracy: %.3f%%") % (result*100.0)  # Accuracy: 75.591% 
# Evaluate using a train and a test set # seed =1 from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] test_size = 0.33 seed = 1 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.score(X_test, Y_test) print("Accuracy: %.3f%%") % (result*100.0)  # Accuracy: 77.559% 

可以看到如果选择的样本一样, 结果是一样的, 但是不同的样本, 比如我这里选择样本的随机种子不同, 会导致不同的结果。

9.3 k折叠交叉验证

交叉验证是一种常用的办法, 用来更稳定的评估机器学习算法的性能。 每一份叫做一叠。 这样你可以计算k-1次,然后求平均的结果。

  • 注意 关于k折叠验证, 记得什么地方看到过说是withour replacement 就是说不放回。 -python 机器学习 p175 什么意思呢, 就是说我们随机分了K份, 然后选择一份为测试集, 用其他来做训练。 第二轮就用其他中再选一份为测试集, 其他为训练。 这个叫做 without replacement。 这个结果可信度更高, 因为算法对于不同的数据训练了多次。
# Evaluate using Cross Validation 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-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] num_folds = 10 seed = 7 kfold = KFold(n_splits=num_folds, random_state=seed) model = LogisticRegression() results = cross_val_score(model, X, Y, cv=kfold) print("Accuracy: %.3f%% (%.3f%%)") % (results.mean()*100.0, results.std()*100.0)  Accuracy: 76.951% (4.841%) 

从结果可以看到, 这个的值处于上次一的两个值之间。 如果更多的尝试, 可能结果更明显。

9.4 留一验证

就是说每次只留一个来做验证。 这样k份数最多, 和数据集数目一样。

  • 好处是说它可以更多的计算
  • 不好, 运算量大。 明显感觉到计算时间较长。 结果看起来来k折叠认证差距不大。
Evaluate using Leave One Out Cross Validation 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-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] loocv = LeaveOneOut() model = LogisticRegression() results = cross_val_score(model, X, Y, cv=loocv) print("Accuracy: %.3f%% (%.3f%%)") % (results.mean()*100.0, results.std()*100.0)  # Accuracy: 76.953% (42.113%) 

9.5 重试随机测试训练分组

这个想法是每次都重复第一个方式: 随机分成训练集和测试集。 然后重复这个过程多次取平均。

  • 显然这样比第一种方法会好, 因为取了多次的结果。
  • 但是呢,由于是随机, 意味着可能有多次冗余。
# Evaluate using Shuffle Split Cross Validation 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-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] n_splits = 10 test_size = 0.33 seed = 7 kfold = ShuffleSplit(n_splits=n_splits, test_size=test_size, random_state=seed) model = LogisticRegression() results = cross_val_score(model, X, Y, cv=kfold) print("Accuracy: %.3f%% (%.3f%%)") % (results.mean()*100.0, results.std()*100.0)  #Accuracy: 76.496% (1.698%)  

这个测试的效果和seed 有很大关系, 如果seed 确定, 每次的结果是一样的, 意味着每次所谓的随机分组都是一样的分法。 但是seed 变了, 结果不同了。

9.6 如何选择

  • 一般来说k折叠算法是最常用, 效果最好的。 k 可以取值3 5 10 看你的测试速度。 - 就这个吧。 :)
  • 算法如果很慢就用一次训练测试分离算法。
  • 留一认证和随机选择的算法可以根据性能, 数据集大小选择。

本文发表于2017年12月12日 22:33
(c)注:本文转载自https://my.oschina.net/sizhe/blog/1588788,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2052 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1