tensorflow实战—多变量线性回归
数据集:
用波士顿房价作为数据集,波士顿房价数据集(Boston House Price Dataset)使用sklearn.datasets.load_boston即可加载相关数据。该数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息, 数据集很小,只有506个案例。该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。
每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。
数据集都有以下14个属性:
- CRIM--城镇人均犯罪率
- ZN - 占地面积超过25,000平方英尺的住宅用地比例。
- INDUS - 每个城镇非零售业务的比例。
- CHAS - Charles River虚拟变量(如果是河道,则为1;否则为0)
- NOX - 一氧化氮浓度(每千万份)
- RM - 每间住宅的平均房间数
- AGE - 1940年以前建造的自住单位比例
- DIS加权距离波士顿的五个就业中心
- RAD - 径向高速公路的可达性指数
- TAX - 每10,000美元的全额物业税率
- PTRATIO - 城镇的学生与教师比例
- B - 1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例
- LSTAT - 人口状况下降%
- MEDV - 自有住房的中位数报价, 单位1000美元
统计数据集并采集分析:
# _*_ encoding:utf-8 _*_
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow.contrib.learn as skflow
from sklearn.utils import shuffle
import numpy as np
import pandas as pd
data = pd.read_csv('boston.csv', encoding='gbk')
print(data.describe()) #输出数据信息信息,平均值,方差,极值等
print(data.shape) #输出数据型别
f, ax1 = plt.subplots() #绘制子图
plt.figure() # Create a new figure
y = data['MEDV']# 平均房价
# 不想 i 值取到 0,故取 range(1,8)这里将前7个特征与Table房价的相关关系画出来
for i in range(1,8):
# 画四行两列,共8个图
number = 420 + i
# 使用locator_params进行对坐标轴刻度的调整,通过nbins设置坐标轴一共平均分为几份
ax1.locator_params(nbins=3)
ax1 = plt.subplot(number)
# 这里将data作为参数传给list的时候,相当于c语言的的一个指针故表示第一行,即名称列,即dtype为string
plt.title(list(data)[i])
ax1.scatter(data[data.columns[i]],y)
# 图像外部边缘的调整可以使用plt.tight_layout() 进行自动控制,
# 此方法不能够很好的控制图像间的间隔。如果想同时控制图像外侧边缘以及图像间的空白区域,使用命令:
#plt.subplots_adjust(left=0.2, bottom=0.2, right=0.8, top=0.8,hspace=0.2, wspace=0.3)
plt.tight_layout(pad=0.4, w_pad=0.5,h_pad=1.0)
plt.show()
运行结果:
完整代码:
# _*_ encoding:utf-8 _*_
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow.contrib.learn as skflow
from sklearn.utils import shuffle
import numpy as np
import pandas as pd
data = pd.read_csv('boston.csv', encoding='gbk')
print(data.describe()) #输出数据信息信息,平均值,方差,极值等
print(data.shape) #输出数据型别
f, ax1 = plt.subplots() #绘制子图
plt.figure() # Create a new figure
y = data['MEDV']# 平均房价
# 不想 i 值取到 0,故取 range(1,8)这里将前7个特征与Table房价的相关关系画出来
for i in range(1,8):
# 画四行两列,共8个图
number = 420 + i
# 使用locator_params进行对坐标轴刻度的调整,通过nbins设置坐标轴一共平均分为几份
ax1.locator_params(nbins=3)
ax1 = plt.subplot(number)
# 这里将data作为参数传给list的时候,相当于c语言的的一个指针故表示第一行,即名称列,即dtype为string
plt.title(list(data)[i])
ax1.scatter(data[data.columns[i]],y)
# 图像外部边缘的调整可以使用plt.tight_layout() 进行自动控制,
# 此方法不能够很好的控制图像间的间隔。如果想同时控制图像外侧边缘以及图像间的空白区域,使用命令:
#plt.subplots_adjust(left=0.2, bottom=0.2, right=0.8, top=0.8,hspace=0.2, wspace=0.3)
plt.tight_layout(pad=0.4, w_pad=0.5,h_pad=1.0)
plt.show()
# 定义符号变量
X = tf.placeholder('float',name='X')
Y = tf.placeholder('float',name='Y')
# 定义模型
with tf.name_scope('Model'):
def model(X, w, b):
return tf.multiply(X, w) + b # we define the linear model
# create shared variable
w = tf.Variable(tf.random_normal([2],stddev=0.01),name='b0')
b = tf.Variable(tf.random_normal([2],stddev=0.01),name='b1')
y_model = model(X, w, b)
# 定义损失函数
with tf.name_scope('CostFunction'):
# 使用均方误差
cost = tf.reduce_mean(tf.pow(Y - y_model, 2))
# 定义优化器Optimizer
train_op = tf.train.AdamOptimizer(0.01).minimize(cost)
# 定义会话
sess = tf.Session()
init = tf.global_variables_initializer() #初始化
tf.train.write_graph(sess.graph,'/home/bonnin/linear2','graph.pbtxt')
cost_op = tf.summary.scalar('loss',cost)
merged = tf.summary.merge_all()
sess.run(init)
writer = tf.train.SummaryFileWriter('/home/bonnin/linear2',sess.graph)
# xvalues = data[[data.columns[2], df.columns[4]]].values.astype(float)
# xvalue = data[[data.columns[2],data.columns[4]] #.values.astype(float)
plt.plot(cost)
plt.show()
xvalue = data[['INDUS ', 'AGE']].values.astype(float)
yvalue = data[data.columns[12]].values.astype(float)
b0temp = b.eval(session=sess)
b1temp = w.eval(session=sess)
# 开始迭代求解
for a in range(1,50):
cost1 = 0.0
for i, j in zip(xvalue,yvalue):
sess.run(train_op,feed_dict={X: i, Y: j})
# 除以 560 个样本
cost1 += sess.run(cost,feed_dict={X: i,Y:i}) / 560.0
xvalues, yvalues = shuffle(xvalues, yvalues)
print(cost1)
b0temp = b.eval(session=sess)
b1temp = w.eval(session=sess)
print(b0temp)
print(b1temp)
得到输出结果: