使用 scikit-learn 准备建模数据

发布日期:2026-07-11 11:49:04   来源 : 杭州电子商务研究院    浏览量 :9
杭州电子商务研究院 发布日期:2026-07-11 11:49:04  
9

介绍

在数据科学项目中,数据准备通常占用数据科学家 80% 的时间,这强调了其在机器学习生命周期中的重要性。

在本指南中,您将学习下面提到的几种数据准备技术的基础知识和实施:

  1. 处理错误条目
  2. 缺失值处理
  3. 编码分类标签
  4. 处理异常值
  5. 对数变换
  6. 标准化
  7. 转换列类型

数据

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

  1. 婚姻状况 - 申请人是否已婚(“1”)或未婚(“0”)。
  2. 受抚养人 - 申请人所声称的受抚养人人数。
  3. Is_graduate - 申请人是否是毕业生(“1”)或不是(“0”)。
  4. 收入——申请人的年收入(以百美元为单位)。
  5. Loan_amount-提交申请的贷款金额(以百美元为单位)。
  6. Term_months – 贷款期限(以月为单位)。
  7. Credit_score - 申请人的信用评分是良好(“1”)还是不良(“0”)。
  8. 年龄 — 申请人的年龄。
  9. 性别 - 申请人是女性 (F) 还是男性 (M)。
  10. 审批状态 - 贷款申请是否已获批准(“1”)或未获批准(“0”)。这是因变量。

让我们首先加载所需的库和模块。

      # Import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
 
# Import necessary modules
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split 
from sklearn.metrics import confusion_matrix, classification_report
    

读取数据并执行基本数据检查

下面的第一行代码将数据读入为 pandas 数据框,而第二行打印形状 - 10 个变量的 600 个观测值。第三行给出变量的汇总统计数据。

      # Load data
dat2 = pd.read_csv("data_prep.csv")
print(dat2.shape)
dat2.describe()
    

输出:

      (600, 10)
 
|   	   | Marital_status  	| Dependents    | Is_graduate 	| Income    	 	| Loan_amount   | Term_months 	| Credit_score  	| approval_status 	| Age         	|
|-------   |---------------- 	|------------   |------------- |--------------- |------------- |-------------  |-------------- |-----------------	|------------  |
| count    | 600.000000 	 	| 598.000000    | 599.000000  	| 600.000000	 	| 600.000000    | 600.00000   	| 600.000000    	| 600.000000  		| 600.000000  	|
| mean     | 0.651667   	 	| 0.730769      | 2.449082     	| 7210.720000   | 161.571667  	| 367.10000    	| 0.788333 	 | 0.686667    	 	| 51.766667     |
| std      | 0.476840   	 	| 0.997194      | 40.788143   	| 8224.445086    	| 93.467598     | 63.40892	 	| 0.408831 	 | 0.464236    	 	| 21.240704     |
| min      | 0.000000   	 	| 0.000000      | 0.000000     	| 200.000000	 | 10.000000   	| 36.00000     	| 0.000000 	 | 0.000000    	 	| 0.000000      |
| 25%      | 0.000000   	 	| 0.000000      | 1.000000     	| 3832.500000   | 111.000000  	| 384.00000    	| 1.000000 	 | 0.000000    	 	| 36.000000     |
| 50%      | 1.000000   	 	| 0.000000      | 1.000000     	| 5075.000000   | 140.000000  	| 384.00000    	| 1.000000 	 | 1.000000    	 	| 51.000000     |
| 75%      | 1.000000   	 	| 1.000000      | 1.000000     	| 7641.500000   | 180.500000  	| 384.00000    	| 1.000000 	 | 1.000000    	 	| 64.000000     |
| max      | 1.000000   	 	| 3.000000      | 999.000000  	| 108000.000000  	| 778.000000    | 504.00000   	| 1.000000 	 	| 1.000000    		| 200.000000  	|
    

处理错误条目

