本文中对几种常见的机器学习算法进行了总结,主要是监督学习和非监督学习的算法对比:
物以类聚,给定一个训练数据集,对于新输入的实例,在训练集数据中找出和该实例最邻近的k个实例,算法的具体步骤为:
KNN算法中距离的选择分为以下几种:
k值一般是tonggu来确定的;经验规则来说,一般k是低于训练样本数的平方根
k值太小:容易受到噪声点的影响
k值太大:分类太多,太细,导致包含太多其他类别的点
聚类和降维是无监督学习方法,在无监督学习中数据是没有标签的。
相关系数的绝对值越接近1,样本越相似;越接近0,越不相似
夹角余弦cosine
越接近1表示越相似,接近0表示越不相似
用距离度量:距离越小,越靠近越相似;用相关系数:相关系数越大越相似
算法接受一个未标记的数据集,然后将数据聚类成不同的组。 假设将数据分成n个组,方法为:
图解K-means
有监督分为回归
(预测房价,得到一个数值和分类
(是否发信用卡、是否生病等)两种
事先没有任何训练样本,而需要直接对数据进行建模。比如参加一个画展,我们对艺术一无所知,但是参加完画展也能够将部分不同的流派。
PCA是常用的数据分析方法,属于无监督学习的方法
PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维
PCA
中就是使用样本方差作为信息衡量的指标。样本方差越大,可解释型越强,特征所带的信息越多,常用的方法是:
算法具体步骤:
决策树学习的本质上是从训练数据集上归纳出一组分类规则,通过训练数据集估计条件概率模型。
决策树学习的损失函数通常是正则化的极大似然函数。
信息熵越小,数据集的纯度越大
信息增益
来选择,偏向于取值较多的属性进行分割信息增益率
来选择,对数目较少的属性有所偏好基尼系数
来选择,采用的是二元切分法;基尼系数越小越好,数据的纯度越高
决策树算法 | 算法描述 |
---|---|
ID3 | 在各级节点上,使用信息增益作为属性的选择标准 只适用于离散的描述属性 依赖于选择特征数目较多的属性特征 单变量决策树,特征之间的关系不会考虑 |
C4.5 | 使用的是信息增益率作为属性的选择标准 可以同时处理离散和连续的属性描述 |
CART | 使用的是基尼系数作为属性的选择标准 非参数的分类和回归算法 构建的一定是二叉树 终节点是连续变量,属于回归树 终节点是离散变量,属于分类树 |
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。
它通过自助法(bootstrap)重采样技术,从原始训练样本集N中有放回地重复随机抽取n个样本生成新的训练样本集合训练决策树,然后按以上步骤生成m棵决策树组成随机森林,新数据的分类结果按分类树投票多少形成的分数而定。
其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于独立抽取的样本。
随机且有放回地
从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集
如果不进行随机抽样
,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样单颗树是相同的,没有意义:树完全相同,没有意义
如果不是有放回的抽样
,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的",也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的。树之间没有任何交集,不能求同存异,也没有任何意义
# 基于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'])