【机器学习(五)】基于KNN模型对高炉发电量进行回归预测分析

news2025/1/19 8:25:31

在这里插入图片描述

文章目录

  • 专栏导读
  • 1、KNN简介
  • 2、KNN回归模型介绍
  • 3、KNN模型应用-高炉发电量预测
    • 3.1数据集信息:
    • 3.2属性信息
    • 3.3数据准备
    • 3.4数据标准化和划分数据集
    • 3.5寻找最佳K值
    • 3.6建立KNN模型预测
  • 4、完整代码

专栏导读

✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。

本文录入于《数据分析之术》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分析工程师精心打造,对机器学习算法知识点逐一击破,不断学习,提升自我。
订阅后,可以阅读《数据分析之术》中全部文章内容,详细介绍数学模型及原理,带领读者通过模型与算法描述实现一个个案例。
还可以订阅基础篇《数据分析之道》,其包含python基础语法、数据结构和文件操作,科学计算,实现文件内容操作,实现数据可视化等等。
✍ 其他专栏:《数据分析案例》 ,《机器学习案例》

1、KNN简介

KNN(K-Nearest Neighbors)算法是一种非参数的分类和回归算法,它可以用于解决分类和回归问题。

在KNN算法中,输入是一个向量,输出为该向量所属的类别或该向量的值。KNN算法的核心思想是:如果一个样本在特征空间中的K个最相邻的样本中,属于某一个类别的样本点最多,则该样本也属于这个类别。

在分类问题中,KNN算法的预测结果是通过所属类别最多的K个邻居来确定的。在回归问题中,KNN算法的预测结果是通过K个邻居的平均值来确定的。

KNN算法的实现步骤:

  • 计算输入样本和训练样本之间的距离。

  • 选取距离最近的K个样本点。

  • 对于分类问题,将这K个样本点中出现次数最多的类别作为预测结果;对于回归问题,将这K个样本点的平均值作为预测结果。

  • 输出预测结果。

KNN算法的优点是简单易懂,不需要对数据进行假设,对于非线性的数据集表现优秀,但是缺点也比较明显,需要存储所有的训练数据,计算距离时的计算量大,对异常值比较敏感,需要对数据进行归一化处理。同时,KNN算法对于高维数据集表现不佳,因为在高维数据空间中,样本点之间的距离容易产生偏差,从而影响预测的准确性。

2、KNN回归模型介绍

python中的sklearn模块提供了KNN算法实现分类和回归功能,该功能存在于子模块neighbors中,对于回归问题,需要调用KNeighborsRegressor类。

neighbors.KNeighborsRegressor(n_neighbors=5, weights='uniform', algorithm='auto', 
			           leaf_size=30, p=2, metric='minkowski', 
			           metric_params=None, n_jobs=1)
  • n_neighbors:用于指定近邻样本个数K,默认为5

  • weights:用于指定近邻样本的投票权重,默认为’uniform’,表示所有近邻样本的投票权重一样;如果为’distance’,则表示投票权重与距离成反比,即近邻样本与未知类别的样本点距离越远,权重越小,反之,权重越大

  • algorithm:用于指定近邻样本的搜寻算法,如果为’ball_tree’,则表示使用球树搜寻法寻找近邻样本;如果为’kd_tree’,则表示使用KD树搜寻法寻找近邻样本;如果为’brute’,则表示使用暴力搜寻法寻找近邻样本。默认为’auto’,表示KNN算法会根据数据特征自动选择最佳的搜寻算法

  • leaf_size:用于指定球树或KD树叶子节点所包含的最小样本量,它用于控制树的生长条件,会影响树的查询速度,默认为30

  • metric:用于指定距离的度量指标,默认为闵可夫斯基距离

  • p:当参数metric为闵可夫斯基距离时,p=1,表示计算点之间的曼哈顿距离;p=2,表示计算点之间的欧氏距离;该参数的默认值为2

  • metric_params:为metric参数所对应的距离指标添加关键字参数

  • n_jobs:用于设置KNN算法并行计算所需的CPU数量,默认为1表示仅使用1个CPU运行算法,即不使用并行运算功能

