首先明确一下回归与分类的区别:
分类和回归的区别在于输出变量的类型。
定量输出称为回归,或者说是连续变量预测;
定性输出称为分类,或者说是离散变量预测。
举个例子:
预测明天的气温是多少度,这是一个回归任务;
预测明天是阴、晴还是雨,就是一个分类任务;
决策树三种算法特性对比:
ID3特点:
(1)节点优先选取采用信息增益作为标准。
(2)容易造成过度拟合(倾向于选择分类多的节点)
(3)容易处理标称型数据(主要用于分类),但是很难处理连续型 数据(主要用于回归)。
4.5特点:
(1)既能处理标称型数据,又能连续型数据。为了处理连续型数据,该算法在相应的节点使用一个属性的阈值,利用阈值将样本划分成两部分。
(2)能处理缺失了一些属性的数据。该算法允许属性值缺失时被标记为?,属性值缺失的样本在计算熵增益时被忽略。
(3)构造完成后可以剪枝。合并相邻的无法产生大量信息增益的叶节点,消除过渡匹配问题。
Cart特点:
(1)CART称为分类决策树,classification and regression tree,既能处理分类问题,又能处理回归问题。
(2)与ID3不能直接处理连续型特征不同的是,CART使用二元切分,即使用一个属性阈值对样本数据进行划分。划分的标准除了使用熵增益外,还有基尼纯净度(Gini impurity)和方差缩减(variance reduction)(用于回归)。
集成学习(Boosting,Bagging和随机森林)
集成学习分为2类:
(1)个体学习器间存在强大依赖关系、必须串行生成的序列化方法,代表算法:Boosting;
(2)个体学习器间不存在依赖关系、可同时生成的并行化方法,代表算法Bagging和“随机森林”RF。
1.Boosting是一族可以将若学习器提升为强学习器的算法,代表算法为AdaBoost。
该算法的工作机制:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器。如此反复进行,直至学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
2.Bagging是并行式集成学习代表方法。
基于“自助采样法”(bootstrap sampling)。自助采样法机制:给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下一次采样时该样本还会被采到。这样,经过m次样本采集,我们得到包含m个样本的采样集。采样集中,有的样本出现过很多次,有的没有出现过。Bagging机制:我们采样出T个含m个样本的采样集。然后基于每个采样集训练出一个学习器,再将学习器进行结合。对分类任务使用投票法,对回归任务采用平均值法。
3.随机森林RF:
以决策树为基学习器构建Bagging集成,进一步在决策树的训练过程中引入随机属性选择。传统决策树在选择划分属性的时候是在当前节点所有的属性集合中选出一个左右属性进行划分;而在RF中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度。如果k=d(全部属性集),则基决策树的构建=传统决策树构建。如果k=1,基决策树每个节点随机选择一个属性进行划分。一般推荐k=log2d。
4.AdaBoost VS Bagging:AdaBoost只适用于二分类任务,Bagging适用于多分类、回归等任务。
5.Bagging VS 随机森林:Bagging中基学习器的“多样性”通过样本扰动(对初始训练集采样)而获得;随机森林中基学习器的“多样性”不仅来自于样本扰动,而且还可以通过随机属性扰动来获得。这使得随机森立的泛化性能可通过个体学习器之间差异程度的增加而进一步提升。随机森林的使其性能很差,但随着学习器的增加,性能很快就会变好,且强于Bagging。
回归树:
回归树的算法:
1. 回归树的生成:基于训练数据集生成决策树,尽量大点。
2. 回归树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
回归是为了处理预测值是连续分布的情景,其返回值应该是一个具体预测值。回归树的叶子是一个个具体的值,从预测值连续这个意义上严格来说,回归树不能称之为“回归算法”。因为回归树返回的是“一团”数据的均值,而不是具体的、连续的预测值(即训练数据的标签值虽然是连续的,但回归树的预测值却只能是离散的).
随机森林概念:
森林的一个通俗解释就是:由一组决策树构建的复合分类器,它的特点是每个决策树在样本域里使用随机的特征属性进行分类划分。最后分类时投票每棵分类树的结论取最高票为最终分类结论。
随机森林预测代码:
import numpy as np
from numpy import *
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score, ShuffleSplit
import pandas as pd
origin_data = pd.read_excel(r"C:\Users\***\Desktop\31天测试数据.xlsx")
data_frame=origin_data
rf=RandomForestRegressor()
rf.fit(data_frame.ix[0:49,0:29],data_frame.ix[:,29:30])
res=rf.predict(data_frame.ix[:,1:30])
#计算平均误差构造矩阵
minus=array(res)-array(origin_data[[30]])
mape=mean(abs(minus))/mean(array(origin_data[[30]]))
#作图图
plt1=plt.plot(range(0,48),res,'r',label='predict data mape={0:0.2f}%'.format(mape*100))
plt2=plt.plot(range(0,48),origin_data[[30]],'b',label='real data')
plt.xlabel("dimension(total 48 dimensions)")
plt.ylabel("value")
plt.legend(loc="lower right")
plt.show()