python数据与挖掘实战学习:第五章挖掘建模 分类与预测部分笔记

第五章 挖掘建模

5.1 分类与预测

分类与预测是预测问题的两种主要类型,分类主要是预测分类标号(离散属性),而预测主要是建立连续值函数模型,预测给定自变量对应的因变量的值。

5.1.1 实现过程

(1)分类
分类是构造一个分类模型,输入样本的属性值,输出对应的类别,将每个样本映射到预先定义好的类别。分类模型建立在已有类标记的数据集上,模型在已有样本上的准确率可以方便地计算,属于监督学习
(2)预测
预测是指建立在两种或两种以上变量间相互依赖的函数模型,然后进行预测或控制。
(3)实现过程
分类算法:第一步是学习步,通过归纳分析训练样本集来建立分类模型得到分类规则;第二步是分类步,先用已知的测试样本集评估分类规则的准确率,如果准确率是可以接受的,则使用该模型对未知类标号的待测样本集进行预测。
预测算法:第一步通过训练集建立预测属性(数值型的)的函数模型,第二步在模型通过检验后进行预测或控制。

5.1.2 常用的分类与预测算法

(1)回归分析
回归分析是确定预测属性(数值型)与其他变量间相互依赖的定量关系最常用的统计学方法。包括线性回归、非线性回归、logistic回归、岭回归、主成分回归、偏最小二乘回归等模型。
(2)决策树
决策树采用自顶向下的递归方式,在内部节点进行属性值的比较,并根据不同的属性值从该节点向下分支,最终得到的叶节点是学习划分的类。
(3)人工神经网络
人工神经网络是一种模仿大脑神经网络结构和功能而建立的信息处理系统,表示神经网络的输入与输出变量之间关系的模型。
(4)贝叶斯网络
贝叶斯网络又称信度网络,是bayes方法的扩展,是目前不确定知识表达和推理领域最有效的理论模型之一。
(5)支持向量机
支持向量机是一种通过某种非线性映射,把低维的非线性可分转化为高维的线性可分,在高维空间进行线性分析的算法。

5.1.3 回归分析

回归分析是通过建立模型来研究变量之间相互关系的密切程度、结构状态及进行模型预测的一种有效工具。
(1)线性回归
适用条件:因变量与自变量是线性关系。
对一个或多个自变量和因变量之间的线性关系进行建模,可用最小二乘法求解模型系数。
(2)非线性回归
适用条件:因变量与自变量之间不都是线性关系。
对一个或多个自变量和因变量之间的非线性关系进行建模。如果非线性关系可以通过简单的函数变换转化成线性关系,用线性回归的思想求解;如果不能转化,用非线性最小二乘方法求解。
(3)Logistic回归
适用条件:因变量一般有1和0(是否)两种取值。
是广义线性回归模型的特例,利用Logistic函数将因变量的取值范围控制在0和1之间,表示取值为1的概率。
(4)岭回归
适用条件:参与建模的自变量之间具有多重共线性。
是一种改进最小二乘估计的方法。
(5)主成分回归
适用条件:参与建模的自变量之间具有多重共线性。
主成分回归是根据主成分分析的思想提出来的,是对最小二乘法的一种改进,它是参数估计的一种有偏估计。可以消除自变量之间的多重共线性。
书中对二分类Logistic回归模型的原理进行介绍。
1.Logistic回归分析介绍
(1)Logistic函数
二分类Logistic回归模型中的因变量只有1-0两种取值。记y取1的概率是p=P(y=1|X),取0的概率是1-p,取1和取0的概率之比为 p 1 − p \frac{p}{1-p} 1pp,称为事件的优势比(odds),对odds取自然对数即得Logistic变换
L o g i t ( p ) = l n ( p 1 − p ) Logit(p)=ln(\frac{p}{1-p}) Logit(p)=ln(1pp)
L o g i t ( p ) = l n ( p 1 − p ) = z Logit(p)=ln(\frac{p}{1-p})=z Logit(p)=ln(1pp)=z,则 p = 1 1 + e − z p=\frac{1}{1+e^{-z}} p=1+ez1即为Logistic函数。
Logistic函数图像
(2)Logistic回归模型
Logistic回归模型是建立 l n ( p 1 − p ) ln(\frac{p}{1-p}) ln(1pp)与自变量的线性回归模型。
Logistic回归模型为:
l n ( p 1 − p ) = β 0 + β 1 x 1 + . . . + β p x p + ε ln(\frac{p}{1-p})=β_{0}+β_{1}x_{1}+...+β_{p}x_{p}+ε ln(1pp)=β0+β1x1+...+βpxp+ε
取值范围是 ( − ∞ , + ∞ ) (-\infty,+\infty) (+)
g ( x ) = β 0 + β 1 x 1 + . . . + β p x p g(x)=β_{0}+β_{1}x_{1}+...+β_{p}x_{p} g(x)=β0+β1x1+...+βpxp,得到:
p = P ( y = 1 ∣ X ) = 1 1 + e − g ( x ) 1 − p = P ( y = 0 ∣ X ) = 1 − 1 1 + e − g ( x ) p=P(y=1|X)=\frac{1}{1+e^{-g(x)}}\\ 1-p = P(y=0|X)=1-\frac{1}{1+e^{-g(x)}} p=P(y=1X)=1+eg(x)11p=P(y=0X)=11+eg(x)1
(3)Logistic回归模型解释
p 1 − p = e β 0 + β 1 x 1 + . . . + β p x p + ε \frac{p}{1-p}=e^{β_{0}+β_{1}x_{1}+...+β_{p}x_{p}+ε} 1pp=eβ0+β1x1+...+βpxp+ε

