【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林

news2024/11/15 8:30:09

文章目录

  • 一、概念与原理
    • 1.1 决策树
      • 1.1.1 概念
      • 1.1.2 原理
        • 特征选择
        • 分割方法
      • 1.1.3 优点与缺点
      • 1.1.4 Python常用决策树算法
    • 1.2 随机森林
      • 1.2.1 概念
      • 1.2.2 原理
      • 1.2.3 优点与缺点
      • 1.2.4 Python常用随机森林算法
    • 1.3 决策树与随机森林的比较
      • 1.3.1 相同之处
      • 1.3.2 不同之处
  • 二、决策树算法
  • 三、随机森林
    • 3.1 构建和训练随机森林模型
      • 3.1.1 随机选择样本
      • 3.1.2 随机选择特征
    • 3.2 特征重要性的评估方法
  • 四、决策树与随机森林的应用
    • 4.1 实际问题中的应用场景
      • 4.1.1 医疗诊断
      • 4.1.2 金融风控
      • 4.1.3 客户分类
    • 4.2 泰坦尼克号生存预测
      • 4.2.1 数据预处理
      • 4.2.2 随机森林模型
      • 4.2.3 预测文件内容
      • 4.2.4 预测输入数据
  • 五、调优
    • 5.1 超参数调优
    • 5.2 交叉验证和网格搜索
    • 5.3 提升模型性能的技巧和策略


一、概念与原理

1.1 决策树

1.1.1 概念

决策树是一种机器学习算法,其模型呈现为一个树状结构,用于解决分类和回归问题。决策树通过对数据集的特征进行分析和判断,构建出一系列的决策规则,并根据这些规则对新的数据进行预测。

决策树的每个节点表示一个特征,每个分支代表该特征的某个取值,而每个叶子节点代表一个分类或预测值。树的顶部节点称为根节点,最底部的叶子节点称为叶节点。决策树的每个内部节点都包含一个条件,用于决定当前样本实例的下一个分支。通过从根节点一直向下移动,并根据样本的特征值和条件进行逐级分支,直到达到一个叶节点,就可以得到对该样本的预测或分类结果。

构建决策树的过程基于信息熵、信息增益、基尼系数等指标来选择最佳的划分特征,并递归地将数据集划分为更小的子集,直到满足某种终止条件(如达到最大深度、节点包含的样本数达到最小值等)为止。

决策树在机器学习中具有较好的可解释性和可视化性,它能够处理离散和连续特征,也能够处理多分类和回归问题。然而,决策树容易过拟合训练数据,可以通过剪枝、设置模型参数等方法来改善模型性能。

1.1.2 原理

我们将从特征选择和分割方法两个方面介绍决策树的实现原理。

特征选择

决策树通过选择最佳的特征作为当前节点的划分特征,以获得最大的信息增益或最小的基尼指数。我们使用信息熵来度量数据的混乱程度,其数学公式如下:

熵 ( D ) = − Σ ( p i ∗ l o g 2 ( p i ) ) 熵(D) = -Σ(p_i * log2(p_i)) (D)=Σ(pilog2(pi))

其中,D 表示数据集,p_i 表示数据集中第i个类别的概率。熵的值越大,表示数据集的不确定性越高。

信息增益(ID3 算法)用于选择最佳特征,其计算公式如下:

信息增益 ( D , A ) = 熵 ( D ) − Σ ( ∣ D v ∣ / ∣ D ∣ ∗ 熵 ( D v ) ) 信息增益(D, A) = 熵(D) - Σ(|D_v| / |D| * 熵(D_v)) 信息增益(D,A)=(D)Σ(Dv∣/∣D(Dv))

其中,A 表示特征,D_v 表示特征 A 下的子数据集,|D| 表示数据集 D 的样本数,|D_v| 表示子数据集 D_v 的样本数。信息增益越大,表示特征 A 对于分类的贡献越大。

基尼指数(CART 算法)在特征选择中也常被使用,其计算公式如下:

基尼指数 ( D ) = 1 − Σ ( p i 2 ) 基尼指数(D) = 1 - Σ(p_i^2) 基尼指数(D)=1Σ(pi2)

基尼指数的值越小,表示数据集的纯度越高。基尼指数越小,表示特征的分类能力越好。

分割方法

