精华内容
下载资源
问答
  • fps=1一般情况下,数据集的特征成百上千,因此有必要从中选取对结果影响较大的特征来进行进一步建模,相关的方法有:主成分分析、lasso等,这里我们介绍的是通过随机森林来进行筛选。用随机森林进行特征重要性评估的...

    参考:http://blog.csdn.net/zjuPeco/article/details/77371645?locationNum=7&fps=1

    一般情况下,数据集的特征成百上千,因此有必要从中选取对结果影响较大的特征来进行进一步建模,相关的方法有:主成分分析、lasso等,这里我们介绍的是通过随机森林来进行筛选。

    用随机森林进行特征重要性评估的思想比较简单,主要是看每个特征在随机森林中的每棵树上做了多大的贡献,然后取平均值,最后比较不同特征之间的贡献大小。

    贡献度的衡量指标包括:基尼指数(gini)、袋外数据(OOB)错误率作为评价指标来衡量。

    衍生知识点:权重随机森林的应用(用于增加小样本的识别概率,从而提高总体的分类准确率)

    随机森林/CART树在使用时一般通过gini值作为切分节点的标准,而在加权随机森林(WRF)中,权重的本质是赋给小类较大的权重,给大类较小的权重。也就是给小类更大的惩罚。权重的作用有2个,第1点是用于切分点选择中加权计算gini值,表达式如下:

    其中,N表示未分离的节点,NL和NR分别表示分离后的左侧节点和右侧节点,Wi为c类样本的类权重,ni表示节点内各类样本的数量,Δi是不纯度减少量,该值越大表明分离点的分离效果越好。

    第2点是在终节点,类权重用来决定其类标签,表达式如下:

    参考文献:随机森林针对小样本数据类权重设置     https://wenku.baidu.com/view/07ba98cca0c7aa00b52acfc789eb172ded639998.html

    这里介绍通过gini值来进行评价,我们将变量的重要性评分用VIM来表示,gini值用GI表示,假设有m个特征X1,X2,...Xc,现在要计算出每个特征Xj的gini指数评分VIMj,即第j个特征在随机森林所有决策树中节点分裂不纯度的平均改变量,gini指数的计算公式如下表示:

    其中,k表示有k个类别,pmk表示节点m(将特征m逐个对节点计算gini值变化量)中类别k所占的比例。

    特征Xj在节点m的重要性,即节点m分枝前后的gini指数变化量为:

    其中GIl和GIr分别表示分枝后两个新节点的gini指数。

    如果特征Xj在决策树i中出现的节点在集合M中,那么Xj在第i棵树的重要性为:

    假设随机森林共有n棵树,那么:

    最后把所有求得的重要性评分进行归一化处理就得到重要性的评分:

    通过sklearn中的随机森林返回特征的重要性:

    from sklearn.ensemble importRandomForestClassifier

    forest= RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)

    importances=forest.feature_importances_#样例的输出结果如下所示

    1) Alcohol 0.182483

    2) Malic acid 0.158610

    3) Ash 0.150948

    4) Alcalinity of ash 0.131987

    5) Magnesium 0.106589

    6) Total phenols 0.078243

    7) Flavanoids 0.060718

    8) Nonflavanoid phenols 0.032033

    9) Proanthocyanins 0.025400

    10) Color intensity 0.022351

    11) Hue 0.022078

    12) OD280/OD315 of diluted wines 0.014645

    13) Proline 0.013916

    举个样例:

    from sklearn.datasets importload_irisfrom sklearn.ensemble importRandomForestClassifierimportpandas as pdimportnumpy as np

    iris=load_iris()

    df= pd.DataFrame(iris.data, columns=iris.feature_names)

    df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75df['species'] =pd.Categorical.from_codes(iris.target, iris.target_names)

    df.head()

    train, test= df[df['is_train']==True], df[df['is_train']==False]

    features= df.columns[:4]

    clf= RandomForestClassifier(n_jobs=2)

    y, _= pd.factorize(train['species'])

    clf.fit(train[features], y)

    preds=iris.target_names[clf.predict(test[features])]

    pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])

    clf.feature_importances_

    #返回特征重要性的结果:

    [ 0.085598  ,  0.01877088,  0.45324092,  0.4423902 ]

    sklearn.metrics中的评估方法介绍:

    1、sklearn.metrics.roc_curve(true_y. pred_proba_score, pos_labal)#返回roc曲线的3个属性:fpr, tpr,和阈值

    importnumpy as npfrom sklearn.metrics importroc_curve

    y= np.array([1,1,2,2])

    pred= np.array([0.1, 0.4, 0.35, 0.8])

    fpr, tpr, thresholds= roc_curve(y, pred, pos_label=2)

    fpr#array([ 0. , 0.5, 0.5, 1. ])

    tpr #array([ 0.5, 0.5, 1. , 1. ])

    thresholds #array([ 0.8 , 0.4 , 0.35, 0.1 ])

    from sklearn.metrics importauc

    metrics.auc(fpr, tpr)2、sklearn.metrics.auc(x, y, reorder=False)#计算AUC值,其中x,y分别为数组形式,根据(xi,yi)在坐标上的点,生成的曲线,计算AUC值

    3、sklearn.metrics.roc_auc_score(true_y, pred_proba_y)#直接根据真实值(必须是二值)、预测值(可以是0/1,或是prob)计算出auc值

    参考:http://blog.csdn.net/cherdw/article/details/54971771

    网格搜索调参:

    grid.fit():运行网格搜索

    grid_scores_:给出不同参数情况下的评价结果

    best_params_:描述了已取得最佳结果的参数的组合

    best_score_:成员提供优化过程期间观察到的最好的评分

    param_test1= {'n_estimators':range(10,71,10)} #对参数'n_estimators'进行网格调参

    gsearch1= GridSearchCV(estimator = RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt' ,random_state=10), param_grid =param_test1, scoring='roc_auc',cv=5)

    gsearch1.fit(X,y)

    gsearch1.grid_scores_,gsearch1.best_params_, gsearch1.best_score_#输出调参结果,并返回最优下的参数#输出结果如下:

    ([mean:0.80681, std: 0.02236, params: {'n_estimators': 10},

    mean:0.81600, std: 0.03275, params:{'n_estimators': 20},

    mean:0.81818, std: 0.03136, params:{'n_estimators': 30},

    mean:0.81838, std: 0.03118, params:{'n_estimators': 40},

    mean:0.82034, std: 0.03001, params:{'n_estimators': 50},

    mean:0.82113, std: 0.02966, params:{'n_estimators': 60},

    mean:0.81992, std: 0.02836, params:{'n_estimators': 70}],

    {'n_estimators':60}, 0.8211334476626017)#多个特征的网格搜索,如下所示

    param_test2= {'max_depth':range(3,14,2),'min_samples_split':range(50,201,20)}

    gsearch2= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60, min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10), param_grid = param_test2,scoring='roc_auc',iid=False, cv=5)

    gsearch2.fit(X,y)

    gsearch2.grid_scores_,gsearch2.best_params_, gsearch2.best_score_#通过查看袋外准确率(oob)来判别参数调整前后准确率的变化情况

    rf1= RandomForestClassifier(n_estimators= 60, max_depth=13, min_samples_split=110, min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10)

    rf1.fit(X,y)

    print(rf1.oob_score_)

    #通过每次对1-3个特征进行网格搜索,重复此过程直到遍历每个特征,并得到最终的调参结果。

    展开全文
  • 因此文中在分析随机森林算法的基本原理的基础上,提出一种改进的基于随机森林的特征筛选算法,并应用Python编程设计了一个能够预处理数据、调用这些算法、控制各参数并展现测试结果的系统,最终将该系统应用于肝癌...

    刘云翔 陈斌 周子宜

    463909fd40cadf434a4069af5023ff41.png

    93f91aff8059ffe52c4ca4c80d0ff200.png

    de8a5d682c22c2c786e0d481741382ea.png

    摘  要: 肝癌是一种我国高发的消化系统恶性肿瘤,患者死亡率高,威胁极大。而其预后情况通常只能通过医生的专业知识和经验积累来粗略判断,准确率较差。因此文中在分析随机森林算法的基本原理的基础上,提出一种改进的基于随机森林的特征筛选算法,并应用Python编程设计了一个能够预处理数据、调用这些算法、控制各参数并展现测试结果的系统,最终将该系统应用于肝癌预后预测,比较分析了不同的算法、参数、内部策略对预测精度和计算性能的影响。研究结果表明,随机森林相比剪枝过的决策树具备更好的泛化能力和训练速度,改进的特征筛选算法能够在保证预测精度的前提下显著缩小特征集。

    关键词: 随机森林算法; 特征筛选; 肝癌预后预测; 决策树; 预测精度; 特征集

    中图分类号: TN911?34; TP3?05; TP312          文献标识码: A                文章编号: 1004?373X(2019)12?0117?05

    Abstract: Liver cancer is a malignant tumor of the digestive system highly occurred in China, which causes high mortality of patients and great threat to their lives, and its prognosis conditions are often roughly judged by doctors with their professional knowledge and experience accumulation, which has poor accuracy. Therefore, on the basis of analyzing the basic principle of the random forest algorithm, an improved feature selection algorithm based on the random forest is proposed in this paper. The Python programming design is applied to design a system that can preprocess data, recall the algorithms, control various parameters and display test results. The system is applied to the prognosis prediction of the liver cancer. The influences of different algorithms, parameters and internal strategies on the prediction accuracy and computing performance are compared and analyzed. The research results show that in comparison with the pruned decision tree, the random forest has a better generalization ability and training speed, and the improved feature selection algorithm can significantly reduce the feature set on the premise of guaranteeing the prediction accuracy.

    Keywords: random forest algorithm; feature selection; liver cancer prognosis prediction; decision tree; prediction accuracy; feature set

    0  引  言

    肝癌是一种我国高发的消化系统恶性肿瘤,患者死亡率在恶性肿瘤中高居第三,威胁极大。该疾病的预后情况通常只能通过医生的专业知识和经验积累来粗略判断,准确率较差,对医生和患者都造成了不利影响。目前国内外对该方面进行预测的系统性研究甚少,大多局限于某些具体指标对预后产生的意义,更没有相应的模型或软件。但是国内尚无成熟的原发性肝癌数据库,这可能和肝癌数据分散,难以大批量获得有关。目前国内将数据挖掘应用于肝癌预后预测研究主要的尝试有申羽等人运用朴素贝叶斯算法[1]和于长春等人应用改进的神经网络算法[2]对原发性肝癌预后预测进行应用研究。随着医学上的数据采集设备不断更新换代,基于大样本的数据挖掘技术将逐步在医学应用中崭露头角,显现出了重要的实用价值和广阔的发展前景。

    本文将随机森林算法应用于原发性肝癌的数据分析,以期在临床上能够借助计算机进行预后预测,帮助选择治疗方案。此外,还改进并验证了一种基于随机森林的特征筛选算法,以降低模型训练的开销和数据采集的难度。本文采用Python语言实现了上述算法的各个细节,组织系统界面,最终进行大量的测试,详细分析不同参数和内部策略对性能、输出造成的影响,对模型选择提供了建议。

    本文數据来自第二军医大学东方肝胆医院,共有588个病例和3个类别,在专业人员的帮助下去除了很多无关指标,每例剩余39个可用指标。

    1  随机森林算法原理

    随机森林是以决策树为基学习器的集成学习方法,它包含多棵随机产生的决策树并将它们的预测结合输出[3?4]。随机森林采取了Bagging思想和特征子空间思想,比单一决策树有更好的抗噪性,并且不易过拟合,可以显著提高泛化能力[3]。随机森林在Bagging思想的样本扰动基础上,又加入了属性扰动,即特征子空间思想:在各决策树的每个节点上选取最佳划分特征时,候选特征集都是从该节点的特征集中随机抽取的一个子集,而不再是该处的整个特征集。特征子集的大小k决定了随机程度,通常取[k=M]或[k=log2M+1],其中M是当前节点的特征总数。特别地,当[k=1]时,每个特征都是随机选取的;而当[k=M]时,建立的是普通决策树。

    由于每棵决策树的训练集和节点上的特征子集都是独立抽取,所以它们的预测结果也是相互独立的。根据Bagging思想,随机森林在分类时用简单投票法取各决策树的多数预测结果。随机森林构造的是多棵“随机”的决策树,其中单棵的泛化能力通常低于在同样训练集上构造的普通决策树,然而在集成后整体的性能往往会好于只用Bagging方法建立的随机森林,因为各基学习器之间有更大的差异性,可得随机森林中每一棵“随机”决策树的构建算法如下:

    初始化每个节点抽取的特征子集大小m

    由于各决策树构建过程的随机性,随机森林被证明不会过拟合[4],故每棵树都尽可能地生长而不需要剪枝。与此同时,各分类器同质且相互独立,因此随机森林的建立可以方便地并行完成,速度较快。图1为随机森林的基本流程。

    图1  随机森林的基本流程

    463909fd40cadf434a4069af5023ff41.png

    2  基于袋外误差的特征选择

    对于高维数据,一般要进行降维或特征选择,目的是降低模型学习的难度[5?8]。而冗余特征的存在使得特征选择更有必要性,去除这些不相关的特征不但能降低学习的开销,还能给数据采集提供便利。常见的特征选择方式有三类:过滤式、包裹式和嵌入式。过滤式方法在建立学习器之前就对数据集进行特征选择,再用筛选后的特征训练学习器;包裹式方法在候选特征子集上训练学习器,用学习器的性能来评价所选的特征集;而嵌入式方法在训练学习器的同时就能完成特征选择。本节中随机森林的特征选择算法是一种基于袋外误差的包裹式方法。

    2.1  特征重要性

    随机森林定义了特征的重要性度量,计算某特征X重要性的步骤如下:

    1) 对于随机森林中的决策树[Ti],计算它在自己袋外数据上的分类错误数[Ei]。

    2) 在该决策树的袋外数据中对X的取值进行随机扰动,重新计算其分类错误数[EXi]。

    3) 令[i=1,2,…,n],重复以上两步,其中n是随机森林包含的决策树个数。

    4) 特征X的重要性定义为:

    这样定义的依据是:如果对某个特征加入噪声后模型的袋外误差显著提升,则说明该特征对预测结果的影响较大,从而有较高的重要性。

    2.2  改进的特征选择算法

    2010年Genuer R等人和2014年姚登举等人曾提出用随机森林进行特征选择的基本方法[5?6],本文在此基础上设计一种更加快捷的特征选择算法,根据各轮筛选造成的误差增量(相对筛选前)来判断是否要继续筛选,一旦它超过指定阈值就退出迭代,并将上一轮筛选所得的特征集作为结果。這样做的依据是,对于在不断缩减的特征集上训练出的模型,它们的泛化性能一般呈降低趋势,而其降低程度可以作为特征集的评价标准。该策略的实质是在给定误差范围内优先选择最小的特征子集,而不是测试精度最高的,从而能够尽早停止筛选,节省大量时间。不将误差增量阈值简单置为0的原因是,除了剔除不相关特征之外还希望去除一些弱相关特征,而且这样也能容许每次测试的微小偏差。试验结果表明,筛选后的特征集其实并不会产生像阈值那样大的误差增量,在其上的测试精度可以与筛选前持平甚至更高。

    由于交叉验证的过程中会产生多个随机森林,故选择其中测试精度最高的一个来计算当前轮次的特征重要性顺序。计算特征重要性的流程图如图2所示。

    图2  计算特征重要性的流程图

    93f91aff8059ffe52c4ca4c80d0ff200.png

    3  在肝癌数据上的应用和分析

    3.1  数据概览和预处理

    训练和测试数据为肝癌病例588例,由第二军医大学东方肝胆医院提供,在专业人士的帮助下去除了许多无关指标,并将所有记录数值化。每个病例剩余39个匿名指标,类标签有3种:

    1) 恶性肿瘤,包含246例(41.8%);

    2) 正常,包含193例(32.8%);

    3) 良性病变,包含149例(25.3%)。

    由于隐私保护、记录丢失等客观原因,样本集缺失值较多,共693处,缺失值超过5个的样本被程序自动丢弃,剩余519例。此外,每个样本包含6个离散型指标,下标分别为:0,16,17,18,19,20。

    本文测试过程中的操作平台的配置为i7?3930k、16 GB内存,开发和测试环境为WIN7 64 bit、Anaconda 5.1.0,其中Python解释器版本3.6.5(64 bit),预处理数据结果如图3所示。

    3.2  模型评估方法

    由于是分类问题,故模型的损失函数为0?1损失,而模型的测试误差是其在测试集上的平均损失[9?11]。设模型f的输入是X,Y是对应X的真实值,测试样本容量为N,则损失函数L、测试误差e和测试精度r的形式化定义如下:

    图3  读取的文件

    de8a5d682c22c2c786e0d481741382ea.png

    模型的复杂度可以直接由代码段在同1台计算机上的运行时间衡量,也可以通过决策树的叶节点个数来比较。记录的运行时间由Python计时器获得[9]。

    展开全文
  • 一、决策树(类型、节点特征选择的算法原理、优缺点、随机森林算法产生的背景)1、分类树和回归树由目标变量是离散的还是连续的来决定的;目标变量是离散的,选择分类树;反之(目标变量是连续的,但自变量可以是分类的...

    一、决策树(类型、节点特征选择的算法原理、优缺点、随机森林算法产生的背景)

    1、分类树和回归树

    由目标变量是离散的还是连续的来决定的;目标变量是离散的,选择分类树;反之(目标变量是连续的,但自变量可以是分类的或数值的),选择回归树;

    树的类型不同,节点分裂的算法和预测的算法也不一样;

    分类树会使用基于信息熵或者gini指数的算法来划分节点,然后用每个节点的类别情况投票决定预测样本的分类;回归树会使用最大均方误差来划分节点,然后用每个节点中样本的均值作为测试样本的预测值;

    2、决策树的算法:ID3、C4.5和CART

    CART(Classify and regresion tree)算法既可以生成分类树,也可以生成回归树,但它生成的是二叉树;既可以处理连续变量也可以处理离散变量;对于分类树使用gini不纯度来决定划分节点,对于回归树使用最小误差准则来划分节点;CART的树特点是可以不断生长,需要进行剪枝;

    思想:递归地将输入空间分割成矩形

    优点:可以进行变量选择,可以克服missing data,可以处理混合预测

    缺点:不稳定

    ID3是用信息增益来决定划分节点,只能处理离散变量;ID3会对特征取值较多的特征有所偏好(比如ID号),但这是没有意义的;

    C4.5是用信息增益率来决定划分节点,可以处理连续值(用二分法进行离散化);可以处理缺省值;而且C4.5克服了ID3一个重要缺点,它对于取值较多的特征有一个惩罚抑制;或者说它对取值较少的特征有所偏好;但它的算法性能较低;可以与ID3结合优势互补来进行一些效果和性能的优化;

    3、决策树是如何选择分裂节点的?

    MeanDecreaseAccuracy 和 MeanDecreaseGini

    因为用“平均精度下降”衡量特征重要性时,是通过随机扰动每个变量(特征)值来看其整体最后的预测误差的,也就是说,除了被扰动的那个特征外,剩余的特征没有变化,用这种方法造成的最终结果的预测误差来衡量这个被扰动特征的重要性;

    GINI指数是衡量节点特征纯度的指标,“gini值平均降低量表示所有树的变量分割节点平均减小的不纯度”;gini指数是决策树节点分割中除了信息熵以外的另一个衡量特征重要性的指标;它表示数据集在增加了特征A的作用之后,gini指数的增益值最大,所以选择A属性作为分裂节点;

    二、随机森林

    1、为什么叫“随机”?

    随机森林里的每一棵决策树的建立,不仅对样本进行有放回(bootstrap)的随机抽样,还对特征进行随机抽样;(即“行”抽样,和“列”抽样,是否回放,是可以设定的)

    从原始输入的N个样本中每次抽取k个样本作为特征子集,建立m棵分类决策树;抽多少次就建多少棵决策树;

    每次抽样样本的size和原始输入样本的大小相同,因为是放回抽样,所以有可能抽到重复的;这可以保证有重复样本被不同决策树分类,这样就可以对不同决策树的分类能力做个评价。

    特征的随机抽样是指,在建每棵树进行每个节点分裂的时候,都随机抽一部分特征,然后在这随机抽的部分特征里面,用决策树的特征选择的方法(比如信息增益,或信息增益率)来决定使用最优的特征来作为分裂节点的;

    2、随机森林算法的优缺点

    优点:

    (1)分类结果准确性高:

    使用多棵决策树的投票结果来决定随机森林分类器最终的分类判定结果;

    所谓“林子大了,什么鸟都有”。由于建立的多棵决策树中,有不少是随机的效果不好的决策树,但也有少数非常优秀的决策树,在对每个样本的投票结果中,不好的树它们的投票是接近随机的,所以他们的投票被相互抵消;最后剩下“优秀”的决策树的投票结果决定了随机森林分类器的最终输出结果,这样的结果提高了准确性的同时,也提高了模型的泛化能力;(The more random, the more robust.)

    随机森林算法的“妙处”恰恰在于“随机”大法的强大,上面说的每个节点都从随机选的部分特征里面选best split的方法或许会使得某些表现“好”的特征被多棵树选中,最终导致有的树很像(虽然它们的训练样本不一样),这样就不够“随机”了,所以有的使用者会在branching的时候(也就是选择划分节点的特征的时候)再加一个随机的处理过程,这样增加算法的稳定性;

    (2)自带特征筛选机制:

    因为“随机化”增加了RF算法的包容性,它可以更方便地处理高维特征而不需要预先进行特征筛选;相反,它可以是进行特征筛选步骤的一种手段;

    3、随机森林是如何衡量特征的重要性的?

    在随机森林中某个特征X的重要性的计算方法如下:

    (1)对于随机森林中的每一颗决策树,使用相应的OOB(袋外数据)数据来计算它的袋外数据误差,记为errOOB1.

    (2)  随机地对袋外数据OOB所有样本的特征X加入噪声干扰(就可以随机的改变样本在特征X处的值),再次计算它的袋外数据误差,记为errOOB2.

    (3)假设随机森林中有Ntree棵树,那么对于特征X的重要性=∑(errOOB2-errOOB1)/Ntree,之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入噪声之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。

    参考:http://www.cnblogs.com/justcxtoworld/p/3447231.html

    所以可以认为这个特征重要性的衡量是考虑了特征之间的相互作用;跟tf-idf或者t-test,chi-square-test这些单变量分析的方法有很大不同;但这个优化是在权重值的计算层面的,并没有对特征进行什么改造;

    但是又不像LDA、word2vec那样,考虑了上下文的语义关系以及情感分析(即没有考虑近义词和由于和其他重要词组合而出现的情感的褒贬),RF的特征选择是无序的bagging考虑的方法(不考虑词出现的先后顺序和语义层面的关系);

    RF的特征筛选并没有对特征进行组合加工或者其他变换(这点不如逻辑回归),同时没有加入近义词的考虑;因此在特征工程上面,这里还有很多优化的空间。详细参见后续的文章。

    4、与其他集成分类器的区别和共同点(bagging,Adaboosting,GBDT)?

    随机森林与以决策树作为基本分类器的bagging算法相比,其相同点是两者都使用bootstrap的方法对样本进行有放回的抽样;

    但不同之处在于随机森林除了对样本进行随机抽样,还对特征进行随机抽样;而bagging算法的特点是它里面可以用不同的方法来构建分类器,不仅仅局限于决策树;

    5、随机森林是如何衡量每棵树在最终决策时的权重的?

    权重树随机森林算法,采用决策树在其袋外数据上的AUC衡量决策树的分类能力,根据每棵树的分类能力对树分配其在最终决策时的权重,采用权重集成方法对决策树进行组合。

    三、具体实现过程

    具体实现过程如下:

    (1)原始训练集为N,应用bootstrap法有放回地随机抽取k个新的自助样本集,并由此构建k棵分类树,每次未被抽到的样本组成了k个袋外数据;

    (2)设有mall个变量,则在每一棵树的每个节点处随机抽取mtry个变量(mtry<< mall),然后在mtry中选择(用节点划分的方法)一个最具有分类能力的变量,变量分类的阈值通过检查每一个分类点确定;

    (3)每棵树最大限度地生长, 不做任何修剪;

    (4)将生成的多棵分类树组成随机森林,用随机森林分类器对新的数据进行判别与分类,分类结果按树分类器的投票多少而定。

    参考:http://www.jianshu.com/p/c4bcb2505360

    四、GBDT

    1、回归树、提升树和梯度提升树

    (1)回归树

    gbdt中的树是回归树,不是决策树,用来做回归预测,调整后也可以用于分类;

    回归树分支时穷举每一个feature的每一个阈值寻找最好的分割点,衡量好坏的标准不是最大熵,而是最小化平方误差;

    (2)提升树

    迭代多棵回归树来共同决策;

    参考:http://www.jianshu.com/p/005a4e6ac775

    2、boosting和bagging算法的区别

    随机森林将多棵决策树的结果进行加权后得到最终的结果,对不同的样本的重要性并没有区分,对不同的树的训练结果也没有做进一步的优化提升,是一种bagging的思想。

    GBDT则是基于boosting的思想。

    boosting算法是在迭代的每一步构建弱学习器来弥补原有模型的不足。

    其中,adaboost通过给被已有模型预测错误的样本更高的权重,使得先前被学习错误的样本可以在后续的训练中得到更高的关注来弥补原有模型的不足;gradient boost则是通过每次迭代的时候构建一个沿梯度下降最快的方向的学习器来弥补模型的不足。

    经典的AdaBoost算法只能处理采用指数损失函数的二分类学习任务,而梯度提升方法通过设置不同的可微损失函数可以处理各类学习任务(多分类、回归、Ranking等),应用范围大大扩展。

    另一方面,AdaBoost算法对异常点(outlier)比较敏感,而梯度提升算法通过引入bagging思想、加入正则项等方法能够有效地抵御训练数据中的噪音,具有更好的健壮性。

    参考:http://www.jianshu.com/p/005a4e6ac775

    3、GBDT构造新特征(组合特征)的思想

    参考:http://breezedeus.github.io/2014/11/19/breezedeus-feature-mining-gbdt.html#fnref:fbgbdt

    4、GBDT是如何衡量特征的重要性的

    计算所有的非叶子节点在分裂时加权不纯度的减少,减少得越多说明特征越重要。

    不纯度的减少实际上就是该节点此次分裂的收益,因此我们也可以这样理解,节点分裂时收益越大,该节点对应的特征的重要度越高。

    5、GBDT的学习算法:

    1. 算法每次迭代生成一颗新的决策树

    2. 在每次迭代开始之前,计算损失函数在每个训练样本点的一阶导数gi和二阶导数hi

    3. 通过贪心策略生成新的决策树,通过等式(7)计算每个叶节点对应的预测值

    4. 把新生成的决策树ft(x)添加到模型中:ŷ ti=ŷ t−1i+ft(xi)

    参考文章:http://blog.csdn.net/yangxudong/article/details/53872141

    通常在第四步,我们把模型更新公式替换为:ŷ ti=ŷ t−1i+ϵft(xi),其中ϵ称之为步长或者学习率。增加ϵ因子的目的是为了避免模型过拟合。

    五、随机森林和GBDT的比较

    1、随机森林和GBDT分别在什么情况下容易过拟合?

    从生成树的方式的角度看,随机森林是通过随机抽取样本和特征来建立决策树的,因此当数据中有较多缺失值的时候,随机森林的结果容易发生过拟合;而GBDT基于错误样本来建立提升树,当样本中有异常值outlier的时候,GBDT容易发生过拟合;

    2、在分布式实现上,随机森林和GBDT哪个的实现更困难?

    随机森林的分布式实现更简单,因为在随机森林中每棵树建立的时候与其他的树是独立的,而GBDT每棵树的建立需要依赖于上一层的结果。

    展开全文
  • 昨晚,小伙伴收到了大鱼海棠为我们带来的FigureYa182RFSurv,使用随机森林对生存数据降维,根据变量重要性排序并筛选基因组成prognostic signature。这是我们第二次众筹随机森林相关分析,上次的FigureYa159LR_RF,...

    昨晚,小伙伴收到了大鱼海棠为我们带来的FigureYa182RFSurv,使用随机森林对生存数据降维,根据变量重要性排序并筛选基因组成prognostic signature。

    这是我们第二次众筹随机森林相关分析,上次的FigureYa159LR_RF,是在LASSO降维的基础上,采用logistic regression或Random forest的方法,进行5-fold cross-validation评估LASSO selected feature的预测效能。

    大鱼海棠为我们带来了众多或经典或酷炫的好用代码,具有丰富的医学统计分析经验。这次建立FigureYa182RFSurv专属讨论群,请大鱼海棠入群答疑。小伙伴就相关问题展开讨论,小丫整理记录下来,留下这宝贵资源。

    HSZ:请问这个安装是哪里出问题了,我百度也不知道怎么解决?

    大鱼海棠:https://share.weiyun.com/0Qk7bvR6,直接把这个拖到R的library下解压试试,我以前这样做似乎也可以用,在windows里。

    ZJH问:老师,您好!imp.cutoff这个重要性阈值的怎么选择?

    大鱼海棠:没有固定cutoff。结果导向的,嫌结果太多就设高一点

    LGM问:海棠哥好,请教一下筛选出来的特征要组合成预后signature,是还需要进一步使用多因素COX回归来求变量的系数吗?

    大鱼海棠:嗯我会建议这样做,但是多因素这部不进行变量筛选了。

    Allittis问:海棠老师的意思是直接多因素全部纳入算一个系数即可,是不?

    LGM问:不进行逐步回归?

    大鱼海棠:对的,因为你已经认为RF得出来的是你感兴趣的变量了。当然你非要再逐步回归,从操作性上来讲没有问题。

    零度反应问:如果这个得到的基因太多呢,可不可以再用逐步回归?

    大鱼海棠:可以

    零度反应:因为之前用过这个,也用过你写的lasso回归的方法,但最后得到的signature基因相对多一点,然后有时auc优势也并不明显

    大鱼海棠:survival的auc一般都不会那么高。。因为不仅仅是二分类问题,考虑了time-to-event

    零度反应:所以又进行了多因素,最起码基因会少一些,感觉上好那么一丢丢。

    LGM问:关于组合成预后signature还想再请教一下

    一篇文章使用COX回归得到了感兴趣的基因,但是risk score 的计算居然是表达量跟HR相乘。有这样的处理方式吗?

    Allittis:HR的置信区间好大

    唐渊:估计是数据没有做归一化处理导致HR 值这么大。

    LZQ:scale一下一般会小一些

    大鱼海棠:多个数据集验证的话,都会建议每个数据集都要scale,尤其是针对不同平台。

    CSJ问:请问R中可以获取基因的coefficients值么,我看原文中提到这个值是由random forest algorithm得到的,但是我在结果中没有找到这个值~

    LZQ:这个应该是单因素cox的coef,决策树是无参ML。HR=e^coef

    对应的HR值转化一下就得到了。

    大鱼海棠:我觉得也是,coef,HR以及对应的95%CI应该是后算的,单因素cox直接summary一下都有。

    DMY问:我在分析数据的时候发现如果用TCGA做训练集,而用GEO做验证集,结果发现训练集中获得的关键基因在GEO数据集中不存在,那我应该反过来用GEO做训练集呢?还是先取 TCGA和GEO的交集后再分析?谢谢啦!

    砍柴人:先基因取交集啊

    DMY:那用随机森林和支持向量机这两种方法筛选关键基因,那个更好呢?还是用组合的方式来筛选@大鱼海棠

    大鱼海棠:组合的方式只是为了。。虚假的工作量吧,多写几段method。我不太认可这种做法,尤其是需要其中的指标时。比如LASSO和SVM一起用,那LASSO里的系数怎么办?

    DMY:那有没有一个更好的组合呢?比如先差异筛选,再单COX,再随机森林,最后多COX?

    大鱼海棠:这些方法最后都是结果导向型,没有什么最好的组合。。

    DMY:AUC值通常多少比较合适呢?必须0.7以上么?

    大鱼海棠:训练集我会建议0.8以上吧。

    砍柴人:训练集0.8以上,那测试集可以得到多少?

    大鱼海棠:看运气

    DMY:嗯,有时候经常是在TCGA训练集很高,到了GEO验证的时候就很低了,不懂是不是数据需要归一化处理。

    大鱼海棠:要归一化处理

    DMY:难怪呢,我平时都没做归一化,结果差别很大。有没有同时对所有训练集和验证集进行归一化处理的方法呢?谢谢啦!

    大鱼海棠:z-score最方便。个人觉得0-1区间变换最严谨,但是没必要。

    DMY:先取基因交集,然后合并所有数据集,再用Z-score归一化,再拆分数据进行分析,是这个逻辑么?谢谢啦

    大鱼海棠:分别zscore,不会合并zscore。tcga数据要先log,用TPM。

    DMY:谢谢啦,受益匪浅!

    CGD:所以请问是先将tcga的tpm数据zscore后再建模,然后在geo的zscore后的数据中验证模型是吗?是这样的顺序吗,感谢!

    DMY:前面大鱼海棠 有说,先在TCGA中对tpm进行log2后再zscore

    LGM问:能不能再众筹个不同平台数据的标准化?

    DMY:感觉可行,数据清理确实很重要。确实跨平台验证会面临很多问题,同一平台也会有批次效应,所以我在处理多GEO数据集的时候都先去除批次效应并合并后,再进行下面分析。

    大鱼海棠:你们可以了解一下gene pair,完美回避批次。是一个比较热的,回避标准化的,跨平台数据处理理念,但是数据的量级会比较大。

    The one:gene pair[强][强][强],知道这个东西,没尝试过,晚上回去试下!

    DMY:我前面看一些教程里面写随机森林对二分类变量预测效果最佳,比如生死,患病与否,但是病人的生存数据里还有生存时间,应该用二分类变量作为结局变量么?如生死,还是以连续性变量生存时间作为结局变量比较好,谢谢啦。

    大鱼海棠:有研究不关心时间,只关心生死的,看个人目的吧。随机森林对二分类最佳也没有这种说法,看观测和变量的比例。逻辑回归这种就很robust,而且可以写出关系式,推荐的还是逻辑回归。

    DMY:那研究是否复发,或者转移,也是不错的选择哈!

    大鱼海棠:是的。

    Paul:老师您好,我想请一下xgboost会不会比随机森林树更好一些?

    大鱼海棠:没有方法有绝对的优势。。不然老方法就完全淘汰了不是吗?分类算法、聚类算法都是result-oriented。我相信。。你们也会试不同的方法得到自己expected的结果吧!

    DMY:感觉都是先用各种方法先分析,那个结果好就用那个,均衡来选择,结果导向,今天又做到一个新知识,谢谢大神!

    DMY:请问内部验证应该分配多少样品比例比较好呢?有些文章按照每组50%来分配,有些按照80%训练和20%来分,那个更好呢?

    Paul:7:3,1:1的都有用,结果导向。

    大鱼海棠:对,结果导向。五折多一些,只要不太离谱。

    赞美太阳:请教个问题,为什么不用rfsrc这个函数筛选变量?

    大鱼海棠:没有用新的函数包

    赞美太阳:那么rfs之后可以自行再来一发var.select吗?

    大鱼海棠:感觉没必要

    赞美太阳:嗯,我觉得只要能说通就可以了。

    展开全文
  • 随机森林筛选变量(Python实现)

    万次阅读 2018-07-04 10:53:10
    #文章转自每日一Python公众号当数据集的特征过多时,容易产生过拟合,可以用随机森林来在训练之后可以产生一个各个特征重要性的数据集,利用这个数据集,确定一个阈值,选出来对模型训练帮助最大的一些特征,...
  • 早上好我在R(randomForest,caret)中的随机林实现中使用置换重要性对变量进行排序。所有变量都是连续的,结果是明确的。在为了处理共线特性Terence Parr,Jeremy Howard和其他人更新了Python中的rfpimp包,将高度...
  • 我正在为scikit-learn的随机森林分类器生成特征向量.特征向量代表9个蛋白质氨基酸残基的名称.有20个可能的残留名称.所以,我使用20个虚拟变量来表示一个残基名称,对于9个残基,我有180个虚拟变量.例如,如果滑动窗口中...
  • I'm generating feature vector for random forest classifier of scikit-learn . The feature vector represents the name of 9 protein amino acid residues. There are 20 possible residue names....
  • R语言随机森林详细解析(基于randomforest包和...不知各位有没有发现,CSDN上随机森林的教程都说的有些模糊,好像在刻意回避着什么,而且很少有人说变量筛选的问题。所以,今日,我觉得有必要记录一下了。 随机森...
  • 随机森林变量重要性评分及其研究进展,杨凯,侯艳,随机森林变量重要性评分(VIM)在高维组学数据生物标志物的筛选中有广泛应用,然而由于其有多种算法且适用条件不同,其结果也可能
  • 实现方式为Python或R软件操作一:利用随机森林两阶段逐步回归筛选重要性变量,需要完成以下两个步骤:1.选用相对重要性评价变量重要性,要求实现步骤如下:(1)对所有变量计算随机森林重要性得分,按相对重要性得分...
  • 随机森林特征筛选 关于的特征的筛选,可以利用皮尔逊系数,如果是分类的变量的话可以用卡方检验,这些都是再用具体算法跑之前所做的数据处理。我们还可以用一个算法先跑,然后看数据属性的特征,也就是选择主要的...
  • 昨晚,小伙伴收到了大鱼海棠为我们带来的FigureYa182RFSurv,使用随机森林对生存数据降维,根据变量重要性排序并筛选基因组成prognostic signature。这是我们第二次众筹随机森林相关分析,上次的FigureYa159LR_RF,...
  • 需要经历多次的筛选,在课程案例中通过了随机森林进行变量的粗筛,通过WOE转化+决策树模型进行变量细筛。 一、变量粗筛——随机森林模型 与randomForest包不同之处在于,party可以处理缺失值,而这个包可以。
  • 当数据集的特征过多时,容易产生过拟合...本文所用数据集是从kaggle网站上下载的lend club数据,通过随机森林筛选出对预测是否逾期的重要性变量:# 首先导入数据,查看数据集的基本情况:df = pd.read_csv('loan.cs...
  • 前面机器学习第18篇 - Boruta特征变量筛选(2)已经完成了特征变量筛选,下面看下基于筛选的特征变量构建的模型准确性怎样?定义一个函数生成一些列用来测试的mtry (一系列不大于总变...
  • 昨晚,小伙伴收到了大鱼海棠为我们带来的FigureYa182RFSurv,使用随机森林对生存数据降维,根据变量重要性排序并筛选基因组成prognostic signature。这是我们第二次众筹随机森林相关分析,上次的FigureYa159LR_RF,...
  • 评估RFE变量筛选过程中构建的最终模型的效果最终拟合的模型可通过rfe$fit获取,用于后续预测分析。library(randomForest) rfe$fit## ## Call: #...
  • 当数据集的特征过多时,容易产生过拟合...本文所用数据集是从kaggle网站上下载的lend club数据,通过随机森林筛选出对预测是否逾期的重要性变量:# 首先导入数据,查看数据集的基本情况:df = pd.read_csv('loan.cs...
  • 随机森林(Random Forest)

    2018-11-28 12:16:31
    使用随机森林进行变量筛选 使用随机森林绘制MDS二维图 小结 回到顶部 前言  随机森林非常像《机器学习实践》里面提到过的那个AdaBoost算法,但区别在于它没有迭代,还有就是森林里的树长度不限制。  因为它...
  • (1)所用到的数据中有57个变量,需要利用随机森林筛选出重要性变量,剔除对预测结果影响较小的冗余变量; (2)利用步骤(1)中剔除冗余变量的2007-2016年的数据建立随机森林模型,预测2017年第一季度、2017年第二...
  • 当数据集的特征过多时,容易产生过拟合,可以用随机森林来在训练之后可以产生一个各个特征重要性的数据集,利用这个数据集,...数据集是从kaggle网站上下载的lend club数据,通过随机森林筛选出对预测是否逾期的重...
  • 当数据集的特征过多时,容易产生过拟合,可以用随机森林来在训练之后可以产生一个各个特征重要性的数据集,利用这个数据集,确定一个阈值,选出来对模型训练帮助最大的一些特征,筛选出重要变量后可以再训练模型;...
  • 当数据集的特征过多时,容易产生过拟合,可以用随机森林来在训练之后可以产生一个各个特征重要性的数据集,利用这个数据集,确定一个阈值,选出来对模型训练帮助最大的一些特征,筛选出重要变量后可以再训练模型;...
  • Wish list

    2016-05-09 14:20:00
    创业维艰 javaheadfirst java 设计模式 马斯洛的智慧 失控 已读 从0到1 兴业e家日记:适合基金入门  ... 随机森林筛选变量重要性:http://www.360doc.com/content/13/...
  • 简介本文通过使用LendingClub的数据,采用卡方分箱(ChiMerge)、WOE编码、计算IV值、单变量和多变量(VIF)分析,然后使用逻辑回归模型进行训练,在变量筛选时也可尝试添加L1约束或通过随机森林筛选变量,最后进行模型...
  • 本文通过使用LendingClub的数据,采用卡方分箱(ChiMerge)、WOE编码、计算IV值、单变量和多变量(VIF)分析,然后使用逻辑回归模型进行训练,在变量筛选时也可尝试添加L1约束或通过随机森林筛选变量,最后进行模型...
  • 随机森林或 Xgboost 模型变量重要性排序,得到最终的变量筛选结果5.过滤法、包装法、嵌入法源码1.读取数据区分离散变量与连续变量2.对连续变量和离散变量分箱(删除分箱数只有1的)3.对训练数据

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

随机森林筛选变量