在这篇文章中,将探讨为什么在已经拥有决策树算法的情况下,还需要学习随机森林算法。随机森林究竟是什么?它与决策树有何不同?随机森林同样是一种监督学习算法,广泛应用于分类和回归任务。然而,决策树存在过拟合问题,即模型过于复杂,过于紧密地拟合数据,导致在未见过的数据上无法做出准确的预测。随机森林算法通过构建多个决策树并结合它们的预测来解决这一问题,从而得出更准确的预测结果。
理解集成学习的基础知识。熟悉随机森林的基本概念。了解构建完整随机森林过程中每一步的重要性。使用Python实现随机森林的实际应用。理解如何解决过拟合问题。还将了解随机森林如何提高模型的鲁棒性。
在决策树中,只有一棵树来回答问题。例如,如果想购买一部手机,可以使用以下决策树来决定是否购买iPhone或Android手机。但在现实生活中,不会只问一个人的意见,会咨询家人、朋友、专家和销售人员。假设每棵树都像每个人一样,如果问10个人(8人说iPhone,2人说Android),在随机森林分类中,最终输出基于多数投票。将购买iPhone。
如果构建的是回归模型,使用平均值。将结合多个决策树模型的过程称为随机森林。但是,可以将多个模型(如逻辑回归、朴素贝叶斯和KNN)结合起来吗?如果可以,称之为什么?称之为Bagging和Boosting。它们是机器学习中用于通过结合多个模型的预测来提高单一模型性能的两种集成方法。
Bagging是一种结合多个模型的方法;可以是任何模型,如上面讨论的knn、朴素贝叶斯、逻辑回归等。但是,结果将是一样的,因为所有模型的数据输入将相同。为了处理这个问题,将使用自助聚合器。例如,如果有10个模型,每个模型都训练在训练数据的不同子集上。最终预测通常是所有模型预测的平均值或多数投票。此外,Bagging还通过上述两点减少方差。
相反,BOOSTING通过结合弱学习器来产生强学习器。在上面的图像中,可以看到它遵循顺序训练。
是的,可以通过四个简单的步骤来理解随机森林的工作原理。但是,在此之前,需要理解一个关于随机森林的问题。随机森林属于哪种集成学习?它属于Bagging,构建多个决策树称为随机森林。理解随机森林需要分步骤的方法。以下是分步指南。
# 导入必要的库
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
# 从sklearn库加载iris数据集
data = load_iris()
# 将iris数据转换为以特征名为列名的Pandas数据框
df = pd.DataFrame(data.data, columns=data.feature_names)
# 使用目标名称和目标代码向数据框添加新列'target'
df['target'] = pd.Categorical.from_codes(data.target, data.target_names)
# 打印数据框的前5行
print(df.head())
当有一个训练数据集时,模型会创建一个替换的自助样本。什么是自助?从实际训练数据集中创建多个子集。如何在训练数据集中创建多个子集,并且有行和列?什么是替换?行:当说替换时(参考下图以获得更好的理解),在子集中,可以有同一行多次。如在子集2中看到的,第二行重复了2次,在子集3中,第一行重复了2次。列:1. 对于分类,它是总特征数的平方根。例如,假设总共有4个特征,对于每个子集将有2个特征。2.回归:总特征数除以3。
# 导入train_test_split函数
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 导入RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
classifier_rf = RandomForestClassifier(random_state=42, n_jobs=-1, n_estimators=20)
# 拟合训练数据
classifier_rf.fit(X_train, y_train)
# 在测试数据上进行预测
y_pred = classifier_rf.predict(X_test)
# 导入评估函数
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
# 打印混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))