在特征选择后,我们使用不同的分割方法将数据集划分为子集。对于离散特征,我们可以使用简单的等于或不等于条件进行划分,如 A = a 或 A != a。对于连续特征,我们可以选择一个阈值进行划分,如 A <= t 或 A > t。

根据选择的特征和划分方法,我们可以得到一个决策树的节点,每个分支对应一个特征的取值。我们可以递归地对每个子数据集进行特征选择和分割方法的确定,从而构建整个决策树。

最终,当达到终止条件时,我们将最后的叶节点分配为一个类别,或者对回归问题进行平均值预测。

1.1.3 优点与缺点

决策树具有以下优点:

  • 可解释性:决策树是一种直观且易于理解的模型,可以提供清晰的决策规则。它可以帮助我们了解特征的重要性和影响,以及预测结果的推理过程。

  • 处理多种数据类型:决策树可以同时处理离散特征和连续特征,以及具有多个类别的分类问题。

  • 没有复杂的假设:决策树不需要任何附加的假设或参数,因此可以很好地适应不同类型的数据集。

  • 可以处理缺失值和异常值:决策树具有容忍缺失值和异常值的能力,在数据预处理方面更加灵活。

  • 可以处理高维数据:决策树可以处理具有很多特征的高维数据集,而不需要进行降维操作。

  • 可扩展性:决策树可以与其他机器学习技术(如集成学习)结合使用,以提高模型的性能。

然而,决策树也存在一些缺点:

  • 容易过拟合:决策树在处理复杂数据时容易过度匹配训练数据,导致模型过拟合,无法泛化到未见过的数据。

  • 对输入数据的变化敏感:数据集中较小的变化可能导致不同的决策树生成,这使得模型不稳定。

  • 忽略数据间的相关性:决策树通常基于每个节点最优的特征进行划分,而不考虑特征之间的相关性。

  • 选择最佳划分特征的计算开销较大:决策树需要计算每个特征的信息增益或基尼指数,这对于具有大量特征的数据集来说可能是计算密集型的。

  • 对于类别不平衡的数据集可能不敏感:决策树在处理类别不平衡的数据集时可能会倾向于选择具有更多样本的类别作为主要决策规则。

总之,决策树是一种强大而灵活的算法,但也有其局限性。在使用决策树时需要注意并解决过拟合问题,并结合其他技术对其进行改进和加强。

1.1.4 Python常用决策树算法

在 Python 中,有几个常用的决策树算法可以使用,以下是其中的一些:

  • ID3 算法:基于信息增益来选择最佳划分特征的决策树算法。它使用信息熵来度量数据集的混乱程度,并选择具有最大信息增益的特征作为节点的划分特征。

  • C4.5 算法:与 ID3 算法类似,但它使用信息增益比来选择最佳特征。信息增益比考虑了特征的取值个数对信息增益的影响,避免了对取值多的特征倾向的问题。

  • CART 算法:Classification and Regression Trees(分类和回归树)是一种非常通用的决策树算法。与 ID3 和 C4.5 不同,CART 算法既可以处理分类问题,也可以处理回归问题。它使用基尼指数来选择最佳划分特征,以最小化数据集的不纯度。

  • RandomForest(随机森林):随机森林是一种集成学习的决策树算法。它通过随机选择一部分特征和样本子集来构建多个决策树,并对它们的结果进行平均或投票来进行预测。随机森林可以减少过拟合风险,并具有较好的性能。

这些算法都可以通过 Python 中的 sklearn 库来实现。sklearn 库提供了DecisionTreeClassifierDecisionTreeRegressor类来构建决策树模型,并提供相应的参数和方法来调整和评估模型。在使用这些决策树算法时,还可以进行一些技术手段来改善模型的性能,如剪枝、调整参数、采用交叉验证等。

1.2 随机森林

1.2.1 概念

随机森林是一种集成学习方法,它由多个决策树组成的模型。每个决策树都基于不同的随机样本集和随机特征子集进行训练。随机森林通过整合所有决策树的预测结果来进行最终的预测或分类。随机森林可以提高模型的鲁棒性和准确性,并且对于大规模数据集具有较好的性能。

1.2.2 原理

假设我们有一个训练数据集 D,包含 N 个样本和 M 个特征。我们要构建一个包含 T 个决策树的随机森林模型。

