(1)什么是随机森林?
- 集成学习方法:集成学习通过建立几个模型组合来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立的学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的方法作出预测。
- 随机森林:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
(2)随机森林建立多个决策树的过程
单个决策树建立过程如下:
- 对于N个样本,M个特征的数据
- 随机在N个样本中选择一个样本,重复N次;样本有可能重复。
- 随机在M个特征中选取m个特征,其中m<M,建立决策树;
- 采取bootstrap进行抽样。
为什么要随机抽样?
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样。
为什么要有放回的抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,每棵树的训练结果存在较大的差异。而随机森林最后的分类取决于多棵树(弱分类器)的投票结果。
(3)随机森林API:
sklearn.ensemble.RandomForestClassifier
模型调参利器- GridSearchCV(网格搜索)
GridSearchCV的sklearn官方网址:
对上文中泰坦尼克号的案例使用随机森林预测示例:
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.feature_extraction import DictVectorizer
# from sklearn.cross_validation import train_test_split # 已经更新为下边api
from sklearn.model_selection import train_test_split,GridSearchCV
import pandas as pd
def forest():
'''
对泰坦尼克号预测生死
数据地址:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
:return None
'''
# 读取数据
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 处理数据,找出特征值和目标值
x = titan[["pclass", 'age', 'sex']] #特征值
y = titan[['survived']] # 目标值
# print(x)
# 缺失值处理
x['age'].fillna(x['age'].mean(), inplace=True)
# 分割数据集到训练集合,测试集合.数据随机切分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 进行处理(特征工程)特征->类别-> one-hot编码
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names())
x_test = dict.fit_transform(x_test.to_dict(orient='records'))
# print (x_train)
# 随机森林进行预测(超参数调优)
rf = RandomForestClassifier()
param = {"n_estimators":[120,200,300,500,800,1200],'max_depth':[5,8,15,25,30]}
# 网格搜索与交叉验证
gc = GridSearchCV(rf, param_grid=param)
gc.fit(x_train, y_train)
print("准确率:",gc.score(x_test,y_test))
print("查看选择的参数模型:",gc.best_params_)
return None
if __name__== "__main__":
forest()
(4)、随机森林的优点
在当前所有的算法中,具有极好的准确率;
能够有效的运行在大数据集上;
能够处理具有高维特征的输入样本,而且不需要降维;
能够评估各个特征在分类问题上的重要性。