评估算法
拟合:已知某函数的若干离散函数值,通过调整该函数中若干待定系数,使该函数与已知点集的差别(最小二乘意义)最小。
评估:估计算法在预测新数据能达到的程度。
四种不同的分离数据集的方法:
分离训练数据集和评估数据集
K折交叉验证分离
留一交叉验证分离
重复随机评估、训练数据集分离
² 分离训练数据集和评估数据集
简单地将原始数据集分为两部分,第一部分用来训练算法生成模型,第二部分通过模型来预测结果,并与已知的结果进行比较,来评估算法模型的准确度。通常将67%的数据作为训练集,将33%的数据作为评估数据集。
#分离训练数据集和评估数据集
#简洁、快速的数据分离技术,通常在具有大量数据、数据分布比较平衡的情况下非常有效
#将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]
seed = 4
test_size = 0.33
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('算法评估结果:%.3f%%' %(result*100))
² K折交叉验证分离
K折交叉验证是将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,再用K个模型最终的验证集的分类准确率的平均数。K折交叉验证可以有效地避免过学习及欠学习状态的发生。通常情况下,K的取值为3、5、10.
#K折交叉验证分离,K的取值为10
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
num_folds = 10
seed = 7
kfold = KFold(n_splits=10,random_state=seed)
model = LogisticRegression()
result = cross_val_score(model,X,y,cv=kfold)
print('算法评估结果:%.3f%%(%.3f%%)' %(result.mean()*100,result.std()*100))
² 留一交叉验证分离
留一交叉验证就是N-1交叉验证,即每个样本单独作为验证集,其余的N-1个样本作为训练集。
其优点:
最接近原始样本的样本,评估所得的结果比较可靠。
没有随机因素影响实验数据,确保实验过程可以被复制。
其缺点:
计算成本高,需要花费大量的时间完成算法的运算与评估。
#留一交叉
from sklearn.model_selection import LeaveOneOut
loocv = LeaveOneOut()
model = LogisticRegression()
result = cross_val_score(model,X,y,cv=loocv)
print('算法评估结果:%.3f%%(%.3f%%)' %(result.mean()*100,result.std()*100))
利用此方法计算出的标准方差和K折交叉验证的结果有较大的差距。
总结:
K折交叉验证是用来评估机器学习算法的黄金准则,不知道如何设定K值时,请将K值设为10.