特征工程(I)--探索性数据分析

有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样是确定的步骤,更多是工程上的经验和权衡。因此没有统一的方法。这里只是对一些常用的方法做一个总结。

特征工程包含了 Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和 Feature construction(特征构造)等子问题。

数据集描述

本项目使用Kaggle上的 家庭信用违约风险数据集 (Home Credit Default Risk) ,是一个标准的机器学习分类问题。其目标是使用历史贷款的信息,以及客户的社会经济和财务信息,预测客户是否会违约。

数据集包括了8个不同的数据文件:

application_{train|test}:包含每个客户社会经济信息和Home Credit贷款申请信息的主要文件。每行代表一个贷款申请,由SK_ID_CURR唯一标识。训练集30.75万数据,测试集4.87万数据。其中训练集中TARGET=1表示未偿还贷款。通过这两个文件,就能对这个任务做基本的数据分析和建模,也是本篇的主要内容。

Jupyter Notebook 脚本:feature_engineering_demo_p1_EDA

探索性数据分析

Exploratory Data Analysis(EDA)

数据概览

导入必要的包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings# Setting configuration.
warnings.filterwarnings('ignore')
sns.set_style('whitegrid')
pd.set_option('display.max_columns',None)
pd.set_option('display.max_rows',None)
pd.options.display.max_colwidth = 100SEED = 42

导入数据

df = pd.read_csv('../datasets/Home-Credit-Default-Risk/application_train.csv')
print(df.head())
print('Training data shape: ', df.shape)
# `SK_ID_CURR` is the unique id of the row.
id_col = "SK_ID_CURR"
df[id_col].nunique() == df.shape[0]

在遇到非常多的数据的时候,我们一般先会按照数据的类型分布下手,看看不同的数据类型各有多少

# Number of each type of column
print(df.dtypes.value_counts())
print("\nCategorical features:")
print(df.select_dtypes(["object"]).columns.tolist())
print("\nNumeric features:")
print(df.select_dtypes("number").columns.tolist())

接下来看下数据集的统计信息

print(df.info())
print(df.describe())

数据相关性

data Correlation

查看两两特征之间的相关程度,对特征的处理有指导意义。

# The correlation matrix
corrmat = df.corr(numeric_only=True)# Upper triangle of correlations
upper = corrmat.where(np.triu(np.ones(corrmat.shape), k=1).astype(np.bool))# Absolute value correlation
corr_abs = upper.unstack().abs().sort_values(ascending=False).dropna()corr_abs.head(20)
fig, axs = plt.subplots(figsize=(10, 10))
sns.heatmap(corrmat, vmax=0.9, square=True)
axs.set_title('Correlations', size=15)
plt.show()

目标变量相关性

Continuous Features

# Correlation map to see how features are correlated with target.
target = "TARGET"
corrmat[target].abs().sort_values(ascending=False).head(20)
cont_features = ['EXT_SOURCE_1', 'EXT_SOURCE_2', 'EXT_SOURCE_3']fig = plt.figure(figsize=(5, 8))
plt.subplots_adjust(right=1.5)for i, source in enumerate(cont_features):# Distribution of feature in datasetax = fig.add_subplot(3, 1, i + 1)sns.kdeplot(x=source, data=df, hue=target, common_norm=False,fill=True, ax=ax)# Label the plotsplt.title(f'Distribution of {source} by Target Value')plt.xlabel(f'{source}')plt.ylabel('Density')plt.tight_layout(h_pad = 2.5)
cont_features = ['EXT_SOURCE_1', 'EXT_SOURCE_2', 'EXT_SOURCE_3']for source in cont_features:# Calculate the correlation coefficient between the variable and the targetcorr = df[target].corr(df[source])# Calculate medians for repaid vs not repaidavg_repaid = df.loc[df[target] == 0, source].median()avg_not_repaid = df.loc[df[target] == 1, source].median()# print out the correlationprint('\nThe correlation between %s and the TARGET is %0.4f' % (source, corr))# Print out average valuesprint('Median value for loan that was not repaid = %0.4f' % avg_not_repaid)print('Median value for loan that was repaid =     %0.4f' % avg_repaid)

