首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TensorFlow机器学习理论与实战 第一章 线性回归模型

《Python机器学习理论与实战》系列主要讲的是利用 Python 的机器学习库 Scikit-Learn来进行机器学习任务,但是由于人工智能深度学习的迅速发展,TensorFlow这类的深度学习框架逐渐成为AI 研究员的主流工具,因此才有了《TensorFlow机器学习理论与实战 》系列的诞生。

建议《Python机器学习理论与实战》《TensorFlow机器学习理论与实战 》两个系列可以对比着来看,将会分别讲述利用Scikit-LearnTensorFlow来实现同一个机器学习算法,然后对实现的结果进行比较。利用Scikit-Learn实现一个算法相对比较简单,使用fit( ),predict( )score( )等函数基本就能满足需求,而利用TensorFlow来实现同一个算法的话,则需要你从头到尾一步一步地把算法利用计算图的形式搭建出来,因此利用 TensorFlow 来实现算法的时候,你可以控制更多的参数

《Python机器学习理论与实战 第一章 线性回归模型》这个链接在全文可能出现多次,我先把它放到最前面,便于大家查找。

学习TensorFlow的必要性

既然Scikit-Learn简单也能实现绝大多数的机器学习算法,但是为什么还要学习 TensorFlow,我想主要的原因应该有以下几点:

TensorFlow 的使用率越来越广泛,自谷歌开源 TensorFlow 框架之后,TensorFlow 逐渐在各行各业得以运用,发展速度非常快

计算速度快,能够利用 GPU 并对地理分布式 GPU 设备进行训练,对大数据的处理能力

提供高性能机器学习模块,TensorFlow除了能实现传统的机器学习算法外,还提供了卷积神经网络(CNN)循环神经网络(RNN)长短期记忆网络(LSTM)高性能机器学习模块,并且使用灵活可定制性强

TensorFlow在Windows中的安装

首先安装最新版的 Anaconda(>= Python 3.6)

Windows+R,输入CMD打开命令窗,安装CPU 版本

pip install --upgrade tensorflow

若是安装过程遇到问题,可以联系。

线性回归的理论

线性回归的理论本文就不做过多介绍了,具体的内容读者可以查看文章《Python机器学习理论与实战 第一章 线性回归模型》,里面有详细的介绍。本文主要讲解如何用 TensorFlow 来实现一个线性回归模型,并与《Python机器学习理论与实战 第一章 线性回归模型》中的结果做比较

查看数据描述

载入需要的数据,查看数据的描述信息。

#导入房价数据读取器from sklearn.datasets import load_boston#读取房价数据存储在变量boston中boston=load_boston()#输出数据描述print (boston.DESCR)

可以得到关于数据集的一些描述性信息,比如,共有506条数据13项数值型或者类别型预测变量目标变量为房价没有缺失值等,具体的信息同样在《Python机器学习理论与实战 第一章 线性回归模型》中有详细介绍。

数据划分:分为测试集和训练集

为了使得两种方法的结果具有可比性,这里设置划分的random_state=33是一样的。

#数据分割# 从sklearn.cross_alidation导入数据分割器from sklearn.cross_alidation import train_test_split# 导入numpy并重命名为npimport numpy as npX = boston.datay = boston.target# 随机采样25%的数据构建测试样本,其余作为训练样本X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.25)

TensorFlow线性回归—参数定义

这里有2个参数需要重点说明一下:

training_epochs = 101 epoch就是指把所有训练数据完整的学过一遍,本文设置学习 10 遍就行,因为本文的模型较简单而且数据量较小。

batch_size = 1batchsize用来设置计算总误差的时候使用几个样本,然后根据误差调节权重,然后再输入 batchsize 个样本再计算总误差再调节权重,直至所有所有样本都被学习完,就完成了1 epoch,接下来开始第 2 个 epoch 的训练。本题数据量较小,将其设置为1,即每1个样本计算一次总误差调节一次权重,要求模型得到的结果对于每一个样本来说误差都是逼近最小的。

import tensorflow as tf#####设置学习的参数#####n_features = X_train.shape[1]#输入特征的数目=X_train的列的数目n_samples = X_train.shape[0]#样本总数=X_train的行的数目learning_rate = 0.01#学习率设置为0.01training_epochs = 10# 学习次数设置为10次,one epoch就是指把所有训练数据完整的学过一遍,这里设置学习10遍batch_size = 1# batchsize 用来设置计算总误差的时候使用几个样本,本题数据量较小,将其设置为1

TensorFlow线性回归—batch_size函数实现

####### 该函数用来每次从训练数据中取batchsize大小的数据集出来######def iterate_minibatches(arrays, batch_size, shuffle=False, seed=None):rgen = np.random.RandomState(seed)indices = np.arange(arrays[0].shape[0])if shuffle:rgen.shuffle(indices)for start_idx in range(0, indices.shape[0] - batch_size + 1, batch_size):index_slice = indices[start_idx:start_idx + batch_size]yield (ary[index_slice] for ary in arrays)

