在本页面中,将探讨iris数据集上不同机器学习模型的性能。iris数据集是一个经典的多类分类问题,包含了150个样本,每个样本有4个特征。将使用决策树、随机森林、极端随机树和AdaBoost这四种模型来进行比较。这些模型都是基于树的集成学习方法,但在构建决策边界和处理特征时有所不同。
首先,来看决策树模型。决策树是一种基本的分类和回归方法,它通过递归地选择最优特征来分裂数据,直到满足停止条件。在iris数据集上,决策树模型能够达到较高的准确率,但可能会受到过拟合的影响。为了解决这个问题,可以调整决策树的最大深度参数,以控制模型的复杂度。
接下来是随机森林模型。随机森林是一种集成学习方法,它通过构建多个决策树并进行投票来提高模型的稳定性和准确性。在iris数据集上,随机森林模型通常能够达到与决策树相似或略高的准确率,并且具有更好的泛化能力。这是因为随机森林在构建每棵树时引入了随机性,从而减少了模型之间的相关性。
极端随机树(ExtraTrees)是另一种集成学习方法,它与随机森林类似,但在构建树时采用了更加极端的随机性。在iris数据集上,极端随机树模型通常能够达到与随机森林相似的性能。然而,由于其更高的随机性,极端随机树在某些情况下可能会比随机森林更加不稳定。
最后,来看AdaBoost模型。AdaBoost是一种自适应增强方法,它通过迭代地提高错误分类样本的权重来提高模型的性能。在iris数据集上,AdaBoost模型通常能够达到较高的准确率,但可能会受到样本不平衡的影响。为了解决这个问题,可以调整AdaBoost的基学习器参数,例如决策树的最大深度,以提高模型的鲁棒性。
在本页面中,还将展示不同模型在iris数据集上不同特征组合下的决策边界。这些决策边界可以帮助直观地理解模型是如何在特征空间中进行分类的。通过比较不同模型的决策边界,可以更好地理解它们在处理iris数据集时的优缺点。
总的来说,iris数据集上的机器学习模型比较可以帮助了解不同模型在实际问题中的性能和适用性。通过调整模型参数和特征组合,可以进一步提高模型的准确率和泛化能力。同时,这些模型的比较也为提供了一个学习和理解机器学习算法的平台。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier, ExtraTreesClassifier, RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
# 参数设置
n_classes = 3
n_estimators = 30
cmap = plt.cm.RdYlBu
plot_step = 0.02 # 决策边界的步长
plot_step_coarser = 0.5 # 粗略分类器猜测的步长
RANDOM_SEED = 13 # 随机种子
# 加载数据
iris = load_iris()
plot_idx = 1
models = [
DecisionTreeClassifier(max_depth=None),
RandomForestClassifier(n_estimators=n_estimators),
ExtraTreesClassifier(n_estimators=n_estimators),
AdaBoostClassifier(DecisionTreeClassifier(max_depth=3), n_estimators=n_estimators, algorithm="SAMME"),
]
for pair in ([0, 1], [0, 2], [2, 3]):
for model in models:
# 只取对应的两个特征
X = iris.data[:, pair]
y = iris.target
# 打乱数据
idx = np.arange(X.shape[0])
np.random.seed(RANDOM_SEED)
np.random.shuffle(idx)
X = X[idx]
y = y[idx]
# 标准化
mean = X.mean(axis=0)
std = X.std(axis=0)
X = (X - mean) / std
# 训练模型
model.fit(X, y)
scores = model.score(X, y)
# 创建每个列的标题和控制台输出
model_title = str(type(model)).split(".")[-1][:-2][:-len("Classifier")]
model_details = model_title
if hasattr(model, "estimators_"):
model_details += " with {} estimators".format(len(model.estimators_))
print(model_details + " with features", pair, "has a score of", scores)
plt.subplot(3, 4, plot_idx)
if plot_idx <= len(models):
# 在每列的顶部添加标题
plt.title(model_title, fontsize=9)
# 现在使用细网格作为输入来绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step), np.arange(y_min, y_max, plot_step))
# 绘制单个决策树分类器或混合集成分类器的决策边界
if isinstance(model, DecisionTreeClassifier):
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, cmap=cmap)
else:
# 根据使用的估计器数量选择alpha混合级别
estimator_alpha = 1.0 / len(model.estimators_)
for tree in model.estimators_:
Z = tree.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, alpha=estimator_alpha, cmap=cmap)
# 构建一个粗略的网格来绘制一组集成分类
xx_coarser, yy_coarser = np.meshgrid(np.arange(x_min, x_max, plot_step_coarser), np.arange(y_min, y_max, plot_step_coarser))
Z_points_coarser = model.predict(np.c_[xx_coarser.ravel(), yy_coarser.ravel()]).reshape(xx_coarser.shape)
cs_points = plt.scatter(xx_coarser, yy_coarser, s=15, c=Z_points_coarser, cmap=cmap, edgecolors="none")
# 绘制训练点,这些点聚集在一起并有黑色轮廓
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=ListedColormap(["r", "y", "b"]), edgecolor="k", s=20)
plot_idx += 1
# 移动到下一个序列中的绘图
plt.suptitle("Classifiers on feature subsets of the Iris dataset", fontsize=12)
plt.axis("tight")
plt.tight_layout(h_pad=0.2, w_pad=0.2, pad=2.5)
plt.show()