当前位置: 首页 > news >正文

机器学习项目实战-能源利用率 Part-3(特征工程与特征筛选)

博主前期相关的博客可见下:
机器学习项目实战-能源利用率 Part-1(数据清洗)
机器学习项目实战-能源利用率 Part-2(探索性数据分析)
这部分进行的特征工程与特征筛选。

三 特征工程与特征筛选

一般情况下我们分两步走:特征工程与特征筛选:

特征工程: 概括性来说就是尽可能的多在数据中提取特征,各种数值变换,特征组合,分解等各种手段齐上阵。

特征选择: 就是找到最有价值的那些特征作为我们模型的输入,但是之前做了那么多,可能有些是多余的,有些还没被发现,所以这俩阶段都是一个反复在更新的过程。比如我在建模之后拿到了特征重要性,这就为特征选择做了参考,有些不重要的我可以去掉,那些比较重要的,我还可以再想办法让其做更多变换和组合来促进我的模型。所以特征工程并不是一次性就能解决的,需要通过各种结果来反复斟酌。

3.1 特征变换 与 One-hot encode

有点像分析特征之间的相关性

features = data.copy()
numeric_subset = data.select_dtypes('number')
for col in numeric_subset.columns:if col == 'score':nextelse:numeric_subset['log_' + col] = np.log(abs(numeric_subset[col]) + 0.01)categorical_subset = data[['Borough', 'Largest Property Use Type']]
categorical_subset = pd.get_dummies(categorical_subset)features = pd.concat([numeric_subset, categorical_subset], axis = 1)
features.shape

这段代码的目的是为了生成特征矩阵 features,它包含了原始数据 data 的数值特征和分类特征的处理结果。

首先,代码复制了原始数据 data,并将其赋值给 features

接下来,通过 select_dtypes('number') 选择了 data 中的数值类型的列,并将结果存储在 numeric_subset 中。

然后,使用一个循环遍历 numeric_subset 的列,对每一列进行处理。对于列名为 ‘score’ 的列,直接跳过(使用 next)。对于其他列,将其绝对值加上一个很小的常数(0.01),然后取对数,并将结果存储在 numeric_subset 中以 ‘log_’ 开头的列名中。

接着,从 data 中选择了 ‘Borough’ 和 ‘Largest Property Use Type’ 两列作为分类特征,并使用 pd.get_dummies 进行独热编码(One-Hot Encoding)得到它们的编码结果,并将结果存储在 categorical_subset 中。

最后,使用 pd.concatnumeric_subsetcategorical_subset 按列方向(axis=1)进行拼接,得到最终的特征矩阵 features

最后一行代码输出了 features 的形状(行数和列数)。

在这里插入图片描述

3.2 共线特征

在数据中Site EUI 和 Weather Norm EUI就是要考虑的目标,他俩描述的基本是同一个事

plot_data = data[['Weather Normalized Site EUI (kBtu/ft²)', 'Site EUI (kBtu/ft²)']].dropna()plt.plot(plot_data['Site EUI (kBtu/ft²)'], plot_data['Weather Normalized Site EUI (kBtu/ft²)'], 'bo')
plt.xlabel('Site EUI'); plt.ylabel('Weather Norm EUI')
plt.title('Weather Norm EUI vs Site EUI, R = %.4f' % np.corrcoef(data[['Weather Normalized Site EUI (kBtu/ft²)', 'Site EUI (kBtu/ft²)']].dropna(), rowvar=False)[0][1])

在这里插入图片描述

3.3 剔除共线特征

