机器学习——随机森林和极限森林
随机森林
在机器学习中,随机森林是一个包含多个决策树的分类器,其中每个决策树之间互不关联,其输出的类别是由个别树输出的类别的众数而定。
算法步骤:
对于N个训练样例,有M个特征,对于每一个决策树来说,都选取m个特征数目,其远远小于M,用来确定每一个决策树上一个节点的决策结果,从训练样例上有放回抽样,形成一个多决策树的训练集,对于每一个决策树都计算出其最佳的分裂方式,最终合并成一个结果。
优点:
1. 可以用来解决分类和回归问题:随机森林可以同时处理分类和数值特征。
2. 抗过拟合能力:通过平均决策树,降低过拟合的风险性。
3. 只有在半数以上的基分类器出现差错时才会做出错误的预测:随机森林非常稳定,即使数据集中出现了一个新的数据点,整个算法也不会受到过多影响,它只会影响到一颗决策树,很难对所有决策树产生影响。
4. 能够处理很高维度的数据,并且不用做特征选择(特征列采样)
5. 对于不平衡的分类资料集来说,它可以平衡误差
缺点:
1. 比决策树算法更复杂,计算成本更高。
2. 由于其本身的复杂性,它们比其他类似的算法需要更多的时间来训练。
极限森林
极限森林和随机森林类似,但是在每一个决策树的采样上不同,RF是随机采取训练样例的部分数据,而极限森林中每一个决策树都采用原始训练集;同时,RF在每一个决策树上,都会选取最优特征值划分点,而极限森林会随机选取一个特征值来进行划分。
决策树&随机森林&极限森林 代码对比:
import sklearn.datasets as dt from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier,ExtraTreesClassifier #随机森林 极限森林 from sklearn.model_selection import train_test_split,cross_val_score import time import re if __name__ == '__main__': datas=dt.load_iris(return_X_y=True) train,test=datas[0],datas[1] # print(train) # print(test) print() x_data,x_test,y_target,y_real=train_test_split(train,test,test_size=0.2,random_state=1024) #random_state 随机种子 #print(x_data) #print(y_target) #决策树 t1 = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0]) dtc=DecisionTreeClassifier(criterion='entropy') print(cross_val_score(dtc,x_data,y_target,cv=10).mean()) t_dtc = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])-float(t1) print(t_dtc) print('----------------') #随机森林 t2 = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0]) rfc=RandomForestClassifier(n_estimators=128,criterion='entropy') print(cross_val_score(rfc,x_data,y_target,cv=10).mean()) t_rfc = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])-float(t2) print(t_rfc) print('----------------') #极限森林 t3 = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0]) etc=ExtraTreesClassifier(n_estimators=128,criterion='entropy') print(cross_val_score(etc,x_data,y_target,cv=10).mean()) t_etc = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])-float(t3) print(t_etc) #结果如下: 0.925 12.0 ---------------- 0.95 1571.0 ---------------- 0.95 1074.0
可以看出随机森林和极限森林的精确度高于决策树,但是其计算消耗时间是远远大于决策树的。