文章目录
一、线性回归&逻辑回归
回归和分类(有监督的机器学习算法:有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、总结
单颗决策树的缺点:
- 运算量大,需要一次加载所有数据进内存。并且找寻分割条件是一个极耗资源的工作
- 训练样本中出现异常数据时,将会对决策树产生很大影响。抗干扰能力差
解决:
- 减少决策树所需训练样本(减少列或者减少行)
- 随机采样,降低异常数据的影响
三、随机森林
森林:由树组成
随机:生成树的数据都是从数据集中随机选取的
随机森林:当数据集很大的时候,我们随机选取数据集的一部分,生成一棵树,重复上述过程,我们可以生成一堆形态各异的树。这些树放在一起就叫森林。
多棵树最后的取值方式:少数服从多数