def remove_collinear_features(x, threshold):'''Objective:Remove collinear features in a dataframe with a correlation coefficientgreater than the threshold. Removing collinear features can help a modelto generalize and improves the interpretability of the model.Inputs: threshold: any features with correlations greater than this value are removedOutput: dataframe that contains only the non-highly-collinear features'''y = x['score']x = x.drop(columns = ['score'])corr_matrix = x.corr()iters = range(len(corr_matrix.columns) - 1)drop_cols = []for i in iters:for j in range(i):item = corr_matrix.iloc[j: (j+1), (i+1): (i+2)]            col = item.columnsrow = item.indexval = abs(item.values)           if val >= threshold:# print(col.values[0], "|", row.values[0], "|", round(val[0][0], 2))drop_cols.append(col.values[0])drops = set(drop_cols)# print(drops)x = x.drop(columns = drops)x = x.drop(columns = ['Weather Normalized Site EUI (kBtu/ft²)', 'Water Use (All Water Sources) (kgal)','log_Water Use (All Water Sources) (kgal)','Largest Property Use Type - Gross Floor Area (ft²)'])x['score'] = yreturn xfeatures = remove_collinear_features(features, 0.6)  # 阈值为0.6
features = features.dropna(axis = 1, how = 'all')
print(features.shape)
features.head()

这段代码定义了一个名为 remove_collinear_features 的函数,用于移除具有高相关性的特征。移除具有高相关性的特征可以帮助模型泛化并提高模型的解释性。

函数的输入参数为 x(包含特征和目标变量的数据框)和 threshold(相关系数的阈值),阈值以上的特征相关性会被移除。

首先,将目标变量 score 存储在变量 y 中,并将其从 x 中移除。

接下来,计算特征之间的相关系数矩阵 corr_matrix

然后,使用两个嵌套的循环遍历相关系数矩阵中的元素。当相关系数的绝对值大于等于阈值时,将该特征的列名添加到 drop_cols 列表中。

完成循环后,将 drop_cols 转换为集合 drops,以去除重复的特征列名。

然后,从 x 中移除 drops 中的特征列,以及其他预定义的特征列。

接下来,将目标变量 y 添加回 x 中,并将结果返回。

最后,对更新后的特征矩阵 features 进行处理,移除所有包含缺失值的列,并输出其形状(行数和列数),并展示前几行数据。

在这里插入图片描述

3.4 数据集划分

no_score = features[features['score'].isna()]
score = features[features['score'].notnull()]
print('no_score.shape: ', no_score.shape)
print('score.shape', score.shape)from sklearn.model_selection import train_test_split
features = score.drop(columns = 'score')
labels = pd.DataFrame(score['score'])
features = features.replace({np.inf: np.nan, -np.inf: np.nan})
X, X_test, y, y_test = train_test_split(features, labels, test_size = 0.3, random_state = 42)
print(X.shape)
print(X_test.shape)
print(y.shape)
print(y_test.shape)

这段代码分为几个步骤:

  1. 首先,将特征矩阵 features 分为两部分:no_scorescore。其中,no_scorefeatures 中目标变量 score 为空的部分,而 score 则是 features 中目标变量 score 不为空的部分。

  2. 输出 no_scorescore 的形状(行数和列数),分别使用 no_score.shapescore.shape 打印结果。

  3. 导入 sklearn.model_selection 模块中的 train_test_split 函数。

  4. score 中移除目标变量 score 列,得到特征矩阵 features

  5. 创建标签(目标变量)矩阵 labels,其中只包含目标变量 score 列。

  6. 使用 replace 方法将 features 中的无穷大值替换为缺失值(NaN)。

  7. 使用 train_test_split 函数将特征矩阵 features 和标签矩阵 labels 划分为训练集和测试集。参数 test_size 设置测试集的比例为 0.3,random_state 设置随机种子为 42。将划分后的结果分别存储在 XX_testyy_test 中。

  8. 输出训练集 X、测试集 X_test、训练集标签 y 和测试集标签 y_test 的形状(行数和列数),分别使用 X.shapeX_test.shapey.shapey_test.shape 打印结果。

这段代码的目的是将数据集划分为训练集和测试集,并准备好用于训练和评估模型的特征矩阵和标签矩阵。
在这里插入图片描述

3.5 建立一个Baseline

在建模之前,我们得有一个最坏的打算,就是模型起码得有点作用才行。

