基础|认识机器学习中的逻辑回归、决策树、神经网络算法

作者:石文华

编辑:田 旭

逻辑回归

1

逻辑回归。它始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确而又具备鲁棒性地分割,因此我们设计出了逻辑回归这样一个算法,它的输出结果表征了某个样本属于某类别的概率。逻辑回归的成功之处在于,将原本输出结果范围可以非常大的θTX 通过sigmoid函数映射到(0,1),从而完成概率的估测。sigmoid函数图像如下图所示:

直观地在二维空间理解逻辑回归,是sigmoid函数的特性,使得判定的阈值能够映射为平面的一条判定边界,当然随着特征的复杂化,判定边界可能是多种多样的样貌,但是它能够较好地把两类样本点分隔开,解决分类问题。求解逻辑回归参数的传统方法是梯度下降,构造为凸函数的代价函数后,每次沿着偏导方向(下降速度最快方向)迈进一小部分,直至N次迭代后到达最低点。利用Scikit-Learn对数据进行逻辑回归分析。 首先进行特征筛选, 特征筛选的方法有很多,主要包含在Scikit_Learn的feature_selection库中, 比较简单的有通过F检验(f_regression) 来给出各个特征的F值和p值, 从而可以筛选变量(选择F值大的或者p值小的特征)其次有递归特征消除(Recursive Feature Elimination, RFE) 和稳定性选择(Stability Selection) 等比较新的方法。之后就可以利用筛选后的特征建立逻辑回归模型。

递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型) 然后选出最好的(或者最差的) 的特征(可以根据系数来选) , 把选出来的特征放到一边, 然后在剩余的特征上重复这个过程, 直到遍历所有特征。 这个过程中特征被消除的次序就是特征的排序。 因此, 这是一种寻找最优特征子集的贪心算法。 Scikit-Learn提供了RFE包, 可以用于特征消除, 还提供了RFECV, 可以通过交叉验证来对特征进行排序。

  • 代码体验
import pandas as pd
input_file='./bankloan.xls'
data=pd.read_excel(input_file)
data.head()
X=data.iloc[:,:8].as_matrix()#将矩阵转换为Numpy数组
Y=data.iloc[:,8].as_matrix()
from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR
rlr=RLR()#建立随机逻辑回归模型,筛选变量
rlr.fit(X,Y) #训练模型
rlr.get_support()#获取特征筛选结果,也可以通过.scores_方法获取各个特征的分数
x=data.iloc[:,0:8]
X = x[x.columns[rlr.get_support()]].as_matrix() #筛选好特征
lr=LR()#建立逻辑回归模型
lr.fit(X,Y)
print("正确率:%s" % lr.score(X,Y))
x.columns[rlr.get_support()]

决策树

2

决策树(decision tree):是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

决策树构造:使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:

  1. 属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
  2. 属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
  3. 属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。

构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,是将给定的类标记的训练集合的数据划分D“最好”地分成个体类的启发式方法,它决定了拓扑结构及分裂点split_point的选择。

属性选择度量算法有很多,一般使用自顶向下递归分治法,并采用不回溯的贪心策略。

  • 代码体验
import pandas as pd
input_file='./sales_data.xls'
data=pd.read_excel(input_file,index_col='序号')
data[data=="好"]=1
data[data=="是"]=1
data[data=="高"]=1
data[data!=1]=-1
#注意类型,上面输出可以看出是object类型,要转换成int类型
X=x.as_matrix().astype(int)
Y=y.as_matrix().astype(int)
from sklearn.tree import DecisionTreeClassifier as DTC#导入分类树
dtc=DTC()
dtc.fit(X,Y)
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
with open("tree.dot", 'w') as f:
    f = export_graphviz(dtc, feature_names = x.columns, out_file = f)

神经网络

3

人工神经网络(ANN)

人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人 工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象, 建立某种 简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神 经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相 互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加 权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式, 权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数 的逼近,也可能是对一种逻辑策略的表达。

Keras简介

Keras:基于Python的深度学习库 Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果 。

常用模块简介:

1.optimizers 包:keras.optimizers : 这个是用来选用优化方法的,里面有SGD,Adagrad,Adadelta,RMSprop,Adam可选 。

