关于公司财务的预测,使用sklearn中的bp神经网络

目标:已经有551个数据,试图构造一个bp神经网络,通过一个企业的各项指标来判断这个企业属于哪一类。

我写了两个函数,一个是主函数main,一个是读取数据和预处理的函数read_data,
其中read_data函数的代码如下:

# 该函数读取数据并分类
import pandas as pd


def judge(a):
    # 该函数用来分类,分类依据为:
    # 80分以上是1类
    # 40~80分是2类
    # 0~40分是3类
    # -40~0是4类
    # 小于-40分是5类
    if a > 80:
        b = 1
    elif (a < 80) and (a > 40):
        b = 2
    elif (a < 40) and (a > 0):
        b = 3
    elif (a < 0) and (a > -40):
        b = 4
    else:
        b = 5
    return b


def import_data(path='./data/all_data.csv', rate=0.8, shuff=True):
    # 需要输入3个参数,一个是数据的路径,另外一个是训练集和测试集的分布比例,默认是二八开,最后一个是是否需要打乱顺序
    # 返回值是训练数据和测试数据
    all_data = pd.read_csv(path, encoding="gb18030")
    temp_data = all_data.drop(['new', '唯一主代码', '企业名称', '综合得分.1'], axis=1)
    # 删掉这些没用的列
    length = temp_data.shape[0]
    # 整个列表的长度
    class_list = []
    # 创建一个空列表
    for i in range(0, length):
        a = temp_data.loc[i, '综合得分']
        # 进行判断
        b = judge(a)
        # 最后构造是一个类别
        class_list.append(b)

    temp_data['class'] = class_list
    # 在最后一列进行添加数据,以列表的形式
    # 打乱顺序,但是序号还是从1到551
    if shuff:
        temp_data = temp_data.sample(frac=1).reset_index(drop=True)

    train_number = int(length * rate)
    # 440个训练数据
    test_number = length - train_number
    # 111个测试数据
    train_data = temp_data.iloc[0:train_number]
    # 训练数据
    test_data = temp_data.iloc[train_number:length]
    # 测试数据
    return train_data, test_data


主函数如下所示:

# copyright by huatianxue 2021年10月4日17:10:10 for my wife
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
import numpy as np
import read_data as rd
# read_data 是我自己写的函数,用作封装读取数据这个环节的
path = './data/all_data.csv'
train_data, test_data = rd.import_data(path=path)

x_train_data = np.array(train_data.drop(['class'], axis=1))
# 训练数据的自变量
y_train_data = np.array(train_data['class'])
# 训练数据的标签
x_test_data = np.array(test_data.drop(['class'], axis=1))
# 测试数据的自变量
test_true_label = np.array(test_data['class'])
# 训练数据的标签
# 现在这些格式都是dataframe格式,标签转换为array格式
scaler = StandardScaler()
# 测试数据标准化
scaler.fit(x_test_data)
x_test_Standard = scaler.transform(x_test_data)
# 训练数据标准化
scaler.fit(x_train_data)
x_train_Standard = scaler.transform(x_train_data)
# 构建bp神经网络
bp = MLPClassifier(hidden_layer_sizes=(50, 50), activation='relu',
    solver='lbfgs', alpha=0.0001, batch_size='auto',
    learning_rate='constant')
# 自适应
bp.fit(x_train_Standard, y_train_data.astype('int'))
# 构建BP神经网络
test_pre = bp.predict(x_test_Standard)
# 预测正确的数值,初始化为0
pre_true_sum = 0
# 做一个循环
for i in range(0,len(test_true_label)):
    # 如果预测值和真实值相等
    if test_true_label[i] == test_pre[i]:
        # 那么正确预测的数值加上1
        pre_true_sum = pre_true_sum + 1

print("预测的分类:")
print(test_pre)
print("实际的分类:")
print(test_true_label)
print("正确分类的个数")
print(pre_true_sum)
acc = pre_true_sum/len(test_true_label)
print("分类正确率:")
print(str(acc * 100) + "%")




输出如下所示

G:\python\python.exe G:/my_python_exercise/媳妇儿的BP模型/main.py
预测的分类:
[2 4 4 2 4 4 4 4 5 4 3 4 4 4 4 5 3 4 3 4 4 4 5 4 4 4 4 4 2 3 3 4 2 4 3 2 4
 3 4 4 2 3 4 4 3 3 4 4 4 4 4 4 4 4 4 3 5 3 4 4 3 3 3 4 4 4 3 4 4 4 4 4 1 3
 3 4 3 4 1 3 3 4 4 5 4 4 4 4 2 3 3 3 4 4 3 4 4 4 1 3 3 3 3 5 2 5 3 4 4 2 4]
实际的分类:
[2 4 4 3 4 4 4 4 5 4 3 4 4 4 4 5 3 4 3 4 4 4 5 4 4 4 4 4 2 3 3 4 3 4 3 2 4
 3 4 4 2 3 4 4 3 4 4 5 4 4 4 4 4 4 3 3 5 3 4 4 3 3 2 4 4 4 3 4 4 4 4 4 1 3
 3 4 3 4 3 3 3 4 4 5 4 4 4 4 2 3 3 3 4 4 3 4 4 4 1 3 3 3 3 5 2 5 3 4 4 2 4]
正确分类的个数
104
分类正确率:
93.69369369369369%

Process finished with exit code 0

上一篇:《信息安全系统设计与实现》学习笔记10


下一篇:创投机构BP联系方式2