Categorical Features

cat_features = df.select_dtypes(["object"]).columnsfig = plt.figure(figsize=(16, 16))
for i, feature in enumerate(cat_features):    ax = fig.add_subplot(4, 4, i+1)sns.countplot(x=feature, data=df, hue=df[target].map(lambda x:str(x)), fill=True, ax=ax)ax.set_xlabel(feature)ax.set_ylabel('App Count')    ax.legend(loc='upper center')plt.show()

可以看到,一些分类特征和目标变量有很大的相关性,可以one-hot编码,也可以组合成新的有序分类变量。

目标变量分布

对于分类问题的目标变量,在sklearn中需要编码为数值型

sklearn.preprocessing预处理
LabelEncoder目标变量序数编码
LabelBinarizer二分类目标数值化
MultiLabelBinarizer多标签目标数值化

检查目标变量分布

# `TARGET` is the target variable we are trying to predict (0 or 1):
# 1 = Not Repaid 
# 0 = Repaid
target = 'TARGET'print(f"percentage of default : {df[target].mean():.2%}")
print(df[target].value_counts())

现实中,样本(类别)样本不平衡(class-imbalance)是一种常见的现象,一般地,做分类算法训练时,如果样本类别比例(Imbalance Ratio)(多数类vs少数类)严重不平衡时,分类算法将开始做出有利于多数类的预测。一般有以下几种方法:权重法、采样法、数据增强、损失函数、集成方法、评估指标。

方法函数python包
SMOTESMOTEimblearn.over_sampling
ADASYNADASYNimblearn.over_sampling
Bagging算法BalancedBaggingClassifierimblearn.ensemble
Boosting算法EasyEnsembleClassifierimblearn.ensemble
损失函数Focal Lossself-define

我们可以用imbalance-learn这个Python库实现诸如重采样和模型集成等大多数方法。

对于回归任务,假设预测目标为客户的贷款额度AMT_CREDIT

df['AMT_CREDIT'].describe()

我们画出SalePrice的分布图和QQ图。

Quantile-Quantile图是一种常用的统计图形,用来比较两个数据集之间的分布。它是由标准正态分布的分位数为横坐标,样本值为纵坐标的散点图。如果QQ图上的点在一条直线附近,则说明数据近似于正态分布,且该直线的斜率为标准差,截距为均值。

import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import probplot, normdef norm_comparison_plot(series):series = pd.Series(series)mu, sigma = norm.fit(series)kurt, skew = series.kurt(), series.skew()print(f"Kurtosis: {kurt:.2f}", f"Skewness: {skew:.2f}", sep='\t')fig = plt.figure(figsize=(10, 4))# Now plot the distributionax1 = fig.add_subplot(121)ax1.set_title('Distribution')ax1.set_ylabel('Frequency')sns.distplot(series, fit=norm, ax=ax1)ax1.legend(['dist','kde','norm'],f'Normal dist. ($\mu=$ {mu:.2f} and $\sigma=$ {sigma:.2f} )', loc='best')# Get also the QQ-plotax2 = fig.add_subplot(122)probplot(series, plot=plt)norm_comparison_plot(df['AMT_CREDIT'])
plt.show()

可以看到 SalePrice 的分布呈偏态,许多回归算法都有正态分布假设,因此我们尝试对数变换,让数据接近正态分布。

norm_comparison_plot(np.log1p(df['AMT_CREDIT']))
plt.show()

可以看到经过对数变换后,基本符合正态分布了。

sklearn.compose 中的 TransformedTargetRegressor 是专门为回归任务设置的目标变换。对于简单的变换,TransformedTargetRegressor在拟合回归模型之前变换目标变量,预测时则通过逆变换映射回原始值。

reg = TransformedTargetRegressor(regressor=LinearRegression(), transformer=FunctionTransformer(np.log1p))

