机器学习-Python实践Day5(选择算法)

分离数据集的意义:
在评估算法准确度的时候,为什么不直接使用全量样本数据作为评估模型的数据集?
最直接的原因是在训练模型的时候,使用了一部分或全量样本数据;评估的时候,再次用全量数据去做评估的时候,会导致过拟合的情况。如图考试前一天,老师提前让你做了一套与明天考试一模一样的试卷,还公布了答案。那么明天的考试对你来说就十拿九稳了,不过这样是不可能检验你对知识的掌握能力。
因此我们不可能用全量数据去做训练模型和评估模型,而会采用分离数据集的方式将数据切分为训练集和评估集。
当然你在检验并确定好算法后,是可以使用全量数据去训练模型的,以便迎接新的数据验证。
分离数据集方法:

1.1、分离训练数据集和评估数据集

简单地将原始数据集分成两部分,一部分作为训练集用来训练算法生成模型;另一部分作为评估集,通过训练好的模型来预测结果,并与评估集中已知的结果做比较,以此评估模型的准确度。
通常会将2/3的数据作为训练集,1/3的数据作为评估集。
①导入数据

# 导入数据
import pandas as pd

names=['preg','plas','pres','skin','test','mass','pedi','age','class']
df=pd.read_csv('pima_data.csv',names=names)
# X为特征集
X=df.iloc[:,0:8].values
# Y为标签集
Y=df.iloc[:,8].values
# 查砍前5行
df.head()

机器学习-Python实践Day5(选择算法)
②分离训练数据集和评估数据集
在指定分离数据比例的同时,还需要指定数据随机的粒度,确保每次执行程序得到相同的训练集和评估集,有助于比较两个不同算法生成模型的结果。

# 分离训练数据集和评估数据集
from sklearn.model_selection import train_test_split
# 设置评估集占比
test_size=1/3
# 设置随机种子,保证训练集和评估集的不变性
seed=4
# 训练特征,评估特征,训练标签,评估标签
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=test_size,random_state=seed)

③评估模型

# 评估模型
from sklearn.linear_model import LogisticRegression
lr=LogisticRegression()
# 训练算法生成模型
lr.fit(X_train,Y_train)
lr_score=lr.score(X_test,Y_test)
print('算法评估结果:%.3f%%' % (lr_score*100))

机器学习-Python实践Day5(选择算法)

1.2、K折交叉验证分离

K折交叉验证
K折交叉验证是将原始数据分成K组样本子集(一般为均分),将每组样本子集分别作为一次评估集,其他K-1组样本子集作为训练集,由此得到K个模型,最后将这K个模型各自对评估集的预测准确率的平均值作为交叉验证下的性能指标。
①导入数据

# 导入数据
import pandas as pd

names=['preg','plas','pres','skin','test','mass','pedi','age','class']
df=pd.read_csv('pima_data.csv',names=names)
# X为特征集
X=df.iloc[:,0:8].values
# Y为标签集
Y=df.iloc[:,8].values
# 查砍前5行
df.head()

机器学习-Python实践Day5(选择算法)
②K折交叉验证分离

# K折交叉验证分离
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
# 将原始样本数据均分为10个样本子集
num_folds=10
# 设置随机种子
seed=4
# 定义交叉验证对象
kfold=KFold(n_splits=num_folds,random_state=seed)
# 定义算法
lr=LogisticRegression()
result=cross_val_score(lr,X,Y,cv=kfold)
print('10个模型的评估结果:\n',result)
# 取均值作为最终的评估指标
# 取标准方差作为评估结果之间的差异情况
print('算法评估结果:%.3f%%(%.3f%%)' % (result.mean()*100,result.std()*100))

机器学习-Python实践Day5(选择算法)

1.3、弃一交叉验证分离(N-1折交叉验证)

如果原始数据有N个样本数据,那么弃一交叉验证就是N-1折交叉验证,即每个样本单独作为评估集,其他N-1个样本作为训练集,所以会得到N个模型。将这N个模型各自对评估集的预测准确度的平均值作为弃一交叉验证的性能指标。
相较于K折交叉验证,弃一交叉验证有两个显著的特点:

  1. 可靠的评估结果,每次分离数据集,几乎将所有的样本用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
  2. 计算成本高,因为需要建立的模型数量与原始数据样本数量相同;当原始数据样本数量相当多时,弃一交叉验证就需要花费大量的时间来完成算法的运算和评估。
    ①导入数据
# 导入数据
import pandas as pd

names=['preg','plas','pres','skin','test','mass','pedi','age','class']
df=pd.read_csv('pima_data.csv',names=names)
# X为特征集
X=df.iloc[:,0:8].values
# Y为标签集
Y=df.iloc[:,8].values
# 查砍前5行
df.head()

机器学习-Python实践Day5(选择算法)
②弃一交叉验证分离

# 弃一交叉验证分离
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score
# 定义弃一交叉验证对象
loocv=LeaveOneOut()
# 定义逻辑回归算法
lr=LogisticRegression()
result=cross_val_score(lr,X,Y,cv=loocv)
print('多个模型的评估结果:\n',result)
# 取均值作为最终的评估指标
# 取方差作为评估结果之间的差异情况
print('算法评估结果:%.3f%%(%.3f%%)' % (result.mean()*100,result.std()*100))
# print('模型评估分数为0的个数:',len(result[result==0]))
# print('模型评估分数为1的个数:',len(result[result==1]))
# print('模型评估总个数:',l# len(result))
# (768-177)/768 = 0.76953125

可以看到评估的结果非1即0,因为只有一个样本作为评估集,分类的时候要么对要么错。评估分数要么100%,要么0%。
机器学习-Python实践Day5(选择算法)

1.4、重复随机分离评估、 训练数据集分离

还有一种K折交叉验证是随机分离原始样本为训练集和评估集,当不同的是,每训练完一个模型,就重新切分样本数据。类似设置不同随机种子。(不过这种随机种子是更深层次的)
①导入数据

# 导入数据
import pandas as pd

names=['preg','plas','pres','skin','test','mass','pedi','age','class']
df=pd.read_csv('pima_data.csv',names=names)
# X为特征集
X=df.iloc[:,0:8].values
# Y为标签集
Y=df.iloc[:,8].values
# 查砍前5行
df.head()

机器学习-Python实践Day5(选择算法)
②重复随机分离评估、 训练数据集分离

from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
# 将原始样本数据重复随机均分为10个样本子集
n_splits=10
# 设置评估集占比
test_size=1/3
# 设置随机种子
seed=4
kfold=ShuffleSplit(n_splits=n_splits,test_size=test_size,random_state=seed)
lr=LogisticRegression()
result=cross_val_score(lr,X,Y,cv=kfold)
print('多个模型的评估结果:\n',result)
# 取均值作为最终的评估指标
# 取方差作为评估结果之间的差异情况
print('算法评估结果:%.3f%%(%.3f%%)' % (result.mean()*100,result.std()*100))

机器学习-Python实践Day5(选择算法)
总结:
上述介绍了4种分离样本数据的方法,我们可以通过以下原则来选择分离方式:

  • K折交叉验证是用来评估机器学习算法的黄金准则。通过会取K为3,5,10来分离数据集;
  • 分离训练数据集和评估集。执行效率高,通常会用于算法执行效率较低或者样本数据量过大的情况;
  • 弃一交叉验证和重复随机分离训练集和评估集,通常用于平衡评估算法、模型训练速度及样本数量大小;
  • 一般情况下可以选择10折交叉验证;