2.objectives

包:keras.objectives

该模块主要负责为神经网络附加损失函数,即目标函

这个定义了用什么形式的误差来优化,有

mean_squared_error / mse:平均方差 mean_absolute_error / mae:绝对误差 mean_absolute_percentage_error / mape:平均绝对百分差 mean_squared_logarithmic_error / msle:对数误差 squared_hinge hinge binary_crossentropy: Also known as logloss. categorical_crossentropy:使用这个目标函数需要设置label为二进制数组的形式。

3.model 包:keras.models 这是Keras中最主要的一个模块,用于对各个组件进行组装 from keras.model import Sequential model = keras.models.Sequential() 初始化一个神经网络 model.add(......)#add方法进行组装

4、layers 包:keras.layers 该模块主要用于生成神经网络层,包含多种类型,如Core layers、Convolutional layers等 from keras.layers import Dense model.add(Dense(input_dim=3,output_dim=5)#加入隐藏层

5、Initializations 包:keras.initializations 该模块主要负责对模型参数(权重)进行初始化,初始化方法包括:uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal等 model.add(Dense(input_dim=3,output_dim=5,init='uniform')) #加入带初始化(uniform)的隐含层

6、Activations 包:keras.activations、keras.layers.advanced_activations(新激活函数) 该模块主要负责为神经层附加激活函数,如linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus以及LeakyReLU等比较新的激活函数

Keras的Sequential模型

Keras的核心数据结构是“模型”,模型是一种组织网络层的方式。Keras中主要的模型是Sequential模型,Sequential是一系列网络层按顺序构成的栈。你也可以查看函数式模型来学习建立更复杂的模型。

Sequential模型如下: from keras.models import Sequential model = Sequential() 将一些网络层通过.add()堆叠起来,就构成了一个模型: from keras.layers import Dense, Activation model.add(Dense(units=64, input_dim=100)) model.add(Activation("relu")) model.add(Dense(units=10)) model.add(Activation("softmax"))

完成模型的搭建后,我们需要使用.compile()方法来编译模型: model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

编译模型时必须指明损失函数和优化器,如果你需要的话,也可以自己定制损失函数。Keras的一个核心理念就是简明易用同时,保证用户对Keras的绝对控制力度,用户可以根据自己的需要定制自己的模型、网络层,甚至修改源代码。

from keras.optimizers import SGD model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))

完成模型编译后,我们在训练数据上按batch进行一定次数的迭代来训练网络

model.fit(x_train, y_train, epochs=5, batch_size=32)

当然,我们也可以手动将一个个batch的数据送入网络中训练,这时候需要使用:model.train_on_batch(x_batch, y_batch)

随后,我们可以使用一行代码对我们的模型进行评估,看看模型的指标是否满足我们的要求:

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

或者,我们可以使用我们的模型,对新的数据进行预测: classes = model.predict(x_test, batch_size=128)

搭建一个问答系统、图像分类模型,或神经图灵机、word2vec词嵌入器就是这么快。支撑深度学习的基本想法本就是简单的,现在让我们把它的实现也变的简单起来!

  • 代码体验
import pandas as pd
#读取数据
input_file='./sales_data.xls'
data=pd.read_excel(input_file,index_col='序号')
#将数据的类别标签转换为数据
data[data=='好']=1
data[data=='是']=1
data[data=='高']=1
data[data!=1]=0
x=data.iloc[:,:3].as_matrix().astype(int)#选取训练集,转换为矩阵形式,并且注意类型
y=data.iloc[:,3].as_matrix().astype(int)
from keras.models import Sequential
from keras.layers.core import Dense,Activation
model=Sequential()#建立模型
model.add(Dense(input_dim=3,output_dim=10))
model.add(Activation('relu'))#用relu作为激活函数
model.add(Dense(input_dim=10,output_dim=1))
model.add(Activation('sigmoid'))#输出分类0或1
model.compile(loss = 'binary_crossentropy', optimizer = 'adam')
model.fit(x,y,nb_epoch = 1000, batch_size = 10) #训练模型,学习一千次yp=model.predict_classes(x).reshape(len(y))  #分类预测
yp = model.predict_classes(x).reshape(len(y)) #分类预测
import matplotlib.pyplot as plt #导入作图库
from sklearn.metrics import confusion_matrix #导入混淆矩阵函数
def cm_plot(y, yp):
    cm = confusion_matrix(y, yp) #混淆矩阵
    plt.matshow(cm, cmap=plt.cm.Greens) #画混淆矩阵图,配色风格使用cm.Greens,更多风格请参考官网。
    plt.colorbar() #颜色标签
    for x in range(len(cm)): #数据标签
        for y in range(len(cm)):
            plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
    plt.ylabel('True label') #坐标轴标签
    plt.xlabel('Predicted label') #坐标轴标签
    return plt