# 衡量标准: Mean Absolute Error
def mae(y_true, y_pred):return np.mean(abs(y_true - y_pred))baseline_guess = np.median(y)print('The baseline guess is a score of %.2f' % baseline_guess)
print('Baseline Performance on the test set: MAE = %.4f' % mae(y_test, baseline_guess))

这段代码定义了一个衡量标准函数 mae,并计算了一个基准预测结果。

  1. mae 函数计算了预测值与真实值之间的平均绝对误差(Mean Absolute Error)。它接受两个参数 y_truey_pred,分别表示真实值和预测值。函数内部通过 np.mean(abs(y_true - y_pred)) 计算平均绝对误差,并返回结果。

  2. baseline_guess 是基准预测的结果,它被设置为标签(目标变量) y 的中位数。这相当于一种简单的基准方法,用中位数作为所有预测的固定值。

  3. 使用 print 函数打印基准预测结果的信息。'The baseline guess is a score of %.2f' % baseline_guess 会输出基准预测结果的值,保留两位小数。'Baseline Performance on the test set: MAE = %.4f' % mae(y_test, baseline_guess) 会输出基准预测结果在测试集上的性能,即平均绝对误差(MAE),保留四位小数。

这段代码的目的是计算基准预测结果,并输出基准预测结果的信息以及在测试集上的性能评估(使用平均绝对误差作为衡量标准)。

在这里插入图片描述

3.6 保存数据

no_score.to_csv('data/no_score.csv', index = False)
X.to_csv('data/training_features.csv', index = False)
X_test.to_csv('data/testing_features.csv', index = False)
y.to_csv('data/training_labels.csv', index = False)
y_test.to_csv('data/testing_labels.csv', index = False)

Reference

机器学习项目实战-能源利用率 Part-1(数据清洗)

机器学习项目实战-能源利用率 Part-2(探索性数据分析)

机器学习项目实战-能源利用率1-数据预处理

相关文章:

机器学习项目实战-能源利用率 Part-3(特征工程与特征筛选)

博主前期相关的博客可见下: 机器学习项目实战-能源利用率 Part-1(数据清洗) 机器学习项目实战-能源利用率 Part-2(探索性数据分析) 这部分进行的特征工程与特征筛选。 三 特征工程与特征筛选 一般情况下我们分两步走…...

WebSocket的那些事(2-实操篇)

目录 一、概述二、Websocket API1、引入相关依赖2、配置WebSocket处理器3、WebSocket配置4、测试 三、总结 一、概述 在上一节 WebSocket的那些事(1-概念篇)中我们简单的介绍了关于WebSocket协议的相关概念、与HTTP的联系区别等等。 这一节将会带来Web…...

BurpSuite—-Target模块(目标模块)

前言 本文主要介绍BurpSuite—-Target模块(目标模块)的相关内容 关于BurpSuite的安装可以看一下之前这篇文章: http://t.csdn.cn/cavWt Target功能 目标工具包含了SiteMap,用你的目标应用程序的详细信息。它可以让你定义哪些对象在范围上为你目前的工…...

部门来了个测试开发,听说是00后,上来一顿操作给我看呆了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…...

Godot引擎 4.0 文档 - 入门介绍 - Godot简介

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面:Introduction to Godsot — Godot Engine (stable) documentation in English Godot简介 本文旨在帮助您确定 Godot 是否适合您。我们将介绍该引擎的一些广泛功能&#…...

数据通信基础 - 码元速率 和 数据速率 详解

文章目录 1 概述1.1 码元速率(波特率)1.2 数据速率(比特率)1.3 码元速率 和 数据速率 换算 2 网工软考真题 1 概述 1.1 码元速率(波特率) 码元速率:表示单位时间内信号波形的变换次数&#xf…...

听我一句劝,别去外包,干了三年,废了....

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

全域兴趣电商:国货品牌的新策略、新玩法

【潮汐商业评论/原创】 消费的方向标已经变了。 在消费市场的滚滚浪潮里,国人的“衣食住行”在全面的“国货化”,一个个有颜值有实力的国货品牌如雨后春笋般出现在寻常百姓家,如今在这片肥沃的土壤上正结出适合国人使用的果实。 01 国货二…...