β0:在没有自变量,即x1,x2,…,xp全部取0,y=1与y=0发生概率之比的自然对数。
βi:某自变量xi变化时,即xi=1与xi相比,y=1优势比的对数值。

Created with Raphaël 2.3.0 根据挖掘目的设置特征,并筛选特征y;x1,x2,...,xp 列出回归方程ln(p/1-p)=β0+β1x1+...+βpxp+ε 估计回归系数 模型检验 预测控制

在进行逻辑回归分析前先进行特征筛选,可使用方法主要包含在Scikit_Learn的feature_selection库中,有:F检验、递归特征消除、稳定性选择等。

import pandas as pd

data = pd.read_excel('./demo/data/bankloan.xls')
print(data)
x = data.iloc[:, :8].values  # as_matrix()方法已淘汰
y = data.iloc[:, 8].values

from sklearn.linear_model import LogisticRegression as LR
from sklearn.feature_selection import RFE  # 因为新版本的sklearn库已经将RandomizedLogisticRegression移除,这里使用RFE进行特征筛选

estimator = LR(max_iter=5000)  # 这里设置迭代次数为5000,不然下面训练模型时会报收敛警告
selector = RFE(estimator=estimator, n_features_to_select=4)  # 选择4个特征
selector.fit(x, y)
# print(selector.n_features_)   # 给出被选出的特征的数量
# print(selector.support_)      # 给出了被选择特征的mask
# print(selector.ranking_)      # 特征排名,被选出特征的排名为1
print('通过RFE模型筛选特征结束。')
print('有效特征为:%s' % ','.join(data.columns[selector.get_support(indices=True)]))  # Indices是False,返回一个类型是boolean的数组,如果indices是True,返回一个整型数组
x = data[data.columns[selector.get_support(indices=True)]].values  # 筛选好特征

lr = LR()  # 建立逻辑回归模型
lr.fit(x, y)  # 用筛选好的特征数据来训练模型
print('逻辑回归模型训练结束。')
print('模型的平均正确率为:%s' % lr.score(x, y))  # 给出模型的平均正确率

5.1.4 决策树