上面的输出显示变量“Age”的最小值和最大值分别为 0 和 200。此外,变量“Is_graduate”的最大值是 999,而不是二进制值“0”和“1”。这些条目不正确,需要更正。一种方法是删除这些记录,但相反,我们将这些记录视为缺失值,并用集中趋势的度量(即平均值、中位数或众数)替换它们。

从“Age”变量开始,下面的前两行代码将错误值“0”和“200”替换为“NaN”(缺失值指示)。我们在第三行代码中对变量“Is_graduate”重复相同的过程。第四行打印有关变量的信息。

      dat2.Age.replace(0, np.nan, inplace=True)
dat2.Age.replace(200, np.nan, inplace=True)
dat2.Is_graduate.replace(999, np.nan, inplace=True)
dat2.info()
    

输出:

      <class 'pandas.core.frame.DataFrame'>
	RangeIndex: 600 entries, 0 to 599
	Data columns (total 10 columns):
	Marital_status 	600 non-null int64
	Dependents     	598 non-null float64
	Is_graduate    	598 non-null float64
	Income         	600 non-null int64
	Loan_amount    	600 non-null int64
	Term_months    	600 non-null int64
	Credit_score   	600 non-null int64
	approval_status	600 non-null int64
	Age            	594 non-null float64
	Sex            	595 non-null object
	dtypes: float64(3), int64(6), object(1)
	memory usage: 47.0+ KB
    

现在,变量“年龄”和“Is_graduate”分别有 594 条和 598 条记录。遗漏的条目已被标记为缺失,我们将在下一节中了解这一点。

缺失值处理

处理缺失值的方法有很多种。最广泛使用的方法是用集中趋势度量来替换值。下面的第一行代码用剩余值的平均值替换“年龄”变量的缺失值。第二行用值“1”替换“Is_graduate”变量的缺失值,这表明申请人的教育状况为“研究生”。第三行给出了变量的汇总统计数据。

      dat2['Age'].fillna(dat2['Age'].mean(), inplace=True)
dat2['Is_graduate'].fillna(1,inplace=True)
dat2.describe()
    

输出:

      |   	   | Marital_status  	| Dependents    | Is_graduate 	| Income    	 	| Loan_amount   | Term_months 	| Credit_score  	| approval_status 	| Age         	|
|-------   |---------------- 	|------------   |------------- |--------------- |------------- |-------------  |-------------- |-----------------	|------------  |
| count    | 600.000000 	 	| 598.000000    | 600.000000  	| 600.000000	 	| 600.000000    | 600.00000   	| 600.000000    	| 600.000000  		| 600.000000  	|
| mean     | 0.651667   	 	| 0.730769      | 0.783333     	| 7210.720000   | 161.571667  	| 367.10000    	| 0.788333 	 | 0.686667    	 	| 50.606061     |
| std      | 0.476840   	 	| 0.997194      | 0.412317     	| 8224.445086   | 93.467598   	| 63.40892	 	| 0.408831 	 | 0.464236    	 	| 16.184651     |
| min      | 0.000000   	 	| 0.000000      | 0.000000     	| 200.000000	 | 10.000000   	| 36.00000	 	| 0.000000 	 | 0.000000    	 	| 22.000000     |
| 25%      | 0.000000   	 	| 0.000000      | 1.000000     	| 3832.500000   | 111.000000  	| 384.00000    	| 1.000000 	 | 0.000000    	 	| 36.000000     |
| 50%      | 1.000000   	 	| 0.000000      | 1.000000     	| 5075.000000   | 140.000000  	| 384.00000    	| 1.000000 	 | 1.000000    	 	| 50.606061     |
| 75%      | 1.000000   	 	| 1.000000      | 1.000000     	| 7641.500000   | 180.500000  	| 384.00000    	| 1.000000 	 | 1.000000    	 	| 64.000000     |
| max      | 1.000000   	 	| 3.000000      | 1.000000     	| 108000.000000 | 778.000000  	| 504.00000    	| 1.000000 	 | 1.000000    	 	| 80.000000     |
    

