决策树和集成算法的实现流程

决策树和集成算法

树的组成:
根节点:第一个选择点
非叶子节点与分支:中间过程
叶子节点:最终的决策结果

  熵值:H(X)=- ∑ pi * logpi, i=1,2, ... , n

  Gini(S) = 1 - Σ (pk^2)。取值(0,1)0最纯。

初始熵值:结果的熵值,结果有几个类别就有几个熵值相加

新熵值:一个特征分成有多个结果,每个结果的熵值和初始熵值计算方法一样,然后加权相加

信息增益ID3(如果一个特征分为很多结果的话,新熵就是0了,即未考虑分类数的影响):

(信息增益)InformationGain(S, A) = (熵)Entropy(S) - H(S|A)

(增益率)GainRatio(S, A) = InformationGain(S, A) / SplitInformation(A)

SplitInformation(A) = - Σ (p(t) * log2(p(t)))

信息增益率c4.5

CART:使用GINI系数来当做衡量标准,用法和信息增益一样

信息增益率越高,表示特征对于分类的贡献越大。

决策树剪枝:决策树过拟合风险很大(如果树足够庞大,每个叶子节点不就一个数据了嘛)

预剪枝:限制深度,叶子节点个数叶子节点样本数,信息增益量等
后剪枝:通过一定的衡量标准(叶子节点越多,损失越大。假设某个节点的子树被剪枝,将该节点替换为叶节点,并将其类别设置为该子树中样本最多的类别。提高泛化能力。

集成算法:Bagging:Stacking:Boosting

Bagging( bootstrap aggregation)多个并行分类器取平均。

   首先对训练数据集进行多次采样,保证每次得到的采样数据都是不同的

   分别训练多个模型,例如树模型

   预测时需得到所有模型结果再进行集成

 oob_score_ 是基于袋装集成算法的袋外评估得分,它通过使用在训练过程中未使用的样本(每个决策树都没用过,有点像测试集,但是是类内验证)进行预测来评估分类器的性能

Adaboost(自适应增强算法)

提高分错样本的权重,(这次错了,下次别错了)

 for i in range(5):
        svm_clf = SVC(kernel='rbf',C=0.05,random_state=42)
        svm_clf.fit(X_train,y_train,sample_weight = sample_weights)
        y_pred = svm_clf.predict(X_train)
        sample_weights[y_pred != y_train] *= (1+learning_rate)
        plot_decision_boundary(svm_clf,X,y,alpha=0.2)
        plt.title('learning_rate = {}'.format(learning_rate))

重要的是指出,Adaboost算法是一个迭代的过程,通过反复训练基础分类器并调整样本权重来逐步提升整体模型的性能。通过逐步调整样本权重,Adaboost能够对错误分类的样本加大关注,从而更有效地拟合数据集中的难以分类的样本。 

Gradient Boosting

tree_reg1 = DecisionTreeRegressor(max_depth = 2)
tree_reg1.fit(X,y)
y2 = y - tree_reg1.predict(X)
tree_reg2 = DecisionTreeRegressor(max_depth = 2)
tree_reg2.fit(X,y2)
y3 = y2 - tree_reg2.predict(X)
tree_reg3 = DecisionTreeRegressor(max_depth = 2)
tree_reg3.fit(X,y3)
#多次计算残差,然后多个决策树叠加
确实有梯度下降那个味道了 

 

gbrt = GradientBoostingRegressor(max_depth = 2,
                          n_estimators = 120,

                          learning_rate = 1.0
                          random_state = 42
)

多个模型图像叠加

Stacking(堆叠集成)

Stacking使用多层的结构进行模型组合。首先,原始训练集被用于训练一组初始的基础学习器。然后,使用基础学习器的预测结果作为输入数据,再训练一个学习器来对最终结果进行预测。

estimators = [random_forest_clf, extra_trees_clf, svm_clf, mlp_clf]
for estimator in estimators:
    print("Training the", estimator)
    estimator.fit(X_train, y_train)
X_val_predictions = np.empty((len(X_val), len(estimators)), dtype=np.float32)

for index, estimator in enumerate(estimators):
    X_val_predictions[:, index] = estimator.predict(X_val)
    
rnd_forest_blender.fit(X_val_predictions, y_val)

提前停止策略

errors = [mean_squared_error(y_val,y_pred) for y_pred in gbrt.staged_predict(X_val)]
bst_n_estimators = np.argmin(errors)
min_error = np.min(errors)
plt.plot([bst_n_estimators,bst_n_estimators],[0,min_error],'k--')
plt.plot([0,120],[min_error,min_error],'k--')

此时就要中途停止了,之后就过拟合了

for n_estimators in range(1,120):
    gbrt.n_estimators = n_estimators
    gbrt.fit(X_train,y_train)
    y_pred = gbrt.predict(X_val)
    val_error = mean_squared_error(y_val,y_pred)
    if val_error < min_val_error:     #min_val_error初始值要非常大才行
        min_val_error = val_error
        error_going_up = 0
    else:
        error_going_up +=1
        if error_going_up == 5:
            break

 loss连续五次增长,那就break。

随机森林实现逻辑

首先想想目的:对数据进行分类,并构建预测函数

目前有什么:数据集,特征,标签

方法是什么:计算每个特征的信息熵,找到最大的信息增益率(原来的熵值和分类后熵值的差),然后把这个特征作为第一个非叶子节点。以此类推

这是决策树最基础的一个构成:{'F2-WORK': {0: 'no', 1: 'yes'}}即F2-WORK取0,1时结果的样子

{'F3-HOME': {0: {'F2-WORK': {0: 'no', 1: 'yes'}}, 1: 'yes'}}

1.计算初始熵值,分别计算每一个特征的信息增益率,最大的那个就是根节点

2.递归,找下一个非叶子节点

3.最后只剩下一个特征,或者信息增益率都为负数,或者分类完全正确时停止。返回预测结果或类别标签。通常情况下,这个结果是当前节点中样本数量最多的类别。

4.得到这棵决策树

def createTree(dataset, labels, featLabels): #featLabels 是一个空列表
    classList = [example[-1] for example in dataset]#取出结果

    if classList.count(classList[0]) == len(classList):
        return classList[0]
    if len(dataset[0]) == 1:
        return majorityCnt(classList) #停止条件

    bestFeat = chooseBestFeatureToSplit(dataset)#返回一个索引
    bestFeatLabel = labels[bestFeat]  # 把最佳特征传入featLabels 列表
    featLabels.append(bestFeatLabel)
    myTree = {bestFeatLabel: {}} #标签进入树中 

    del labels[bestFeat] #labels 列表中删除已选择的特征
    featValue = [example[bestFeat] for example in dataset]
    uniqueVals = set(featValue)
#提取数据集中最佳特征的所有取值。 set 去除重复,得到一个包含唯一值的集合。

    for value in uniqueVals:
        sublabels = labels[:]
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataset, bestFeat, value), 
                                                  sublabels, featLabels)
    #把数据集分为value份,并删除bestFeatLabel这一列,然后继续向下延申
    return myTree

