集成学习的思想是将若干个学习器(分类器&回归器)组合之后产生一个新学习器。 弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测的分类器(error rate < 0.5);
集成算法的成功在于保证弱分类器的多样性(Diversity)。而且集成不稳定的算法 也能够得到一个比较明显的性能提升。
常见的集成学习思想有:
Bagging
Boosting
Stacking
Bagging方法又叫做自举汇聚法(Bootstrap Aggregating),思想是:在原始数 据集上通过有放回的抽样的方式,重新选择出S个新数据集来分别训练S个分类器 的集成技术。也就是说这些模型的训练数据中允许存在重复数据。
Bagging方法训练出来的模型在预测新样本分类的时候,会使用多数投票或者求 均值的方式来统计最终的分类结果。
Bagging方法的弱学习器可以是基本的算法模型,eg: Linear、Ridge、Lasso、 Logistic、Softmax、ID3、C4.5、CART、SVM、KNN等。
备注:Bagging方式是有放回的抽样,并且每个子集的样本数量必须和原始样本 数量一致,但是子集中允许存在重复数据。
随机森林是在Bagging策略的基础上进行修改后的一种算法 从样本集中用Bootstrap采样选出n个样本;
从所有属性中随机选择K个属性,选择出最佳分割属性作为节点创建决策树; 重复以上两步m次,即建立m棵决策树; 这m个决策树形成随机森林,通过投票表决结果决定数据属于那一类。
常见的RF变种算法如下:
Extra Tree;Totally Random Trees Embedding(TRTE) ;Isolation Forest
Extra Tree是RF的一个变种,原理基本和RF一样,区别如下:
TRTE是一种非监督的数据转化方式。将低维的数据集映射到高维,从而让映射 到高维的数据更好的应用于分类回归模型。
TRTE算法的转换过程类似RF算法的方法,建立T个决策树来拟合数据。当决策 树构建完成后,数据集里的每个数据在T个决策树中叶子节点的位置就定下来了, 将位置信息转换为向量就完成了特征转换操作。
案例:有3棵决策树,每棵决策树有5个叶子节点,某个数据x划分到第一个决策 树的第3个叶子节点,第二个决策树的第一个叶子节点,第三个决策树的第第五 个叶子节点,那么最终的x映射特征编码为:(0,0,1,0,0, 1,0,0,0,0, 0,0,0,0,1)
IForest是一种异常点检测算法,使用类似RF的方式来检测异常点;IForest算法 和RF算法的区别在于:
在随机采样的过程中,一般只需要少量数据即可;
在进行决策树构建过程中,IForest算法会随机选择一个划分特征,并对划分特征 随机选择一个划分阈值;
IForest算法构建的决策树一般深度max_depth是比较小的。
区别原因:目的是异常点检测,所以只要能够区分异常的即可,不需要大量数据;
另外在异常点检测的过程中,一般不需要太大规模的决策树
RF的主要优点:
训练可以并行化,对于大规模样本的训练具有速度的优势;
由于进行随机选择决策树划分特征列表,这样在样本维度比较高的时候,仍然具有比较高 的训练性能;
给以给出各个特征的重要性列表;
由于存在随机抽样,训练出来的模型方差小,泛化能力强; 5. RF实现简单;
对于部分特征的缺失不敏感。
RF的主要缺点:
在某些噪音比较大的特征上,RF模型容易陷入过拟合;
取值比较多的划分特征对RF的决策会产生更大的影响,从而有可能影响模型的效果。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA
from sklearn.preprocessing import Imputer
from sklearn.preprocessing import label_binarize
from sklearn import metrics
mpl.rcParams['font.sans-serif'] = [u'Arial Unicode MS']
mpl.rcParams['axes.unicode_minus'] = False
#选取宫颈癌数据,各列的名字放入names,方便查看
names = [u'Age', u'Number of sexual partners', u'First sexual intercourse',
u'Num of pregnancies', u'Smokes', u'Smokes (years)',
u'Smokes (packs/year)', u'Hormonal Contraceptives',
u'Hormonal Contraceptives (years)', u'IUD', u'IUD (years)', u'STDs',
u'STDs (number)', u'STDs:condylomatosis',
u'STDs:cervical condylomatosis', u'STDs:vaginal condylomatosis',
u'STDs:vulvo-perineal condylomatosis', u'STDs:syphilis',
u'STDs:pelvic inflammatory disease', u'STDs:genital herpes',
u'STDs:molluscum contagiosum', u'STDs:AIDS', u'STDs:HIV',
u'STDs:Hepatitis B', u'STDs:HPV', u'STDs: Number of diagnosis',
u'STDs: Time since first diagnosis', u'STDs: Time since last diagnosis',
u'Dx:Cancer', u'Dx:CIN', u'Dx:HPV', u'Dx', u'Hinselmann', u'Schiller',
u'Citology', u'Biopsy']#df.columns
path = "datas/risk_factors_cervical_cancer.csv" # 数据文件路径
data = pd.read_csv(path)
X = data[names[0:-4]]
Y = data[names[-4:]]
# 对于缺省值,进行数据填充;默认是以列/特征的均值填充
imputer = Imputer(missing_values="NaN")
X = imputer.fit_transform(X, Y)
#数据分割
x_train,x_test,y_train,y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
#标准化
ss = MinMaxScaler()#分类模型,经常使用的是minmaxscaler归一化,回归模型经常用standardscaler
x_train = ss.fit_transform(x_train, y_train)
x_test = ss.transform(x_test)
x_train.shape
#降维
pca = PCA(n_components=2)
x_train = pca.fit_transform(x_train)
x_test = pca.transform(x_test)
x_train.shape
print(pca.explained_variance_ratio_)
#随机森林模型
forest = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=1, random_state=0)
forest.fit(x_train, y_train)#max_depth一般不宜设置过大,把每个模型作为一个弱分类器
#n_estimators : integer, optional (default=10) 整数,可选择(默认值为10)。决策树的数目
#criterion : string, optional (default=”gini”) 字符串,可选择(默认值为“gini”)。
#max_depth : integer or None, optional (default=None) 整数或者无值,可选的(默认为None决策树的最大深度
#bootstrap : boolean, optional (default=True) 布尔值,可选的(默认值为True)是否有放回抽样