实验:根据在TV、无线电台和报纸这三个平台投放的广告量预测销量
一、导入库和数据
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv(r'Advertising.csv', index_col=0)
data.head()
#查看数据维度
data.shape
输出:(200, 4)
二、理论上广告投放量越多,销量越好,现在画图看一下是否是这种情况
#TV
plt.scatter(data.TV, data.sales)
从上图可以看出基本上是线性关系
#无线电
plt.scatter(data.radio, data.sales)
#报纸
plt.scatter(data.newspaper, data.sales)
从上图可以看出在报纸上投放广告效果并不好
三、接下来构造模型
# 获得输入数据与输出数据
x = data.iloc[:, :-1]
y = data.iloc[:, -1]
#查看x
x.head()
#查看y
y.head()
#构建模型
model = tf.keras.Sequential([tf.keras.layers.Dense(10, input_shape=(3,), activation='relu'),
tf.keras.layers.Dense(1)])
在上一段代码中,tf.keras.Sequential用来构造一个顺序模型,另外’tf.keras.layers.Dense(10, input_shape=(3,), activation=‘relu’)'这句代码构造模型的第一层,第一个参数表示输出节点的个数,也就是中间层节点的个数,这里定义为10,中间层节点数越多,模型在训练集上表现越好,但是节点数过多的话也可能造成过拟合。第二个参数input_shape是输入数据的形状,也就是输入层节点个数,在这里数据集x中共有TV、radio、newspaper这三个属性,所以这里填(3,)。第三个参数activation='relu’是设定激活函数为relu。
tf.keras.layers.Dense(1)构造了输出层,输出维度是1,input_shape参数只有第一层需要填写,后面的层会自动计算这个参数。
模型大致形状如下:
#查看模型摘要
model.summary()
上图给出了模型摘要,共有两层dense(中间层)和dense_1(输出层), 中间层参数有40个,这是因为共有三个输入值,TV、radio、newspaper,这三个属性需要三个权重w1,w2,w3,另外需要一个偏置b,中间层共有10个节点,所以共有4*10=40个参数,写成公式为:y = w1×x1 + w2×x2 + w3×x3 + b
四、训练模型
#编译模型
#参数optimizer='adam':使用梯度下降法优化损失函数
#参数loss = 'mse':使用均方误差计算损失函数
model.compile(optimizer='adam',
loss = 'mse'
)
#训练模型
#参数epochs=100:使用梯度下降法优化损失函数,下降100次后停止
model.fit(x, y, epochs=100)
五、使用模型进行预测
model.predict(x)