tensorflow神经网络进行成绩预测(非时序)

这个预测很简陋,就是用一个人的高数1、2的两个成绩预测线性代数成绩,数据量不大,预测的实际意义也不大。主要是体验下流程,应付下作业。( ̄y▽, ̄)╭
首先是数据的类型,我们这次拿到的数据是3个班的高数1、2和线性代数的成绩。考虑到一些因素,这里只用前两个班的成绩。数据如下(表头我自己图省事改了改)
在这里插入图片描述这里我只需要总评分和前两个班级的数据,所以

def get_class(T_class, info, num):  # 从总的课程(info)里取出指定班级(T_class),将总评的列名改成num
    info = pd.DataFrame(info)[['StuName', 'StuClass', '总评']]
    info = info.rename(columns={'总评': num})
    data_group = info.groupby(info["StuClass"])
    for key, value in data_group:
        if (key == T_class):
            info = value
    info.reindex()
    return info


data1_import = pd.read_csv('output/高等数学(一)-1_output.csv', encoding='GBK')  # 读取课程
data2_import = pd.read_csv('output/高等数学(一)-2_output.csv', encoding='GBK')
data3_import = pd.read_csv('output/线性代数_output.csv', encoding='GBK')

info1 = get_class('18大数据1', data1_import, '高1')
info1 = pd.concat([info1, get_class('18大数据2', data1_import, '高1')], axis=0)  # 将两个班级上下拼接到一起,axis指定上下拼接或左右拼接
info2 = get_class('18大数据1', data2_import, '高2')
info2 = pd.concat([info2, get_class('18大数据2', data2_import, '高2')], axis=0)
info3 = get_class('18大数据1', data3_import, '线代')
info3 = pd.concat([info3, get_class('18大数据2', data3_import, '线代')], axis=0)

这样,我们得到了info1(1、2班的高数一分数)info2(1、2班的高数二)info3(1、2班的线代)
随后我们进行拼接和归一化处理,同时将我们要输入的值也做处理

out = info1.join(info2, lsuffix='高1', rsuffix='高2')  # 左右拼接,用concat也可以
out = out.join(info3)
print(out)
x1 = input('请输入高数一:')
x2 = input('请输入高数二:')
xin = ((int(x1) - info1['高1'].mean()) / info1['高1'].std())
yin = ((int(x2) - info2['高2'].mean()) / info2['高2'].std())
predict_input = pd.DataFrame({'高1': [xin], '高2': [yin]})  # 做一个dataframe,里面只有两个数据,作为输入的成绩
info1['高1'] = (info1['高1'] - info1['高1'].mean()) / info1['高1'].std()
info2['高2'] = (info2['高2'] - info2['高2'].mean()) / info2['高2'].std()

x_train = info1.join(info2, lsuffix='高1', rsuffix='高2')  # 高数12两个表左右拼接
x_train = x_train.loc[:, ('高1', '高2')]  # 取出这两列,不要多余的数据,作为数据x
y_train = info3['线代']  # 取出线代分数这一列,作为标签y
print(x_train.shape)#(58, 2)
print(len(x_train.keys()))#2

因为数据量过少,所以我们就不划分训练集和测试集了。直接拿所有的数据训练。loss是记录最后一次的值,这个跑起来很快所以就不保存模型了,用的时候现场训练就可以

model = tf.keras.Sequential([
    layers.Dense(128, activation='relu', input_shape=[len(x_train.keys())]),
    layers.Dense(256, activation='relu'),
    layers.Dense(1)
])#这么多纯属我闲着,,,,32,32就可以,我这里跑56个数据基本没啥区别。。。。
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse', optimizer=optimizer, metrics=['mae'])  # 'accuracy'整数 无意义

loss = 0


class PrintDot(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs):
        global loss
        if epoch % 100 == 0:
            print(f'{str(epoch)}:{logs}')
            loss = logs['loss']


model.fit(x_train, y_train, epochs=2000, validation_split=0.3, verbose=0,
          callbacks=[PrintDot()])  # 将训练数据输进去模型
test = model.predict(x_train)  # 把训练的数据x(多个)输入,不带标签,由模型得到标签(多个)。方便做表
result = model.predict(predict_input)  # 把我们输入的高数1,2(一组)输入,拿到预测的线代分数(一个)
plt.figure()
plt.plot(np.arange(len(y_train)), y_train, "bo-", label="真实值")  # 训练数据和训练标签
plt.plot(np.arange(len(test)), test, "ro-", label="预测值")  # 训练数据和模型预测的标签,和上一个x值一样,区别是y值不是真实的,是模型算的
plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.title(f"tensorflow神经网络---loss:{loss}\n高数一:{x1}--高数二:{x2}--线代预测值:{result[0][0]}")
plt.legend(loc="best")
plt.show()

结果如下:
在这里插入图片描述在这里插入图片描述
其实效果也不算太好,这里因为要交大作业,选了一个预测的不错的例子q(≧▽≦q)

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值