使用Python与Scikit-learn实现随机森林分析

参考资料

随机森林(RandomForest)算法

随机森林属于集成学习(Ensemble Learning)的一类算法,结合了多种相同类型的算法,即多个决策树,从而形成了一个随机森林树。

随即森林是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。上世纪八十年代Breiman等人发明分类树的算法(Breiman et al. 1984),通过反复二分数据进行分类或回归,计算量大大降低。2001年Breiman把分类树组合成随机森林(Breiman 2001a),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果。随机森林在运算量没有显著提高的前提下提高了预测精度。随机森林对多元公线性不敏感,结果对缺失数据和非平衡的数据比较稳健,可以很好地预测多达几千个解释变量的作用(Breiman 2001b),被誉为当前最好的算法之一(Iverson et al. 2008)。

参考:https://zhuanlan.zhihu.com/p/22097796

随机森林工作原理

image.png

随机森林优缺点

优点

  • 准确度高
  • 没有过拟合问题
  • 可用于分类和回归问题
  • 可以处理缺失值,一是用中位数代替连续变量,二是计算缺失值的近似加权平均值;也可用于没有归一化的问题

缺点

  • 速度慢
  • 与决策树相比较难解释

随即森林与决策树

  • 随机森林是一组多决策树。
  • 深度决策树可能会出现过拟合,但随机森林通过在随机子集上创建树来防止过拟合。
  • 决策树的计算速度更快。
  • 随机森林很难解释,而决策树很容易解释,可以转换为规则。

利用Scikit-learn实现随即森林的分析

随机森林通过 RandomForestClassifier实现分类问题

随机森林通过 RandomForestRegressor 实现回归问题

1
2
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor

随机森林解决回归问题

  • 问题

根据汽油税(美分),人均收入(美元),已铺设的高速公路(以英里为单位)和驾驶执照人口与汽油税的比例,来预测美国48个州的汽油消耗量(百万加仑)。

数据链接:https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_/view

  • 读入数据
1
2
dataset = pd.read_csv('petrol_consumption.csv')
dataset.head()

image.png

  • 数据前处理

提取’attributes’ 和 ‘label’; 拆分测试数据和训练数据集

注意:random_state 设置随机数种子,以保证多次运行的结果相同

1
2
3
4
5
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
  • 数据归一化(Feature Scaling)
1
2
3
4
5
6
# Feature Scaling
from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
  • 训练模型

注意:重要参数 n_estimators , 表示随机森林树的数目

1
2
3
4
5
from sklearn.ensemble import RandomForestRegressor

regressor = RandomForestRegressor(n_estimators=20, random_state=0)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
  • 模型评估
1
2
3
4
5
from sklearn import metrics

print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

image.png

当参数改为200时,模型评估结果提升了n_estimators=200

image.png

随机森林解决分类问题

  • 问题:根据四个属性(即图像小波变换后的图像的方差,偏度,熵和图像的弯曲度)来预测银行纸币是否真实
  • 读入数据
1
2
3
4
import pandas as pd
import numpy as np
dataset = pd.read_csv("D:/Datasets/bill_authentication.csv")
dataset.head()

image.png

  • 数据预处理
1
2
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values

拆分测试数据和训练数据

1
2
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
  • 归一化
1
2
3
4
5
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
  • 训练模型
1
2
3
4
from sklearn.ensemble import RandomForestClassifier
regressor = RandomForestClassifier(n_estimators=20, random_state=0)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
  • 模型评估
1
2
3
4
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))
print(accuracy_score(y_test, y_pred))

image.png

这里将n_estimators=20 改为200时,结果并没有明显改变

image.png