随机森林是一种集成学习方法
集成学习通过建立几个模型组合的方法来解决单一预测问题。他的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类作出的预测。
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。例如,如果你训练了5个树,其中有4个树的结果是True,1个树的结果为False,那么最终的投票结果就是True。
两个随机(假设N个样本,M个特征)
训练集随机:从N个样本中随机有放回得抽样N个
BootStrap(非前端框架):随机有放回的抽样
特征值随机:从M个特征中随机的抽取m个特征(M >> m)
为什么随机抽样?
答:如果不进行随机抽样,每颗树的训练集都一样,那么最终训练出来的树分类结果也是完全一样的;
为什么有放回抽样?
答:如果不是有放回的抽样,那么每颗树的训练样本是不一样的,都是没有交集的,这样每颗树都是有偏
sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion='gini',max_depth=None,bootstrap=True,random_state=None,min_samples_split=2)
- 随机森林分类器
- n_estimators:integer,optional(default=10)森林里的树木数量
- criterion:string,可选(default='gini')分割特征的测量方法
- max_depth:integer或None,可选(默认无)树的最大深度
- max_features='auto' 每个决策树的最大特征数量
1.if 'auto',then max_feature=sqrt(n_features)
2.if 'sqrt',then max_features=sqrt(n_features)(same as suto)
3.if 'log2',then max_features=log2(n_features)
4.if None,then max_features=n_features
- bootstrap:boolean,optional(default = True)在构建树时是否放回抽样
- min_samples_split:节点划分最少样本树
- min_samples_leaf:叶子节点最小样本数
代码如下所示(加入了超参数搜索):
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
def titanic_demo():
# 1)、获取数据
titanic = pd.read_csv("/Users/dengzhao/Desktop/数据集/titanic/train.csv")
# 2)、筛选特征值和目标值
x = titanic[["Pclass","Age","Sex"]]
y = titanic["Survived"]
# 3)、缺失值处理
x["Age"].fillna(x["Age"].mean(),inplace=True)
# 4、转换成字典
x = x.to_dict(orient="records")
# 5)、数据集的划分
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22)# random_state随机数种子
# 6)、字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 7)、转换器
estimator = RandomForestClassifier()
# 8)、模型评价
# 加如网格搜索和交叉验证
# 参数准备
param_dic = {"n_estimators": [120,200,300,500,800,1200],'max_depth':[5,8,10,12,14]}
estimator = GridSearchCV(estimator, param_grid=param_dic, cv=3)
estimator.fit(x_train, y_train)
# 5)模型评估
"""评估方法1:直接比对真实值和预测值"""
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
"""评估方法2:计算准确率"""
score = estimator.score(x_test, y_test) # 相当于计算了预估器的准确率,因为这里本来是完全一致的
print("准确率:\n", score)
# 最佳参数:best_params_
print("最佳参数\n", estimator.best_params_)
# 最佳结果:best_score_
print("最佳结果\n", estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器\n", estimator.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果\n", estimator.cv_results_)
return
if __name__ == '__main__':
titanic_demo()
结果如下:
准确率:
0.7623318385650224
最佳参数
{‘max_depth’: 5, ‘n_estimators’: 120}
最佳结果
0.8174093375887098
最佳估计器
RandomForestClassifier(max_depth=5, n_estimators=120)