用KNN(K近邻算法)和ANN(人工神经网络)建立预测模型

2023-11-19

数据
输入 32 维的向量 输出一个值
有151组这样的数据

目的
用这样一组数据建立一个预测模型
输入32维的向量就能预测一个值

代码部分

1 导入工具包

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
from sklearn.metrics import r2_score
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import History
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split

""" 显示中文 """
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

2 读取数据

df = pd.read_excel('data.xls', index_col = 0) #index_col=0 表示第一列不作为索引
df = df.T #对列表进行转置

3 归一化

model_M = MinMaxScaler()
for i in df.columns:
    if (i == 'soot'):
        pass
    else:
        df[i] = model_M.fit_transform(pd.DataFrame(df[i]))
        #DataFrame 表示为表的形式
        #fit_transform 对数据进行归一化、标准化

#对fit、transform和fit_transform通俗易懂的解释 点这里

4 数据集划分
前100 个作为训练集、后 51 个作为测试集

df = shuffle(df) #对数据进行随机排列
df1 = df[:100]
df2 = df[100:]

5 相关性分析

column = df1.columns.tolist()#将列的索引转化为列表
corr_num = df1[column].corr(method = 'spearman').abs() #斯皮尔曼系数 相关性分析 并取绝对值
corr_ratio = corr_num[corr_num['soot'] > 0.2]['soot'] #挑选出相关性系数绝对值大于0.2的参数
plt.figure(figsize = (10, 6))
ratio = df1[corr_ratio.index].corr() #对挑选出的系数列进行相关性分析 皮尔森系数
g = sns.heatmap(ratio, annot = True, cmap = 'RdYlGn') #画出热力图

corr_top = corr_ratio.sort_values(ascending = False).reset_index() 
#sort_values(ascending=False)降序排列 默认是升序
#reset_index() 重置索引
corr_top.columns = ['特征', '相关性'] #将索引改成特征、相关性

df_top = [col for col in corr_top['特征']] #储存特征索引

df1 = df1[df_top] #训练集
df2 = df2[df1.columns] #测试集
#

6 划分训练集、验证集

train_data = df1[df1.columns[1:]] #input
test_data = df1['soot'] #label
X_train, X_val, y_train, y_val = train_test_split(train_data, test_data, test_size = 0.3, random_state = 2020) 
#test_size=0.3 这里训练集70组 验证集30组 random_state=2020保证每次划分是相同的

7 分离测试集特征、预测值

X_test = df2[df2.columns[1:]] #input
y_test = df2['soot'] #label

8 KNN
8.1 网格调参

model_KNN = KNeighborsRegressor() #KNN回归
parameters = {
    'p':[1],
    'n_neighbors':[i for i in range(3, 11)],
} #p=1 曼哈顿距离

model_GSCV = GridSearchCV(model_KNN, parameters, cv = 5)#网格搜索
model_GSCV.fit(X_train, y_train)

score_MSE = mean_squared_error(y_val, model_GSCV.predict(X_val))

print('验证集均方误差:', score_MSE)
print('最优参数:', model_GSCV.best_params_)

8.2 R2分数

model_KNN = KNeighborsRegressor(
    p = 1,
    n_neighbors = 3
)#这里最佳的n_neighbors最佳值为3
model_KNN.fit(X_train, y_train) #将训练集数据导入训练
predict_KNN = model_KNN.predict(X_val) #用验证集测试
r2_score(y_val, predict_KNN) #R2分数

8.3 测试集预测

predict_KNN = model_KNN.predict(X_test) #输入测试集数据,获得预测值
x = [i for i in range(0, 51)]
y1 = [i for i in y_test] #实际值
y2 = [i for i in predict_KNN] #预测值
plt.figure(figsize = (20, 6))
plt.plot(x, y1, label = '真实值')
plt.plot(x, y2, label = '预测值')
plt.title('KNN')
plt.legend() #图例位置

8.4 R2分数

r2_score(y_test, predict_KNN)

9 ANN
9.1搭建初级模型

#这里用 Sequential()建立神经网络,一层隐层,神经元个数32个
model_1 = Sequential()
model_1.add(Dense(32, input_dim = 7, activation = 'relu'))#激活函数relu
model_1.add(Dense(1, activation = 'linear'))