参考文献:
Home Credit Default Risk - 1 之基础篇
Home Credit Default Risk 之FeatureTools篇
Feature Engineering for House Prices
Credit Fraud信用卡欺诈数据集,如何处理非平衡数据
Predict Future Sales 预测未来销量, Kaggle 比赛,LB 0.89896 排名6%
feature-engine 将特征工程中常用的方法进行了封装
分享关于人工智能的内容

特征工程系列:特征筛选的原理与实现(上) 7.23
特征工程系列:特征筛选的原理与实现(下) 7.23
特征工程系列:数据清洗 8.1
特征工程系列:特征预处理(上) 8.8
特征工程系列:特征预处理(下) 8.16
特征工程系列:特征构造之概览篇 10.8
特征工程系列:聚合特征构造以及转换特征构造 10.12
特征工程系列:笛卡尔乘积特征构造以及遗传编程特征构造 10.15
特征工程系列:GBDT特征构造以及聚类特征构造 10.30
特征工程系列:时间特征构造以及时间序列特征构造 11.11
特征工程系列:自动化特征构造 12.10
特征工程系列:空间特征构造以及文本特征构造 12.10

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

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

相关文章

33. UE5 RPG使用增强输入激活GameplayAbility(三)

在前面的文章,我们实现了使用GameplayTag和InputAction的对应绑定的数据,并且添加到了增强输入映射的上下文中,实现了通过按键打印对应的GameplayTag,这只是我们基础需要制作的。目的主要是为了实现在GameplayAblity上面设置对应的…

Linux slocate命令教程:安全快速的文件搜索工具(附实例详解和注意事项)

Linux slocate命令介绍 slocate(secure locate)是一个用于在系统中查找文件的命令。这是Linux命令locate的安全版本,它也用于文件搜索,类似于locate命令,它创建了一个文件位置的数据库以便更快地搜索。但是它比locate…

计算机网络 实验指导 实验16

实验16 PPP配置实验 1.实验拓扑图 实验10讲了如何添加Se的接口 名称接口IP地址Router1se0/0/0192.168.1.1/24Router0se0/0/0192.168.1.2/24se0/0/1192.168.2.1/24Router2se0/3/0192.168.2.2/24 2.实验目的 (1)掌握PPP的基本配置步骤和方法 &#xf…

linux之文件系统、inode和动静态库制作和发布

一、背景 1.没有被打开的文件都在磁盘上 --- 磁盘级文件 2.对磁盘级别的文件,我们的侧重点 单个文件角度 -- 这个文件在哪里,有多大,其他属性是什么? 站在系统角度 -- 一共有多少文件?各自属性在哪里&#xff1f…

Hive 之 UDF 运用(包会的)

文章目录 UDF 是什么?reflect静态方法调用实例方法调用 自定义 UDF(GenericUDF)1.创建项目2.创建类继承 UDF3.数据类型判断4.编写业务逻辑5.定义函数描述信息6.打包与上传7.注册 UDF 函数并测试返回复杂的数据类型 UDF 是什么? H…

数组-二维数组

本笔记为47 数组-二维数组定义方式_哔哩哔哩_bilibili的学习笔记 二维数组 定义方式 注: 常用第二种方式定义,原因:第二种方式更清晰列数可以省行数不可省 ,详见上述第四种定义方式 示例: 二维数组 数组名 作用&am…

【QT+QGIS跨平台编译】063:【qca-logger+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、qca-logger插件介绍二、QCA下载三、文件分析四、pro文件五、编译实践5.1 windows下编译5.2 linux下编译5.3 macos下编译一、qca-logger插件介绍 QCA::Logger 是 Qt Cryptographic Architecture (QCA) 库中的一个类,它提供了一个简单而灵活的日志…

PostgrerSQL基本使用与数据备份