5.集成多个决策树

随机森林通过集成学习的方式将多个决策树的结果联系在一起。具体来说,随机森林采用以下两个主要方法来整合多个决策树的预测结果:

 1.投票(Voting):在多数投票策略下,每个决策树都对样本进行预测,并投票选择最常见的类别作为最终的预测结果。这通常适用于分类问题。

           硬投票(Hard Voting):将每个决策树的预测结果进行简单的投票,即选择获得最高票数的类别作为最终预测结果。

           软投票(Soft Voting):每个决策树会为每个类别给出一个概率或置信度(gini不纯度等求出来的),最后将所有决策树预测结果的概率进行平均并选取概率最高的类别作为最终预测结果

 2.平均(Averaging):对于回归问题,每个决策树都会给出一个连续的预测值,随机森林通过取所有决策树预测值的平均值作为最终的预测结果。

                                                        ( 决策树在回归问题中的应用) 

隔了大半年回来看看:

根据算法,求出depth=0这条线在哪两个点之间时损失函数最小,得到第一个分界点。之后迭代并以此类推。

depth=0时maxdepth为1,此时时散点图被拟合为两条线段。每条线段的y坐标这这段线段中x散点y坐标的均值。 

                                     

6.模型评估和优化:随机森林的性能可以通过交叉验证等方法进行评估。可以根据需要调整超参数,如决策树数量和每个决策树的最大深度等,以进一步优化随机森林模型的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 决策树是一种基本的机器学习算法,用于解决分类和回归问题。它通过建立一棵树状结构来预测样本的类别或数值。Python是一种流行的编程语言,具有丰富的机器学习库和工具。 在Python中,我们可以使用scikit-learn库来实现决策树算法。以下是一个简单的决策树Python源码示例: ```python # 导入所需的库 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score # 加载数据集 iris = datasets.load_iris() # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42) # 创建决策树模型 clf = DecisionTreeClassifier() # 拟合模型 clf.fit(X_train, y_train) # 预测测试集 y_pred = clf.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("准确率: ", accuracy) ``` 在上面的源代码中,我们首先导入所需的库,包括`datasets`用于加载数据集,`train_test_split`用于划分数据集,`DecisionTreeClassifier`用于创建决策树模型,`accuracy_score`用于计算准确率。 我们使用鸢尾花数据集作为示例数据集,它包含了150个样本和4个特征。使用`train_test_split`函数将数据集划分为训练集和测试集。 然后,我们创建`DecisionTreeClassifier`对象作为我们的决策树模型,并使用`fit`方法来拟合模型。接下来,我们使用测试集进行预测,并使用`accuracy_score`函数计算模型的准确率。 最后,我们将准确率打印出来。 这段源码展示了使用Python实现决策树算法的基本流程,你可以通过调整参数、更换数据集等来进一步优化和研究决策树算法。 ### 回答2: 决策树是一种常见的机器学习算法,用于解决分类和回归问题。Python中有许多开源库可以用于实现决策树算法,比如scikit-learn和tensorflow等。 决策树的基本思想是通过对数据进行分割,构建一个树形结构来进行预测。在算法中,我们首先选择一个最佳的特征来分割数据集,然后递归地对每个子集进行相同的分割操作,直到满足某个终止条件(如所有数据属于同一个类别或者达到预定的树深度)。最后,根据构建好的决策树,我们可以对新的未知数据进行预测。 决策树的python源码可以通过导入对应的机器学习库来实现。以scikit-learn库为例,我们可以完成如下的决策树实现: ```python from sklearn import tree # 加载训练数据 X = [[0, 0], [1, 1]] Y = [0, 1] # 创建决策树模型 clf = tree.DecisionTreeClassifier() # 使用训练数据拟合模型 clf = clf.fit(X, Y) # 使用模型进行预测 prediction = clf.predict([[2., 2.]]) print(prediction) ``` 以上代码首先导入了决策树模块,然后根据训练数据创建了一个决策树模型,接着利用拟合方法拟合数据。最后,用fit方法进行预测,并打印出预测结果。 这只是一个简单的决策树实现示例,实际使用中可以根据具体需求对模型的参数和数据进行调整和优化。决策树算法机器学习领域有着广泛的应用,可以用于解决多种分类和回归问题。 ### 回答3: 决策树是一种机器学习中常用的分类与回归算法。Python作为一种流行的编程语言,提供了丰富的机器学习库,其中包括用于构建和应用决策树的库。下面是一个简单的决策树Python源代码示例: ```python from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score # 加载数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建决策树分类器 clf = DecisionTreeClassifier() # 在训练集上训练决策树分类器 clf.fit(X_train, y_train) # 在测试集上进行预测 y_pred = clf.predict(X_test) # 计算分类准确率 accuracy = accuracy_score(y_test, y_pred) print("分类准确率:", accuracy) ``` 以上代码使用`sklearn`库中的`DecisionTreeClassifier`类来构建决策树分类器。首先,通过`datasets.load_iris()`加载鸢尾花数据集,并将其特征和目标分别赋给`X`和`y`。然后,使用`train_test_split`函数将数据集划分为训练集和测试集。接下来,创建决策树分类器对象`clf`,并使用`fit`方法在训练集上进行训练。最后,使用`predict`方法在测试集上进行预测,并使用`accuracy_score`函数计算分类准确率。 这是一个简单的决策树Python源代码示例,你可以根据自己的数据集和需求进行调整和拓展。决策树算法在数据集较小且特征较少的情况下表现较好,而在高维数据集和复杂分类问题上可能会遇到过拟合或者欠拟合的问题,可以通过调整参数或者使用集成学习等方法来改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值