batch_size函数

TensorFlow线性回归—定义计算图

g = tf.Graph()with g.as_default() as g:# Input datatf_x = tf.placeholder(dtype=tf.float32,shape=[None, n_features], name='inputs')#定义输入为n_features维的列向量tf_y = tf.placeholder(dtype=tf.float32,shape=[None], name='targets')#定义输出# Model parametersparams = {'weights': tf.ariable(tf.zeros(shape=[n_features, 1],dtype=tf.float32), name='weights'),'bias': tf.ariable([[0.]], dtype=tf.float32, name='bias')}#定义权重和偏差,权重为n_features维的行向量,偏差为b# Linear Regressionlinear = tf.matmul(tf_x, params['weights']) + params['bias']# 定义线性回归的计算y=x*w+b # Loss and optimizercost = tf.reduce_mean(tf.square(linear - tf_y), name='cost') #定义损失函数为平均误差平方和#optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)#定义优化方法,采用梯度下降法来优化参数,学习率设置为learning_rate=0.01train = optimizer.minimize(cost, name='train')# 定义学习过程,train相当于一个优化器,训练的过程就是最小化cost

定义计算图

发现采用梯度下降算法最后的效果并不好,后来换成了Adam优化算法取得了很好的效果。

TensorFlow线性回归—训练过程

with tf.Session(graph=g) as sess:sess.run(tf.global_ariables_initializer())#全局变量的初始化# 打印初始化的w和bprint('weights = ', sess.run(['weights:0']), 'bias = ', sess.run(['bias:0']))ag_cost = np.nancount = 1# 用于计算平均损失for epoch in range(training_epochs):# 把所有数据都学习10遍print("Epoch: %03d | AgCost: %.3f " % (epoch, ag_cost / count), end="")ag_cost = 0.count = 0for x_batch, y_batch in iterate_minibatches(arrays=[X_train, y_train],batch_size=batch_size,shuffle=True, seed=123):# 把训练样本分批次,然后取出feed_dict = {'inputs:0': x_batch,'targets:0': y_batch}_, c = sess.run(['train', 'cost:0'], feed_dict=feed_dict)#索要下一批次batch_size的输入和输出ag_cost += ccount += 1weights, bias = sess.run(['weights:0', 'bias:0'])print(' Weights: ', weights)print(' Bias: ', bias)

训练过程

输出结果

TensorFlow线性回归—模型评价

lr_y_predict=X_test.dot(weights)+bias# 从sklearn.metrics依次导入r2_score、mean_squared_error以及mean_absoluate_error用于回归性能的评估from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error# 使用r2_score模块,并输出评估结果print ('The alue of R-squared of LinearRegression is', r2_score(y_test, lr_y_predict))# 使用mean_squared_error模块,并输出评估结果print ('The mean squared error of LinearRegression is', mean_squared_error(ss_y.inerse_transform(y_test),ss_y.inerse_transform(lr_y_predict)))# 使用mean_absolute_error模块,并输出评估结果print ('The mean absoluate error of LinearRegression is', mean_absolute_error(ss_y.inerse_transform(y_test), ss_y.inerse_transform(lr_y_predict)))#注:这里均方误差和平均绝对误差均较大是因为这里给出的误差都是转换为标准化之前的数据再算出的误差(ss_y.inerse_transform())

TensorFlow和Scikit-Learn结果比较

TensorFlow 结果

The mean squared error of LinearRegression is25.2440032605

The mean absoluate error of LinearRegression is3.55180931128

Scikit-Learn结果(具体计算过程可以查看《Python机器学习理论与实战 第一章 线性回归模型》)

The mean squared error of LinearRegression is25.0969856921

The mean absoluate error of LinearRegression is3.5261239964

对比TensorFlowScikit-Learn的结果可以发现两者的结果相差不大,Scikit-Learn 的结果要比 TensorFlow 好一点。这是因为Scikit-Learn中的LinearRegression 模块采用的是精确计算的解析算法来计算模型的参数,TensorFlow则是使用快速估计的数值优化 Adam 算法

相比之下,Scikit-Learn中的LinearRegression 模块对参数计算采用精确解析的方法计算时间长但是模型的性能略高TensorFlow采用快速估计的数值优化算法计算时间短但是产出的模型性能略低,此处使用的数据量太小看不出明显的差距,但是当数据规模达到10万数量级以上时,考虑到时间的消耗,使用快速估计的数值优化算法就会更有优势

由于头条排版的限制,每一行开头所有的空格都是被忽略的,但是偏偏Python又是一门非常重视缩进的语言,因此代码部分的排版并不是很好看,以截图的形式给出,因此原文代码直接复制粘贴可能并不一定能正常运行,读者可能需要微调一下。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180228A0F57H00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券