使用 scikit-learn 准备建模数据
介绍
在数据科学项目中,数据准备通常占用数据科学家 80% 的时间,这强调了其在机器学习生命周期中的重要性。
在本指南中,您将学习下面提到的几种数据准备技术的基础知识和实施:
- 处理错误条目
- 缺失值处理
- 编码分类标签
- 处理异常值
- 对数变换
- 标准化
- 转换列类型
数据
在本指南中,我们将使用贷款申请人的虚构数据,其中包含 600 个观测值和 10 个变量,如下所述:
- 婚姻状况 - 申请人是否已婚(“1”)或未婚(“0”)。
- 受抚养人 - 申请人所声称的受抚养人人数。
- Is_graduate - 申请人是否是毕业生(“1”)或不是(“0”)。
- 收入——申请人的年收入(以百美元为单位)。
- Loan_amount-提交申请的贷款金额(以百美元为单位)。
- Term_months – 贷款期限(以月为单位)。
- Credit_score - 申请人的信用评分是良好(“1”)还是不良(“0”)。
- 年龄 — 申请人的年龄。
- 性别 - 申请人是女性 (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
# 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
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~