随机森林的实现原理如下:

  • 随机采样:首先,从原始数据集D中进行有放回的随机采样,生成T个训练子集。每个训练子集的大小约为N个样本的63%。用D_i表示第i个训练子集。

  • 随机选择特征:对于每个决策树的每个节点,在特征上进行随机选择。这里我们设置一个可调节的参数max_features,它决定了每个节点的最大候选分割特征数。通常,max_features的推荐值是总特征数的平方根。

  • 决策树的构建:使用随机采样的训练子集和随机选择的特征子集来构建每个决策树。对于第t个决策树,使用训练子集D_t进行构建。决策树的构建过程与传统决策树算法相似,通过递归地选择最佳特征进行节点分割,直到满足终止条件。

  • 集成预测:对于分类问题,随机森林使用多数投票法来确定最终的分类结果。对于回归问题,随机森林取所有决策树的预测结果的平均值作为最终的回归值。

下面是一段示例代码,展示了如何使用 sklearn 库来实现随机森林模型。

from sklearn.ensemble import RandomForestClassifier

# 创建随机森林分类器对象
rf_classifier = RandomForestClassifier(n_estimators=100, max_features="sqrt")

# 使用训练数据拟合模型
rf_classifier.fit(train_features, train_labels)

# 使用随机森林进行预测
predictions = rf_classifier.predict(test_features)

在上述代码中,我们使用RandomForestClassifier类来实现随机森林分类器。通过设置n_estimators参数来指定决策树的数量,max_features参数用于控制每个节点的特征子集大小。通过fit方法拟合训练数据,然后使用predict方法进行预测。

通过组合多个决策树的预测,随机森林能够减少过拟合的风险,并获得更稳定和准确的预测结果。它在机器学习中被广泛应用于分类和回归问题,并展现出良好的性能和鲁棒性。

1.2.3 优点与缺点

随机森林的优点:

  • 随机森林可以处理高维数据集,且不需要特征选择进行降维。
  • 在处理大规模数据集时,随机森林具有很好的效率。
  • 随机森林能够处理不平衡的数据集,并且能够生成平衡的分类器。
  • 随机森林可以估测缺失数据并保持精确性。
  • 随机森林具有较好的预测准确性。

随机森林的缺点:

  • 随机森林相对于其他算法,如支持向量机等,在处理小规模数据集时可能会出现过拟合的情况。
  • 随机森林的模型复杂度较高,在训练时需要较大的内存空间。
  • 对于非线性的数据集,随机森林的表现可能不如其他算法。
  • 随机森林的建模过程比较难解释,不利于提取模型的特征解释性。

1.2.4 Python常用随机森林算法

在 Python 中,常用的随机森林算法实现主要包括以下几种:

  • scikit-learn 库中的RandomForestClassifierRandomForestRegressor类:这两个类提供了随机森林分类和回归的功能,并提供了一系列参数供用户调整,如树的数量、最大深度等。

  • XGBoost 库中的XGBClassifierXGBRegressor类:XGBoost 是一种梯度提升树算法,通过集成多棵树进行分类或回归。它可以使用 sklearn 的接口形式进行使用。

  • LightGBM 库中的LGBMClassifierLGBMRegressor类:LightGBM 是一种基于梯度提升树的高效算法,也可以用来进行分类和回归问题。同样,它也提供了与 sklearn 兼容的接口。

  • CatBoost 库中的CatBoostClassifierCatBoostRegressor类:CatBoost 是一种基于梯度提升树的机器学习算法,特别适用于处理类别型特征和高维稀疏数据。它也提供了与 sklearn 兼容的接口。

1.3 决策树与随机森林的比较

决策树和随机森林是常用的机器学习算法,常用于分类和回归问题。它们的设计和实现原理有一些相同之处,但也存在一些显著的差异。

1.3.1 相同之处

首先,让我们先了解决策树和随机森林的相同之处:

  1. 决策树和随机森林都是基于树结构的算法,用于从数据中学习一系列的决策规则。它们都能够处理分类和回归问题。

  2. 决策树和随机森林都以属性值的比较进行分割。在每个节点上,通过计算属性的信息增益或基尼指数等指标,选择最优的属性进行分割。

  3. 决策树和随机森林都可以处理离散型和连续型属性。对于离散型属性,可以通过计算属性值的频率或熵来进行选择;对于连续型属性,可以通过计算属性值的二分点来进行选择。

下面,我们将讨论决策树和随机森林的不同之处。

