Tensorflow2.0⼊门基础——多元线性回归(波⼠顿房价)以及⽹络搭建⽅法**
Tensorflow2.0⼊门基础——多元线性回归(波⼠顿房价)以及⽹络搭建⽅法
(1)第⼀步⾸先导⼊数据集,这⾥我们选⽤波⼠顿房价预测
如果已经下载好了可以直接导⼊数据(也可以直接加我qq1217649965我要),如果没有下载好,可以使⽤注释的部分导⼊
#如果没有下载好,可以使⽤注释的部分导⼊
# from sklearn.datasets import load_boston
# import matplotlib.pyplot as plt
# dataset = load_boston()import pandas as pd
import numpy as np
data = pd.read_csv('D:\\Download\\Anacond\\boston_house_prices.csv',header=0)
# header=0 取第⼀⾏为列标签第⼀列作为⾏名字只需要在加上 index _col = 0
data
总共有13组特征值,1组⽬标值,总计506⾏数据。
数据集中的每⼀⾏数据都是对波⼠顿周边或城镇房价的描述:
CRIM: 城镇⼈均犯罪率;
ZN: 住宅⽤地所占⽐例
INDUS: 城镇中⾮住宅⽤地所占⽐例;
CHAS:虚拟变量,⽤于回归分析
NOX: 环保指数;
RM: 每栋住宅的房间数
AGE: 1940 年以前建成的⾃住单位的⽐例;
DIS: 距离 5 个波⼠顿的就业中⼼的加权距离。
RAD: 距离⾼速公路的便利指数
TAX: 每⼀万美元的不动产税率
PRTATIO: 城镇中的教师学⽣⽐例
B: 城镇中的⿊⼈⽐例
LSTAT: 地区中有多少房东属于低收⼊⼈
MEDV: ⾃住房屋房价中位数(是⽬标值)
然后导⼊Tensorflow2.0,查看⾃⼰的Tensorflow版本是不是2.0的版本
import tensorflow as tf
print('Tensorflow Version: {}'.format(tf.__version__))
我的版本是2.1
(2)接下来将数据划分为特征值和⽬标值两部分,并且进⾏数据的预处理,归⼀化
#获取特征和标签值,总共有13组标签和1组特征
x_data = data.iloc[:,:-1]#获取前13组特征
y_data = data.iloc[:,-1]#获取标签
"""数据归⼀化(最⼤最⼩⽅法)"""
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(x_data)#训练
x_data = ansform(x_data)#此时输出的x_data就是数组了
"""数据归⼀化(标准化⽅法)"""
# from sklearn.preprocessing import StandardScaler
# scaler = StandardScaler()
# scaler.fit(x_data)
# x_data = ansform(x_data)
y_data = np.array(y_data)#将y_data转换成数组
此处归⼀化是使⽤的最⼤最⼩化⽅法,归⼀化⽤的⽐较多的就是以下两种,如果不懂得可以参考这位博主讲解的原理
(2)最⼩最⼤化tensorflow入门教程
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() #创建对象
scaler.fit(data)
data = ansform(data)
(4)标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
data = ansform(data)
(3)接下来打了tensorflow2.0的核⼼了,构建模型,tensorflow2.0⽐1.X简便太多了,⾮常容易学,下⾯这位⼤佬详细总结了2.0与1.X之间的对⽐
"""顺序模型:类似于搭积⽊⼀样⼀层、⼀层放上去"""
model = tf.keras.Sequential()
"""添加层:其实就是 wx+b"""
model.add(tf.keras.layers.Dense(1,input_shape =(13,)))#输出是1维数据,输⼊是13维数据
"""查看⽹络结构"""
model.summary()
仅仅只有⼀层,是最简单的线性回归模型tf.keras.layers.Dense相当于执⾏了wx+b的操作,所以有13个权重w和⼀个偏置b,总共14个参数,没有隐含层
model = tf.keras.Sequential()相当于⼀个容器,⾥⾯可以⼀层⼀层储存东西
tf.keras.layers.Dense(1,input_shape = (13,)),只有⼀层神经单元,所以此层就是输出层,1就相当于是输出神经元个数就是1个,如果是分类问题,有⼏类就代表输出神经元的个数是⼏,后⾯的input_shape = (13,),就是指输⼊的是⼀维的数组,但是⼀维数组⾥⾯有13个元素。
注意啦(k,)代表的是⼀维数组⾥⾯有k个数值,并不是代表13维,但是输⼊有⼏个是未知的,我们只是知道输⼊的size是⼀维⾥⾯13个元素,但到底有⼏个输⼊是没有规定的
此处我们可以尝试着⾃⼰添加⼀个隐含层,有两种⽅法:
⽅法⼀:model.add()⽅法,执⾏⼀次添加⼀层(我这⾥没加激活函数,后⾯讲的时候再加)
“”“顺序模型:类似于搭积⽊⼀样⼀层、⼀层放上去”""
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16,input_shape = (13,))) ,
model.add(tf.keras.layers.Dense(8)),
model.add(tf.keras.layers.Dense(1)),
⼤家有没有发现只有第⼀层填写了input_shape = (13,))输⼊数据的形状,后⾯的数据都没有填写,因为后⾯的层都会⾃⼰推算出来,不⽤⼈为的填写,只需要填写⾃⼰本层神经元数量即可。
**⽅法⼆:直接把所有的层塞到篮⼦⾥⾯model = tf.keras.Sequential()
⼀层⼀层叠加,注意要⽤数组的形式塞⼊[, , , , , ]
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation=‘relu’, input_shape=(13,)),
tf.keras.layers.Dense(64, activation=‘relu’),
tf.keras.layers.Dense(1)
])
(3)接下来就进⼊模型配置和编译的阶段
"""编译,配置"""
modelpile(optimizer ='adam',
loss ='mse',
metrics=['mae','mse']
)
"""训练数据"""
history = model.fit(x_data, y_data, epochs =1000)
hist = pd.DataFrame(history.history)
hist['epoch']= history.epoch
接下来画出损失函数
hist['epoch']= hist['epoch']+1
import matplotlib.pyplot as plt
%matplotlib notebook
# """修改列名"""
# ame(columns={'mean_absolute_error':'MAE', 'mean_squared_error':'MSE'},inplace = True) # print(hist)
def plot_history(hist):
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.xlabel('Epoch')
plt.ylabel('MSE')
plt.plot(hist['epoch'], hist['mse'],
label='MSE')
plt.legend()
plt.subplot(1,2,2)
plt.xlabel('Epoch')
plt.ylabel('MAE')
plt.plot(hist['epoch'], hist['mae'],
label ='MAE',color ='red')
plt.ylim([3,4.5])
plt.legend()
plot_history(hist)
(4)查看模型预测效果
"""查看训练效果,从中随机提取20个数据下标""" indices = np.random.choice(len(data), size=100) # house_data.loc[indices,:]
count =0
for n in indices:
count +=1
x_test = x_data[n]
x_test = shape(1,13)
predict = model.predict(x_test)
print("——第%d个数据——"% count)
print("预测值:%f"% predict)
target = y_data[n]
print("标签值:%f"% target)
print('\n')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论