机器学习给人的感觉就是非常的高大上,因为机器学习的一些名词总是让人云里雾里,今天我们主要来通俗易懂的讲一下机器学习的概念。
1 数据
数据大家应该都明白,举个栗子!
我们在以往写程序的时候,经常用到数据库
,那么数据库中存的一行数据
,其实又叫做一条数据
而每条数据都包含很多属性
。那么属性又跟机器学习有什么关系呢?
2 特征
每条数据的属性
,在机器学习中就叫做特征
,特征又分为离散型
、连续型
2.1 离散型
如果你高中数学有认真听,应该听说过这么两个词连续
和不连续
,而在大学有一们课叫离散数学
,下面我们简单举几个栗子来说明离散型
特征!
首先我们定义了一个Bird
类,类中有几个属性,分别是体重
、长度
、脚蹼
、颜色
、种类
其实这几个属性
又叫做特征
- 颜色属于
枚举型特征
- 体重和长度属于
数值型特征
- 脚蹼属于
布尔型特征
,又叫做二值型特征
- 种类被我们称为
目标变量
public class Bird{
private Double weight;
private Double length;
private Boolean fins;
private ColorEnum color;
private TypeEnum type;
}
下面就是我们的离散型
数据
体重 | 长度 | 脚蹼 | 颜色 | 种类 |
---|---|---|---|---|
1000.1 | 125.0 | 0 | 棕色 | 红尾鸟 |
3000.7 | 200.0 | 0 | 灰色 | 鹭鹰 |
3300.0 | 220.3 | 0 | 灰色 | 鹭鹰 |
4100.0 | 136.0 | 1 | 黑色 | 普通潜鸟 |
3.0 | 11.0 | 0 | 绿色 | 瑰丽蜂鸟 |
2.2 连续型
连续型数据一般都是区间型
的数据,比如:
今天杭州市的天气是19~28
摄氏度
水结冰的温度是-4~负无穷
摄氏度
3 维度
这个词真的是故弄玄虚的
本质上就是特征
的个数
我们用上面的Bird
进行说明,这个类包含4个特征,那么它的数据的维度
就是4
比如我们将数据离散后变成下面这个矩阵
,那么矩阵中每条向量
的维度
就是4
[
[ 1000.1 , 125.0 , 0 , 0 ],
[ 3000.7 , 200.0 , 0 , 1 ],
[ 3300.0 , 220.3 , 0 , 2 ],
[ 4100.0 , 136.0 , 1 , 3 ],
[ 3.0 , 11.0 , 0 , 4 ],
]
4 目标变量
目标变量
就是机器学习算法预测的结果,简单的理解,就是y=x+1
中的y
- 在
分类算法
中目标变量通常是标称型数据
- 在
回归算法
中目标变量通常是连续型数据
一般在我们的训练数据集
中,目标变量是必须要确定的值,不然的话,你怎么确定特征
和目标变量
的关系呢
5 训练
训练,全称叫做算法训练
为算法输入大量的已分类(又叫做标注数据)的数据,来产生一个算法模型
这里的数据叫做训练集
,训练集是用于训练机器学习算法的数据样本集合
下面我们举例说明:
假如我们对一个训练算法,输入数据,然后算法产出了f(x)=x/2
那么这个f(x)其实就是我们的算法模型
我们可以想象一下公式推导,我们通过一些数据和一个公式来推导出另外一个公式,这个过程其实就是算法训练
D:数据 F(x):训练算法 G(x):模型算法
F(D) => G(x)
6 数据集
6.1 训练数据集(训练样本集)
顾名思义,训练数据集
就是用来训练算法模型的数据集,也就是训练算法的输入数据
6.2 测试数据集(测试样本集)
测试样本集
就是在我们训练完算法模型后,对算法模型
进行测试所要使用的输入数据
这里有两点要注意:
- 测试数据集要包含
目标变量
,用以判断算法模型
的实际精确度
- 测试数据集用以训练模型,如果参与训练过程,那将导致算法模型的正确率存在偏差
7 归一化
归一化全称叫做数值归一化
为什么要对数据进行归一化
呢?,让我们看看下方的数据。
飞行里程数据
和其他两项数据的差异实在太大了,在我们进行欧式距离
等公式计算的时候,因为差值太大了,所以会造成数据偏重,所以我们要消除这个偏重,将所有特征都转化到0 ~ 1
的区间之内
飞行里程 | 吃冰淇淋数 | 网游戏时间 |
---|---|---|
40920 | 8.326976 | 0.953952 |
14488 | 7.153469 | 1.673904 |
26052 | 1.441871 | 0.805124 |
… | … | … |
min:0.0,max:91273.0 | min:0.0,max:20.919349 | min:0.001156,max:1.695517 |
下面提供一个较为简单的归一化公式:
new_value=(old_value-min)/(max-min)
old_value:原来的值
min:在数据集中该特征最小的值
max:在数据集中该特征最大的值
转化后的数据:
飞行里程 | 吃冰淇淋数 | 网游戏时间 |
---|---|---|
0.44832535 | 0.39805139 | 0.56233353 |
0.15873259 | 0.34195467 | 0.98724416 |
0.28542943 | 0.06892523 | 0.47449629 |
8 监督学习
监督学习其实就是指我们对算法所输入的数据是经过标注
的。
监督学习的算法必须要知道要预测什么,也就是必须要知道特征
和目标变量
的关系
8.1 分类
分类:其实是把数据分配到已有的几个类别
机器学习的主要任务就是分类
下面我们举例说明:
我们可以通过数据+算法训练出一个分类器
(又叫做模型),然后通过分类器来对新的数据进行分类
香蕉 橙子 刀叉 芬达
| | | |
水果 水果 餐具 饮料
8.2 回归
回归
主要应用于预测一些数值型的数据,比如数据拟合曲线
:通过给定数据点的最优拟合曲线
8.3 常用的监督学习算法
分类 | 回归 |
---|---|
k-近邻算法 | 线性回归 |
朴素贝叶斯算法 | 局部加权线性回归 |
支持向量机 | Ridge回归 |
决策树 | Lasso最小回归系数估计 |
9 无监督学习
在无监督学习中,数据是只有特征
,没有目标变量
的,通过计算来猜出几个结果来
无监督学习的好处是可以减少数据特征的维度,以便我们用二维和三维的图像进行展示数据
9.1 聚类
什么叫聚类呢?顾名思义。
聚类:其实就是把没有分类的一组数据中相似的聚集成几个堆,这个堆也叫簇
专业的讲,就是将数据集合分成由类似的对象组成的多个类的过程
这里的苹果
,橘子
,筷子
,勺子
,可乐
,雪碧
都是没有分类的数据,我们通过他们的一些特征计算出水果
、餐具
、饮料
这三个类
苹果 橘子 勺子 筷子 可乐 雪碧
\ / \ / \ /
水果 餐具 饮料
9.2 密度估计
寻找描述数据统计值的过程
9.3 常用的无监督学习算法
聚类 | 密度估计 |
---|---|
k-均值 | 最大期望算法 |
DBSCAN | Parzen窗设计 |
10 在使用机器学习时的问题
10.1 如何选择合适的机器学习算法
首先我们要明确,我们选择算法只能在一定程度上缩小算法的选择范围,一般并不存在最好的算法和给出最好结果的算法
在我们选择算法的时候,首先要考虑两个问题
- 我们的目的是什么,想要算法完成什么任务
- 我们需要分析的数据是什么,我们得到的数据又是什么
如果你想要预测目标变量
,那么你可以选择监督学习
。
如果你的目标变量
的数据类型是离散型
,那么你可以选择分类算法
,如果是连续型
,可以选择回归算法
如果你不想预测目标变量
,可以选择无监督学习
。
如果需要将数据划分成组,可以选择聚类算法
,如果要估计每个分组的相似程度,可以选择密度估计算法
10.2 了解数据
- 特征值是
离散型
还是连续型
- 特征值中是否存在缺失的值,什么原因导致的缺失值,
- 数据中是否存在异常值
- 某个特征的频率如何,是否相当稀疏
11 机器学习开发的步骤
- 收集数据:爬虫爬数据,硬件设备获取数据,下载公开数据等
- 准备输入数据:确保数据的格式,是否格式不统一,是否需要离散化等
- 分析数据:查看数据中是否有空值,是否存在其他异常值,可以通过图表展示来观察数据
- 训练算法:选择合适的算法,并对我们的训练数据进行训练,如果是无监督学习则不需要训练
- 测试算法:对我们的模型或算法进行测试,来看看是否满意算法的输出结果
- 使用算法:将模型或算法进行工程化,用以执行实际的任务
12 推荐的语言和库
机器学习领域,推荐python
,因为它有一些强大库,并且语言简单,可以让你更加专注机器学习的开发
常用的库
- numpy: 实现了常用的向量和矩阵的操作,并且增加了可读性,并且底层提高了计算性能
- matplotlib: 常用的绘图工具,可以绘制2d、3d 的图形
13 numpy常用操作
13.1 构建随机数据
构建一个4*4的数组
import numpy
numpy.random.ramd(4,4)
13.2 数组转化矩阵
将4*4的随机数组转化为矩阵
import numpy
random_array=numpy.random.ramd(4,4)
random_matrix=numpy.mat(random_array)
13.3 矩阵求逆
import numpy
random_matrix=numpy.mat(numpy.random.ramd(4,4))
random_matrix.I
13.4 矩阵相乘
import numpy
random_matrix=numpy.mat(numpy.random.ramd(4,4))
result=random_matrix*random_matrix.I
13.5 创建矩阵
import numpy
matrix=numpy.eye(4)