决策树是一树状结构,它的每一个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出到达这个节点的样本所属的类。
构造决策树的核心问题是在每一步如何选择适当的属性对样本做拆分。
(1)ID3算法
其核心是在决策树的各级节点上,使用信息增益方法作为属性的选择标准,来帮助确定生成每个节点时所应采用的合适属性。
(2)C4.5算法
C4.5决策树生成算法相对于ID3算法的重要改进是使用信息增益来选择节点属性。C4.5算法可以克服ID3算法存在的不足:ID3算法只适用于离散的描述属性,而C4.5算法既能够处理离散的描述属性,也可以处理连续的描述属性。
(3)CART算法
CART决策树是一种十分有效的非参数分类和回归算法,通过构建树、修剪树、评估树来构建一个二叉树。当终结点是连续变量时,该树为回归树;当终结点是分类变量,该树为分类树。
该书主要介绍了ID3算法。
1.ID3算法介绍及基本原理
ID3算法基于信息熵来选择最佳测试属性。它选择当前样本集中具有最大信息增益值的属性作为测试属性;样本集的划分则依据测试属性的取值进行,测试属性有多少不同取值就将样本集划分为多少子样本集,同时决策树上相应于该样本集的节点长出新的叶子节点。
算法根据信息论理论,采用划分后样本集的不确定性作为衡量划分好坏的标准,用信息增益值度量不确定性:信息增益越大,不确定性越小。ID3算法在每个非叶节点选择信息增益最大的属性作为测试属性,因此得到当前情况下最纯的拆分,从而得到较小的决策树。
设S是s个数据样本的集合。假定类别属性具有m个不同的值:Ci(i=1,2,…,m)。设si是类Ci中的样本数。对一个给定的样本,总信息熵为:
I ( s 1 , s 2 , . . . , s m ) = − ∑ i = 1 m P i l o g 2 ( P i ) I(s_{1},s_{2},...,s_{m})=-\sum_{i=1}^{m}{P_{i}log_{2}(P_{i})} I(s1,s2,...,sm)=i=1mPilog2(Pi)
其中,Pi是任意样本属于Ci的概率,一般用 s i s \frac{s_{i}}{s} ssi估计。
设一个属性A具有k个不同的值{a1,a2,…,ak},利用属性A将集合S划分为k个子集{S1,S2,…,Sk},其中Sj包含了集合S中属性A取aj值的样本。若选择属性A作为测试属性,则这些子集就是从集合S的节点生长出来的新叶节点。设sij是子集Sj中类别为Ci的样本数,则根据属性A划分样本的信息熵值为
E ( A ) = ∑ j = 1 k s 1 j + s 2 j + . . . + s m j s I ( s 1 j , s 2 j , . . . , s m j ) E(A)=\sum_{j=1}^{k} \frac{s_{1j}+s_{2j}+...+s_{mj}}{s}I(s_{1j},s_{2j},...,s_{mj}) E(A)=j=1kss1j+s2j+...+smjI(s1j,s2j,...,smj)
其中 I ( s 1 j , s 2 j , . . . , s m j ) = − ∑ i = 1 m P i j l o g 2 ( P i j ) , P i j = s i j s 1 j + s 2 j + . . . + s m j I(s_{1j},s_{2j},...,s_{mj})=-\sum_{i=1}^{m}{P_{ij}log_{2}(P_{ij})},P_{ij}=\frac{s_{ij}}{s_{1j}+s_{2j}+...+s_{mj}} I(s1j,s2j,...,smj)=i=1mPijlog2(Pij)Pij=s1j+s2j+...+smjsij是子集Sj中类别为Ci的样本的概率。
最后,用属性A划分样本集S后所得到的信息增益为
G a i n ( A ) = I ( s 1 , s 2 , . . . , s m ) − E ( A ) Gain(A)=I(s_{1},s_{2},...,s_{m})-E(A) Gain(A)=I(s1,s2,...,sm)E(A)
E(A)越小,Gain(A)越大,说明选择测试属性A对于分类提供的信息越大,选择A后对分类的不确定程度越小。属性A的k个不同的值对于样本集S的k个子集或分支,通过递归调用上述过程(不包括已经选择的属性),生成其他属性作为节点的子节点和分支来生成整个决策树。
2.ID3算法具体流程
1)对当前样本集合,计算所有属性的信息增益;
2)选择信息增益最大的属性作为测试属性,把测试属性取值相同的样本划分为同一个子样本集;
3)若子样本集的类别属性只含有单个属性,则分支为叶子节点,判断其属性值并标上相应的符号,然后返回调用处;否则对子样本集递归调用算法。

import pandas as pd

data = pd.read_excel('./demo/data/sales_data.xls', index_col='序号')  # 导入数据
# print(data)

# 数据是类别标签,将其转换为数据
# 用1来表示“好”,“是”,“高”三个属性,用-1来表示“坏”“否”“低”
data[data == '好'] = 1
data[data == '高'] = 1
data[data == '是'] = 1
data[data != 1] = -1
x = data.iloc[:, :3].values.astype(int)
y = data.iloc[:, 3].values.astype(int)
# print(x)
# print(y)

from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy')  # 建立决策树模型,基于信息熵
dtc.fit(x, y)

5.1.5 人工神经网络