1.3.2 不同之处

  1. 决策树与随机森林的关系:决策树是随机森林中的基本构成单元。随机森林是由多棵决策树组成的集成模型。

  2. 处理过拟合的能力:决策树容易发生过拟合现象,特别是当树的深度较大时。而随机森林通过集成多个决策树,并根据随机抽样来生成不同的训练集,可以有效减轻过拟合问题,提高模型的泛化能力。

  3. 数据特征选择:在决策树中,由于每个节点只考虑其中一个属性进行分裂,可能会忽略其他重要属性的影响。而在随机森林中,每个决策树都是在随机选择的子集上进行训练,因此可以更全面地考虑所有属性的重要性,减少了特征选择的偏差。

接下来,让我们通过 Python 代码来演示决策树和随机森林的实现。

首先,我们导入需要的库:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

接着,我们加载一个示例数据集(使用 sklearn 的鸢尾花数据集):

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)

接下来,我们分别使用决策树和随机森林进行模型训练和预测:

# 决策树
decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, y_train)
y_pred_dt = decision_tree.predict(X_test)

# 随机森林
random_forest = RandomForestClassifier()
random_forest.fit(X_train, y_train)
y_pred_rf = random_forest.predict(X_test)

最后,我们分别计算决策树和随机森林的准确率:

accuracy_dt = accuracy_score(y_test, y_pred_dt)
accuracy_rf = accuracy_score(y_test, y_pred_rf)

print("决策树准确率:", accuracy_dt)
print("随机森林准确率:", accuracy_rf)

通过以上代码,我们可以看到决策树和随机森林都能够实现对鸢尾花数据集的分类任务,并得到相应的准确率。


二、决策树算法

首先,我们需要导入相应的库:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

接下来,我们加载一个示例数据集(使用 sklearn 的鸢尾花数据集):

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)

接下来,我们创建一个决策树分类器,并用训练数据进行模型训练:

decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, y_train)

此时,决策树模型已经训练完毕。接下来,我们可以使用测试集进行预测,并计算模型的准确率:

y_pred = decision_tree.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print("决策树准确率:", accuracy)

以上代码中,我们使用了 sklearn 库中的DecisionTreeClassifier类来构建决策树分类器,并使用fit()方法进行模型训练。然后,使用predict()方法对测试集进行预测,最后使用accuracy_score()方法计算模型的准确率。


三、随机森林

3.1 构建和训练随机森林模型

随机森林的构建过程主要包括两个步骤:随机选择样本和随机选择特征。

3.1.1 随机选择样本

在构建每棵决策树时,随机森林从原始训练集中进行有放回抽样,构建一个新的训练集,该新训练集的样本数量与原始训练集相同,但有些样本可能会重复。这种有放回抽样的方式确保了每棵决策树之间的差异性,增加了模型的多样性,从而提高了模型的泛化能力。

3.1.2 随机选择特征

在构建每棵决策树的节点时,随机森林从所有特征中随机选择一部分特征,然后根据选定的特征来进行节点分裂。这样做的好处是,它减少了特征之间的相关性,避免了某些特定特征对模型的过度依赖。

下面是使用 Python 中的sklearn库来构建和训练随机森林模型的示例代码:

# 导入所需的库和模块
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
rf_model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = rf_model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("随机森林模型的准确率:", accuracy)

3.2 特征重要性的评估方法

随机森林除了能够用于预测,还可以通过评估特征的重要性来帮助我们理解数据和模型。特征重要性指的是在模型训练过程中,各个特征对于模型性能的贡献程度。

随机森林通过衡量每个特征在模型中的节点分裂中的纯度提高(通常是基尼系数或信息增益),来评估特征的重要性。在训练完成后,我们可以通过以下方法来获取特征重要性:

# 获取特征重要性
importance = rf_model.feature_importances_

# 将特征重要性与对应特征名称进行关联
feature_importance = dict(zip(iris.feature_names, importance))

# 按照重要性降序排列
sorted_feature_importance = dict(sorted(feature_importance.items(), key=lambda x: x[1], reverse=True))

# 输出特征重要性
print("特征重要性排名:")
for feature, importance in sorted_feature_importance.items():
    print(f"{feature}: {importance}")

特征重要性的值越大,表示该特征对于模型的预测能力越强,因此在特征工程中,我们可以根据这些重要性信息来选择最有用的特征或者排除不重要的特征,以提高模型的性能。


四、决策树与随机森林的应用

4.1 实际问题中的应用场景

决策树与随机森林是在机器学习领域中常用的分类与回归算法。它们在实际问题中的应用场景非常广泛,包括但不限于以下几个方面:

4.1.1 医疗诊断

决策树与随机森林可以用于医疗领域,辅助医生进行疾病诊断。通过输入患者的临床指标、生理参数等信息,决策树可以帮助医生快速判断患者可能患有哪种疾病,从而更好地进行治疗与护理。

4.1.2 金融风控

在金融行业中,决策树与随机森林可用于评估贷款申请人的信用风险。根据申请人的个人信息、信用历史、财务状况等数据,这些算法可以预测出借款人是否有能力按时还款,从而帮助银行做出贷款决策,降低坏账率。

4.1.3 客户分类

在市场营销中,决策树与随机森林可以用于客户分类与定向广告。通过分析客户的购买行为、兴趣偏好等信息,这些算法可以将客户分为不同的群体,并针对性地推送广告与优惠活动,提高营销效率。

4.2 泰坦尼克号生存预测

下载地址:

训练文件train.csv(892 条数据):
在这里插入图片描述
测试数据test.csv(419 条数据):
在这里插入图片描述

4.2.1 数据预处理

导入库:

import pandas as pd

读取数据:

# 读取数据
data = pd.read_csv('titanic\\train.csv')

数据预处理:

# 数据预处理
data = data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'Embarked'], axis=1)
data['Age'] = data['Age'].fillna(data['Age'].mean())
data['Sex'] = data['Sex'].map({'female': 0, 'male': 1})

划分特征和标签:

# 划分特征和标签
X = data.drop('Survived', axis=1)
y = data['Survived']

4.2.2 随机森林模型

导入库:

from sklearn.ensemble import RandomForestClassifier

构建模型:

# 构建随机森林模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X, y)

4.2.3 预测文件内容

导入库:

from sklearn.impute import SimpleImputer

读取测试数据:

# 读取测试数据
test_data = pd.read_csv('titanic\\test.csv')

数据预处理:

# 数据预处理
test_data = test_data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'Embarked'], axis=1)
test_data['Age'] = test_data['Age'].fillna(test_data['Age'].mean())
test_data['Sex'] = test_data['Sex'].map({'female': 0, 'male': 1})

填充缺失值:

# 填充缺失值
imputer = SimpleImputer(strategy='mean')
test_data = pd.DataFrame(imputer.fit_transform(test_data), columns=test_data.columns)

预测:

# 预测
predictions = model.predict(test_data)
print(predictions)

4.2.4 预测输入数据

输入数据:

# 输入数据
pclass = int(input('Pclass(1-3):')) # 船票级别(1,2或3)
sex = int(input('Sex(male:1,female:0):')) # 性别(男1,女0)
age = int(input('Age:')) # 年龄
sibsp = int(input('SibSp:')) # 船上的兄弟姐妹以及配偶的人数
parch = int(input('Parch:')) # 船上的父母以及子女的人数
fare = float(input('Fare:')) # 船票费用
input_data = pd.DataFrame({'Pclass': [pclass], 'Sex': [sex], 'Age': [age], 'SibSp': [sibsp], 'Parch': [parch], 'Fare': [fare]})

预测结果:

# 预测结果
prediction = model.predict(input_data)
if 0 in prediction:
    print('survive')
else:
    print('do not survive')
Pclass(1-3):2
Sex(male:1,female:0):1
Age:25
SibSp:0
Parch:0
Fare:1000
survive

五、调优

5.1 超参数调优

在机器学习中,超参数是指在模型训练之前需要手动设置的参数。决策树和随机森林模型都有一些重要的超参数,调优这些超参数可以提高模型的性能。

决策树的超参数包括最大深度(max_depth)、最小样本划分数(min_samples_split)、最小叶子节点样本数(min_samples_leaf)等。通过调整这些超参数,可以控制决策树的复杂度和泛化能力。

随机森林的超参数包括决策树数量(n_estimators)、最大特征数(max_features)、最大深度(max_depth)等。通过调整这些超参数,可以控制随机森林的复杂度和泛化能力。

5.2 交叉验证和网格搜索

为了找到最优的超参数组合,可以使用交叉验证和网格搜索的方法。

交叉验证是一种评估模型性能的方法,它将数据集分成训练集和验证集,多次训练模型并计算验证集上的性能指标,最后取平均值作为模型的性能评估。

网格搜索是一种系统地遍历多个超参数组合的方法,通过交叉验证评估每个超参数组合的性能,最后选择性能最好的超参数组合作为最终模型的超参数。

下面是使用交叉验证和网格搜索调优决策树和随机森林模型的示例代码:

from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

# 决策树调优
param_grid = {
    'max_depth': [3, 5, 7],
    'min_samples_split': [2, 4, 6],
    'min_samples_leaf': [1, 2, 3]
}
dt = DecisionTreeClassifier()
grid_search = GridSearchCV(dt, param_grid, cv=5)
grid_search.fit(X_train, y_train)
best_dt = grid_search.best_estimator_

# 随机森林调优
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth': [3, 5, 7]
}
rf = RandomForestClassifier()
grid_search = GridSearchCV(rf, param_grid, cv=5)
grid_search.fit(X_train, y_train)
best_rf = grid_search.best_estimator_

5.3 提升模型性能的技巧和策略

除了调优超参数,还有一些其他的技巧和策略可以提升决策树和随机森林模型的性能。

一种常用的技巧是特征选择,通过选择最相关的特征来减少决策树和随机森林的复杂度,提高模型的泛化能力。

另一种常用的策略是集成学习,通过组合多个决策树或随机森林模型的预测结果来提高模型的性能。常见的集成学习方法包括投票法、平均法和堆叠法等。

下面是使用特征选择和集成学习提升决策树和随机森林模型性能的示例代码:

from sklearn.feature_selection import SelectKBest
from sklearn.ensemble import VotingClassifier

# 特征选择
selector = SelectKBest(k=10)
X_train_selected = selector.fit_transform(X_train, y_train)
X_test_selected = selector.transform(X_test)

# 集成学习
dt1 = DecisionTreeClassifier()
dt2 = DecisionTreeClassifier()
rf1 = RandomForestClassifier()
rf2 = RandomForestClassifier()
voting_clf = VotingClassifier(estimators=[('dt1', dt1), ('dt2', dt2), ('rf1', rf1), ('rf2', rf2)], voting='hard')
voting_clf.fit(X_train_selected, y_train)

通过调优超参数、特征选择和集成学习等技巧和策略,可以提高决策树和随机森林模型的性能,使其更适用于实际问题的解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苍穹外卖Day01项目日志

1.软件开发流程和人员分工是怎样的&#xff1f; 软件开发流程 一个软件是怎么被开发出来的&#xff1f; 需求分析 先得知道软件定位人群、用户群体、有什么功能、要实现什么效果等。 需要得到需求规格说明书、产品原型。 需求规格说明书 其中前后端工程师要关注的就是产品原…

C# 继承,封装,多态等知识点

一&#xff1a;面向对象的三大特征&#xff1a;继承性&#xff0c;封装性&#xff0c;多态性 1&#xff1a;继承性&#xff1a;继承主要描述是类与类之间的关系&#xff0c;通过继承可以在无需重新编写原有的类的情况下&#xff0c;对原有的类的功能进行扩展。 2&#xff1a;封…

【Lua学习笔记】Lua进阶——协程

文章目录 协程协程的定义和调度StatusRunning 协程 协程是一种并发操作&#xff0c;相比于线程&#xff0c;线程在执行时往往是并行的&#xff0c;并且线程在创建销毁执行时极其消耗资源&#xff0c;并且过长的执行时间会造成主进程阻塞。而协程可以以并发时轮值时间片来执行&…

法大大携手盘子女人坊,以数字化唤醒国风摄影新体验

第三方数据显示&#xff0c;目前&#xff0c;我国共有163万家摄影相关企业&#xff0c;有约1900个从事摄影相关业务的品牌&#xff0c;且预计到2025年艺术摄影市场规模将达到7063.18亿元。艺术摄影行业作为在时代进步、科技发展以及人民生活水平提高的推动下逐渐发展起来的行业…

flutter:角标

角标应该非常常见了&#xff0c;以小说app为例&#xff0c;通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API&#xff0c;使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…

day42-Live User Filter(实时用户过滤器)

50 天学习 50 个项目 - HTMLCSS and JavaScript day42-Live User Filter&#xff08;实时用户过滤器&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport…

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows11下使用【Instant Neural Surface Reconstruction】算法时需要…

饱和(非饱和)激活函数

