机器学习1---GBDT

本文介绍了机器学习中的基本算法,包括线性回归和逻辑回归,强调它们在回归和分类问题中的应用。此外,详细讨论了决策树的生成、分类方法,如ID3、C4.5和CART,以及如何通过基尼系数选择最佳分割特征。还给出了决策树的Python实现示例,并探讨了单棵决策树的局限性和随机森林的概念。
摘要由CSDN通过智能技术生成

一、线性回归&逻辑回归

回归和分类(有监督的机器学习算法:有y值/有标签):回归是预测一个连续值/分类是预测一个离散值

1、线性回归:

模型:
Y=w0x0+w1x1+w2x2…+wnxn(定义域:负无穷到正无穷;值域:负无穷到正无穷)
损失函数:MSE
损失函数最小的方法:梯度下降(随机梯度下降,批梯度下降,mini-batch梯度下降)

2、逻辑回归:

模型:
(1)g(x)=w0x0+w1x1+w2x2…+wnxn(值域:负无穷到正无穷)
(2)Y=sigmoid(g(x))=(1/1+e(-g(x)));这个公式相当于把一个负无穷到正无穷转化呈一个0到1的值;如果阈值取到0.5,也就是说大于0.5的是一类;小于0.5的也是一类
损失函数:交叉熵(用来描述概率分布是不是杂乱的一个度量值,越杂乱,熵越大)
损失函数最小的方法:梯度下降(随机梯度下降,批梯度下降,mini-bantch梯度下降)

3、总结

  • 机器学习算法,三步走:1、模型 ,2、损失函数,3、梯度下降
  • 所有的回归问题,损失函数都可以用MSE;所有的分类问题,损失函数都可以用交叉熵

二、决策树

1、引言

  • 逻辑回归是一种线性有监督离散型分类模型
    • 逻辑回归对于非线性的解决方案:映射到高维
  • 决策树是一种非线性有监督离散型分类模型
    • 决策树使用特征进行分类
    • 分类的顺序不一样,导致分类的复杂度也不一样
    • 纯度(纯度指一个节点是否是叶子节点)高的特征,复杂度就低;所以当我们使用一个特征进行分类的时候,一定要去判断:哪个特征得到的结果纯度高。
  • 随机森林是一种非线性有监督离散型分类模型

2、数据类型

非数字数据的分类方式:

  • encoding
  • one-hot

encoding和one-bot的用法:

  • 当一组数据需要比较,但是无关大小,用encoding(比如学历,有高低之分)
  • 当一组数是独立的时候,用one-hot(比如男女,无比较关系)

1)离散的数据

需指明取值数量2M 种分割方式

  • 天气:晴天、雨天、多云
    • encoding:晴天1,雨天2,多云3
    • one-hot:晴天100,雨天010,多云001
  • 学历:高中、本科、研究生

2)连续的数据

需离散化,需指明离散化后的数量
车速:低速(60)高速(80)
M+1种分割方式

3、决策树的生成

数据在不断分裂的递归过程,每一次分裂,尽可能让类别一样的数据在树的一边,当树的叶子节点的数据都是一类的时候,则停止分裂(if else语句)

4、决策树的分类

决策树学习的思想主要来源于Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,以及由Breiman等人在1984年提出的CART算法
CART:一个节点只能分成两类(二叉树)
ID3、C4.5:一个节点可以分成多类

1)ID3

算法的核心是在决策树各个节点上应用信息增益选择特征,递归的构建决策树
具体方法是:

  • 从根节点(root node)开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点
  • 再对子节点递归地调用以上方法,构建决策树
  • 直到所有特征的信息增益均很小或没有特征可以选择为止
  • 最后得到一个决策树

当熵最大为1的时候,是分类效果最差的状态
当它最小为0的时候,是完全分类的状态
因为熵等于0是理想状态,一般实际情况下,熵介于0和1之间
ID3的缺点:
越细小的分割分类错误率越小,所以ID3会越分越细,容易造成过度学习

2)C4.5

所以为了避免分割太细,C4.5对ID3进行了改进,C4.5中,优化项要除以分割太细的代价,这个比值叫做信息增益率,显然分割太细分母增加,信息增益率会降低。除此之外,其他的原理和ID3相同。

3)CART

CART是一个二叉树,也是回归树,同时也是分类树,CART的构成简单明了
CART只能将一个父节点分为两个子节点,CART用GINI指数来决定如何分裂

GINI指数:总体内包含的类别越杂乱,GINI指数越大(跟熵的概念相似)。

  • a:比如使用出勤率大于70%这个条件将训练数据分成两组:
    大于70%里面由两类:好学生和不是好学生
    而小于等于70%里也有两类:好学生和不是好学生
  • b:如果用分数小于70分来分:
    则小于70分只有不是好学生一类
    而大于等于70分有好学生和不是好学生两类

比较a和b,发现b的凌乱程度比a要小,即GINI指数b比a小,所以选择b的方案。
以此为例,将所有条件列出来,选择GINI指数最小的方案,这个和熵的概念很类似。

i、基尼系数

基尼系数是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标

  • 若低于0.2表示指数等级极低;(高度平均)
  • 0.2-0.29表示指数等级低;(比较平均)
  • 0.3-0.39表示指数等级中;(相对合理)
  • 0.4-0.59表示指数等级高;(差距较大)
  • 0.6以上表示指数等级极高;(差距悬殊)

一般发达国家的基尼系数在0.24到0.36之间,美国偏高,为0.45.中国国家统计局公布基尼系数2012年为0.474,2013年为0.473,2014年为0.469,2015年为0.462,2016年为0.465。

5、代码实例

