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

news2024/12/24 11:27:25

博主前期相关的博客可见下:
机器学习项目实战-能源利用率 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':
        next
    else:
        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 coefficient
        greater than the threshold. Removing collinear features can help a model
        to generalize and improves the interpretability of the model.
        
    Inputs: 
        threshold: any features with correlations greater than this value are removed
    
    Output: 
        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.columns
            row = item.index
            val = 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'] = y
    return x

features = 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-数据预处理

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

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

相关文章

李彦宏一句“车水马龙”,中国AI的一幕天地宽广

“什么叫生成式?比如说,给我画一幅车水马龙的图片。这种东西,过去人们不觉得是人工智能应该做的事,现在可以做了。”5月18日,百度CEO李彦宏在天津举办的第七届世界智能大会上演讲时,说了这么一句话。 不了解…

保护你无价的数据 | 推荐一个开源备份工具,可去重、增量、压缩、还原到特定日期...

Borg 数据备份 Borg 的优势是 高效:BorgBackup 会将文件按数据块去重,只有改动的数据块才会被备份。一个 25 GiB 的虚拟机磁盘文件,只改动了 1 GiB,那就只会新增备份这 1 GiB 的数据;高速:核心算法使用 C 编…

5-《Kotlin》

5-《Kotlin》 1.kotlin基础: From Java To Kotlin2.Kotlin 的延迟初始化: lateinit var 和 by lazy1.lateinit var2.by lazy 3 Kotlin Tips:怎么用 Kotlin 去提高生产力(kotlin优势)Tip1- 更简洁的字符串Tip2- Kotlin中大多数控制结构都是表达…

[RapidOCRWeb] 桌面版使用教程

引言 说明:桌面版指的是可以直接解压,双击即可运行的版本。通俗来说,对rapidocr_web做了打包,将相关依赖全部放到一个zip包中,不需要本地有额外的环境,降低使用门槛。下面会以Windows版为例,作…

LeetCode 1373. 二叉搜索子树的最大键值和

【LetMeFly】1373.二叉搜索子树的最大键值和 力扣题目链接:https://leetcode.cn/problems/maximum-sum-bst-in-binary-tree/ 给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下: 任意节点的…

pandas---数据处理(excel文件)

近期在弄一个项目的前期数据,所以总结了一下,内容如下(以下以csv文件为例) 1. DataFrame常用操作1.1 DataFrame去除空行(1)对于一般空行(2)对于列表式(list)空…

Redis(二)对事务进行操作及Jedis

系列文章目录 Redis入门笔记(一):Redis在Linux下安装和八大数据类型 文章目录 系列文章目录前言Redis对事务进行操作开启事务:multi执行事务:exec放弃事务:discard编译型异常(命令错误&#xf…

信息安全-数据安全-字节大数据平台安全与权限治理实践

导读:本次分享题目为字节跳动大数据平台安全与权限治理实践,文章会围绕下面四点展开: 字节大数据安全体系现状和难点 细粒度权限管控和治理 资产保护能力 数据删除能力 分享嘉宾|许从余 火山引擎 数据平台产品经理 编辑整理&#…

Spring 5 笔记 - 新功能

1. Spring 5 框架新功能 整个Spring 5 框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除。Spring 5.0 框架自带了通用的日志封装 (1)Spring 5 已经移除 Log4jConfigListener,官方建议使用…

立创EDA标准版指南1-原理图与封装库

立创 EDA 标准版 由于立创 EDA 新版本改了对应术语,这是对于的表格: 原理图库->符号 PCB 库->封装 PCB 3D 库->3D 模型 下面的全部讲述将依据旧版称呼,因为更直观,新版称呼模棱两可并且与 AD 的工程架构差别较大 这是…

数据分析11——Pandas中数据偏移/数据切分/数据结构转换

数据偏移: 1、shift函数: 在 Pandas 中,shift 函数用于将数组的数据向前或向后平移指定的步数。它可以应用于 Series 或 DataFrame 类型的数据中,并返回一个平移后的新数据结构,其中每个元素都被取代为原始序列中对应…

kubernetes根据podName获取对应的主机pid

获取指定的podName kubectl get pods -n demo -owide登录对应的主机执行docker命令,获取到容器的id docker ps | grep PODNAME拿到的容器id,执行如下命令 获取容器的长的容器id docker inspect container_id找到容器id后 执行 apt-get install jq cat /var/lib…

关于Word文档的处理【笔记】

关于Word文档的处理【笔记】 前言推荐关于Word文档的处理一、解压word如何恢复1 准备2 解压3 恢复 二、对word文档进行图片替换1 首先解压word文档2 进入word文档存放图片的路径3 批量给图片添加水印4 替换原来的media文件5 压缩为docx文件6 打开 最后 前言 2023-5-20 11:00:1…

uniapp 快手授权登录,发布、编辑、裁剪图片和视频,分享 Ba-Kwai

简介(下载地址) 快手授权登录,发布、编辑、裁剪图片和视频,一键智能裁剪,分享私信,打开用户主页,挂载小程序等。自带选择图片和选择视频方法。 抖音授权登录、发布、分享 Ba-Aweme&#xff08…

基于GitLab搭建DevSecOps流水线

本博客地址:https://security.blog.csdn.net/article/details/130734964 一、GitLab安装 GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建Web服务,可通过Web界面访问公开的或者私人的项目。它…

【总结】数据建模调研与设计

一、数据建模背景和目的 1.1 数据建模任务背景 a. xxxx 中台新增数据建模模块,对标行业最佳实践,补齐数据中台短板。 b. 以往的数据建模,包括数仓模型的设计、数仓模型的落地,都是通过第三方的工具,例如DBwaver、Nav…

SOFA Weekly|SOFA 大事记、Layotto 社区会议回顾与预告、社区本周贡献

SOFA WEEKLY | 每周精选 筛选每周精华问答,同步开源进展 欢迎留言互动~ SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件&am…

【信息安全案例】——应用软件安全(学习笔记)

📖 前言:随着应用软件日益增多,与我们的生活深度绑定,应用软件的安全性问题愈发凸显。针对恶意代码、代码漏洞等安全风险,必须加强安全意识,采取有效措施进行防范。合理有效的安全措施能够确保用户的信息安…

(数字图像处理MATLAB+Python)第九章图像形态学运算-第一、二节:形态学基础和二值形态学运算

文章目录 一:形态学基础(1)结构元素(2)程序 二:二值形态学的基础运算(1)基本形态变换A:膨胀运算①:概述②:示例③:程序 B:…

CleanMyMac X4.13.4中文版下载及使用教程

随着Mac电脑的广泛普及,越来越多的用户开始关注如何保持自己电脑的快速运行。众所周知,Mac电脑的性能和稳定性得到了广泛认可。但是,随着使用时间的增加和数据的增加,任何电脑都可能变得缓慢和难以使用。为了解决这一问题&#xf…