自助聚合
每次从总样本矩阵中以有放回抽样的方式,随机抽取部分样本构建决策树, 这样形成多颗包含不同训练本的决策树. 以削弱某些强势样本对模型预测结果的影响. 提高模型的泛化特性.
随机森林
在自助聚合的基础上, 每次构建决策树模型时, 不仅随机选择部分样本, 而且还随机选择部分特征(树的高度不同), 这样的集合算法, 不仅规避了强势样本对预测结果的影响, 而且也削弱了强势特征的影响, 是模型的预测能力更加泛化.
随机森林相关API:
import sklearn.ensemble as se
# 构建随机森林回归器模型
model = se.RandomForestRegressor(
max_depth=4, # 最大深度
n_estimators=1000, # 构建1000棵决策树
# 子表中最小样本数 若<=这个数字则不再继续划分
min_samples_slit=2
)
案例: 分析共享单车的需求, 从而判断如何投放.
"""
demo02_bike.py 共享单车案例 随机森林
"""
import numpy as np
import sklearn.utils as su
import sklearn.ensemble as se
import sklearn.metrics as sm
import matplotlib.pyplot as mp
data = np.loadtxt('../ml_data/bike_day.csv',
delimiter=',', unpack=False,
dtype='U20')
# 获取输入集与输出集
header = data[0, 2:13]
x = np.array(data[1:, 2:13], dtype=float)
y = np.array(data[1:, -1], dtype=float)
# 打乱数据集
x, y = su.shuffle(x, y, random_state=7)
# 拆分训练集,测试集
train_size = int(len(x)*0.9)
train_x, test_x, train_y, test_y = \
x[:train_size], x[train_size:], \
y[:train_size], y[train_size:]
# 随机森林模型训练
model=se.RandomForestRegressor(max_depth=10,
n_estimators=1000, min_samples_split=2)
model.fit(train_x, train_y)
pred_test_y = model.predict(test_x)
# 使用r2得分验证预测结果
print(sm.r2_score(test_y, pred_test_y))
# 输出特征重要性
fi_day = model.feature_importances_
print(fi_day)
print(header)
# 绘制特征重要性柱状图
mp.figure('Bike', facecolor='lightgray')
mp.subplot(211)
mp.title('Day', fontsize=16)
mp.ylabel('Importances', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
pos = np.arange(fi_day.size)
sorted_i = fi_day.argsort()[::-1]
mp.xticks(pos, header[sorted_i])
mp.bar(pos, fi_day[sorted_i],
color='dodgerblue', label='Bike_Day')
mp.legend()
data = np.loadtxt('../ml_data/bike_hour.csv',
delimiter=',', unpack=False,
dtype='U20')
# 获取输入集与输出集
header = data[0, 2:14]
x = np.array(data[1:, 2:14], dtype=float)
y = np.array(data[1:, -1], dtype=float)
# 打乱数据集
x, y = su.shuffle(x, y, random_state=7)
# 拆分训练集,测试集
train_size = int(len(x)*0.9)
train_x, test_x, train_y, test_y = \
x[:train_size], x[train_size:], \
y[:train_size], y[train_size:]
# 随机森林模型训练
model=se.RandomForestRegressor(max_depth=10,
n_estimators=1000, min_samples_split=2)
model.fit(train_x, train_y)
pred_test_y = model.predict(test_x)
# 使用r2得分验证预测结果
print(sm.r2_score(test_y, pred_test_y))
# 输出特征重要性
fi_hour = model.feature_importances_
print(fi_hour)
print(header)
mp.subplot(212)
mp.title('Hour', fontsize=16)
mp.ylabel('Importances', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
pos = np.arange(fi_hour.size)
sorted_i = fi_hour.argsort()[::-1]
mp.xticks(pos, header[sorted_i])
mp.bar(pos, fi_hour[sorted_i],
color='orangered', label='Bike Hour')
mp.legend()
mp.show()
0.8926334392300549
[0.06638183 0.28997887 0.02826374 0.00304802 0.01460011 0.00411691
0.01753458 0.33964001 0.14297167 0.06249903 0.03096522]
['season' 'yr' 'mnth' 'holiday' 'weekday' 'workingday' 'weathersit' 'temp'
'atemp' 'hum' 'windspeed']
0.9186105067675527
[0.02229112 0.08663297 0.00830193 0.64513701 0.00145209 0.00705756
0.06023155 0.01646287 0.12005369 0.01383168 0.01587423 0.0026733 ]
['season' 'yr' 'mnth' 'hr' 'holiday' 'weekday' 'workingday' 'weathersit'
'temp' 'atemp' 'hum' 'windspeed']