决策树和随机森林

决策树

决策树的分支思想运用了if-then结构。决策树的划分运用了信息论中信息熵的概念,信息熵的计算公式如下:在这里插入图片描述
决策树的划分依据之一-信息增益
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:在这里插入图片描述
信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。

常见决策树使用方法:

  1. ID3:信息增益最大化原则
  2. C4.5:信息增益比 最大化原则
  3. CART:回归树:平方误差最小,分类树:基尼系数最小原则
    基尼系数公式:在这里插入图片描述
    sklearn中决策树的API:sklearn.tree.DecisionTreeClassifier(criterion=‘gini’,max_depth=None,random-state=None)
    criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
    优点:简单的理解和解释,树木可视化。
    需要很少的数据准备,其他技术通常需要数据归一化,
    缺点:决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
    决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成。
def decision_tree():
    taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    #获取特征值和目标值
    x = taitan[['pclass','age','room']]
    y = taitan['survived']

    #缺失值填充
    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编码
    x_train = x_train.to_dict(orient = "record")
    dict = DictVectorizer()
    x_train = dict.fit_transform(x_train)
    x_test = dict.transform(x_test.to_dict(orient = 'record'))

    dt = DecisionTreeClassifier()
    dt.fit(x_train,y_train)
    #预测准确率
    print('预测准确率:',dt.score(x_test,y_train))

随机森林

定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数,M表示特征数目。
输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
随机森林API:sklearn.ensemble.RandomForestClassifier(n_estimators = 10,criterion = ‘gini’,max_depth = None,bootstrap =Trap,random_state = None)。随机森林中的超参数可以使用网格搜索和交叉验证进行选择。
优点:
在当前所有算法中,具有极好的准确率
能够有效地运行在大数据集上
能够处理具有高维特征的输入样本,而且不需要降维
能够评估各个特征在分类问题上的重要性
对于缺省值问题也能够获得很好得结果

def randomforest():
    #API在集成方法中
    taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    x = taitan[['pclass','age','room']]
    y = taitan['survived']
    #缺失值填充
    x['age'].fill(x['age'].mean(),inplace = True)

    #训练集和测试集分离
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)

    x_train = x_train.to_dict(orient= 'record')
    RF = RandomForestClassifier()
    #进行随机森林超参数的网格搜素

    param = {'n_estimators':[100,200,300,500,800],'max_depth':[5,8,15,20,25]}

    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_)

    return None
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值