"""
Description:
DecisionTreeClassifier(ClassifierMixin,BaseDecisionTree)的参数:
criterion:表示特征纯度的标准,有基尼系数gini,信息增益entropy
splitter:选择分裂节点的策略,有best和random,best会将所有的都计算一遍,然后选择一个最好的,精准但慢;random随机选取一个,快但不准确
max_depth:确定树的最大深度,防止造成过拟合。如果过深会造成分类过细
min_samples_split:int or float,指每个节点中最少能分得几个子节点,
指的是internal node   int:给一个确定的值,如果小于这个值,则不对此节点进行继续划分;
                      float:给出的是计算得到的一个比率
                      同样是防止过拟合的发生
min_samples_leaf:int or float,专指叶子节点
min_weight_fraction_leaf:float 指每个叶子节点的权重值
max_features:可以指定计算的特征数量(如果特征数量过大时,进行设定)
            int:指定的特征数量
            float:指定一个特征所占的比例进行计算
            auto:自动使用“max_features=sqrt(n_features)”
            sqrt:同auto
            log2:max_features=log2(n_features)
            不进行设置即为n_features
max_leaf_nodes:最大的叶子节点数,如果达到这个数量就不继续向下分
min_impurity_decrease:设定一个纯度的最低标准,直到达到这个标准才停止计算
"""
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
# 决策树分类器
from sklearn.tree import DecisionTreeClassifier
# 分割训练集和测试集的比例
from sklearn.model_selection import train_test_split
# metrics做评估用的,accuracy_score是为了评估准确率
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

iris=load_iris()
data=pd.DataFrame(iris.data)
data.columns=iris.feature_names
data['Species']=iris.target
pd.set_option('display.max_columns',4)  # 显示几列数据,这里显示一列数据
# print(data)

x=data.iloc[:,:2]  # 取数据的前两列,即花萼的长度和宽度
y=data.iloc[:,-1]  # 取数据的最后一列
# print(x)
# print(y)

# train_size切分数据集的比例,random_state随机种子,保证每次切割的数据集都是一模一样的
# 现在一般的划分为70:30
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.75,random_state=42)

# 创建一个决策树模型,最大深度max_depth是2,求纯度的分割标准criterion,默认的是基尼系数gini,这里使用了entropy,即信息增益
tree_clf=DecisionTreeClassifier(max_depth=2,criterion='entropy')
tree_clf.fit(x_train,y_train)
y_test_hat=tree_clf.predict(x_test)
print('acc score:',accuracy_score(y_test,y_test_hat))
# 此时的准确度为0.6578947368421053
print(tree_clf.predict_proba([[5,1.5]]))  # 随机输入一个特征值,去预测花的种类,proba给出的是属于某个特征的概率
print(tree_clf.predict([[5,1.5]]))  # 根据属于每个种类的概率,选择属于概率高的那个种类,作为预测种类输出


# 调节决策树,提高准确度
depth=np.arange(1,15)
err_list=[]
for d in depth:
    # splitter: best 找最好的维度进行分裂 random随机找维度进行分裂
    # max_feature: 找最好分割维度的时候,找多少个特征 none就是不限制找的数量 int就是找3个进行考量 float就是找0.5(50%)去试 sqrt就是找所有特征开根号个特征
    # max_depth: 最大深度 None的话,得看 min_sample_split
    # min_sample_split: 分裂前我需要保证这个叶子有几个样本 int就是直接取, float还是要计算一下
    # min_samples_leaf: 分类后需要保证每个分裂的叶子有几个样本(min_sample_split=2, min_samples_leaf=1)
    # min_weight_fraction_leaf 每个叶子节点里的样本数,必须是所有样本的10%
    # max_leaf_nodes: 最多的叶子数
    # min_impurity_split: 每一个叶子节点里面的不纯度,最小保证多纯:保证不会过早的停止生长;达不到指标就继续往下分
    clf=DecisionTreeClassifier(criterion='entropy',max_depth=d)
    clf.fit(x_train,y_train)
    y_test_hat=clf.predict(x_test)
    result=(y_test==y_test_hat)  # 相同时为1,不同时为0,取和
    err=1-np.mean(result)
    err_list.append(err)
    print(d,'错误率:%.2f%%'%(100*err))

# 设置字体
# mpl.rcParams['font.sans-serif']=['SimHei']
# 图的底色
plt.figure(facecolor='w')
# ro-red 圈,横线连起来
plt.plot(depth,err_list,'ro-',lw=2)
plt.xlabel('Decision Tree Depth',fontsize=15)
plt.ylabel('Error Rate',fontsize=15)
plt.title('Decision Tree Depth & Over Fit',fontsize=18)
plt.grid(True)
plt.show()

结果:

acc score: 0.6578947368421053
[[0.14285714 0.71428571 0.14285714]]
[1]
1 错误率:36.84%
2 错误率:34.21%
3 错误率:31.58%
4 错误率:26.32%
5 错误率:34.21%
6 错误率:28.95%
7 错误率:31.58%
8 错误率:26.32%
9 错误率:26.32%
10 错误率:39.47%
11 错误率:42.11%
12 错误率:31.58%
13 错误率:36.84%
14 错误率:36.84%

在这里插入图片描述

6、总结

单颗决策树的缺点:

  • 运算量大,需要一次加载所有数据进内存。并且找寻分割条件是一个极耗资源的工作
  • 训练样本中出现异常数据时,将会对决策树产生很大影响。抗干扰能力差

解决:

  • 减少决策树所需训练样本(减少列或者减少行)
  • 随机采样,降低异常数据的影响

三、随机森林

森林:由树组成
随机:生成树的数据都是从数据集中随机选取的
随机森林:当数据集很大的时候,我们随机选取数据集的一部分,生成一棵树,重复上述过程,我们可以生成一堆形态各异的树。这些树放在一起就叫森林。
多棵树最后的取值方式:少数服从多数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值