3、KNN模型应用-高炉发电量预测

3.1数据集信息:

该数据集包含 6 年(2006 年至 2011 年)从联合循环发电厂收集的 9568 个数据点,当时该发电厂被设置为满负荷工作。特征包括每小时平均环境变量温度 (T)、环境压力 (AP)、相对湿度 (RH) 和排气真空 (V),以预测电厂每小时的净电能输出 (EP)。
联合循环发电厂 (CCPP) 由燃气轮机 (GT)、蒸汽轮机 (ST) 和热回收蒸汽发生器组成。在 CCPP 中,电力由结合在一个循环中的燃气轮机和蒸汽轮机产生,并从一个涡轮机转移到另一个涡轮机。虽然真空是从汽轮机收集并对其产生影响,但其他三个环境变量会影响 GT 性能。

3.2属性信息

  • 温度 (T) 在 1.81°C 和 37.11°C 范围内,
  • 环境压力 (AP) 在 992.89-1033.30 毫巴范围内,
  • 相对湿度 (RH) 在 25.56% 至 100.16 范围内%
  • 排气真空 (V) 在 25.36-81.56 cm Hg 范围内
  • 每小时净电能输出 (EP) 420.26-495.76 MW

3.3数据准备

读取数据

# 读入数据
import pandas as pd
ccpp = pd.read_excel(r"D:\Download\CCPP\Folds5x2_pp.xlsx")
ccpp.head()

在这里插入图片描述
查看数据形状

# 返回数据集的行数与列数
ccpp.shape

在这里插入图片描述

3.4数据标准化和划分数据集

标准化

# 导入第三方包
from sklearn.preprocessing import minmax_scale
# 对所有自变量数据作标准化处理
predictors = ccpp.columns[:-1]
X = minmax_scale(ccpp[predictors])

将数据集拆分为训练集和测试集

# 将数据集拆分为训练集和测试集
from sklearn import model_selection
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, ccpp.PE, 
                                                                    test_size = 0.25, random_state = 1234)

3.5寻找最佳K值

设置不同K值,使用交叉验证寻找

# 设置待测试的不同k值
K = np.arange(1,np.ceil(np.log2(ccpp.shape[0]))).astype(int)
# 构建空的列表,用于存储平均MSE
mse = []
for k in K:
    # 使用10重交叉验证的方法,比对每一个k值下KNN模型的计算MSE
    cv_result = model_selection.cross_val_score(neighbors.KNeighborsRegressor(n_neighbors = k, weights = 'distance'), 
                                                X_train, y_train, cv = 10, scoring='neg_mean_squared_error')
    mse.append((-1*cv_result).mean())

将得到的最佳K值可视化

# 从k个平均MSE中挑选出最小值所对应的下标  
arg_min = np.array(mse).argmin()
# 绘制不同K值与平均MSE之间的折线图
plt.plot(K, mse)
# 添加点图
plt.scatter(K, mse)
# 添加文字说明
plt.text(K[arg_min], mse[arg_min] + 0.5, '最佳k值为%s' %int(K[arg_min]))
# 显示图形
plt.show()

在这里插入图片描述

3.6建立KNN模型预测

from sklearn import metrics
# 重新构建模型,并将最佳的近邻个数设置为7
knn_reg = neighbors.KNeighborsRegressor(n_neighbors = 7, weights = 'distance')
# 模型拟合
knn_reg.fit(X_train, y_train)
# 模型在测试集上的预测
predict = knn_reg.predict(X_test)
# 计算MSE值
metrics.mean_squared_error(y_test, predict)

在这里插入图片描述
真实值和预测值

# 对比真实值和预测值
pd.DataFrame({'Real':y_test,'Predict':predict}, columns=['Real','Predict']).head(10)

在这里插入图片描述

通过对比发现,KNN模型在测试集上的真实值和预测值非常接近,可以认为模型的拟合效果非常理想。

4、完整代码

# 读入数据
import pandas as pd
ccpp = pd.read_excel(r"D:\Download\CCPP\Folds5x2_pp.xlsx")
ccpp.head()

# 返回数据集的行数与列数
ccpp.shape

