前言
为了能让更多小伙伴,非常容易的学习机器学习,并且有一些Python 基础就能用机器学习来解决自己工作中的问题。
定下目标,每天翻译一些scikit-learn的官方文档。和找一些实际案例,进行通俗讲解,保证让大家把此项技术应用到工作当中。
scikit-learn:Python 中通用的机器学习函数库。通过github 社区统计使用人数为11万。实际人数肯定比这个高多。
机器学习中的数据类型可以粗暴划分为:X数据,y数据。
举例:
X数据-->(身高180、体重:80kg, 有喉结、短发) y数据--->(男性)
X数据-->(身高165、体重:60kg, 无喉结、长发) y数据--->(女性)
机器学习期初就是利用X数据得到Y 数据的一个功能而已。
基础的术语讲解(只解释Scikit-learn官方提到的术语):
拟合模型:
大家的工作会遇到y数据与x数据存在相关性,但无法知道y与x是哪种相关,需要具体知道两者关系,我们可以用拟合模型来完成这个事情。
拟合:
拟合就是把平面上一系列的有x数据和y 数据组合成的点,用一条光滑的曲线连接起来。
模型:
就是Python 中的函数,而在机器学习领域换了一个名字而已
预测:
根据拟合的模型,给出X数据,预测出Y值。
交叉验证:
当我们的数据量比较小, 为了验证处理数据函数的准确率,从而可以根据准确率选择更准确的函数。
把我们的数据分隔成训练集,测试集,用训练集做拟合模型。用测试集做预测,看看预测的准不准。
举个通俗点的例子: 一个互联网公司做软件都有由两个标配岗位(分为软件开发工程,软件测试工程师)
但是有些互联网公司成本有限,招不起测试工程师。这个时候怎么办呢。在开发阶段,也会使用交叉验证的原理。
小明、 小乐是软件开发工程师,就是小明开发完的代码让小乐检查,小乐的开发的代码让小明检查。
训练集:
用于训练模型的子集。
测试集:
用于测试训练后模型的子集。
有监督机器学习:
从给定的数据中得出一个函数(模型),当新的数据到来时,可以根据这个函数预测出这个X 对应的Y 是男还是女。
无监督机器学习:
在数据里没有Y数据的时候,把散乱的X数据中长得很像的数据自动的分为一类。(也叫聚类)
数据预处理:
就是先把表格里的异常数据,变成正常数据(这就叫做数据的预处理)。然后在统计计算。
异常情况如下
1、数据缺失 (就是你的Excel表格里,张三的生日因为入职的时候,因为你的疏忽没有录入到表里)
2、数据噪声 (数据值不和常理,张三的月工资为负5千)
3、数据不一致 (张三年龄18,但是他的出生年月日为:2020-05-23日)
4、数据冗余( 是数据量或者属性数目超出数据分析需要的情况) 需要进行删减
5、数据集不均衡 (例如:要统计男员工和女员工的平均体重。但是统计的数据中有100个男生,只有2个女生)
6、离群点/异常值 (其他人工资每月5千,张三每月工资50万)
7、数据重复(Duplicate)是在数据集中出现多次的数据
模型选择:
要从若干个机器学习函数中,选择准确率最好的函数。
估算器
Scikit-learn提供了数十种内置的机器学习算法和模型,称为估算器
入门例子
from sklearn.ensemble import RandomForestClassifier # RandomForestClassifier:随机森林函数 # random_state:保证程序每次运行都分割一样的训练集和测试集 clf = RandomForestClassifier(random_state=0) X = [[ 1, 2, 3], # 2 个样本数据, 3 个特征(字段) [11, 12, 13]] y = [0, 1] # 每个样本类别 clf.fit(X, y) # fit :拟合模型
决策树函数的通俗解释:
小明决定学Python编程,他便咨询它的好朋友‘小乐’如何学Python?
小乐根据自己的经验推荐了学习Python的方式:
你可以看我们录制的Python 自动发办公课程、在购买一本热门的书籍 'python菜鸟到高手'。
随机森林(Random Forest,简称RF)
之后小明不仅问了小乐,还问了小红,小亮,小玉 、小王。
他们都根据自己的经验都推荐了学习Python 的方式。最终小明选择了推荐次数最多的学习Python的方式。
随机数和随机数种子 :
例如:从1、2、3、4、5、6、7、8、9、0这十个数中随机取出一个数,取出的数是6的话,那么6就叫随机数。
十个数字就叫随机数种子。
通过random.seed(123),就能让每次产生同样的随机数
import random # 设置同样的seed 两次会打印出同样的随机数 random.seed(123) for i in range(10): print(random.randint(1,100)) random.seed(123) for i in range(10): print(random.randint(1,100))
拟合模型后,就可以直接用于预测新数据的目标值(y), 无需重新训练估算器:
clf.predict(X) # 预测训练数据的类别 # array([0, 1]) clf.predict([[4, 5, 6], [14, 15, 16]]) # 预测新数据的类别 # array([0, 1])
防止萌新不太理解我解释的,我们到网上又找了一个更加形象化的例子,一定要把该死的术语打下去:
一句话总结:通过算法 去 引导模型去训练数据,最终使得模型可用,该模型的训练数据的过程就是机器学习的过程。
一直以来总感觉手写体识别并不适合作为机器学习开篇的基础认知讲解。终究觉得它还不够那么的直观和形象的解释清楚机器学的过程和数据、算法以及模型之间
的关系。引出一个象形直白简单的例子教大家如何区分数据、算法、模型之间的关系。希望能够帮到初学者。
相比于一上来就去理解手写体汉字的识别程序和过程,我觉得还是有必要进行一些前期的导入学习更有利于对这个过程的理解和消化。
妈妈教孩子认字,那一个个的汉字就是数据,妈妈教孩子的过程就是训练的过程,妈妈用的方法就是算法,孩子最后就成了一个能够认识不同字的模型。
首先每个汉字有不同的形态,这些偏旁、部首就是汉字的特征,妈妈给孩子讲解每个汉字的这些特征,让孩子识记的过程就是一个训练的过程。
妈妈用的教育方法就是训练过程中使用到的算法,比如告诉孩子哪个汉字具体有哪些特征,什么样的特征是这个汉字,什么特征不是这个字,这就是监督学习过程,告诉孩子对错和判断的标准(主要的数据特征),并通过孩子的反馈不断地纠正孩子的错误来纠正孩子的认知,从而使得孩子能够不断的提高识字的准确程度(前向传播和反向纠错),这个算法也就是监督学习算法。
孩子经过妈妈的一番教导和不断地纠正错误(训练过程)最后终于有了自己相对稳定的判断(模型本身)可以识别不同的汉字了。
但是还有还时会不时认错字(误差),这就是训练过程不可避免的存在误差。
即便是人本身也不可能事事都能百分之百做对、做正确,金无足赤,人无完人,机器亦是如此。
从上边的过程可以看出,妈妈教孩子识字的过程就是一个机器学习的过程,繁多的汉字作为训练的原始数据集,孩子就是已经定义好的模型结构(这个没得选),妈妈的教育过程就是一个有监督的数据训练的过程,孩子的反馈和妈妈的纠正属于前向传播和反向传播的算法执行过程,最终孩子学会了识记各种汉字,直白点孩子此时本身就是一个识别汉字的模型。