人工神经网络是模拟生物神经网络进行信息处理的一种数学模型,目的在于模拟大脑的某些机理与机制,实现一些特定的功能。
人工神经网络模型主要是一个人工神经元将输入信号乘权重+阈值代入激活函数中,得到输出y。
人工神经网络的学习也称为训练,指的是神经网络在受到外部环境的刺激下调整神经网络的参数,使神经网络以一种新的方式对外部环境做出反应的一个过程。
常用激活函数:
(1)域值函数(阶梯函数)
f ( v ) = { 1 v ≥ 0 0 v < 0 f(v)=\left\{ \begin{aligned} 1\quad v \geq 0 \\ 0\quad v < 0\\ \end{aligned} \right. f(v)={1v00v<0
当函数自变量小于0时,函数的输出为0;当函数的自变量大于或等于0时,函数的输出为1,用该函数可以把输入分成两类
(2)分段线性函数
f ( v ) = { 1 , v ≥ 1 v , − 1 < v < 0 − 1 , v ≤ − 1 f(v)=\left\{ \begin{aligned} 1&, v \geq 1 \\ v&, -1<v < 0\\ -1&,v\leq -1 \end{aligned} \right. f(v)=1v1v11<v<0v1
该函数在(-1,+1)线性区内的放大系数是一致的,这种形式的激活函数可以看作是非线性放大器的近似。
(3)非线性转移函数(Logistic)
f ( v ) = 1 1 + e − v f(v)=\frac{1}{1+e^{-v}} f(v)=1+ev1
单极性S型函数为实数域R到[0,1]闭集的连续函数,代表了连续状态型神经元模型。其特点是函数本身及其导数都是连续的,能够体现数学计算上的优越性。
(4)Relu函数
f ( v ) = { v v ≥ 0 0 v < 0 f(v)=\left\{ \begin{aligned} v\quad v \geq 0 \\ 0\quad v < 0\\ \end{aligned} \right. f(v)={vv00v<0
该激活函数具有计算简单、效果更佳的特点,目前已经有取代其他激活函数的趋势。

在分类与预测中常用δ学习规则(误差校正学习算法)对神经元的连接强度进行修正,用误差函数E来衡量神经网络训练是否完成。
其中误差校正学习算法根据神经网络的输出误差对神经元的连接强度进行修正,属于有指导学习。设神经网络中神经元i作为输入,神经元j作为输出神经元,它们的连接权值为wij,则对权值的修正为△wij=ηδjYi,其中η为学习率,δj=Tj-Yj为j的偏差,即输出神经元j的实际输出和教师信号之差。
常用的神经网络算法有:BP神经网络、LM神经网络、RBf径向基神经网络、FNN模糊神经网络、GMDH神经网络、ANFIS自适应神经网络。

本书主要介绍BP神经网络,其学习算法是δ学习规则,目标函数采用 E = ∑ k = 1 N [ Y k − T k ] 2 E=\sum_{k=1}^{N}[Y_{k}-T_{k}]^{2} E=k=1N[YkTk]2
反向传播算法的特征是利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,一层层反向传播下去,就获得了所有其他各层的误差估计。
这里以三层BP网络为例。
三层BP神经网络

BP算法的学习过程分为信号的正向传播和误差的逆向传播。正向传播时,输入信号经过隐层的处理后,传向输出层。若输出层节点未能得到期望的输出,则转入误差的逆向传播阶段,将输出误差按某种子形式,通过隐层向输入层返回,并“分摊”给隐层4个节点与输入层x1、x2、x3三个输入节点从而获得各层单元的参考误差或称误差信号,作为修改各单元权值的依据。权值不断修改的过程就是学习过程,此过程一直进行到网络输出的误差逐渐减少到可接受的程度或达到设定的学习次数为止。
学习过程

import pandas as pd

data = pd.read_excel('./demo/data/sales_data.xls', index_col='序号')  # 导入数据
# print(data)

# 数据是类别标签,将其转换为数据
# 用1来表示“好”,“是”,“高”三个属性,用-1来表示“坏”“否”“低”
data[data == '好'] = 1
data[data == '高'] = 1
data[data == '是'] = 1
data[data != 1] = -1
x = data.iloc[:, :3].values.astype(int)
y = data.iloc[:, 3].values.astype(int)

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()
model.add(Dense(3, 10))
model.add(Activation('relu'))  # 用relu函数作为激活函数
model.add(Dense(10, 1))
model.add(Activation('sigmoid'))  # 由于是0-1输出,用sigmoid函数作为激活函数

model.compile(loss='binary_crossentropy', optimizer='adam', class_mode='binary')
# 编译模型。由于是二元分类,所以指定损失函数为binary_crossentropy,以及模式为binary
# 另外常见的损失函数还有mean_squared_error、catagorical_crossentropy等
# 求解方法指定用adam,还有sgd、rmsprop等
model.fit(x, y, nb_epoch=1000, batch_size=10)  # 训练模型,学习1000次
yp = model.predict_classes(x).reshape(len(y))  # 分类预测

5.1.6 分类与预测算法评价

为判断一各预测模型的性能表现,需要一组没有参与预测模型建立的数据集,并且在该数据集上评价预测模型的准确率,这组独立的数据集称为测试集。
(1)绝对误差与相对误差
设Y表示实际值,y表示预测值(为了方便以下式子的符号含义相同),则称E为绝对误差:
E = Y − y E = Y-y E=Yy
e为相对误差(也可用百分比表示):
e = Y − y Y e=\frac{Y-y}{Y} e=YYy
(2)平均绝对误差
M A E = 1 n ∑ i = 1 n ∣ E i ∣ = 1 n ∑ i = 1 n ∣ Y i − y i ∣ MAE=\frac{1}{n}\sum_{i=1}^{n}|E_{i}|= \frac{1}{n}\sum_{i=1}^{n}|Y_{i}-y_{i}| MAE=n1i=1nEi=n1i=1nYiyi
(3)均方误差
M S E = 1 n ∑ i = 1 n E i 2 = 1 n ∑ i = 1 n ( Y i − y i ) 2 MSE=\frac{1}{n}\sum_{i=1}^{n}E_{i}^{2}=\frac{1}{n}\sum_{i=1}^{n}(Y_{i}-y_{i})^{2} MSE=n1i=1nEi2=n1i=1n(Yiyi)2
均方根误差加强了数值大的误差在指标中的作用,提高了这个指标的灵敏性。
(4)均方根误差
R M S E = 1 n ∑ i = 1 n E i 2 = 1 n ∑ i = 1 n ( Y i − y i ) 2 RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^{n}E_{i}^{2}}=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(Y_{i}-y_{i})^{2}} RMSE=n1i=1nEi2 =n1i=1n(Yiyi)2
均方根误差代表预测值的离散程度。也称标准误差,最佳拟合情况为RMSE=0。
(5)平均绝对百分误差
M A P E = 1 n ∑ i = 1 n ∣ E i / Y i ∣ = 1 n ∑ i = 1 n ∣ ( Y i − y i ) / Y i ∣ MAPE=\frac{1}{n}\sum_{i=1}^{n}|E_{i}/Y_{i}|=\frac{1}{n}\sum_{i=1}^{n}|(Y_{i}-y_{i})/Y_{i}| MAPE=n1i=1nEi/Yi=n1i=1n(Yiyi)/Yi
一般认为MAPE小于10时,预测精度较高。
(6)Kappa统计
Kappa统计是比较两个或多个观测者对同一事物,或观测者对同一事物的两次或多次观测结果是否一致,以由于机遇造成的一致性和实际观测的一致性之间的差别大小作为评价基础的统计指标。
kappa取值在[-1,+1]之间,不同取值的意义不同

  • kappa=+1 说明两次判断结果完全一致
  • kappa=-1 说明两次判断结果完全不一致
  • kappa=0 说明两次判断结果是机遇造成
  • kappa<0 说明一致程度比机遇造成的还差,两次结果很不一致,在实际应用中无意义
  • kappa>0 此时说明有意义,kappa越大,说明一致性越好
  • kappa>=0.75 说明已经取得相当满意的一致程度
  • kappa<0.4 说明一致程度不够

(7)识别准确度
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\frac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN
其中各项与混淆矩阵有关
参考机器学习:准确率(Precision)、召回率(Recall)、F值(F-Measure)、ROC曲线、PR曲线
对于混淆矩阵有:混淆矩阵
(8)识别准确率
P r e c i s i o n = T P T P + F P ∗ 100 % Precision=\frac{TP}{TP+FP}*100\% Precision=TP+FPTP100%
(9)反馈率
R e c a l l = T P T P + F N ∗ 100 % Recall=\frac{TP}{TP+FN}*100\% Recall=TP+FNTP100%
(10)ROC曲线
受试者工作特性(ROC)将灵敏度设在纵轴,1-特异性设在横轴。该曲线下的积分面积大小与每种方法的优劣密切相关,反映分类器正确分类的统计概率,其值越接近1说明该算法效果越好。

5.1.7 python分类预测模型特点

常见的分类/预测模型:
(1)逻辑回归
比较基础的线性分类模型,位于sklearn.linear_model
(2)SVM
可以用来回归、预测、分类等,而根据选取不同的核函数。模型可以是线性或非线性的,位于sklearn.svm。
(3)决策树
基于“分类讨论、逐步细化”思想的分类模型,模型直观,易解释,位于sklearn.tree。
(4)随机森林
思想跟决策树类似,,精度通常比决策树更高,缺点是由于其随机性,丧失了决策树的可解释性,位于sklearn.ensemble。
(5)朴素贝叶斯
基于概率思想的简单有效的分类模型,能够给出容易理解的概率解释,位于sklearn.naive_bayes。
(6)神经网络
具有强大的拟合能力,可以用于拟合、分类等,位于keras。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值