本节将吴文达机器学习最后几章(15.1-17.6)进行了总结
1、决策树
决策树(decision tree): 是一种基本的分类与回归方法,其主要包括特征选择、决策树的生成、决策树的修剪。
重点是节点的选择以及树的深度
(一)节点的选择
熵的定义:
熵表示随机变量不确定性的度量,熵越大,随机变量的不确定性就越大。在决策树中熵越小分类的越纯净。
熵的公式:
信息增益:
信息增益 :表示特征X使得类Y的不确定性减少的程度。用于判断哪个信息作为节点。熵H(D)与条件熵H(D|A)之差成为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
ID3算法:
1)从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征。
2)由该特征的不同取值建立子节点,再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止;
3)最后得到一个决策树。
信息增益比: 特征A对训练数据集D的信息增益比定义为其信息增益与训练数据集的经验熵之比:
C4.5的算法:
选择信息增益比作为判断节点的指标。递归构建,等到遍历完所有数据集属性或者每个分支下的所有实例都具有相同的分类结束。
基尼指数:
CART算法
取Gini指数最小的属性作为决策树的根节点属性。
减枝
决策树算法很容易过拟合(overfitting),剪枝算法就是用来防止决策树过拟合,提高泛华性能的方法。
剪枝分为预剪枝与后剪枝。
分类结果:
分类任务是由所有叶子节点中数据的众数决定的,少数服从多数,加入某叶子节点中有10个“-”,2个“+”,则认定该叶子节点分类为“-”。
回归任务由方差决定。
2、one hot encoding
使用one hot encoding 获得每个特征,one-hot的本质是增加树的深度。
pandas进行特征提取(one hot encoding)
pd.get_dummies()
pandas.get_dummies(data, prefix=None, prefix_sep='_',
dummy_na=False, columns=None,
sparse=False, drop_first=False, dtype=None)
data : array-like, Series, or DataFrame
prefix : 给输出的列添加前缀
prefix_sep : 设置前缀跟分类的分隔符sepration,默认是下划线"_"
3、随机森林
随机森林的目的就是要通过大量的基础树模型找到最稳定可靠的结果,最终的预测结果由全部树模型共同决定。
采用二重随机,每次随机采用不同特征进行建树。
将所有的树模型组合在一起。在分类任务中,求众数就是最终的分类结果;在回归任务中,直接求平均值即可。
from sklearn.ensemble import RandomForestClassifier
features = ["Pclass", "Sex", "SibSp", "Parch"] #选择特征
X = pd.get_dummies(train_data[features]) #特征进行哑变量提取
X_test = pd.get_dummies(test_data[features])
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y) #训练模型
predictions = model.predict(X_test) #预测模型
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
# RandomForestClassifier参数:
# n_estimators:森林中决策树的数量。默认100
# criterion:分裂节点所用的标准,可选“gini”, “entropy”,默认“gini”。
# max_depth:树的最大深度。如果为None,则将节点展开,直到所有叶子都是纯净的(只有一个类),或者直到所有叶子都包含少于min_samples_split个样本。默认是None。
# min_samples_split:拆分内部节点所需的最少样本数:如果为int,则将#min_samples_split视为最小值。如果为float,则min_samples_split是一个分数,而ceil(min_samples_split * n_samples)是每个拆分的最小样本数。默认是2。
# min_samples_leaf:在叶节点处需要的最小样本数。仅在任何深度的分割点在左分支和右分支中的每个分支上至少留下min_samples_leaf个训练样本时,才考虑。这可能具有平滑模型的效果,尤其是在回归中。如果为int,则将min_samples_leaf视为最小值。如果为float,则min_samples_leaf是分数,而ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。默认是1。
# min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。
# max_features:寻找最佳分割时要考虑的特征数量:如果为int,则在每个拆分中考虑max_features个特征。如果为float,则max_features是一个分数,并在每次拆分时考虑int(max_features * n_features)个特征。如果为“auto”,则max_features = sqrt(n_features)。如果为“ sqrt”,则max_features = sqrt(n_features)。如果为“ log2”,则max_features = log2(n_features)。如果为None,则max_features = n_features。注意:在找到至少一个有效的节点样本分区之前,分割的搜索不会停止,即使它需要有效检查多个max_features功能也是如此。
# max_leaf_nodes:最大叶子节点数,整数,默认为None
# min_impurity_decrease:如果分裂指标的减少量大于该值,则进行分裂。
# min_impurity_split:决策树生长的最小纯净度。默认是0。自版本0.19起不推荐使用:不推荐使用min_impurity_split,而建议使用0.19中的min_impurity_decrease。min_impurity_split的默认值在0.23中已从1e-7更改为0,并将在0.25中删除。
# bootstrap:是否进行bootstrap操作,bool。默认True。如果bootstrap==True,将每次有放回地随机选取样本,只有在extra-trees中,bootstrap=False
# oob_score:是否使用袋外样本来估计泛化精度。默认False。
# n_jobs:并行计算数。默认是None。
# random_state:控制bootstrap的随机性以及选择样本的随机性。
# verbose:在拟合和预测时控制详细程度。默认是0。
# warm_start:不常用
# class_weight:每个类的权重,可以用字典的形式传入{class_label: weight}。如果选择了“balanced”,则输入的权重为n_samples / (n_classes * np.bincount(y))。
# ccp_alpha:将选择成本复杂度最大且小于ccp_alpha的子树。默认情况下,不执行修剪。
# max_samples:如果bootstrap为True,则从X抽取以训练每个基本分类器的样本数。如果为None(默认),则抽取X.shape [0]样本。如果为int,则抽取max_samples样本。如果为float,则抽取max_samples * X.shape [0]个样本。因此,max_samples应该在(0,1)中。是0.22版中的新功能。