决策树
顾名思义,决策树是基于树结构来进行决策的,在网上看到一个例子十分有趣,放在这里正好合适。现想象一位捉急的母亲想要给自己的女娃介绍一个男朋友,于是有了下面的对话:
这个女孩的挑剔过程就是一个典型的决策树,即相当于通过年龄、长相、收入和是否公务员将男童鞋分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么使用下图就能很好地表示女孩的决策逻辑(即一颗决策树)。
熵定义为信息的期望值,公式为
简单的理解就是:
分类数目,熵越大,随机变量的不确定性就越大。
ID3算法 / 信息熵
C4.5算法 / 增益率
CART算法 / 基尼指数
随机森林(Random Forests)
随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类、回归等问题。
随机森林有许多优点:
- 具有极高的准确率
- 随机性的引入,使得随机森林不容易过拟合
- 随机性的引入,使得随机森林有很好的抗噪声能力
- 能处理很高维度的数据,并且不用做特征选择
- 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
- 训练速度快,可以得到变量重要性排序
- 容易实现并行化
随机森林的缺点:
- 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
- 随机森林模型还有许多不好解释的地方,有点算个黑盒模型
极限森林
在随机森林的基础上进行升级。不寻找最有区别的阈值,而是为每个候选特征随机绘制阈值,并且这些随机生成的阈值中的最佳阈值作为划分规则。
极限森林 :1、样本抽样随机 2、每棵树分裂条件随机(不是最好的裂分条件)
决策树,进行分裂的时候,根据信息增益最大进行裂分,刻板
交叉验证:
数据简单,普通算法和复杂算法效果一样。数据预处理非常重要。
如何提升准确率:数据的质量,数据的预处理,算法的提升,参数的调整。
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
if __name__ == '__main__':
#导入鸢尾花数据
datas=dt.load_iris(True)
#训练数据和测试数据
train,test=datas[0],datas[1]
# 8成训练数据 x_data
# 2成测试数据 x_test
# 8成训练结果 y_target
# 2成真实数据 y_real
x_data,x_test,y_target,y_real=train_test_split(train,test,test_size=0.2,random_state=1024)
#三种方式
#决策树
dtc=DecisionTreeClassifier(criterion='entropy')
print("决策树:"+str(cross_val_score(dtc,x_data,y_target,cv=10).mean()))
#随机森林 只有一颗树 按照熵算出best的树,128份数据进行训练取平均值
rfc=RandomForestClassifier(n_estimators=128,criterion='entropy')
print("随机森林:" + str(cross_val_score(rfc, x_data, y_target, cv=10).mean()))
#极限森林 真正有128颗不同的树,熵不确定时随机构建树
etc=ExtraTreesClassifier(n_estimators=128,criterion='entropy')
print("极限森林:" + str(cross_val_score(etc, x_data, y_target, cv=10).mean()))
结果
决策树:0.925
随机森林:0.95
极限森林:0.95
可以看到随机森林和极限森林预测正确率差不多,他们都在本次测试中由于决策树