# 导入第三方包
from sklearn.preprocessing import minmax_scale
# 对所有自变量数据作标准化处理
predictors = ccpp.columns[:-1]
X = minmax_scale(ccpp[predictors])

# 将数据集拆分为训练集和测试集
from sklearn import model_selection
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, ccpp.PE, 
                                                                    test_size = 0.25, random_state = 1234)

import numpy as np
from sklearn import neighbors
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 设置待测试的不同k值
K = np.arange(1,np.ceil(np.log2(ccpp.shape[0]))).astype(int)
# 构建空的列表,用于存储平均MSE
mse = []
for k in K:
    # 使用10重交叉验证的方法,比对每一个k值下KNN模型的计算MSE
    cv_result = model_selection.cross_val_score(neighbors.KNeighborsRegressor(n_neighbors = k, weights = 'distance'), 
                                                X_train, y_train, cv = 10, scoring='neg_mean_squared_error')
    mse.append((-1*cv_result).mean())

# 从k个平均MSE中挑选出最小值所对应的下标  
arg_min = np.array(mse).argmin()
# 绘制不同K值与平均MSE之间的折线图
plt.plot(K, mse)
# 添加点图
plt.scatter(K, mse)
# 添加文字说明
plt.text(K[arg_min], mse[arg_min] + 0.5, '最佳k值为%s' %int(K[arg_min]))
# 显示图形
plt.show()

from sklearn import metrics
# 重新构建模型,并将最佳的近邻个数设置为7
knn_reg = neighbors.KNeighborsRegressor(n_neighbors = 7, weights = 'distance')
# 模型拟合
knn_reg.fit(X_train, y_train)
# 模型在测试集上的预测
predict = knn_reg.predict(X_test)
# 计算MSE值
metrics.mean_squared_error(y_test, predict)

# 对比真实值和实际值
pd.DataFrame({'Real':y_test,'Predict':predict}, columns=['Real','Predict']).head(10)

📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用74373芯片进行单片机IO口扩展的方法介绍-成都控制设备订做

本文介绍用74373芯片进行微处理器IO口扩展的方法。 1.为什么要进行IO口扩展? 在电路设计的某些时候,微处理器(如单片机)IO口不够用了,此时该怎么办呢?利用辅助芯片进行IO口扩展是个简单直接的方法&#xff…

开源社与 Dev.Together 2022

思否与开源社携手11>2在 2023 年的春天,开源社走进了 Dev.Together 2022 的会场,一时间有种时空错觉。2022 年本该举办的开源聚会因为不可抗力的因素被延期,感谢思否一直坚持的理念:Dev.Together Summit 只做线下,将…

debian 10 安装神州通用数据库 V7.0

debian 10 安装神州通用数据库 V7.01、官方下载链接2、windows客户端下载链接3、官方安装手册4、安装前准备3.1、创建安装用户3.2、以root 用户修改神通数据库安装包的所有者为shentong 用户3.3、以root 用户创建神通数据库主目录并修改所有者为shentong 用户3.4、以root 用户临…

c/c++:顺序结构,if else分支语句,do while循环语句,switch case break语句

c/c:顺序结构,if else分支语句,do while循环语句,switch case break语句 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学&#xff…

一文读懂域名注册

本文深入浅出讲解域名的注册、建站和管理,通过文章可以了解以下问题: 域名注册及建站流程;域名注册的技术原理;域名管理(修改 DNS 服务器、转入转出、自定义 DNSHost、whois 信息)。 众所周知,…

【MYSQL】表的增删改查(基础)

文章目录🌷 1. 新增(Create)⭐️ 1.1 单行行数据 指定列插入⭐️ 1.2 多行数据 指定列插入🌷 2. 查询(Retrieve)⭐️ 2.1 全列查询⭐️ 2.2 指定列查询⭐️ 2.3 查询字段为表达式⭐️ 2.4 别名⭐️ 2.5 去…

十五、市场活动:excel导入

功能需求 ①用户在市场活动主页面,点击"导入"按钮,弹出导入市场活动的模态窗口; ②用户在导入市场活动的模态窗口选择要上传的文件,点击"导入"按钮,完成导入市场活动的功能. *只支持.xls *文件大小不超过5MB ③导入成功之后,提示成功导入记录条数,关闭…