model_1.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['mean_absolute_error']) #优化器选用adam,loss function选用 平均绝对误差

history = model_1.fit(X_train, y_train, validation_data = (X_val, y_val), epochs = 200, batch_size = 16) #模型训练 用history进行每一步的记录便于之后画图

#画图 训练集和验证集的loss随着epochs的变化
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('模型的训练和验证损失曲线')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['Train', 'Validation'], loc = 'upper right')

9.2 R2分数

predict_ANN = model_1.predict(X_val)#验证集中的预测值
r2_score(y_val, predict_ANN)

9.3再增加四个隐层

#5层隐层,每一层的神经元个数为32
model_2 = Sequential()
model_2.add(Dense(32, input_dim = 7, activation = 'relu'))
model_2.add(Dense(32, activation = 'relu'))
model_2.add(Dense(32, activation = 'relu'))
model_2.add(Dense(32, activation = 'relu'))
model_2.add(Dense(32, activation = 'relu'))
model_2.add(Dense(1, activation = 'linear'))

model_2.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['mean_absolute_error'])

history = model_2.fit(X_train, y_train, validation_data = (X_val, y_val), epochs = 200, batch_size = 16)

#画图
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('模型的训练和验证损失曲线')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['Train', 'Validation'], loc = 'upper right')

9.4 R2分数

predict_ANN = model_2.predict(X_val)
r2_score(y_val, predict_ANN)

9.5增加神经元

#5层隐层,每一层的神经元个数为64
model_3 = Sequential()
model_3.add(Dense(64, input_dim = 7, activation = 'relu'))
model_3.add(Dense(64, activation = 'relu'))
model_3.add(Dense(64, activation = 'relu'))
model_3.add(Dense(64, activation = 'relu'))
model_3.add(Dense(64, activation = 'relu'))
model_3.add(Dense(1, activation = 'linear'))

model_3.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['mean_absolute_error'])

history = model_3.fit(X_train, y_train, validation_data = (X_val, y_val), epochs = 100, batch_size = 16)

#画图
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('模型的训练和验证损失曲线')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['Train', 'Validation'], loc = 'upper right')

9.6 R2分数

predict_ANN = model_3.predict(X_val)
r2_score(y_val, predict_ANN)

9.7 测试集预测

#在三个ANN模型中选择R2分数最高的那个,这里选择model3
predict_ANN = model_3.predict(X_test)

x = [i for i in range(0, 51)]
y1 = [i for i in y_test]
y2 = [i for i in predict_ANN]
plt.figure(figsize = (20, 6))
plt.plot(x, y1, label = '真实值')
plt.plot(x, y2, label = '预测值')
plt.title('ANN')
plt.legend()

9.8 R2分数

r2_score(y_test, predict_ANN)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用KNN(K近邻算法)和ANN(人工神经网络)建立预测模型 的相关文章

