分类算法之随机森林
作者:互联网
一、集成学习方法之随机森林
集成学习通过建立几个模型组合来解决单一模型预测的问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
1、什么是随机森林
随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。假设你训练了n棵树,其中有n-2棵树的结果类别是1,2棵树的结果的类别是2,那么最后的类别结果就是1。
2、随机森林创建流程
在创建随机森林之前,我们需要先知道随机森林中单棵决策树的创建流程:
- 随机在N个样本中以有放回抽样的方式,取样N次(样本有可能重复)
- 随机在M个特征中选出m个特征(m<M)
可以以这种方式创建多棵树,显然每棵树的样本和特征大多不一样。
值得注意的是上面的抽样是:有放回的抽样,如果不是有放回的抽样,这样每棵树的训练样本都是不同,之间也没有交集,也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树的投票表决。
二、集成学习API
1、class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None)
上述就是随机森林的分类器,其中:
- n_estimators:integer,optional(default = 10) 森林里的树木数量
- criteria:string,可选(default =“gini”)分割特征的测量方法
- max_depth:integer或None,可选(默认=无)树的最大深度
- bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
2、实例
import pandas as pd from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.feature_extraction import DictVectorizer from sklearn.ensemble import RandomForestClassifier def decision(): """ 决策树对泰坦尼克号乘客进行生死预测 :return: None """ # 读取数据 data = pd.read_csv("./data/决策树数据/data.csv") # 选取特征值、目标值 x = data[['pclass', 'age', 'sex']] y = data['survived'] # 处理缺失值 x['age'].fillna(x['age'].mean(), inplace=True) print(x) """ pclass age sex 1st 29.000000 female 1st 2.000000 female ... """ # 分割数据集为训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 特征工程,pclass与sex都是非数字的值,所以需要将其值得类别进行one-hot编码,使用字典抽取,age值不变 dict = DictVectorizer(sparse=False) x_train = dict.fit_transform(x_train.to_dict(orient='records')) x_test = dict.transform(x_test.to_dict(orient='records')) print(dict.get_feature_names()) # ['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male'] print(x_train) """ [[32. 0. 0. 1. 0. 1. ] ... [58. 1. 0. 0. 1. 0. ] [35. 0. 1. 0. 0. 1. ] [31.19418104 0. 0. 1. 0. 1. ]] """ # 用随机森林进行预测(超参数调优) rf = RandomForestClassifier() param = {"n_estimators":[120, 200, 300, 500],"max_depth":[5, 8, 15]} # 网格搜索与交叉验证 gc = GridSearchCV(rf,param_grid=param,cv=2) gc.fit(x_train,y_train) # 准确率 print(gc.score(x_test,y_test)) #参数模型 print(gc.best_params_) """ {'max_depth': 5, 'n_estimators': 300} """ if __name__ == '__main__': decision()
随机森林几乎没有什么缺点,它有以下的优点:
- 在当前所有算法中,具有极好的准确率
- 能够有效地运行在大数据集上
- 能够处理具有高维特征的输入样本,而且不需要降维
- 能够评估各个特征在分类问题上的重要性
- 对于缺省值问题也能够获得很好得结果
标签:分类,pclass,算法,train,dict,随机,test,森林 来源: https://www.cnblogs.com/shenjianping/p/13171037.html