(只需三步)如何用chatgpt自动生成思维导图

目录 chatgpt是可以生成思维导图的!只需三步,非常简单! 第一步:打开chatgpt,告诉它主题 第二步,完善思维导图 第三步:查看思维导图的效果 chatgpt是可以生成思维导图的!只需三步&am…

21天学会C++:Day1----C++的发展史

CSDN的uu们,大家好。这里是C入门的第一讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 什么是C 2. C的发展史 3. C的重要性 4. 如何学好C 4.1 别人如何学C 4…

海睿思分享 | 制造业数字化转型之业务场景驱动

在开始谈业务场景驱动之前,我们先介绍一下流程驱动和数据驱动的概念。 首先数据和流程在现代制造业相辅相成,流程中有数据,数据往往通过流程传递,而“驱动”是通过建立一定的驱动机制,改变以往人为的业务推进模式&…

Android UI设计经验分享,掌握设计技巧,让你的应用独树一帜

Android UI渲染是指Android应用程序中的用户界面如何被绘制。Android UI渲染很重要,因为渲染过程直接影响应用程序的性能和用户体验。 当用户在Android应用程序中进行交互时,应用程序会相应地创建并更新UI元素,例如TextView、Button、ImageV…

速下载 | 12项网络与数据安全新国标全文公开

根据2023年3月17日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告(2023年第1号),全国信息安全标准化技术委员会归口的12项网络安全国家标准正式发布。近日标准全文正式公开,炼石第一时间搜集整理这…

极氪X上市,18.98万元起售,进军紧凑豪华车市场

HiEV消息(文/Amy)4月12日,纯电SUV极氪X上市,共发布三个版本,官方零售价为: •ME版 五座后驱 189,800元 •YOU版 五座四驱 209,800元 •YOU版 四座后驱 209,800元全系三款车型预计将于6月起开启交付。极氪X限…

【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地

什么是SAML协议 SAML(Security Assertion Markup Language)是一种基于XML的标准,用于在不同的安全域之间传递身份验证和授权数据。SAML2.0是SAML协议的最新版本,它提供了一种标准的方式来实现单点登录(SSO&#xff09…

1.数据结构---时间复杂度+面试题:消失的数字

文章目录前言1.什么是数据结构?2.什么是算法?3.时间复杂度3.1 实例1:请计算一下Func1中count语句总共执行了多少次?大O的渐进表示法实例2:计算Func2的时间复杂度实例3:计算Func3的时间复杂度?实例4:计算Func4的时间复杂度?大O的渐进表示法总…

Activiti7原生整合和工作流相关概念详解

一、概述 Activiti是一个工作流引擎, Activiti可以将业务系统中复杂的业务流程抽取出来,并用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由Activiti进行管理,减少业务系统由…

C++ vasprintf

vasprintf 是一个 C 库函数,它可以通过可变参数创建一个格式化的字符串,并将其存储在动态分配的内存中。它的使用方法与 printf 类似,但它不会将结果打印到标准输出流中,而是将其存储在一个指向字符数组的指针中。 以下是 vasprin…

RFID技术在供应链管理中的应用

RFID是无线射频识别技术的简称,广泛应用于物流、制造、供应链等领域。在供应链管理中,RFID技术可以提供更加精确、实时的信息,帮助企业减少损耗和时间成本,提高效率和可靠性。本文将介绍RFID技术在供应链管理中的应用及其优势。 …

6.redis-集群

01-集群cluster 存在的问题 redis提供的服务OPS(operation per second)可以达到10万/秒,当前业务OPS如果超过10万/秒,怎么办? redis集群 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gITgqXr9-1681709270830)(n…

Nginx学习笔记 - 新

跟着 https://www.bilibili.com/video/BV1yS4y1N76R 视频学的 安装教程 nginx环境搭建 通过不同域名相同端口访问不同页面 首先添加hosts,映射下域名到装nginx的主机IP地址,我这里是虚拟机,且没有买域名就自己本地这样玩 进入nginx安装目…