嵌入式 Linux 入门(十一、make 和 MakeFile)

嵌入式 Linux 入门第十一课,Make 工具和 Makefile 的引入...... 矜辰所致目录 前言一、Linux 下多文件编译二、make 工具和 Makefile2.1 make 和 Makefile 是什么?2.2 通过 STM32 提前熟悉 Makefile2.3 GCC 与 make 的关系/区别? 三、一个简单的 Makefi…...

Serverless冷扩机器在压测中被击穿问题 | 京东云技术团队

一、现象回顾 在今天ForceBot全链路压测中,有位同事负责的服务做Serverless扩容(负载达到50%之后自动扩容并上线接入流量)中,发现新扩容的机器被击穿,监控如下(关注2:40-3:15时间段的数据)&…...

数仓中指标-标签,维度-度量,自然键-代理键等各名词深度解析

作为一个数据人,是不是经常被各种名词围绕,是不是对其中很多概念认知模糊。有些词虽然只有一字之差,但是它们意思完全不同,今天我们就来了解下数仓建设及数据分析时常见的一些概念含义及它们之间的关系。 本文首发于公众号【五分钟…...

Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C++)(Mono)

Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C) Baumer工业相机Baumer工业相机图像数据转为Bitmap的技术背景Baumer工业相机使用BGAPISDK将图像数据转换为Bitmap的几种方式1.引用合适的类文件2.BGAPI SDK原始图像数据为Bi…...

C++笔试笔记2

C笔试笔记2 百富计算机的笔试 const限定符:首先作用于左边,如果左边没东西,就作用于右边。 const int: 左边没有内容,所以const作用于右边,就是“整型常量”。等同于int const; int * const&am…...

手写Spring框架

手写Spring框架 各位道友,我发现现在贼卷底层代码,看完源码发下几天后,额!!!我当时看了啥! 还是自己写个迷你的spring框架,这样印象更加深刻,上干货,代码仓…...

微服务学习笔记--(Docker)

目录 初识DockerDcoker的基本操作Dockerfile自定义镜像Docker-ComposeDocker镜像服务 初始Docter 什么是DockerDocker和虚拟机的区别Docker架构安装Docker 初识Docker-什么是docker 项目部署的问题 大型项目组件较多,运行环境也较为复杂,部署时会碰…...

ChatGPT 国内版免费

ChatGPT 是最新的聊天机器人技术,它可以让你更快地完成各种任务。如果你想要一个在国内的免费版本,你来对地方了!在这篇文章中,我们将会分享与你 ChatGPT的最新信息,以及在国内使用 ChatGPT 的方法。如果你想要了解更多…...

推荐5个免费好用的UI模板网站!

1、即时设计 即时设计资源广场是一个聚集了大量优秀设计作品和大厂设计系统超过3000个UI组件库的设计师灵感库。该广场每月更新上百个精品模板,且还将这些模板分门别类按不同类型素材进行分类,其丰富的设计资源包括移动设计、网页设计、插画、线框图、矢…...

linux 安装 maven 3.8 版本

文章目录 1:maven 仓库官网 2、下载安装包 3、使用:Xftp 上传到你想放的目录 4、解压文件 ​编辑 5、配置环境变量 ​编辑 6、刷新 /etc/profile 文件 7、查看maven 版本 1:maven 仓库官网 Maven – Download Apache Mavenhttps://mave…...

Redis的三种持久化策略及选取建议

文章目录 Redis的三种持久化策略及选取建议前言RDB(快照)概述优缺点 AOF(追加文件)概述优缺点AOF刷盘策略AOF重写 选取正确的持久化策略AOF和RDB的选择AOF与RDB的混合模式AOF重写和RDB持久化的冲突AOF校验机制三种模式的选择建议 …...

力扣LCP 33. 蓄水

LCP 33. 蓄水 给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。有以下两种操作: 升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]1 蓄水&#xff1…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制&#xff0…...