决策树和随机森林

决策树:

ID3 (Iterative Dichotomiser 3): 基于信息增益(Info Gain),即为属性划分前后信息差(entropy 前-后),对应于python的参数"entropy",偏向取值较多的特征。

CART (Classification and Regression Tree):基于基尼系数(Gini),表示在样本集合中一个样本被份错的概率,基尼系数越小越好,其他的也是。CART是二叉树,对于连续特征,求出使得度量值最小的决策边界,然后第二层再细分同样使度量值最小,etc.....。

C4.5:基于信息增益率(Info Gain Ratio),即为惩罚参数*信息增益,偏向取值较少的特征。

决策树优点:非参数型,容易解释,很好地处理缺失特征,对特征空间的鲁棒性即大于小于阈值不管多少都没区别,数据规模影响不大,不相关的特征可以不被使用。

决策树缺点:无在线学习,趋向过拟合,易陷入局部最小。

 

样本少且特征很多时很容易过拟合,可以提前PCA或Lesso等一下。

推荐先将其可视化并限制树的深度(如3)以观察拟合效果。

 

参数:度量指标 criterion(默认gini,也有entropy)(回归时默认mse均方误差,也有mae平均绝对误差),

最大深度 max_depth (数据和特征很多的情况可以考虑设),

最大特征数 max_features (默认None考虑全部特征,log2 则考虑 log2 N个特征,sqrt或auto考虑根号N个特征),

特征划分点选择标准 splitter (默认best最优,大样本考虑random局部最优),

节点再划分所需最少样本数 min_samples_split (默认为2,大数据时考虑增大),

叶子节点所需最少样本数 min_samples_leaf (默认为1,大数据时考虑增大),

叶子节点所需最小权重和 min_weight_fraction_leaf (默认为0,小于这个值则会跟兄弟节点被剪枝),

最大叶子节点数 max_leaf_nodes (默认为None,特征很多时可以加以限制,具体值可以结合交叉验证来确定),

样本各类别的权重 class_weight (默认None,balanced 样本分布存在明显偏倚时自动计算),

节点划分最小不纯度 min_impurity_split (不纯度小于这个阈值则不再生成子节点,当只有一类样本时不纯度最低并为0),

数据是否预排序 presort (默认False,忽略就好)。

from sklearn.tree import DecisionTreeClassifier
#决策树
clf = DecisionTreeClassifier(criterion='gini', max_depth=None, max_leaf_nodes=None, )
clf.fit(train, trainclass)
pre = clf.predict(test)
print("Accuracy:", accuracy(pre,testclass))
print(cross_val_score(clf, data, label, cv=10))
RES_MEASURE(testclass, pre)
#决策树可视化,先下载graphviz并将其目录和bin目录加入path,再pip install graphviz & pydotplus
from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus
import os

# 导入路径
#os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

# 导入数据
iris = load_iris()
# 构建模型
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)

# 保存模型
with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)

# 画图,保存到pdf文件
# 设置图像参数
dot_data = tree.export_graphviz(clf, out_file=None,
                         feature_names=iris.feature_names,
                         class_names=iris.target_names,
                         filled=True, rounded=True,
                         special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
# 保存图像到pdf文件
graph.write_pdf("iris.pdf")

集成学习

用多种分类器同时对所有训练集训练生成模型,硬投票根据样本在哪一类别得票最多而判定其属于哪一类。

集成学习两大流派: Bagging和Boosting。Bagging思想是用有放回采样生成n组数据,每个数据用于训练生成一个弱分类器。

Boosting思想是采用重赋权法迭代的生成弱分类器,此时每此训练都到了所有训练集,并且每此根据分类结果会改变样本的权重。 CART树比较常用。

 

随机森林基于Bagging (Bootstrap Aggregating),是一种集成学习方法。机器学习包含集成学习,集成学习包含神经网络。

1. 随机森林基于决策树,首先对于包含m个数据的样本,通过有放回采样(bootstrap)即每次有放回地抽取一个样本,获得n组数据(通常也包括m个样本)。

2. 基于上面第i组样本和随机选择的特征子集(数量为总特征数量的平方根通常),用特征子集中最优特征用于决策树左右子树划分。

3. 集成所有生成的决策树进行决策。

注意:有放回采样会导致每轮约36.8%的数据未被采到,可以用这些袋外数据(Out of bag, OOB) 可以被用于检验模型的泛化能力。

 

参数:每轮随机抽取样本的数量,构建的模型数量(树的个数),

 

随机森林优点:可以并行化,效果好,泛化性强。

随机森林缺点:取值划分较多的特征容易产生较大的影响。
 

#随机森林 bagging
rf_clf = RandomForestClassifier(n_estimators=500, random_state=666, oob_score=True, n_jobs=-1)
rf_clf.fit(train,trainclass)
#返回模型对训练集的分类结果
print(rf_clf.oob_score_)
rf_clf.predict(test)
pre=rf_clf.predict(test)
#返回模型对测试集的分类结果
print("Accuracy:", accuracy(pre,testclass))
RES_MEASURE(testclass, pre)

Ada boosting 相比于 boosting,使用原始的训练集并不再随机采样, 每次根据分类结果对分类错误的结果赋予更高的权重,并训练下次的分类/回归模型,最后用迭代产生的n个模型通过投票来决定样本所属类别。

GBDT(Gradient Boosting Decision Tree,GBDT)将原始的所有训练集数据用于建模,所用树为回归树。每棵树学的是之前所有树的结论和残差,首先产生一个训练模型m1,计算出回归值的误差,将残差定为回归值用于训练第二次模型,etc...。最终将所有模型值累加得到最终回归值。回归和分类任务的区别仅在所用损失函数不同,回归可以logistic + softmax?

正则化方式:步长和迭代次数等。

 

xgboost

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值