机器学习算法对比
本文中对几种常见的机器学习算法进行了总结,主要是监督学习和非监督学习的算法对比:
- KNN
- 聚类和降维
- 决策树和随机森林
K近邻-KNN(有监督)
算法思想
物以类聚,给定一个训练数据集,对于新输入的实例,在训练集数据中找出和该实例最邻近的k个实例,算法的具体步骤为:
- 算距离:给定测试对象,计算它与训练集中的每个对象的距离。距离的选择参考下面的内容
- 找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻。体现物以类聚,人以群分的思想
- 做分类:根据这k个近邻归属的主要类别,来对测试对象分类。将测试对象归属于判别类型多的那个类
- 投票决定:少数服从多数,近邻中哪个类别的点最多就分为该类。
- 加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)
距离选择
KNN算法中距离的选择分为以下几种:
- 明可夫斯基距离
- 欧式距离p=2
- 曼哈顿距离p=1
- 切比雪夫距离,p趋于无穷
K值问题
k值一般是tonggu来确定的;经验规则来说,一般k是低于训练样本数的平方根
k值太小:容易受到噪声点的影响
- 用较小的邻域中的实例进行预测
- 近似误差减小,估计误差增大
- 预测结果对近邻的实例点非常敏感;如果近邻点恰好是噪声,预测出错
k值太大:分类太多,太细,导致包含太多其他类别的点
- 用较大的邻域中的实例点进行预测
- 减少学习的估计误差,但是近似误差增大
- 与输入实例较远的点的训练实例也会起预测作用
- k值增大意味着整个模型变得简单
聚类-KMeans(无监督)
聚类和降维是无监督学习方法,在无监督学习中数据是没有标签的。
度量方法
相关系数的绝对值越接近1,样本越相似;越接近0,越不相似
夹角余弦cosine
越接近1表示越相似,接近0表示越不相似
用距离度量:距离越小,越靠近越相似;用相关系数:相关系数越大越相似
算法步骤
算法接受一个未标记的数据集,然后将数据聚类成不同的组。 假设将数据分成n个组,方法为:
- 随机选择K个点,称之为“聚类中心”
- 对于数据集中的每个数据,按照距离K个中心点的距离,将其和距离最近的中心点关联起来,与同个中心点关联的所有点聚成一类。
- 计算上面步骤中形成的类的平均值,将该组所关联的中心点移动到平均值的位置
- 重复上面两个步骤,直到中心点不再变化。
图解K-means
有监督和无监督的区别
有监督学习的思想
- 通过已有的训练样本去训练得到一个最优模型
- 再利用这个模型将所有的输入映射为相应的输出
- 对输出进行简单的判断从而实现预测和分类的目的,也就具有了对未知数据进行预测和分类的能力
有监督分为回归
(预测房价,得到一个数值和分类
(是否发信用卡、是否生病等)两种
监督学习算法
- K近邻-KNN
- 决策树
- 朴素贝叶斯算法
- 逻辑回归
无监督学习的思想
事先没有任何训练样本,而需要直接对数据进行建模。比如参加一个画展,我们对艺术一无所知,但是参加完画展也能够将部分不同的流派。
- 算法主要是分类:聚类的目的是将相似的东西放在一起,通过计算样本间和群体间距离得到
- 主要算法包含:K-Means、层次聚类等
无监督学习算法
- 聚类:K-Means
- 降维:PCA
主成分分析-PCA
PCA是常用的数据分析方法,属于无监督学习的方法
PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维
PCA
中就是使用样本方差作为信息衡量的指标。样本方差越大,可解释型越强,特征所带的信息越多,常用的方法是:
- 特征值分解
- 奇异值分解
算法具体步骤:
决策树DT
决策树学习的本质上是从训练数据集上归纳出一组分类规则,通过训练数据集估计条件概率模型。
决策树学习的损失函数通常是正则化的极大似然函数。
决策树基本算法
- 决策树的生成是一个递归过程
- 重点是第8行:最优属性的选择;分支节点所包含的样本尽可能的是属于一个类别,节点的“纯度”要高
3种算法
信息熵越小,数据集的纯度越大
- ID3:基于
信息增益
来选择,偏向于取值较多的属性进行分割 - C4.5:基于
信息增益率
来选择,对数目较少的属性有所偏好 - CART:基于
基尼系数
来选择,采用的是二元切分法;基尼系数越小越好,数据的纯度越高
决策树算法 | 算法描述 |
---|---|
ID3 | 在各级节点上,使用信息增益作为属性的选择标准 只适用于离散的描述属性 依赖于选择特征数目较多的属性特征 单变量决策树,特征之间的关系不会考虑 |
C4.5 | 使用的是信息增益率作为属性的选择标准 可以同时处理离散和连续的属性描述 |
CART | 使用的是基尼系数作为属性的选择标准 非参数的分类和回归算法 构建的一定是二叉树 终节点是连续变量,属于回归树 终节点是离散变量,属于分类树 |
随机森林RF
思想
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。
它通过自助法(bootstrap)重采样技术,从原始训练样本集N中有放回地重复随机抽取n个样本生成新的训练样本集合训练决策树,然后按以上步骤生成m棵决策树组成随机森林,新数据的分类结果按分类树投票多少形成的分数而定。
其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于独立抽取的样本。
随机森林的大致过程
- 从样本集中有放回的随机采样选出n个样本
- 从所有特征中随机选择出k个特征,对选择出的样本利用这k个特征建立决策树(一般是使用CART)
- 重复上面的两个步骤m次,便可以生成m颗树,形成一个随机森林
树的生成规则
- 如果训练集大小为N,对于每棵树而言,
随机且有放回地
从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集
代码语言:javascript复制
如果不进行随机抽样
,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样单颗树是相同的,没有意义:树完全相同,没有意义
如果不是有放回的抽样
,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的",也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的。树之间没有任何交集,不能求同存异,也没有任何意义
# 基于pandas和skl实现随机森林
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Factor(iris.target, iris.target_names)
df.head()
train, test = df[df['is_train']==True], df[df['is_train']==False]
features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)
preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])