前言 上篇了解了 PostgrerSQL 数据库的部署PostgreSQL关系型数据库介绍与部署-CSDN博客,本篇将继续就其基本操作、备份与还原内容做相关介绍。 目录 一、数据库的操作 1. 本机登录 2. 开启远程登录 2.1 开放远程端口 2.2 编辑配置文件 2.3 修改配置密码 2.…

xss.pwnfunction-Ma Spaghet!

根据代码得知 这个是根据get传参的并且是由someboby来接收参数的 所以 <script>alert(1137)</script> js并没有执行因为 HTML5中指定不执行由innerHTML插入的<script>标签 所以 ?somebody<img%20src1%20onerror"alert(1337)"> 这样就成…

PowerJob 分布式任务调度简介

目录 适用场景 设计目标 PowerJob 功能全景 任务调度 工作流 分布式计算 动态容器 什么是动态容器? 使用场景 可维护性和灵活性的完美结合 实时日志&在线运维 PowerJob 系统组件 PowerJob 应用场景 PowerJob 的优势 PowerJob&#xff08;原OhMyScheduler&…

Pytorch数据结构:GPU加速

文章目录 一、GPU加速1. 检查GPU可用性&#xff1a;2. GPU不可用需要具体查看问题3. 指定设备4.将张量和模型转移到GPU5.执行计算&#xff1a;6.将结果转移回CPU 二、转移原理1. 数据和模型的存储2. 数据传输3. 计算执行4. 设备管理5.小结 三、to方法的参数类型 一、GPU加速 .…

C#网页打印功能实现

在C# .NET Web中&#xff0c;可以通过使用JavaScript来实现点击按钮后以特定格式弹出打印窗口并进行打印。下面是一个简单的示例代码&#xff0c;演示了如何实现这个功能 <% Page Language"C#" AutoEventWireup"true" CodeBehind"Print.aspx.cs&q…

Lustre架构介绍的阅读笔记-基础知识

本文是在阅读Introduction to Lustre* Architecture的如下章节时的笔记。 Lustre – Fast, Scalable Storage for HPCLustre Scalable StorageLustre Building BlocksLustre Storage Scalability Lustre software services are implemented entirely within the Linux kernel,…

瑞_Redis_商户查询缓存_添加Redis缓存缓存更新策略

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 2.2 添加Redis缓存2.2.1 背景2.2.2 缓存模型和思路2.2.3 代码实现2.2.4 测试附&#xff1a;IDEA控制台输出自动换行设…

【动态规划】【01背包】Leetcode 416. 分割等和子集

【动态规划】【01背包】Leetcode 416. 分割等和子集 ---------------&#x1f388;&#x1f388;416. 分割等和子集 题目链接&#x1f388;&#x1f388;------------------- 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0…

前端部署报错

1.node-sass node 版本和 node-sass 版本不兼容 https://www.npmjs.com/package/node-sass POSTCSS RECEIVED UNDEFINED INSTEAD OF CSS STRING odeJSSupported node-sass versionNode ModuleNode 209.0115Node 198.0111Node 188.0108Node 177.0, <8.0102Node 166.093Node…

txt和jpg或png数据的自动化导入和自动化生成输出随用随拿

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、txt文件的自动化处理&#xff08;代码在上面链接&#xff09;二、txt文件自动化输出图片三、图片的自动化处理总结 前言 自动化导入和生成输出txt和jpg/pn…

泛型数组的赋值

ArrayList<String>[] arrayList new ArrayList[3];//不报错 ArrayList<String>[] arrayList new ArrayList<String>[3];//报错 泛型:编译期间检查&#xff0c;运行期间类型擦除 数组&#xff1a;运行期间检查 第一种情况允许的原因: 因为创建了一个未指…

Docker常用命令和高级操作

一、docker常用命令 1、安装命令 sudo apt install docker.io2、镜像管理 # 查看本地所有镜像 docker images # 移除指定镜像 docker image rm <image_name>:<tag>/<image_id># 其他命令 # dockerhub(https://hub.docker.com/)实在是太慢了 # 创建容器使用…

竞赛 交通目标检测-行人车辆检测流量计数 - 竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…