Tensorflow是一个完整的编码框架。就如同我们按照python编程语法设计程序一样。Tensorflow内部也有自己所定义的常量、变量、数据操作等要素。不同的是,Tensorflow使用图来表示计算任务;并使用会话来执行图。
使用Tensorflow输出一句话
import tensorflow as tf
import numpy as np
#初始化一个Tensorflow的常量:Hello Google Tensorflow!字符串,并命名为greeting作为一个计算模块。
greeting=tf.constant('Hello Google Tensorflow!')
#启动一个会话
sess=tf.Session()
#使用会话执行greeting计算模块
result=sess.run(greeting)
#输出会话执行的结果
print(result)
#关闭会话。这是一种显式关闭会话的方式
sess.close()
b'Hello Google Tensorflow!'
使用Tensorflow完成一次线性函数的计算
#声明matrix1为Tensorflow的一个1*2的行向量
matrix1=tf.constant([[3.,3.]])
#声明matrix2为Tensorflow的一个2*1的列向量
matrix2=tf.constant([[2.],[2.]])
#product将上述两个算子相乘,作为新算例
product=tf.matmul(matrix1,matrix2)
#继续将product与一个标量2.0求和拼接,作为最终的linear算例
linear=tf.add(product,tf.constant(2.0))
#直接在会话中执行linear算例,相当于将上面所有单独算例拼接成流程图来执行
with tf.Session() as sess:
result=sess.run(linear)
print(result)
[[ 14.]]
虽然上述代码可以说明Tensorflow是一个变成框架,但是截至目前还没有显示出其机器学习的能力。那么接下来的代码将要向各位读者展示如何利用Tensorflow自行搭建一个线性分类器。与直接使用Scikit-learn中已经编写好的LogiticRegression模型不同,Tensorflow允许使用者自由选取不同操作,并组织一个学习系统。这里我们对所要使用的线性分类器做一个简化:取0.5(良性肿瘤为0,恶性肿瘤为1)为界,并采用最小二乘法拟合模型参数。
使用Tensorflow自定义一个线性分类器用于“良/恶性乳腺癌肿瘤”进行预测
import tensorflow as tf
import numpy as np
import pandas as pd
train=pd.read_csv('/Users/daqi/Documents/Python机器学习及实践/Datasets/Breast-Cancer/breast-cancer-train.csv')
test=pd.read_csv('/Users/daqi/Documents/Python机器学习及实践/Datasets/Breast-Cancer/breast-cancer-test.csv')
#分隔特征与分类目标
X_train=np.float32(train[['Clump Thickness','Cell Size']].T)
y_train=np.float32(train['Type'].T)
X_test=np.float32(train[['Clump Thickness','Cell Size']].T)
y_test=np.float32(train['Type'].T)
#定义一个tensorflow的变量b作为线性模型的截距,同时设置初始值为1.0。
b=tf.Variable(tf.zeros([1]))
#定义一个tensorflow的变量W作为线性模型的系数,并设置初始值为-1.0至1.0之间均匀分布的随机数。
W=tf.Variable(tf.random_uniform([1,2],-1.0,1.0))
#显式定义这个线性函数
y=tf.matmul(W,X_train)+b
#使用tensorflow中的reduce_mean取得训练集上均方误差
loss=tf.reduce_mean(tf.square(y-y_train))
#使用梯度下降法估计参数W,b,并且设置迭代步长为0.01,这个与scikit-learn中的SGDRegressor类似
optimizer=tf.train.GradientDescentOptimizer(0.01)
#以最小二乘损失为优化目标
train=optimizer.minimize(loss)
#初始化所有变量
init=tf.initialize_all_variables()
#开启Tensorflow中的会话
sess=tf.Session()
#执行变量初始化操作
sess.run(init)
#迭代1000轮次,训练参数
for step in range(0,1000):
sess.run(train)
if step %200==0:
print(step,sess.run(W),sess.run(b))
0 [[-0.23830706 0.59195495]] [-0.0683303]
200 [[ 0.03732548 0.09953798]] [-0.09818262]
400 [[ 0.05677485 0.07890751]] [-0.08934592]
600 [[ 0.05779386 0.07756446]] [-0.087328]
800 [[ 0.05785419 0.07744326]] [-0.08696128]
#准备测试样本
test_negative=test.loc[test['Type']==0][['Clump Thickness','Cell Size']]
test_positive=test.loc[test['Type']==1][['Clump Thickness','Cell Size']]
#以最终更新的参数
import matplotlib.pyplot as plt
plt.scatter(test_negative['Clump Thickness'],test_negative['Cell Size'],marker='o',s=200,c='red')
plt.scatter(test_positive['Clump Thickness'],test_positive['Cell Size'],marker='x',s=150,c='black')
plt.xlabel('Clump Thickness')
plt.ylabel('Cell Size')
lx=np.arange(0,12)
#这里强调下,我们以0.5作为分界面,所以计算方式如下
ly=(0.5-sess.run(b)-lx*sess.run(W)[0][0])/sess.run(W)[0][1]
plt.plot(lx,ly,color='green')
plt.show()
skflow非常适合于熟悉Scikit-learn编程接口(API)的使用者,而且利用Tensorflow的运算架构和模块封装了许多经典的机器学习模型,如线性回归器、深度全连接的神经网络(DNN)等。
使用skflow内置的LogiticRegression、DNN、Scikit-learn中的集成回归模型对“美国波士顿房价”数据进行回归预测
from sklearn import datasets,metrics,preprocessing,cross_validation
boston=datasets.load_boston()
#获取房屋数据特征以及对应房价
X,y=boston.data,boston.target
#分割数据,随机采样25%作为测试样本
X_train,X_test,y_train,y_test=cross_validation.train_test_split(X,y,test_size=0.25,random_state=33)
#对数据特征进行标准化处理。
scaler=preprocessing.StandardScaler()
X_train=scaler.fit_transform(X_train)
X_test=scaler.transform(X_test)
import skflow
#使用skflow的LinearRegressor。
tf_lr=skflow.TensorFlowLinearRegressor(steps=10000,learning_rate=0.01,batch_size=50)
tf_lr.fit(X_train,y_train)
tf_lr_y_predict=tf_lr.predict(X_test)
#输出skflow中的LinearRegressor模型的回归性能。
print('The mean absolute error of Tensorflow Linear Regressor on boston dataset is',metrics.mean_absolute_error(tf_lr_y_predict,y_test))
print('The mean squared error of Tensorflow Linear Regressor on boston dataset is',metrics.mean_squared_error(tf_lr_y_predict,y_test))
print('The mean R-squared error of Tensorflow Linear Regressor on boston dataset is',metrics.r2_score(tf_lr_y_predict,y_test))
The mean absolute error of Tensorflow Linear Regressor on boston dataset is 20.6774992764
The mean squared error of Tensorflow Linear Regressor on boston dataset is 458.29343764
The mean R-squared error of Tensorflow Linear Regressor on boston dataset is -11.3519662471
#使用skflow的DNNRegressor,并且注意其每个隐层特征数量的配置。
tf_dnn_regressor=skflow.TensorFlowDNNRegressor(hidden_units=[100,40],steps=10000,learning_rate=0.01,batch_size=50)
tf_dnn_regressor.fit(X_train,y_train)
tf_dnn_regressor_y_predict=tf_dnn_regressor.predict(X_test)
#输出skflow中的DNNRegressor模型的回归性能。
print('The mean absolute error of Tensorflow DNN Regressor on boston dataset is',metrics.mean_absolute_error(tf_dnn_regressor_y_predict,y_test))
print('The mean squared error of Tensorflow DNN Regressor on boston dataset is',metrics.mean_squared_error(tf_dnn_regressor_y_predict,y_test))
print('The mean R-squared error of Tensorflow DNN Regressor on boston dataset is',metrics.r2_score(tf_dnn_regressor_y_predict,y_test))
The mean absolute error of Tensorflow DNN Regressor on boston dataset is 2.4622086127
The mean squared error of Tensorflow DNN Regressor on boston dataset is 18.2267462678
The mean R-squared error of Tensorflow DNN Regressor on boston dataset is 0.750988158261
from sklearn.ensemble import RandomForestRegressor
rfr=RandomForestRegressor()
rfr.fit(X_train,y_train)
rfr_y_predict=rfr.predict(X_test)
#输出skflow中的DNNRegressor模型的回归性能。
print('The mean absolute error of Tensorflow Random Forest Regressor on boston dataset is',metrics.mean_absolute_error(rfr_y_predict,y_test))
print('The mean squared error of Tensorflow Random Forest Regressor on boston dataset is',metrics.mean_squared_error(rfr_y_predict,y_test))
print('The mean R-squared error of Tensorflow Random Forest Regressor on boston dataset is',metrics.r2_score(rfr_y_predict,y_test))
The mean absolute error of Tensorflow Random Forest Regressor on boston dataset is 2.47141732283
The mean squared error of Tensorflow Random Forest Regressor on boston dataset is 15.2839866142
The mean R-squared error of Tensorflow Random Forest Regressor on boston dataset is 0.786460063124
通过输出结果,可以对比发现深度神经网络的确可以表现出更高的性能。但是,越是具备描述复杂数据的强力模型,越容易在训练时陷入过拟合。这一点,请读者在配置DNN的层数和每层特征元的数量时要特别注意。