Bagging(Bootstrap aggregating)
让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中可以出现多次或根本不出现,训练之后可得到一个预测函数序列h_1,⋯ ⋯h_n ,最终的预测函数H对分类问题采用投票方式,对回归问题采用简单平均方法对新示例进行判别。训练R个分类器f_i,分类器之间其他相同就是参数不同。其中f_i是通过从训练集合中(N篇文档)随机取(取后放回)N次文档构成的训练集合训练得到的。对于新文档d,用这R个分类器去分类,得到的最多的那个类别作为d的最终类别。
Bagging算法可与其他分类,回归算法结合,提高其准确率、稳定性的同时,通过降低结果的方差,避免过拟合的发生。
随机森林
随机森林在bagging基础上做了修改。
从样本集中用Bootstrap采样选出n个样本;
从所有属性中随机选择k个属性,选择最佳分割属性作为节点建立CART决策树;
重复以上两步m次,即建立了m棵CART决策树
这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类
可以使用决策树作为基本分类器
但也可以使用SVM、 Logistic回归等其他分类器,习惯上,这些分类器组成的“总分类器”,仍然叫做随机森林
投票机制:
一票否决(一致表决)
少数服从多数
有效多数(加权)
阈值表决
根据投票机制得到分类结果
评价:
在随机森林中,无需交叉验证来评价其分类的准确性,随机森林自带OOB(out-of-bag)错误估计:
OOB:在构造单棵决策树时我们只是随机有放回的抽取了N个样例,所以可以用没有抽取到的样例来测试这棵决策树的分类准确性,这些样例大概占总样例数目的三分之一
代码事例:
1 from sklearn.datasets import load_iris 2 from sklearn.ensemble import RandomForestClassifier 3 import pandas as pd 4 import numpy as np 5 6 iris = load_iris() 7 df = pd.DataFrame(iris.data, columns=iris.feature_names) 8 df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75 9 df['species'] = pd.Factor(iris.target, iris.target_names) 10 #print(df.head()) 11 12 train, test = df[df['is_train']==True], df[df['is_train']==False] 13 14 features = df.columns[:4] 15 clf = RandomForestClassifier(n_jobs=2) 16 y, _ = pd.factorize(train['species']) 17 clf.fit(train[features], y) 18 19 preds = iris.target_names[clf.predict(test[features])] 20 print(pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds']))