随机推荐

  • java word转pdf 后通过 PdfReader 和 PdfStamper对pdf添加水印 通过poi等组件实现

    所需jar包地址
  • javah用法

    正确做法 进入到包com所在的目录 是java文件所在的包 不是class javah classpath jni com jnitest MainActivity 如果执行这个 javah jni com example zndktest
  • Git中添加文件.gitignore作用

    添加文件 gitignore作用 作用 我们使用Git时 经常看到 gitignore文件 具体有什么作用呢 作用 该文件用来描述Git仓库中不需要管理的文件和目录 一般可以在初始化时自动生成 gitignore文件 如果初始化是忘记加入此
  • 虚拟化、虚拟机等概念理解

    虚拟化 定义 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 在一台计算机上同时运行多个逻辑计算机 每个逻辑计算机可运行不同的操作系统 并且应用程序都可以在相互独立的空间内运行而不受影响 从而显著提高计算机的工作效率 软件 完全虚拟 V
  • Qt表格分页,跳转,首尾页

    简介 1 使用QTableWidget实现了首页 上下页切换 尾页 以及跳转 上代码 widget h ifndef WIDGET H define WIDGET H include
  • unity 使用vrtk4的插件 打包htv vive VR客户端包,手柄不生效

    背景 目的 u3d使用vrtk开发pico应用 vrtk是为了到时候无缝衔接后续要买的htc vive pro 2 先导入了tilia importer 也就是vrtk4 0 根据教程模块化使用功能 和pico官网下的 PICO Unity
  • Dom事件

    1 onclick 点击事件 2 ondbclick 双击事件 3 onmousedown 鼠标按下事件 4 onmouseup 鼠标松开事件 5 onmouseenter 鼠标移入事件 不支持冒泡 只触发一次 6 onmouseover
  • Linux 磁盘与文件系统管理(鸟哥私房菜)

    本文来自 http vbird dic ksu edu tw linux basic 0230filesystem php 第八章 Linux 磁盘与文件系统管理 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也
  • JAVA用到的环境变量,JAVA_HOME、CLASSPATH、PATH

    Windows下JAVA用到的环境变量主要有3个 JAVA HOME CLASSPATH PATH JAVA HOME指向的是JDK的安装路径 如C JDK 1 4 2 在这路径下你应该能够找到bin lib等目录 值得一提的是 JDK的安
  • vue3学习笔记(1)script引入vue3实现简单应用

    Vue3专栏入口 目录 一 脚本引入简单使用 二 双向绑定的基本表现 一 脚本引入简单使用 script引入 简单使用实现数据渲染 div h1 counter num h1 div
  • 人工智能学习(一)newff函数介绍

    以下是matlab中的newff函数说明 不是neurolab中的newff 两者的参数不同 newff函数 指的是训练前馈网络的第一步是建立网络对象 实质是newff函数的参数 newff函数的格式为 net newff PR S1 S2
  • Linux服务器装mysql数据库并且连接数据库(详细教程)(阿里云)

    废话不多说 直接上教程 1 首先执行如下命令 更新YUM源 rpm Uvh http dev mysql com get mysql57 community release el7 9 noarch rpm 执行完上面命令后如果出现Peer
  • Verilog学习记录4——Verilog +: / -:语法

    Verilog 语法 看到这个语法的时候是在分析 IP AXI4 STREAM DATA FIFO的example时碰见的 然后查阅了资料 做出如下理解 变量的定义可以分为大端和小端 由于实际使用中变量常定义成大端 所以这里对小端不进行分析
  • 【华为OD机试】分糖果【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小明从糖果盒中随意抓一把糖果 每次小明会取出一半的糖果分给同学们 当糖果不能平均分配时 小明可以选择从糖果盒中 假设盒中糖果足够 取出一个糖果或放回一个糖果 小明最少
  • VS-code出现注释乱码以及VS调试过程中出现汉字乱码问题

    文章目录 VS VS code 1 前言 2 方法 VS Notepad 方法 VS VS code 1 前言 Visual Studio Code 简称VS code 是如今我们常用的一款编辑器 但是可能一些用户会需要其他软件进行调试等
  • 一次线上生产系统内存泄漏排查与优化实践

    今天给大家分享一个我们之前基于dubbo开发一个线上系统时候遇到的内存泄漏生产问题的排查与优化实践经验 相信对于大家多看一些类似的案例 以后对于大家自己在线上系统遇到各种生产问题的时候 进行排查和优化的思路会有很大的启发 内存泄漏问题发生背
  • begin to drop messages due to rate-limiting

    对于syslog保存的日志会有很多重要信息 但是一旦打印的日志数量超过设置的阈值 就会丢掉 imuxsock pid 48 begin to drop messages due to rate limiting 这是在调试时不愿看到的 可以
  • 【论文笔记系列】AutoML:A Survey of State-of-the-art (上)

    之前已经发过一篇文章来介绍我写的AutoML综述 最近把文章内容做了更新 所以这篇稍微细致地介绍一下 由于篇幅有限 下面介绍的方法中涉及到的细节感兴趣的可以移步到论文中查看 论文地址 https arxiv org abs 1908 007
  • yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测 并且可以估测出目标与本车之间的距离 一 视频展示 yolo车距1 订阅专栏获得源码 提供完整代码 无需看下文 二 单目测距原理 图中有一个车辆 且车辆在地面上 其接地点Q必定在地面上
  • 用KNN(K近邻算法)和ANN(人工神经网络)建立预测模型

    数据 输入 32 维的向量 输出一个值 有151组这样的数据 目的 用这样一组数据建立一个预测模型 输入32维的向量就能预测一个值 代码部分 1 导入工具包 在import pandas as pd import seaborn as sn