接下来对三类机器学习方法应用最多的“监督学习”的实现流程进行阐述。监督学习的实现流程可以归纳为以下步骤:
在数据的学习过程中就会使用各种各样的机器学习算法,比如:
在监督学习的过程中,我们需要将数据划分为“训练数据”和“测试数据”两种,我们并不是一股脑将所有数据进行算法的学习,而是留出一部分数据对训练出来的模型进行检验,更加通俗的讲:我们训练出来的模型精确率不一定很好,如果我们不拿出一部分数据进行测试,那么很有可能得到错误的结果。
大多数情况下,我们选择整体数据的20%作为测试数据。
接下来对划分数据的方法进行介绍:留出法与k折交叉验证,首先介绍留出法。所谓留出法,顾名思义,是将所给的数据集划分为训练集与测试集的一种简单方法,我们在使用机器学习算法时,通常会使用Python里面的第三方软件库:Scikit-Learn,利用Scikit-Learn对留出法进行实践时,需要使用train_test_split()函数,具体使用方法如下:
############导入需要使用的模块#########################
from sklearn import datasets
from sklearn.model_selection import train_test_split
#############读取名为iris的数据集#####################
iris=datasets.load_iris()
x=iris.data
y=iris.target
####################利用留出法将数据保存到“x_train,x_test,y_train,y_test”中,###########
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
############################确认训练数据和测试数据的大小########################
print('x_train:',x_train.shape)
print('x_test',x_test.shape)
print('y_train:',y_train.shape)
print('y_test:',y_test.shape)
参数 | 含义 |
---|---|
x_train | 训练集中的x(自变量) |
x_test | 测试集中的x(自变量 |
y_train | 训练集中的标签 |
y_test | 测试集中的标签 |
test_size | 测试集所占比例,通常为0.2 |
random_state | 指定为0时测试集将会被固定,不会再被随机改变,通常要指定其为0 |
k折交叉验证(k-fold cross-validation)是属于模型评估验证的一种方法,它是使用不放回抽样(已经抽样过的数据不再放回原数据集中的抽样方法),将训练集分割成k个子集,将其中的k-1个子集数据作为学习数据集使用,将剩下的1个子集用于模型测试的一种方法。这样我们会得到K个模型和与之相对应的k个性能评估数据,这样的话我们会重复k次学习和评估,最后对K个性能评估数据取平均值作为模型最后的结果。
留一交叉验证法是k折交叉验证的一种特殊方法,它将分隔子集的个数设置成与数据集的数量相同,也就是说,如果你有20行数据,那么留一法将其分割成20个子集,也就是说每一行数据都是其中的一个子集,做模型训练时,把其中的一行数据拿来测试,其余19行数据拿来训练。这种方法适合处理非常小的数据集(如50~100行)。
经典k折交叉验证Python实现:
'''通过调整cv=k中的k值,分数会不同'''
from sklearn import svm,datasets #导入需要的SVM算法包和数据集
from sklearn.model_selection import cross_val_score #导入k折交叉验证函数
iris=datasets.load_iris() #导入需要的iris数据集
x=iris.data #获取数据自变量的数值
y=iris.target #获取数据的标签
svc=svm.SVC(C=1,kernel='rbf',gamma=0.001) #使用SVM算法
scores=cross_val_score(svc,x,y,cv=5) #计算交叉验证得分,在程序内部数据x,y会被分割成x_train,x_test,y_train,y_test的形式
print(scores) #输出每次验证的分数
print('平均分数:',scores.mean()) #输出平均分数
'''
[0.86666667 0.96666667 0.83333333 0.96666667 0.93333333]
平均分数: 0.9133333333333334
'''
留一法Python代码实现
from sklearn import datasets
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score #导入k折交叉验证函数
from sklearn import svm
svc=svm.SVC(C=1,kernel='rbf',gamma=0.001)
iris=datasets.load_iris()
x=iris.data[0:70] #选取数据集的前70行
y=iris.target[0:70] #同上
loo=LeaveOneOut() #调用留一法
scores=cross_val_score(svc,x,y,cv=loo)
print(scores.mean()) #输出平均分数
'''
平均分数为0.7142857142857143
'''
从留一法最后的平均得分来看,结果并不是很让人满意,这与模型的选取,数据量的大小有关。
下面我用一张图来解释一下什么是过拟合现象:
如图所示,我们目前有两种类别分别为蓝色和橙色的数据集,我们可以清楚地看到有一个蓝色数据点偏离了正常情况的位置,这种情况通常是错误数据,即带有严重偏差的数据集,这个时候我们让计算机去进行分类,那么计算机就会非常“听话”的去处理分类这些数据,最后计算机会得到一种“过拟合的分界线”的结论,而正确的分界线答案却是那条绿色直线。因此我们可以看到,在分类平面受到了其中一个数据的影响而无法画出正确的分界线,计算机对数据进行了过度的学习而产生的状态,称之为“过拟合”
归一,顾名思义,是将数据值映射到 [ 0 , 1 ] [0,1] [0,1]区间,最简单的一种归一化方法就是:
d a t a n e w = d a t a o l d − d a t a m i n d a t a m a x − d a t a m i n data_{new}=\frac{data_{old}-data_{min}}{data_{max}-data_{min}} datanew=datamax−datamindataold−datamin
这样我们便做了一个这样的映射: d a t a → [ 0 , 1 ] data\to[0,1] data→[0,1]
集成学习是通过多个训练模型来实现数据的通用化的一种方法。常用的方法有两种:
往期文章: