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

文章目录

  • 一、概念与原理
    • 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.mfbz.cn/a/54180.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UNIX网络编程卷一 学习笔记 第二十六章 线程

在传统UNIX模式中&#xff0c;当一个进程需要另一个实体完成某事时&#xff0c;它就fork一个子进程&#xff0c;并让子进程去执行处理&#xff0c;Unix上大多网络服务器程序就是这么写的。 这种范式多年来一直用得很好&#xff0c;但fork调用存在一些问题&#xff1a; 1.fork调…

分享一次使用iostat命令定位邮件系统性能故障的经历

目录 一、背景介绍 二、环境介绍 三、分析过程 四、解决方法 最近在整理iostat&#xff0c;回忆起以前处理的系统性能的问题&#xff0c;现把分析方法整理如下。 一、背景介绍 以前公司内网部署有一套邮件系统&#xff0c;每天下午16:00-16:30之间邮件收发非常卡。 二、环…

NOsql之MongoDB入门分享

目录 一、MongoDB简介 1、概念理解 2、yum安装部署 3、二进制安装部署 4、配置文件解析 二、MongoDB基本管理 1、登录操作 2、管理命令 3、用户管理 一、MongoDB简介 1、概念理解 关系型数据库&#xff08;RDBMS:Relational Database Management System) MySql、Ora…

动态规划之树形DP

动态规划之树形DP 树形DP何为树形DP 树形DP例题HDU-1520 Anniversary partyHDU-2196 Computer834. 树中距离之和 树形DP 何为树形DP 树形DP是指在“树”这种数据结构上进行的动态规划&#xff1a;给出一颗树&#xff0c;要求以最少的代价&#xff08;或取得最大收益&#xff…

uniapp实现地图点聚合

点聚合的最重要的一个地方是在 markers 中添加 joinCluster true 这个重要的属性&#xff0c;否则将无法开启点聚合功能。 其实在uniapp的官方文档里体现的不是那么清楚&#xff0c;但是在小程序文档提示的就相当清楚。 实现效果如下&#xff1a; 重点&#xff1a;需要编译在小…

git下载太慢

git官网下载git太慢 阿里git地址 下载适合自己的版本

HTTP请求走私漏洞简单分析

文章目录 HTTP请求走私漏洞的产生HTTP请求走私漏洞的分类HTTP请求走私攻击的危害确认HTTP请求走私漏洞通过时间延迟技术确认CL漏洞通过时间延迟技术寻找TE.CL漏洞 使用差异响应内容确认漏洞通过差异响应确认CL.TE漏洞通过差异响应确认TE.CL漏洞 请求走私漏洞的利用通过请求漏洞…

ARTS 挑战打卡的第1天 --- Linux驱动与设备的匹配规则(Tips)

前言 &#xff08;1&#xff09;因为在Linux驱动开发中&#xff0c;驱动可以和设备c文件文件进行匹配&#xff0c;也可以和设备树dts文件进行匹配。为了弄明白驱动与他们的匹配规则&#xff0c;我查阅了一些资料同时阅读了源码&#xff0c;最终打算使用图片的方式形象具体的写成…

FFmpeg5.0源码阅读——av_interleaved_write_frame

摘要&#xff1a;本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数av_interleaved_write_frame的实现。   关键字&#xff1a;av_interleaved_write_frame   读者须知&#xff1a;读者需要熟悉ffmpeg的基本使用。 1 基本调用流程 av_interleaved_write_frame的基本…

matlab使用教程(6)—线性方程组的求解

进行科学计算时&#xff0c;最重要的一个问题是对联立线性方程组求解。在矩阵表示法中&#xff0c;常见问题采用以下形式&#xff1a;给定两个矩阵 A 和 b&#xff0c;是否存在一个唯一矩阵 x 使 Ax b 或 xA b&#xff1f; 考虑一维示例具有指导意义。例如&#xff0c;方程 …

Redis - 缓存的双写一致性

概念&#xff1a; 当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 那为什么会有不一致的情况呢&#xff1f; 如果不追求一致性&#xff0c;正常有两种做法 先修改数据库 后删除旧的缓存先删除旧的缓存 再修改数据库 我们以先删除旧的…

【玩转pandas系列】数据清洗(文末送书福利)

文章目录 一、重复值检测二、元素替换1️⃣ 元素替换replace2️⃣ 数据映射map 三、修改索引1️⃣ 修改索引名rename2️⃣ 设置索引和重置索引 四、数据处理1️⃣ apply与applymap2️⃣ transform 五、异常值处理六、抽样聚合函数1️⃣ 抽样2️⃣ 数学函数 七、分组聚合&#x…

数字世界未来十年面貌如何?

随着科技的不断发展和创新&#xff0c;数字世界将在未来十年迎来一系列革命性的变化和进步。以下是数字世界未来十年面貌的一些预测&#xff1a; 人工智能全面普及&#xff1a;人工智能将逐渐渗透到我们生活的方方面面。从智能家居到智能交通&#xff0c;从个性化医疗到智能零售…

用python编写一个小程序,如何用python编写软件

大家好&#xff0c;给大家分享一下用python编写一个小程序&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1、python可以写手机应用程序吗&#xff1f; 我想有人曲解意思了&#xff0c;人家说用python开发渣蔽一个手机app&#xff0c;不是…

零基础C#编写上位机如何入门?

学习C#基础语法和.NET框架&#xff0c;掌握基本编程概念和语法&#xff0c;例如数据类型、类、对象、继承、多态、异常处理等。学习WinForm窗体应用程序开发技术&#xff0c;掌握窗体应用程序的设计和开发&#xff0c;例如控件的使用、事件驱动编程、窗体的布局与设计等。学习数…

《向量数据库指南》——Milvus Cloud 2.3 和 2.4 版本的重要变化

Milvus Cloud2.3 和 2.4 版本的重要变化。 首先是 Milvus Cloud2.3 将支持 Json 数据类型,在此基础上亦会支持 Schemaless。此前,用户在使用 Milvus Cloud的过程中会先定一个静态 Schema,此时,如果在实际业务层面如果多了几个 feature 或者 Metadata,就意味着数据需要重新…

什么是架构 架构图

如何成为一名架构师,架构师成长之路_golang架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客 如何画架构图_个人渣记录仅为自己搜索用的博客-CSDN博客 如何画好一张架构图&#xff1f;&#xff08;内含知识图谱&#xff09; - 知乎 什么是架构&#xff1f;要表达的到…

代码随想录算法训练营第二十八天 | Leetcode随机抽题检测

Leetcode随机抽题检测--使用题库&#xff1a;Leetcode热题100 1 两数之和未看解答自己编写的青春版重点题解的代码日后再次复习重新写 49 字母异位词分组未看解答自己编写的青春版重点题解的代码日后再次复习重新写 128 最长连续序列未看解答自己编写的青春版重点关于 left 和 …

黑客技术(网络安全)学习笔记

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识&#xff0c;可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题&#xff0c;可以帮助您更好地解决网络安全的原理和技术…

Qt 2. QSerialPortInfo显示串口信息

在ex2.pro 添加&#xff1a; QT serialport//main.cpp #include "ex2.h" #include <QtSerialPort/QtSerialPort> #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Ex2 w;w.show();QList<QSerialPortInfo>…
最新文章