为特征工程和机器学习准备数据
介绍
优秀的机器学习模型通常具有高质量的特征作为模型的输入。这意味着数据准备和特征工程变得势在必行。在本指南中,读者将学习如何准备数据并为预测建模创建强大的特征。我们将从探索数据开始。
数据
在本指南中,我们将使用虚构的贷款申请人数据,其中包含 600 个观测值和 11 个变量,如下所述:
Marital_status - 申请人是否已婚(“是”)或未婚(“否”)。
受抚养人 - 申请人所声称的受抚养人人数。
Is_graduate - 申请人是否为毕业生(“是”)或不是(“否”)。
收入——申请人的年收入(以美元计)。
Loan_amount-提交申请的贷款金额(以美元计)。
Term_months – 贷款期限(以月为单位)。
信用评分 - 申请人的信用评分是良好(“满意”)还是不佳(“不满意”)。
年龄 — 申请人的年龄。
性别 - 申请人是女性 (F) 还是男性 (M)。
目的——根据申请人的贷款目的(教育、个人、旅游、商业等)。
审批状态 - 贷款申请是否已获批准(“1”)或未获批准(“0”)。这是因变量。
让我们首先加载所需的库和数据。
# Import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
加载数据
下面的第一行代码将数据读入为 pandas 数据框,而第二行打印形状 - 11 个变量的 600 个观测值。第三行打印有关变量及其类型的信息。
df = pd.read_csv("data_eng.csv")
print(df.shape)
print(df.info())
输出:
(600, 11)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 600 entries, 0 to 599
Data columns (total 11 columns):
Marital_status 600 non-null object
Dependents 593 non-null float64
Is_graduate 594 non-null object
Income 600 non-null int64
Loan_amount 592 non-null float64
Term_months 593 non-null float64
Credit_score 600 non-null object
approval_status 600 non-null int64
Age 597 non-null float64
Sex 599 non-null object
Purpose 600 non-null object
dtypes: float64(4), int64(2), object(5)
memory usage: 51.6+ KB
None
上面的输出显示有五个分类(对象)和六个数值变量 - 四个浮点数和两个整数。输出还显示,数据中的一些变量的观测值少于 600 个,这表明存在缺失值。
缺失值
大多数机器学习算法都很难处理有缺失值的数据。下面的代码行打印了不同变量中缺失值的数量。
df.apply(lambda x: sum(x.isnull()),axis=0)
输出:
Marital_status 0
Dependents 7
Is_graduate 6
Income 0
Loan_amount 8
Term_months 7
Credit_score 0
approval_status 0
Age 3
Sex 1
Purpose 0
dtype: int64
我们将根据变量类型处理缺失值。
连续变量的缺失值
处理数值变量中缺失值最常用的方法是用集中趋势度量来替换它们。下面的三行代码分别用变量“Loan_amount”、“Term_months”和“Age”中的缺失值替换这些变量的平均值。第四行打印数据中缺失值的数量。输出显示对这三个变量所做的更正。
df['Loan_amount'].fillna(df['Loan_amount'].mean(), inplace=True)
df['Term_months'].fillna(df['Term_months'].mean(), inplace=True)
df['Age'].fillna(df['Age'].mean(), inplace=True)
df.apply(lambda x: sum(x.isnull()),axis=0)
输出:
Marital_status 0
Dependents 7
Is_graduate 6
Income 0
Loan_amount 0
Term_months 0
Credit_score 0
approval_status 0
Age 0
Sex 1
Purpose 0
dtype: int64
分类变量的缺失值
其中一个分类变量“Is_graduate”有六个缺失值。由于这是一个分类变量,我们将用分布的模式替换缺失值。下面的代码行显示变量的频率计数。
df['Is_graduate'].value_counts()
输出:
Yes 466
No 128
Name: Is_graduate, dtype: int64
标签“是”在变量“Is_graduate”中具有最高频率(或众数),因此我们将用标签“是”替换缺失值。下面的第一行代码执行此任务,而第二行打印变量的分布。输出显示变量的 600 条记录,这意味着缺失值已被替换。
df['Is_graduate'].fillna('Yes',inplace=True)
df['Is_graduate'].value_counts()
输出:
Yes 472
No 128
Name: Is_graduate, dtype: int64
删除缺失的记录
变量“Is_graduate”的缺失值已被替换。但是,数据在变量“Dependents”中仍有 7 个缺失值,在变量“Sex”中仍有 1 个缺失值。
由于缺失值的数量很少,我们将学习另一种删除缺失值记录的方法。下面的第一行代码使用“dropna()”函数删除其中有任何缺失值的行,而第二行检查有关数据集的信息。输出显示所有变量都具有相同数量的观察值,并且缺失值插补已完成。
df = df.dropna()
df.info()
输出:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 592 entries, 0 to 598
Data columns (total 11 columns):
Marital_status 592 non-null object
Dependents 592 non-null float64
Is_graduate 592 non-null object
Income 592 non-null int64
Loan_amount 592 non-null float64
Term_months 592 non-null float64
Credit_score 592 non-null object
approval_status 592 non-null int64
Age 592 non-null float64
Sex 592 non-null object
Purpose 592 non-null object
dtypes: float64(4), int64(2), object(5)
memory usage: 55.5+ KB
数据中没有缺失值,我们现在可以进行特征工程部分。我们将从分类变量开始。
分类变量的特征工程
聚合类别
当分类变量具有太多唯一类别(或标签)时,可能会限制机器学习模型的预测能力。在这种情况下,限制这些标签的数量可能是一种解决方案。在我们的数据中,变量“目的”有多个类别,可以使用下面的代码行显示。
df['Purpose'].value_counts()
输出:
Education 185
Personal 164
Travel 123
Business 43
Wedding 39
Furniture 38
Name: Purpose, dtype: int64
请注意,与其他三个类别相比,“商业”、“婚礼”和“家具”类别的计数明显较低。所有这些类别在预测“approval_status”方面可能不会有统计上的显著差异。因此,我们将这三个类别汇总为一个名为“其他”的新类别。
下面前两行代码使用 Python 字典将“目的”类别的数量重新编码为较小的数字,而第三行打印得到的频率表。
purpose_categories = {'Education':'Education', 'Personal':'Personal',
'Travel':'Travel', 'Business':'other',
'Wedding':'other', 'Furniture':'other'}
df['Purpose'] = [purpose_categories[x] for x in df['Purpose']]
df['Purpose'].value_counts()
输出:
Education 185
Personal 164
Travel 123
other 120
Name: Purpose, dtype: int64
编码分类变量
对于使用 scikit-learn 建模,所有变量都应该是数字,因此我们必须更改标签。有两种常见的技术可以执行此操作。
独热编码
在这种技术中,特征使用独热(“虚拟”)编码方案进行编码。这会为每个类别创建一个二进制列,并返回一个稀疏矩阵或密集数组。
下面的第一行代码对“性别”变量执行独热编码,而第二行打印数据的前五个观察值。
df = pd.get_dummies(df, columns=['Sex'],prefix='S')
df.head(5)
输出:
| | Marital_status | Dependents | Is_graduate | Income | Loan_amount | Term_months | Credit_score | approval_status | Age | Purpose | S_F | S_M |
|--- |---------------- |------------ |------------- |-------- |------------- |------------- |------------------- |----------------- |------ |----------- |----- |----- |
| 0 | Yes | 2.0 | No | 816700 | 104000.0 | 365.079258 | Satisfactory | 0 | 55.0 | Education | 0 | 1 |
| 1 | No | 0.0 | Yes | 722300 | 79500.0 | 365.079258 | Not _satisfactory | 0 | 32.0 | Education | 1 | 0 |
| 2 | No | 0.0 | Yes | 666700 | 84000.0 | 365.079258 | Satisfactory | 0 | 59.0 | Education | 1 | 0 |
| 3 | No | 0.0 | Yes | 500000 | 63000.0 | 365.079258 | Satisfactory | 0 | 36.0 | Education | 0 | 1 |
| 4 | No | 0.0 | Yes | 409200 | 39500.0 | 504.000000 | Satisfactory | 0 | 42.0 | Education | 0 | 1 |
输出显示变量“性别”已被两个二进制变量“S_F”和“S_M”取代。但是,信息重复了,因为“女性”类别的存在自动意味着“男性”类别的缺失。这种信息重复可以通过一种称为虚拟编码的技术来考虑。
虚拟编码
在这种技术中,特征被编码,因此信息不会重复。可以通过将参数drop_first=True传递给.get_dummies函数来实现,如下面的前四行代码所示。第五行代码删除类别“S_M”,而</
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~