1.什么是饱和&#xff08;非饱和&#xff09;激活函数 若h(x)满足&#xff1a;&#xff0c;则h(x)称为饱和激活函数&#xff0c;例如sigmoid和tanh&#xff0c;否则为非饱和激活函数&#xff0c;例如Relu及其变体。 2.非饱和激活函数的优势有两点 能解决所谓的“梯度消失”问…

剑指offer10-II.青蛙跳台阶问题

这道题和上一道斐波那契一模一样&#xff0c;如果你要到达第n个台阶&#xff0c;你有两种方法&#xff0c;第一种是到达n-1级然后跳一下&#xff0c;第二种是到大n-2级然后跳两下&#xff0c;所以到达n级的方法数就是到达n-1级的方法数加上到达n-2级的方法数。其实就是和斐波那…

Hightopo 使用心得(5)- 动画的实现

在前一篇文章《Hightopo 使用心得&#xff08;4&#xff09;- 3D 场景 Graph3dView 与 Obj 模型》中&#xff0c;我们通过使用 ht.Default.startAnim() 让一个直升飞机飞了起来。其实&#xff0c;在 HT for Web 中&#xff0c;有多种手段可以用来实现动画。 我们这里仍然用直升…

20.1:ABC对应123问题

规定1和A对应、2和B对应、3和C对应…26和Z对应 那么一个数字字符串比如"111”就可以转化为: “AAA”、“KA"和"AK” 给定一个只有数字字符组成的字符串str&#xff0c;返回有多少种转化结果 一&#xff1a;暴力方法 public static int number(String str) {…

使用 NVM(Node Version Manager)管理 Node.js 版本

使用 NVM&#xff08;Node Version Manager&#xff09;管理 Node.js 版本 步骤一&#xff1a;安装 NVM NVM 是一个用于安装和管理不同版本的 Node.js 的工具。首先&#xff0c;你需要确保你的系统上已经安装了 NVM。可以通过以下命令检查 NVM 是否已经安装&#xff1a; nvm …

尚硅谷大数据项目《在线教育之采集系统》笔记002

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P032 P033 P033 P034 P035 P036 P032 P033 # 1、定义组件&#xff0c;为各组件命名 a1.sources r1 a1.channels c1 a1.sinks - k1# 2、配置sources&#xff0c;描述source a1.sour…

【已解决】 Celery 报错:AttributeError: ‘EntryPoints‘ object has no attribute ‘get‘

【已解决】 Celery 报错&#xff1a;AttributeError: EntryPoints object has no attribute get 1、起因2、实验环境3、解决方案 1、起因 今天闲来无事学习 Celery 分布式任务队列&#xff0c;写好代码发布并执行&#xff0c;报错了 AttributeError: EntryPoints object has n…

芯片竞争总是一个王朝颠覆另一个王朝,壁仞科技会是下一个么?

AI的水位渐高&#xff0c;过河的船也随之身价暴涨。 刚刚解锁万亿美元市值的英伟达&#xff0c;是AI芯片产业中少有的“豪华游轮”。根据澎湃新闻的报道&#xff0c;受到禁售消息的影响&#xff0c;A800芯片近期价格出现大幅上涨。事实上&#xff0c;A800只是A100的替代&#…

QT【day3】

思维导图&#xff1a; 闹钟&#xff1a; //widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTimer> #include<QTime> //时间类 #include<QPushButton> //按钮类头文件 #include<QDebug&…

论文笔记--GloVe: Global Vectors for Word Representation

论文笔记--GloVe: Global Vectors for Word Representation 1. 文章简介2. 文章概括3 文章重点技术3.1 两种常用的单词向量训练方法3.2 GloVe3.3 模型的复杂度 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;GloVe: Global Vectors for Word Representa…

使用阿里云OSS+PicGo搭建图床

需求&#xff1a;对于写博客来说&#xff0c;图片确实是一个重要的问题。对于大量图片的上传&#xff0c;手动操作确实会非常耗时。为此借助图床提高写博客时处理图片的效率。 1. 阿里云OSS 阿里云对象存储服务OSS&#xff08;Object Storage Service&#xff09;&#xff1a;是…

1000*B. Buttons

#include<bits/stdc.h> using namespace std; typedef long long ll; int n,sum; int main(){scanf("%d",&n);for(int i1;i<n-1;i) sumi*(n-i);cout<<sumn;return 0; }

进阶高级测试专项,Pytest自动化测试框架总结(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、框架简介 pyt…