现在已经对两个变量进行了更正。数据中还有一个变量“性别”,其中有五个缺失值。由于这是一个分类变量,我们将检查标签的分布,这在下面的代码行中完成。

      dat2['Sex'].value_counts()
    

输出:

      M    484
	F    111
	Name: Sex, dtype: int64
    

输出显示 595 名申请人中有 484 名是男性,因此我们将用标签“M”替换缺失值。下面的第一行代码执行此任务,而第二行打印变量的分布。输出显示“性别”变量有 600 条记录,这意味着缺失值已被考虑在内。

      dat2['Sex'].fillna('M',inplace=True)
dat2['Sex'].value_counts()
    

输出:

      M    489
	F    111
	Name: Sex, dtype: int64
    

我们现在将检查是否还有其他变量有缺失值,这在下面的代码行中完成。输出显示变量“Dependents”中仍然有两个缺失值。

      dat2.isnull().sum()
    

输出:

      Marital_status 	0
	Dependents     	2
	Is_graduate    	0
	Income         	0
	Loan_amount    	0
	Term_months    	0
	Credit_score   	0
	approval_status	0
	Age            	0
	Sex            	0
	dtype: int64
    

由于数据集中只有两个缺失值,我们将学习另一种删除缺失值记录的方法。下面的第一行代码使用“dropna()”函数删除其中有任何缺失值的行,而第二行检查有关数据集的信息。

      dat2 = dat2.dropna()
dat2.info()
    

输出:

      <class 'pandas.core.frame.DataFrame'>
	Int64Index: 598 entries, 0 to 599
	Data columns (total 10 columns):
	Marital_status 	598 non-null int64
	Dependents     	598 non-null float64
	Is_graduate    	598 non-null float64
	Income         	598 non-null int64
	Loan_amount    	598 non-null int64
	Term_months    	598 non-null int64
	Credit_score   	598 non-null int64
	approval_status	598 non-null int64
	Age            	598 non-null float64
	Sex            	598 non-null object
	dtypes: float64(3), int64(6), object(1)
	memory usage: 51.4+ KB
    

编码分类标签

数据中已处理了缺失值,但变量“性别”中的标签使用字母(“M”和“F”)。对于使用 scikit-learn 进行建模,所有变量都应为数字,因此我们必须更改标签。由于有两个标签,我们可以进行二进制编码,这在下面的第一行代码中完成。第二行的输出显示我们已成功执行编码。

      dat2["Sex"] = dat2["Sex"].map({"M": 0, "F":1})
dat2['Sex'].value_counts()
    

输出:

      0	487
	1    111
	Name: Sex, dtype: int64
    

处理异常值

预测建模中最大的障碍之一可能是存在异常值,即与其他数据点不同的极端值。异常值通常是一个问题,因为它们会误导训练过程并导致不准确的模型。

对于数值变量,我们可以通过直方图直观地识别异常值,也可以通过偏度值以数字方式识别异常值。下面的两行代码绘制了“收入”变量的直方图以及偏度值。

      plot1 = sns.distplot(dat2["Income"], color="b", label="Skewness : %.1f"%(dat2["Income"].skew()))
plot1 = plot1.legend(loc="best")
    

输出:

直方图显示变量“收入”呈右偏分布,偏度值为 6.5。理想情况下,偏度值应介于 -1 和 1 之间。

除了变量“收入”之外,我们还有其他变量(“贷款金额”和“年龄”),它们的规模不同,需要进行规范化。我们将在后续章节中学习几种技术来处理这些预处理问题。

数值变量的对数变换

上图显示变量“收入”有偏差。使其分布呈正态分布的方法之一是通过对数变换。下面的第一行代码创建了一个新变量“LogIncome”,而第二行和第三行代码绘制了这个新变量的直方图和偏度值。

      dat2["LogIncome"] = dat2["Income"].map(lambda i: np.log(i) if i > 0 else 0)
plot2 = sns.distplot(dat2["LogIncome"], color="m", label="Skewness : %.1
以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据