一、Ensemble learning

集成学习通过构建并结合多个学习器来完成学习任务,有时候也被称为多分类系统。

集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。

随机森林 怎样实现 多分类 随机森林多分类问题_分类

两种集成学习的算法:

随机森林 怎样实现 多分类 随机森林多分类问题_随机森林_02

•Boosting:每个模型相互独立,相互平行。然后对其预测结果进行平均或者多数表决的原则来决定集成评估器的结果

•Bagging:模型循序渐进,依次增强。基评估器是相关的,是按顺序一一构建的,其核心思想是结合弱评估器的力量一次次对难以评估的样本进行预测,从而构成一个强评估器。

二、Bootstrap Sampling

在现实任务中,个体学习器是为解决同一个问题训练出来的,它们之间是不可能完全独立的,虽然“独立”在现实任务中无法做到,但可以设法使基学习器尽可能的具有较大的差异,由此我们引入了自助采样法(Bootstrap sampling)

随机森林 怎样实现 多分类 随机森林多分类问题_机器学习_03

  1. 在原有的样本中通过重抽样抽取一定数量(比如100)的新样本,重抽样(Re-sample)的意思就是有放回的抽取,即一个数据有可以被重复抽取超过一次。
  2. 基于产生的新样本,计算我们需要估计的统计量。
  3. 重复上述步骤n次(一般是n>1000次)

三、决策树

决策树算法相比于K-means等分类算法,优点在于能够理解数据中所蕴涵的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列的规则,这些机器根据数据集创建规则的过程,就是机器学习的过程。
决策树主要功能是从一张有特征和标签的表格中,通过对特定特征进行提问,为我们总结出一系列决策规则,并用树状图来呈现这些决策规则。

随机森林 怎样实现 多分类 随机森林多分类问题_机器学习_04

决策树的构建

信息增益

划分数据集最大的原则:将无序的数据变得更加有序

在划分数据集前后信息发生的变化成为信息增益(information gain),知道如何计算信息增益,我们就可以计算每一个特征划分数据集后获得的信息增益,获得信息增益最高的特征是最好的选择。

随机森林 怎样实现 多分类 随机森林多分类问题_机器学习_05

随机森林 怎样实现 多分类 随机森林多分类问题_机器学习_06

四、随机森林

“随机”:1、 训练数据的随机选取 2、 待选特征的随机选取

随机森林 怎样实现 多分类 随机森林多分类问题_数据集_07

举例说明:对于一个测试数据,将它投入到我们用于分类的随机森林中,每棵树对其会产生不同的测试结果,最后依据少数服从多数的原则选择最终测试结果。

优点:

  • 由于采用了集成算法,本身精度比大多数单个算法要好,所以准确性高
  • 在测试集上表现良好,由于两个随机性的引入,使得随机森林不容易陷入过拟合(样本随机,特征随机)
  • 由于两个随机性的引入,使得随机森林具有一定的抗噪声能力,对比其他算法具有一定优势

缺点:

  • 当随机森林中的决策树个数很多时,训练时需要的空间和时间会比较大
  • 随机森林中还有许多不好解释的地方,有点算是黑盒模型
  • 在某些噪音比较大的样本集上,RF的模型容易陷入过拟合

五、随机森林的实例

from sklearn.datasets import load_iris
#iris 是鸢尾花数据集,包含 150 行数据,
# 分为 3 类:山鸢尾(Setosa)、杂色鸢尾(Versicolour)、维吉尼亚鸢尾(Virginica),
# 每类 50 行数据,每行数据包含 4 个属性:
# 花萼长度(sepal length)、
# 花萼宽度(sepal width)、
# 花瓣长度(petal length)、
# 花瓣宽度(petal width),
# 可通过这 4 个属性来预测鸢尾花属于 3 个种类中的哪一类。
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np

iris = load_iris()

#print(iris.data)   #150*4数组
#print(iris.target) #每个花得类别
#print(iris.target_names) #3花类别种类
#print(iris.feature_names) #特征名称
#print(iris.DESCR) #备注说明

#设置Dataframe打印最大宽度和行数
#pd.set_option('display.width',None)
#pd.set_option('display.max_rows',None)


df = pd.DataFrame(iris.data, columns=iris.feature_names)

df['is_train'] = np.random.uniform( low = 0 , high = 1, size = len(df)) <= .75

df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)


#print(df.head(10))

#3/4作为训练集,1/4作为测试集
train, test = df[df['is_train']==True], df[df['is_train']==False]

features = df.columns[:4]

clf = RandomForestClassifier()

y, _ = pd.factorize(train['species'])

#train[features]训练数据特征,y分类结果,有监督学习
clf.fit(train[features], y)
clf.predict(test[features])

predicts = iris.target_names[clf.predict(test[features])]

#crosstab交叉表
print(pd.crosstab(test['species'], predicts, rownames=['actual'], colnames=['predicts']))