随机森林

Reads: 768 Edit

1 数据说明

我们以sklearn自带的鸢尾花数据集(Iris)为例来预测花的物种。

2 导入所需模块

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,precision_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.metrics import roc_curve
from sklearn.metrics import RocCurveDisplay
from sklearn.ensemble import RandomForestClassifier

3 读取数据并划分为训练样本和测试样本

随机森林模型会给出特征重要性,所以这里将X变换为数据框格式,并加入特征的名字。

# 获取鸢尾花数据集(Iris),将数据分成特征变量和目标变量
iris = datasets.load_iris()

X, y = datasets.load_iris(return_X_y=True)
X = pd.DataFrame(data=X, columns=iris.feature_names)
# 将数据分成训练样本和测试样本
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.3)

4 模型训练

# 训练模型
# 定义AdaBoost模型
n_estimators=50
RForest = RandomForestClassifier(max_depth=1, random_state=0).fit(X_train, y_train)

5 模型评价

# 预测目标变量
y_test_pred = RForest.predict(X_test)
# 模型评价
print('准确率为:', accuracy_score(y_test,y_test_pred))
print('精确率为:', precision_score(y_test,y_test_pred,average=None))

准确率为: 0.9555555555555556
精确率为: [1. 1. 0.84615385]

print('使用AdaBoost预测iris数据的分类报告为:','\n',classification_report(y_test,y_test_pred))
# 混淆矩阵
print('使用AdaBoost预测iris数据的混淆矩阵为:','\n',confusion_matrix(y_test,y_test_pred))

pyt-147

# 特征重要性排名
feature_names=RForest.feature_names_in_
mdi_importances = pd.Series(
    RForest.feature_importances_, index=feature_names
).sort_values(ascending=True)
ax = mdi_importances.plot.barh()
ax.set_title("随机森林特征重要性")
ax.figure.tight_layout()
plt.rc('axes', unicode_minus=False)              ## 解决坐标轴符号显示乱码问题!
plt.rcParams['font.sans-serif'] = ['SimHei']        # 解决中文显示乱码问题!
plt.show()

pyt-148

6 弱分类器的数量与误差的关系图

# 弱分类器数量与误差关系图
# 绘制sqrt的误差
n_est1=np.array([])
err1=np.array([])
RF_sqrt=RandomForestClassifier(
    warm_start=True,
    oob_score=True,
    max_features="sqrt",
    random_state=123,
)
for i in range(1, 50+1):
    RF_sqrt.set_params(n_estimators=i)
    RF_sqrt.fit(X_train, y_train)
    oob_error = 1 - RF_sqrt.oob_score_
    n_est1=np.append(n_est1,i)
    err1=np.append(err1,oob_error)
plt.plot(n_est1,err1,label='sqrt', marker="o")

#绘制log2的误差
n_est2=np.array([])
err2=np.array([])
RF_log2=RandomForestClassifier(
    warm_start=True,
    oob_score=True,
    max_features="log2",
    random_state=123,
)
for i in range(1, 50+1):
    RF_log2.set_params(n_estimators=i)
    RF_log2.fit(X_train, y_train)
    oob_error = 1 - RF_log2.oob_score_
    n_est2=np.append(n_est2,i)
    err2=np.append(err2,oob_error)
plt.plot(n_est2,err2,label='log2')

#绘制None的误差
n_est3=np.array([])
err3=np.array([])
RF_none=RandomForestClassifier(
    warm_start=True,
    oob_score=True,
    max_features=None,
    random_state=123,
)
for i in range(1, 50+1):
    RF_none.set_params(n_estimators=i)
    RF_none.fit(X_train, y_train)
    oob_error = 1 - RF_none.oob_score_
    n_est3=np.append(n_est3,i)
    err3=np.append(err3,oob_error)
plt.plot(n_est3,err3,label='None')

plt.xlim(1, 50)
plt.xlabel("弱分类器数量")
plt.ylabel("OOB误差率")
plt.legend(loc="upper right")
plt.rc('axes', unicode_minus=False)              ## 解决坐标轴符号显示乱码问题!
plt.rcParams['font.sans-serif'] = ['SimHei']        # 解决中文显示乱码问题!
plt.show()

pyt-149

7 SVM的图形展示

鸢尾花数据集(Iris)有6个特征变量,因而无法绘制出svm在6维空间的分类图形。这里仅取前2个特征变量,演示svm模型在2维空间的分类图示。

# 绘制SVM的二维图示
X, y = datasets.load_iris(return_X_y=True)
X = X[:, 0:2]
# 将数据分成训练样本和测试样本
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.7)

# 训练模型
RForest2 = RandomForestClassifier(max_depth=5, random_state=0).fit(X_train, y_train)


# 设置绘图颜色、坐标轴范围
cm = plt.cm.RdBu
cm_bright = ListedColormap(["#FF0000", "#0000FF", "chartreuse"])

DecisionBoundaryDisplay.from_estimator(RForest2 , X_train, cmap=cm, alpha=0.8, eps=0.5)

x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5

# 绘制训练样本的散点
plt.scatter(
    X_train[:, 0],
    X_train[:, 1],
    c=y_train,
    cmap=cm_bright,
    edgecolors="k"
)
# 绘制测试样本的散点
plt.scatter(
    X_test[:, 0],
    X_test[:, 1],
    c=y_test,
    cmap=cm_bright,
    edgecolors="k",
    alpha=0.6,
    marker='^',
)

plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)

plt.show()

pyt-150



获取案例数据和源代码,请关注微信公众号并回复:Python_dt26


Comments

Make a comment