目标:已经有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