三、选择模型
1.评估算法
要知道算法模型对未知的数据表现如何,最好的评估办法是,利用已经明确知道结果的数据运行生成的算法模型进行验证。必须使用与训练数据集完全不同的评估数据集来评价算法。
- 分离训练数据集和评估数据集:将评估数据集和训练数据集完全分开,用训练数据集训练算法生成模型,采用评估数据集来评估算法模型。通常会将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_traing,Y_test = train_test_split(X,Y,test_size=test_size,random_state=seed) model = LogisticRegression() model.fit(X_train,Y_traing) result = model.score(X_test,Y_test) print("算法评估结果:%.3f%%" % (result *100))
- K折交叉验证分离:将原始数据分为K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1个子集作为训练集,得到K个模型,再用这个K个模型最终的验证集的分类准确率的平均数,作为K折交叉验证下分类器的性能指标。K一般取值为3、5、10。(评估机器学习算法的黄金准则)
-
#K折交叉验证分离 from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression num_folds = 10#k一般取3,5,10 seed = 7 kfold = KFold(n_splits=num_folds,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个样本),得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为性能指标。
-
#弃一交叉验证分离,原始数据有N个,弃一就是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))
- 重复随机评估、训练数据集分离:随机分离数据为训练数据集和评估数据集,重复这个过程多次,就如同交叉验证分离。(通常用于平衡评估算法、模型训练的速度及数据集的大小)
-
重复随机分离评估数据集与训练数据集 from sklearn.model_selection import ShuffleSplit n_splits = 10 test_size = 0.33 seed = 7 kfold = ShuffleSplit(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))
2.算法评估矩阵
分类算法矩阵以逻辑回归为例,回归算法矩阵以线性回归为例,使用10折交叉验证来分离数据。使用scikit-learn的modei_selection中的cross_val_score方法来评估算法,分类和回归算法都适用。
- 分类算法矩阵
1)分类准确度:算法自动分类正确的样本数除以所有的样本数。通常准确度越高分类效果越好(不是所有的情况都是准确度越高越好)
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', &