集成方法 - ZhouXuyan/notes GitHub Wiki
集成方法: ensemble method(元算法: meta algorithm) 概述
概念:是对其他算法进行组合的一种形式。
通俗来说: 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。 机器学习处理问题时又何尝不是如此? 这就是集成方法背后的思想。
集成方法:
投票选举(bagging: 自举汇聚法 bootstrap aggregating): 是基于数据随机重抽样分类器构造的方法 再学习(boosting): 是基于所有分类器的加权求和的方法
集成方法 场景
目前 bagging 方法最流行的版本是: 随机森林(random forest) 选男友:美女选择择偶对象的时候,会问几个闺蜜的建议,最后选择一个综合得分最高的一个作为男朋友
目前 boosting 方法最流行的版本是: AdaBoost 追女友:3个帅哥追同一个美女,第1个帅哥失败->(传授经验:姓名、家庭情况) 第2个帅哥失败->(传授经验:兴趣爱好、性格特点) 第3个帅哥成功
bagging 和 boosting 区别是什么?
bagging 是一种与 boosting 很类似的技术, 所使用的多个分类器的类型(数据量和特征量)都是一致的。 bagging 是由不同的分类器(1.数据随机化 2.特征随机化)经过训练,综合得出的出现最多分类结果;boosting 是通过调整已有分类器错分的那些数据来获得新的分类器,得出目前最优的结果。 bagging 中的分类器权重是相等的;而 boosting 中的分类器加权求和,所以权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。
随机森林
随机森林 概述
随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。 决策树相当于一个大师,通过自己在数据集中学到的知识用于新数据的分类。但是俗话说得好,一个诸葛亮,玩不过三个臭皮匠。随机森林就是希望构建多个臭皮匠,希望最终的分类效果能够超过单个大师的一种算法。
随机森林 原理
那随机森林具体如何构建呢? 有两个方面:
数据的随机性化 待选特征的随机化 使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。
数据的随机化:使得随机森林中的决策树更普遍化一点,适合更多的场景。
(有放回的准确率在:70% 以上, 无放回的准确率在:60% 以上)
采取有放回的抽样方式 构造子数据集,保证不同子集之间的数量级一样(不同子集/同一子集 之间的元素可以重复) 利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。 然后统计子决策树的投票结果,得到最终的分类 就是 随机森林的输出结果。 如下图,假设随机森林中有3棵子决策树,2棵子树的分类结果是A类,1棵子树的分类结果是B类,那么随机森林的分类结果就是A类。 数据重抽样
待选特征的随机化
子树从所有的待选特征中随机选取一定的特征。 在选取的特征中选取最优的特征。
随机森林 开发流程
收集数据:任何方法
准备数据:转换样本集
分析数据:任何方法
训练算法:通过数据随机化和特征随机化,进行多实例的分类评估
测试算法:计算错误率
使用算法:输入样本数据,然后运行 随机森林 算法判断输入数据分类属于哪个分类,最后对计算出的分类执行后续处理
随机森林 算法特点
优点:几乎不需要输入准备、可实现隐式特征选择、训练速度非常快、其他模型很难超越、很难建立一个糟糕的随机森林模型、大量优秀、免费以及开源的实现。
缺点:劣势在于模型大小、是个很难去解释的黑盒子。
适用数据范围:数值型和标称型
代码实现
调用sklearn接口:
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.Categorical.from_codes(iris.target, iris.target_names)
#调用鸢尾花数据,处理成标准形式
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'])