cm_plot(y,yp).show() #显示混淆矩阵可视化结果

从图可以看出, 检测样本为34个, 预测正确的个数为26个, 预测准确率为76.4%, 预测准确率较低, 是由于神经网络训练时需要较多样本, 而这里是由于训练数据较少造成的。

需要指出的是, 这里的案例比较简单,我们并没有考虑过拟合的问题。事实上,神经网络的拟合能力是很强的,容易出现过拟合现象。跟传统的添加“惩罚项”的做法不同, 目前神经网络(尤其是深度神经网络)中流行的防止过拟合的方法是随机地让部分神经网络节点休眠,也就是dropout,dropout可参考文章http://mp.weixin.qq.com/s/OB3xBKWHH1lAo-yBdlJVFg。

参考文献: 1、http://blog.csdn.net/han_xiaoyang/article/details/49123419 2、https://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html 3、Python数据分析与挖掘实战 4、http://www.coin163.com/it/x7874130266141340969 5、http://keras-cn.readthedocs.io/en/latest/

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2018-02-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

为什么需要 Mini-batch 梯度下降,及 TensorFlow 应用举例

里面对 BGD,SGD,MBGD,Adagrad,Adadelta,RMSprop,Adam 进行了比较, 今天对其中的 mini-batch 梯度下降 作进...

531
来自专栏新智元

【官方中文版】谷歌发布机器学习术语表(完整版)

【新智元导读】Google 工程教育团队已经发布了多语种的 Google 机器学习术语表,该术语表中列出了一般的Machine Learning术语和 Tens...

3145
来自专栏CVer

机器学习术语表

机器学习术语表:https://developers.google.com/machine-learning/glossary/ 机器学习术语表,即机器学习专业...

3189
来自专栏大数据挖掘DT机器学习

手把手教你理解EM算法原理

作者:Rachel Zhang 百度深度学习实验室RD,关注计算机视觉,机器学习,算法研究,人工智能, 移动互联网等学科和产业. 在聚类中我们经...

3589
来自专栏专知

【干货】一种直观的方法认识梯度下降

【导读】本文是深度学习专家Thalles Silva分享的一篇技术博客,主要讲解机器学习算法中的梯度下降。首先从形象的角度介绍梯度下降:梯度、偏导数等。然后,根...

3646
来自专栏技术随笔

深度学习 — 反向传播(BP)理论推导"BP" Math Principle前向传播反向传播应用实例Reference

4036
来自专栏李智的专栏

斯坦福CS231n - CNN for Visual Recognition(7)-lecture6梯度检查、参数更新

  梯度检查是非常重要的一个环节,就是将解析梯度和数值计算梯度进行比较。数值计算梯度时,使用中心化公式

822
来自专栏目标检测和深度学习

Google发布机器学习术语表 (包括简体中文)

Google 工程教育团队已经发布了多语种的 Google 机器学习术语表,该术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义。语言版本...

2676
来自专栏AI研习社

一文详解神经网络 BP 算法原理及 Python 实现

最近这段时间系统性的学习了 BP 算法后写下了这篇学习笔记,因为能力有限,若有明显错误,还请指正。 什么是梯度下降和链式求导法则 假设我们有一个函数 J(w...

4735
来自专栏人工智能头条

AI从入门到放弃:BP神经网络算法推导及代码实现笔记

822

扫描关注云+社区