使用sklearn构建神经网络进行成绩预测

# coding=gbk
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPRegressor


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)
out = info1.join(info2, lsuffix='高1', rsuffix='高2')  # 左右拼接,用concat也可以
out = out.join(info3)
print(out)
x1 = input('请输入高数一:')
x2 = input('请输入高数二:')
xin1 = ((int(x1) - info1['高1'].mean()) / info1['高1'].std())
xin2 = ((int(x2) - info2['高2'].mean()) / info2['高2'].std())
predict_input = pd.DataFrame({'高1': [xin1], '高2': [xin2]})  # 做一个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

print(x_train.shape)
y_train = info3['线代']  # 取出线代分数这一列,作为标签y
model = MLPRegressor(solver='lbfgs', activation='relu', hidden_layer_sizes=(12, 12), random_state=100)
model.fit(x_train, y_train)  # 将训练数据输进去模型
score = model.score(x_train, y_train)  # score函数,计算拟合度,原本应该从训练数据中拿出来一些作为评测数据,这里省略了,直接拿训练数据评测
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"sklearn神经网络---拟合度:{score}\n高数一:{x1}--高数二:{x2}--线代预测值:{result}")
plt.legend(loc="best")
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值