第二章:机器学习的流程
作者:互联网
文章目录
2.1 机器学习流程的简介
2.1.1 进行机器学习的整体流程
接下来对三类机器学习方法应用最多的“监督学习”的实现流程进行阐述。监督学习的实现流程可以归纳为以下步骤:
- 收集数据
- 数据清洗(清除重复或者缺失的数据,以此来提高数据的精度)
- 运用机器学习算法对数据进行学习
- 使用测试数据集对模型进行性能评测
- 将机器学习模型安装到网页等应用环境中
在以上五个步骤中,只有3会用到机器学习技术,其实收集数据与数据清洗是最最重要的步骤,并且花费的时间也是非常之多。
2.1.2 数据的学习
在数据的学习过程中就会使用各种各样的机器学习算法,比如:
- SVM支持向量机
- 随机森林算法
- KNN近邻算法
- 决策树算法
- BP神经网络等等
-我们需要用这些算法去发现数据所蕴藏的特征与模式 ,然后对数据进行分类和预测。
2.2 学习数据的使用方法
2.2.1 学习数据与测试数据
在监督学习的过程中,我们需要将数据划分为“训练数据”和“测试数据”两种,我们并不是一股脑将所有数据进行算法的学习,而是留出一部分数据对训练出来的模型进行检验,更加通俗的讲:我们训练出来的模型精确率不一定很好,如果我们不拿出一部分数据进行测试,那么很有可能得到错误的结果。
大多数情况下,我们选择整体数据的20%作为测试数据。
2.2.2 留出法的理论与实践
接下来对划分数据的方法进行介绍:留出法与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 |
2.2.3 k折交叉验证的理论
k折交叉验证(k-fold cross-validation)是属于模型评估验证的一种方法,它是使用不放回抽样(已经抽样过的数据不再放回原数据集中的抽样方法),将训练集分割成k个子集,将其中的k-1个子集数据作为学习数据集使用,将剩下的1个子集用于模型测试的一种方法。这样我们会得到K个模型和与之相对应的k个性能评估数据,这样的话我们会重复k次学习和评估,最后对K个性能评估数据取平均值作为模型最后的结果。
留一交叉验证法是k折交叉验证的一种特殊方法,它将分隔子集的个数设置成与数据集的数量相同,也就是说,如果你有20行数据,那么留一法将其分割成20个子集,也就是说每一行数据都是其中的一个子集,做模型训练时,把其中的一行数据拿来测试,其余19行数据拿来训练。这种方法适合处理非常小的数据集(如50~100行)。
2.2.4 k折交叉验证的实践
经典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
'''
从留一法最后的平均得分来看,结果并不是很让人满意,这与模型的选取,数据量的大小有关。
2.3 过拟合
2.3.1 什么是过拟合
下面我用一张图来解释一下什么是过拟合现象:
如图所示,我们目前有两种类别分别为蓝色和橙色的数据集,我们可以清楚地看到有一个蓝色数据点偏离了正常情况的位置,这种情况通常是错误数据,即带有严重偏差的数据集,这个时候我们让计算机去进行分类,那么计算机就会非常“听话”的去处理分类这些数据,最后计算机会得到一种“过拟合的分界线”的结论,而正确的分界线答案却是那条绿色直线。因此我们可以看到,在分类平面受到了其中一个数据的影响而无法画出正确的分界线,计算机对数据进行了过度的学习而产生的状态,称之为“过拟合”
2.3.2 如何避免过拟合
- 在深度学习中,我们常常使用dropout方法防止过拟合
- 在其他的机器学习算法中,我们在对数据进行学习之前,常常会对数据进行归一化处理
下面讲一下什么是归一化处理。
归一化处理
归一,顾名思义,是将数据值映射到
[
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]
2.4 集成学习
集成学习是通过多个训练模型来实现数据的通用化的一种方法。常用的方法有两种:
- 装袋算法,让多个模型同时学习,并通过对预测结果取平均值的方式来增强模型预测结果的泛化性能的一种方法。
- 提升算法,通过针对模型的预测结果生成相应的模型的方式来提升泛化性能。
往期文章:
标签:iris,机器,流程,学习,算法,train,test,第二章,数据 来源: https://blog.csdn.net/ldy__cwx/article/details/122776715