Python从0到100(五十八):机器学习-随机森林及对复杂数据集分类
前言:
零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!
随机森林通过构建多个决策树来完成分类或回归任务。随机森林的核⼼思想是通过多个弱学习器(决策树)的集成来构建⼀个强学习器,从⽽提⾼模型的泛化能⼒和稳定性。
1.基本原理
随机森林的基本原理如下:
- 从训练集中随机抽取⼀定数量的样本(有放回抽样),构建⼀个决策树(称为⾃助采样法或bootstrap采样)。
- 在每个决策树的节点上,随机选择⼀部分特征进⾏划分。
- 对每棵树进⾏训练,直到达到指定的树的数量。
- 对于分类问题,采⽤投票法来确定最终的分类结果;对于回归问题,采⽤平均法来确定最终的回归结果。
2.如何选择适当的超参数构建随机森林
选择适当的超参数来构建随机森林模型⾮常重要,因为它们可以显著影响模型的性能和泛化能⼒。
下⾯是⼀些常⻅的随机森林超参数以及如何选择它们的⼀些建议⽅法:
1、树的数量(n_estimators):
这是随机森林中包含的决策树的数量。
选择⽅法:通常情况下,增加树的数量可以提⾼模型的性能,但也会增加计算成本。您可以使⽤交叉验证或验证集的性能来选择适当数量的树。当性能趋于稳定时,不再增加树的数量。
2、树的深度(max_depth):
这是每棵决策树的最⼤深度,控制了树的复杂性。
选择⽅法:可以通过绘制学习曲线来选择最⼤深度。学习曲线显示了训练误差和验证误差随最⼤深度的变化情况。通常,最⼤深度不宜过⼤,以防⽌过拟合。
3、特征数量的选择(max_features):
这是每个节点⽤于分裂的特征的最⼤数量。
选择⽅法:通常,max_features设置为"auto"(等于总特征数的平⽅根)是⼀个不错的起点。您也可以尝试其他值,如"log2"或⼀个特定的整数值。通过交叉验证或验证集来确定最佳值。
4、最⼩叶⼦节点样本数(min_samples_leaf):
这是叶⼦节点上所需的最⼩样本数,⽤于控制树的⽣⻓。
选择⽅法:增加此参数可以防⽌树在训练数据上过拟合。通常情况下,设置⼀个较⼩的值,如1,以允许树⽣⻓到较⼩的叶⼦节点。然后,通过交叉验证或验证集来选择最佳值。
5、最⼩分裂节点样本数(min_samples_split):
这是⼀个节点分裂所需的最⼩样本数。
选择⽅法:类似于min_samples_leaf,增加此参数可以防⽌过拟合。通常,可以选择⼀个适中的值,然后通过交叉验证或验证集来调整。
6、随机种⼦(random_state):
这是⽤于控制模型的随机性的种⼦值。
选择⽅法:为了可重复性,通常建议设置⼀个固定的随机种⼦。这可以确保多次运⾏模型时得到相同的结果。
超参数的选择通常需要进⾏实验和调整,可以使⽤交叉验证来评估不同超参数组合的性能,然后选择最佳组合。Grid Search和Random Search等⾃动调参技术也可⽤于更全⾯地搜索超参数空间。最终的选择应基于具体问题和
数据集的性质来决定。
3.优缺点
优点:
- ⾼准确性:随机森林能够取得较⾼的准确性,在许多数据集上都有良好的表现。
- 抗过拟合能⼒强:随机森林能够有效地降低过拟合的⻛险,因为它对多个决策树的预测结果进⾏了集成。
- 能够处理⾼维数据:随机森林能够处理⾼维数据和⼤规模数据集,并且不需要进⾏特征选择。
缺点:
- 模型解释性较差:由于随机森林是⼀个集成模型,因此难以解释单个决策树的预测过程。
- 训练时间较⻓:由于需要构建多棵决策树并集成它们的结果,随机森林的训练时间较⻓。
- 对噪声敏感:随机森林对噪声和异常值⽐较敏感,可能会影响模型的性能。
4.适用场景
随机森林适⽤于以下场景:
- 分类和回归问题:随机森林适⽤于分类和回归问题,并且在许多不同类型的数据集上都有良好的表现。
- ⼤规模数据集:随机森林能够处理⼤规模数据集,并且不需要进⾏特征选择,因此适⽤于处理⾼维数据和⼤
规模数据集。 - 数据特征具有复杂交互关系:随机森林能够有效地处理数据特征之间的复杂交互关系,因此适⽤于处理特征
之间存在较强关联性的问题。
总之,随机森林是⼀种强⼤的集成学习算法,具有⾼准确性和抗过拟合能⼒强的优点,适⽤于处理多种类型的分类和回归问题。然⽽,在解释模型结果和训练时间⽅⾯可能存在⼀些挑战。
5.对复杂数据集分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from matplotlib.colors import ListedColormap
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, [2, 3]] # 取特征的后两个维度
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建随机森林模型
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_clf.fit(X_train, y_train)
# 在测试集上进⾏预测
y_pred = rf_clf.predict(X_test)
# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# 可视化决策边界
def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
markers = ('s', 'x', 'o', '^', 'v')
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max,
resolution))
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
for idx, cl in enumerate(np.unique(y)):
plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=[cmap(idx)],
marker=markers[idx], label=cl, edgecolor='black')
if test_idx:
X_test, y_test = X[test_idx, :], y[test_idx]
plt.scatter(X_test[:, 0], X_test[:, 1], c='', edgecolor='black', alpha=1.0,
linewidth=1, marker='o', s=100, label='Test Set')
plot_decision_regions(X_train, y_train, classifier=rf_clf)
plt.title('Random Forest Classifier - Decision Boundary (Training Set)')
plt.xlabel('Petal Length (cm)')
plt.ylabel('Petal Width (cm)')
plt.legend(loc='upper left')
plt.show()
⾸先加载了鸢尾花数据集,并将特征选取为后两个维度以便在⼆维平⾯上可视化。然后构建了⼀个随机森林分类器,并在训练集上训练模型。接着,使⽤ plot_decision_regions 函数绘制了训练集的决策边界,其中不同颜⾊的区域表示不同类别的决策区域。
6.获取随机森林特征分数
在Scikit-Learn中,可以使⽤ feature_importances_
属性来获取随机森林模型中特征的重要性分数:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 创建随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
rf_classifier.fit(X, y)
# 获取特征重要性分数
feature_importance_scores = rf_classifier.feature_importances_
# 可视化特征重要性
plt.figure(figsize=(13, 6))
plt.barh(range(len(feature_importance_scores)), feature_importance_scores,
tick_label=iris.feature_names)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title('Feature Importance in Random Forest')
plt.show()
使⽤了鸢尾花数据集,创建了⼀个包含100棵树的随机森林分类器,并训练了模型。然后,通过feature_importances_ 属性获取了每个特征的重要性分数,并使⽤matplotlib库绘制了特征重要性的条形图:
- 点赞
- 收藏
- 关注作者
评论(0)