- 随机森林(Random Forests) 是集成学习算法的一种。集成学习是通过组合多个学习器来完成学习任务。随机森林是结合多颗决策树来对样本进行训练和预测。随机森林通过随机扰动而令所有的树去相关。
- 随机森林可以使用巨量的预测器,甚至预测器的数量比观察样本的数量还多。采用随机森林方法最显著的优势是它能获得更多的信息以减少拟合数值和估计分割的偏差。通常我们会有一些预测器能主导决策树的拟合过程,因为它们的平均性能始终要比其他一些竞争预测器更好。
- 随机森林有三个主要的超参数调整:
- 结点规模:随机森林不像决策树,每一棵树叶结点所包含的观察样本数量可能十分少。该超参数的目标是生成树的时候尽可能保持小偏差。
- 树的数量:在实践中选择数百棵树一般是比较好的选择。
- 预测器采样的数量:如果我们一共有 D 个预测器,那么我们可以在回归任务中使用 D/3 个预测器数作为采样数,在分类任务中使用 D^(1/2) 个预测器作为抽样。
【我理解这句话的意思是说随机森林里的树训练好后再对树进行采样,减少应用时的计算量?】
代码:5-折交叉验证的网格搜索来对随机森林超参数寻优:
from sklearn.model_selection import GridSearchCV
parameters = {'n_estimators':(100, 500, 1000),'max_depth':(None, 24, 16),'min_samples_split': (2, 4, 8),'min_samples_leaf': (16, 4, 12)}
clf = GridSearchCV(RandomForestClassifier(), parameters, cv=5, n_jobs=8)
clf.fit(x_train, y_train)
clf.best_score_, clf.best_params_
best_rf_model = grid_search.best_estimator_
0.86606676699118579
{'max_depth': 24,
'min_samples_leaf': 4,
'min_samples_split': 4,
'n_estimators': 1000}
- 随机森林有点:
- 数据不需要归一化
- 随机森林局限性:
- 随机森林不擅长推断超出范围的独立变量或非独立变量,MARS 算法更合适;
- 随机森林算法在训练和预测时都比较慢;
- 分类数量太多时随机森林算法效果不好;
- 下一步改进方向:一般来说随机森林可以解决的问题都可以用梯度提升树算法。随机森林精度、计算复杂度均差于梯度提升树算法。
相关代码示例(只保留了关键代码):
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import mean_squared_error
rf = RandomForestRegressor(n_estimators=100, random_state=42)
X, Y = create_dataset(cur_data, global_look_back)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=42)
rf.fit(X_train, Y_train)
trainPredict = rf.predict(X_train)
testPredict = rf.predict(X_test)
trainMSE = mean_squared_error(Y_train, trainPredict) # 训练集误差
testMSE = mean_squared_error(Y_test, testPredict) # 测试集误差
模型保存与加载:
with open(os.path.join(save_model_dir, sname), 'wb') as file:
pickle.dump(rf, file)
with open(fpath, 'rb') as file:
model = pickle.load(file)
Reference
1.机器之心:从决策树到随机森林:树型算法的原理与实现
2.paddle社区 随机森林算法