为特征工程和机器学习准备数据

发布日期:2026-07-19 09:17:06  来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 09:17:06  
0

介绍

优秀的机器学习模型通常具有高质量的特征作为模型的输入。这意味着数据准备和特征工程变得势在必行。在本指南中,读者将学习如何准备数据并为预测建模创建强大的特征。我们将从探索数据开始。

数据

在本指南中,我们将使用虚构的贷款申请人数据,其中包含 600 个观测值和 11 个变量,如下所述:

  1. Marital_status - 申请人是否已婚(“是”)或未婚(“否”)。

  2. 受抚养人 - 申请人所声称的受抚养人人数。

  3. Is_graduate - 申请人是否为毕业生(“是”)或不是(“否”)。

  4. 收入——申请人的年收入(以美元计)。

  5. Loan_amount-提交申请的贷款金额(以美元计)。

  6. Term_months – 贷款期限(以月为单位)。

  7. 信用评分 - 申请人的信用评分是良好(“满意”)还是不佳(“不满意”)。

  8. 年龄 — 申请人的年龄。

  9. 性别 - 申请人是女性 (F) 还是男性 (M)。

  10. 目的——根据申请人的贷款目的(教育、个人、旅游、商业等)。

  11. 审批状态 - 贷款申请是否已获批准(“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”,而</

以上内容来自杭州电子商务研究院推送
分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据