赞
踩
当你有一定的了解之后,你会发现曾经被自己仰望的那些闪耀在夜空的璀璨星斗并非遥不可及,而是只要攀上这座山峰,就能做到手摘星辰。令你望而却步的,其实没那么遥远。渺小的可能不是你的能力,而是你的胆怯和无知。本人在读硕士,目前研一,在研究相关课题时有所用到机器学习的知识,曾被机器学习的数据集划分这一小小的概念困扰万分,曾一度想过拒绝学习这“令人讨厌”的机器学习,如今,对相关的知识有了初步的认识之后,慢慢发现机器学习这座大山并非不可逾越,正在登山的我想把登山的过程及风景记录下来,以供以后自己观看并对未来登山的人提供帮助,随着本人的认知不断增长,很内容也会更新检查,不断完善,有错误之处还请同行人士批评指正。
要明白什么是机器学习,这里有必要介绍什么是显著式编程和非显著式编程。显著式编程是人为赋予计算机规律的编程,通俗点讲,就是人们的思想指引计算机一步一步的做事情;而非显著式编程是让计算机自己总结规律的编程,可以理解为计算机自己学习之后产生了自己的思想,然后根据自己所学到的东西去做相应的事情。而机器学习就是基于非显著式编程的学习。因而,机器学习可以定义为:一个计算机程序被称之为可以学习,是指针对某个任务T和某个性能指标P,从经验E中学习,这种学习有个特点是,它在T上的被P所衡量的性能,会随着经验E的增加而提高。
机器学习的分类,根据输入的数据是否有标签把学习分为监督学习(数据有标签)、半监督学习(部分数据有标签)、非监督学习(所有数据都没有标签)。按照解决问题的类型,把机器分为分为分类和回归。比如垃圾邮件识别就属于分类问题,预测的结果要么是垃圾邮件,要么不是垃圾邮件两类,这就是分类问题;预测房价就是一个回归问题,它预测的就是房价的具体数字。
关于数据集划分、特征、特征提取、拟合、泛化、成本函数、损失函数、模型评分等一些机器学习术语的解释。
数据集划分:当模型确定后,数据集U一般划分为测试集E和训练集P两类,两者满足:E∩P=∅,E∪P=U。E训练集是用来训练模型,测试集是用来测试模型好坏的。当模型没有确定的时候,即有多个备选模型,数据集分为训练集、测试集和验证集,多了一个验证集就是来验证到底选哪个模型进行预测,这结果集合遵循的原则也是并起来是全集,两两相交为空集。
特征和特征提取:特征可以理解为数据的特性,比如花的颜色,花的大小;特征提取就是从所有的特征中选取相对重要的特征的过程,可以是自己收到提取也可以是通过库里的函数。
拟合:拟合就是对模型的训练,模型有时候会出现过拟合和欠拟合的现象,过拟合是对训练集的样本拟合较好,但是对新的数据预测准确性较差。欠拟合是对训练的数据和新的数据都表现得较差。
泛化:很好理解就是训练出来的模型应用到测试集的过程。
损失函数:这个是预测的值和真实值的误差。都有具体的求误差的公式和函数,理解含义会调包就行,这里就不具体讲解了。
成本函数:是成本和模型参数的函数关系,成本是指模型拟合出来的结果和真实的结果的误差平均值,模型参数是构建模型的所用的参数,拿一元线性模型为例,模型y=ax+b,[a,b]向量就是模型参数。
模型评分:就是对模型打分,用于评价一个模型的好坏。
下面就通过一个python实例来对上面的概念进一步解释。我们的实例是鸢尾花分类,这里声明一下,实例都是用sklearn库来演示的。
一般的一个模型学习的过程为:数据准备→建立模型→训练模型→模型预测→模型评估。
数据准备:这里的数据是sklearn库中的数据,from sklearn.datasets import load_iris直接导入进来,这里有三种花色分别是[‘setosa’ ‘versicolor’ ‘virginica’],为了方便就用0,1,2依次表示,他们的特征有[‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’],分别是花萼长度、花萼看度、花瓣长度、花瓣宽度,这四个就是数据特征。现在我们的任务就是对这些现有的数据进行分析,建立适当的模型,使这个模型能对一个或一组新的数据进行准确的预测。划分数据集和训练集,这里用的是train_test_split这个函数,关于这个函数的详解请看train_test_split()函数详解
这里我们用到的模型是K近邻算法,算法简单理解就是考虑新数据点最近的k个邻居(比如1个邻居、3和邻居或5个邻居)是什么类型,然后新数据点的预测结果就是什么类型。这里再解释一下数据集划分部分有时候为何要划分验证集。假设,对于鸢尾花分类问题有三个模型分别为1近邻、3近邻和5近邻三个,我们不知道选哪一个模型能更好的预测新的数据,所以就把数据集划分出了验证集,用验证集来验证这三个模型,那个模型的分最高,就用那个模型去做未来的预测。当然,我们的这次实验,选择的是1近邻算法,模型已经确定,就不再需要什么验证集了。
数据集划分之后,就该模型建立和预测,以及后面的评估了,具体的解释见代码注释把。
# -*-coding:utf-8-*- import mglearn as mglearn import xgboost import pandas as pd import numpy as np from sklearn.datasets import load_iris # from sklearn.neighbors import KNeighborsClassifier #k近邻算法 from sklearn.model_selection import train_test_split iris_data = load_iris() # print(iris_data.keys()) # print(iris_data['target_names']) # print(iris_data['target'])#标签的表示,0,1,2 # print(iris_data['frame']) # print(iris_data['feature_names']) #特征名字 # print(iris_data['data']) #不同特征的特征值 X_train,X_test,y_train,y_test = train_test_split(iris_data['data'],iris_data['target'],random_state=0) iris_DataFrame = pd.DataFrame(X_train,columns=iris_data.feature_names) knn_model = KNeighborsClassifier(n_neighbors=1) #模型建立,模型的参数为1 knn_model.fit(X_train,y_train)#模型训练也叫模型拟合 # x_new = np.array([[5,2.9,1,0.2]]) # print(knn_model.predict(x_new)) y_pre = knn_model.predict(X_test) #模型预测,泛化 score = knn_model.score(X_test,y_test) #模型打分,判断一个模型好坏,就拿他没见过的测试集来预测,把预测出来的结果和真实的结果对比,得分高证明预测的准确。 print('模型得分:',score) #打印出模型的分 #模型得分: 0.9736842105263158 x_new = np.array([[5,2.9,1,0.2]]) #给一组新的鸢尾花特征 pre= knn_model.predict(x_new)#预测最可能的花的种类 print('最可能的花的种类:{}'.format(iris_data['target_names'][pre])) #最可能的花的种类:['setosa']
可以看出模型准确率是97%,已经想对来讲很高了,以后遇到一个鸢尾花,可以直接输入花的四个特征大小,模型就能预测出来一个最有可能的花的类型,看代码中,四个特征的依次数据[5,2.9,1,0.2],最可能的花种类是[‘setosa’]。
再解释一下什么是过拟合和欠拟合:模型训练过程打分和模型测试过程打分都可以用模型里面的score()来计算,即: train_score=model.score(X_train,y_train)
test_score=model.score(X_test,y_test),如果train_score分数大,test_score分数小就是过拟合,两者的分数都小就是欠拟合,因此模型选择的时候一定要保证两者分数都合理的那个模型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。