Scikit Learn - 随机决策树

本章将帮助您理解 Sklearn 中的随机决策树。

随机决策树算法

众所周知,决策树 (DT) 通常通过递归分割数据进行训练,但由于容易过拟合,因此通过在数据的不同子样本上训练多棵树,将其转换为随机森林。sklearn.ensemble 模块包含以下两种基于随机决策树的算法 −

随机森林算法

对于每个考虑的特征,它会计算局部最优的特征/分割组合。在随机森林中,集成中的每棵决策树都是从训练集中抽取的样本构建的,然后对每个样本进行预测,最终通过投票选出最佳方案。它既可以用于分类任务,也可以用于回归任务。

使用随机森林进行分类

为了创建随机森林分类器,Scikit-learn 模块提供了 sklearn.ensemble.RandomForestClassifier。在构建随机森林分类器时,该模块使用的主要参数是 'max_features' 和 'n_estimators'。

其中,'max_features' 表示在分割节点时要考虑的随机特征子集的大小。如果我们将此参数的值设置为 None,则它将考虑所有特征,而不是随机子集。另一方面,n_estimators 表示森林中树的数量。树的数量越多,结果越好。但计算时间也会更长。

实现示例

在下面的示例中,我们使用 sklearn.ensemble.RandomForestClassifier 构建一个随机森林分类器,并使用 cross_val_score 模块检查其准确率。

from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
X, y = make_blobs(n_samples = 10000, n_features = 10, centres = 100, random_state = 0) RFclf = RandomForestClassifier(n_estimators = 10,max_depth = None,min_samples_split = 2, random_state = 0)
scores = cross_val_score(RFclf, X, y, cv = 5)
scores.mean()

输出

0.9997

示例

我们也可以使用 sklearn 数据集构建随机森林分类器。如下例所示,我们使用了鸢尾花数据集。我们还将计算其准确率和混淆矩阵。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

path = "https://archive.ics.uci.edu/ml/machine-learning-database
s/iris/iris.data"
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
dataset = pd.read_csv(path, names = headernames)
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)
RFclf = RandomForestClassifier(n_estimators = 50)
RFclf.fit(X_train, y_train)
y_pred = RFclf.predict(X_test)
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

输出

Confusion Matrix:
[[14 0 0]
[ 0 18 1]
[ 0 0 12]]
Classification Report:
                  precision recall f1-score support
Iris-setosa       1.00        1.00  1.00     14
Iris-versicolor   1.00        0.95  0.97     19
Iris-virginica    0.92        1.00  0.96     12

micro avg         0.98        0.98  0.98     45
macro avg         0.97        0.98  0.98     45
weighted avg      0.98        0.98  0.98     45

Accuracy: 0.9777777777777777

使用随机森林进行回归

为了创建随机森林回归,Scikit-learn 模块提供了 sklearn.ensemble.RandomForestRegressor。构建随机森林回归器时,它将使用与 sklearn.ensemble.RandomForestClassifier 相同的参数。

实现示例

在以下示例中,我们使用 sklearn.ensemble.RandomForestregressor 构建随机森林回归器,并使用 predict() 方法预测新值。

from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
RFregr = RandomForestRegressor(max_depth = 10,random_state = 0,n_estimators = 100)
RFregr.fit(X, y)

输出

RandomForestRegressor(
   bootstrap = True, criterion = 'mse', max_depth = 10,
   max_features = 'auto', max_leaf_nodes = None,
   min_impurity_decrease = 0.0, min_impurity_split = None,
   min_samples_leaf = 1, min_samples_split = 2,
   min_weight_fraction_leaf = 0.0, n_estimators = 100, n_jobs = None,
   oob_score = False, random_state = 0, verbose = 0, warm_start = False
)

拟合完成后,我们可以从回归模型中预测如下 −

print(RFregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

输出

[98.47729198]

额外树方法

对于每个考虑的特征,它会选择一个随机值进行拆分。使用额外树方法的好处是可以进一步降低模型的方差。使用这些方法的缺点是会稍微增加偏差。

使用 Extra-Tree 方法进行分类

为了使用 Extra-Tree 方法创建分类器,Scikit-learn 模块提供了 sklearn.ensemble.ExtraTreesClassifier。它使用的参数与 sklearn.ensemble.RandomForestClassifier 相同。唯一的区别在于上面讨论的构建树的方式。

实现示例

在下面的示例中,我们使用 sklearn.ensemble.ExtraTreeClassifier 构建一个随机森林分类器,并使用 cross_val_score 模块检查其准确率。

from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import ExtraTreesClassifier
X, y = make_blobs(n_samples = 10000, n_features = 10, centres=100, random_state = 0)
ETclf = ExtraTreesClassifier(n_estimators = 10,max_depth = None,min_samples_split = 10, random_state = 0)
scores = cross_val_score(ETclf, X, y, cv = 5)
scores.mean()

输出

1.0

示例

我们也可以使用 sklearn 数据集,通过 Extra-Tree 方法构建分类器。如下例所示,我们使用了 Pima-Indian 数据集。

from pandas import read_csv

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = KFold(n_splits=10, random_state=seed)
num_trees = 150
max_features = 5
ETclf = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)
results = cross_val_score(ETclf, X, Y, cv=kfold)
print(results.mean())

输出

0.7551435406698566

使用 ExtraTree 方法进行回归

为了创建 ExtraTree 回归,Scikit-learn 模块提供了 sklearn.ensemble.ExtraTreesRegressor。构建随机森林回归器时,它将使用与 sklearn.ensemble.ExtraTreesClassifier 相同的参数。

实现示例

在下面的示例中,我们将应用 sklearn.ensemble.ExtraTreesregressor,并使用与创建随机森林回归器相同的数据。让我们看看输出结果的区别

from sklearn.ensemble import ExtraTreesRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
ETregr = ExtraTreesRegressor(max_depth = 10,random_state = 0,n_estimators = 100)
ETregr.fit(X, y)

输出

ExtraTreesRegressor(bootstrap = False, criterion = 'mse', max_depth = 10,
   max_features = 'auto', max_leaf_nodes = None,
   min_impurity_decrease = 0.0, min_impurity_split = None,
   min_samples_leaf = 1, min_samples_split = 2,
   min_weight_fraction_leaf = 0.0, n_estimators = 100, n_jobs = None,
   oob_score = False, random_state = 0, verbose = 0, warm_start = False)

示例

拟合后,我们可以从回归模型预测如下 −

print(ETregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

输出

[85.50955817]