00、背景
机器学习有很多模型算法模型,比如线性回归、逻辑回归、KNN分类、支持向量机、随机森林等等,需要我们一遍又一遍地调用多个模型的拟合和预测.
有没一个可自动执行 ML 建模过程
的 Python 包?能够输出诸如准确率、精准率、召回率、F1、ROC、AUC等指标?
01、什么是LazyPredict ?
LazyPredict 旨在简化机器学习模型的比较和选择过程,适用于快速比较多个模型的性能,它适用于回归和分类任务。
另外由于它的语法与scikit-learn
几乎相同,可以轻松地从现有代码中即插即用。
主要特点
自动化模型选择:LazyPredict 可以自动地对多种流行的机器学习模型进行训练和评估,这包括从简单的线性模型到更复杂的集成模型。
简单易用:它的设计初衷是为了简化机器学习流程。用户只需几行代码就可以训练和评估多个模型,无需单独配置每个模型。
性能评估:LazyPredict 提供了一个详细的性能报告,这包括各种模型的准确率、召回率、F1 分数等重要指标。
适用于分类和回归:LazyPredict 支持分类和回归两种类型的问题,使其适用于广泛的数据科学项目。
开源:LazyPredict 是一个开源项目,这意味着社区可以贡献代码,增强其功能和性能
安装
pip install lazypredict
最简单示例
使用的数据集是经典的 iris 数据集。
# 导入所需的库
from lazypredict.Supervised import LazyClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
# 加载数据
data = load_breast_cancer()
X = data.data
y= data.target
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=.5,random_state =123)
# 初始化 LazyClassifier
clf = LazyClassifier(verbose=0,ignore_warnings=True, custom_metric=None)
# 训练模型并比较结果
models,predictions = clf.fit(X_train, X_test, y_train, y_test)
print(models)
代码解释
首先导入必要的 python 库。
然后加载 breast_cancer 数据集,并将其分为特征变量 (
X
) 和目标变量 (y
)。接着,使用 train_test_split 方法将数据划分为训练集和测试集。接下来创建一个 LazyClassifier 实例。
然后调用 LazyClassifier 实例的 fit 方法训练多个模型,并在测试集上评估它们的性能。
最后输出模型的性能报告,通常包括准确率、平衡准确率、ROC 和 AUC 分数等指标。
02、一个完整的案例分析
问题领域
梦想住房金融公司处理所有住房贷款。他们有着向所有城市、城乡结合部和农村地区提供贷款的历史。
该公司希望根据填写在线申请表时提供的客户详细信息,实现贷款资格流程(实时)自动化。这些详细信息包括性别、婚姻状况、教育程度、家属人数、收入、贷款数量、信用记录等。为了使这一过程自动化,他们提出了识别有资格获得贷款金额的客户群的问题,以便他们可以专门针对这些客户。
自动化贷款流程非常重要,因为贷款质量和贷款程序是对客户在特定公司贷款的决策产生重大影响的两个因素。
基于这些问题,作者希望创建一个可以预测客户贷款资格的系统,以便验证过程能够更加有效和高效地运行。
业务理解
问题陈述
根据上述问题,得到该项目的问题陈述,即:
需要对贷款资格分类数据集进行哪些数据准备才能构建良好的机器学习模型?
您如何选择或创建最佳的机器学习模型来预测梦想住房金融公司潜在借款人的适合性?
目标
根据上述问题陈述,得出该项目的目标,即:
进行数据准备阶段,以便所使用的数据能够很好地用来训练机器学习模型。
创建机器学习模型来预测梦想住房金融公司潜在借款人的适合性,并具有相当好的分类准确性表现。
解决方案声明
根据上述问题陈述和目标,可以实施以下几种解决方案来实现该项目的目标,即:
执行数据准备过程以确保数据已准备好用于建模。可以执行的几个阶段包括删除不需要的列、处理缺失值、更改数据类型、处理具有数字数据类型的列中的异常值、特征工程、编码分类标签、处理目标特征上的不平衡数据、分割数据以及标准化..
如何选择或创建最佳的机器学习模型将分几个阶段完成,如下:
使用
LazyPredict
比较 20 多种机器学习算法的分类案例。选择 5 种能够在训练数据上始终提供良好性能的算法。
通过超参数调整对基线 5 个模型进行改进。
评估使用混淆矩阵和分类报告训练的 5 个模型的性能。
数据理解
预测分析中使用的数据来自 Kaggle。该数据集包含每个潜在借款人在填写梦想住房金融公司在线申请时提供的详细信息。
贷款资格数据集中的变量
Loan_ID: 唯一的贷款ID。
Gender: 性别:男/女。
Married: 已婚:借款人的婚姻状况(是/否)。
Dependents: 家属:借款人的家属人数。
Education: 教育:借款人的教育状况(研究生/本科生)。
Self_Employed: 自由职业者(是/否)。
ApplicantIncome: 申请人收入:借款人的收入。
CoapplicantIncome: 共同申请人收入:借款人的共同申请人收入。
LoanAmount: 贷款金额(以千为单位)。
Loan_Amount_Term: 贷款期限(以月为单位)。
Credit_History: 信用记录符合准则 {1:'Good', 0:'Bad'}。
Property_Area: 城市/半城市/农村。
Loan_Status: 贷款状态(是/否)。
描述性统计
表 1. 描述性统计数据数值
ApplicantIncome | CoapplicantIncome | LoanAmount | Loan_Amount_Term | Credit_History | |
---|---|---|---|---|---|
count | 614.00 | 614.00 | 592.00 | 600.00 | 564.00 |
mean | 5403.46 | 1621.25 | 146.41 | 342.00 | 0.84 |
std | 6109.04 | 2926.25 | 85.59 | 65.12 | 0.36 |
min | 150.00 | 0.00 | 9.00 | 12.00 | 0.00 |
25% | 2877.50 | 0.00 | 100.00 | 360.00 | 1.00 |
50% | 3812.50 | 1188.50 | 128.00 | 360.00 | 1.00 |
75% | 5795.00 | 2297.25 | 168.00 | 360.00 | 1.00 |
max | 81000.00 | 41667.00 | 700.00 | 480.00 | 1.00 |
表 2. 描述性统计数据分类
Loan_ID | Gender | Married | Dependents | Education | Self_Employed | Property_Area | Loan_Status | |
---|---|---|---|---|---|---|---|---|
count | 614 | 601 | 611 | 599 | 614 | 582 | 614 | 614 |
unique | 614 | 2 | 2 | 4 | 2 | 2 | 3 | 2 |
top | LP001002 | Male | Yes | 0 | Graduate | No | Semiurban | Y |
freq | 1 | 489 | 398 | 345 | 480 | 500 | 233 | 422 |
根据上面的表1和表2,可以从描述性统计阶段获得的一些信息是:
该数据集由 614 行和 13 列组成(5 列为数值数据类型,8 列为对象数据类型)。
某些具有指定数字数据类型的列存在异常值。
有几个列缺少值,即“Gender”、“Married”、“Dependents”、“Self_Employed”、“LoanAmount”和“Credit_History”列。因此,需要有一个处理缺失值的过程。
数据集中没有重复的数据。
有几列最好将数据类型更改为整数,即“CoapplicantIncome”、“LoanAmount”、“Loan_Amount_Term”和“Credit_History”列。
在建模之前,可以删除“Loan_ID”列,因为不需要它。
单变量分析
count = df2['Loan_Status'].value_counts()
percentage = 100*df2['Loan_Status'].value_counts(normalize=True)
df2_col = pd.DataFrame({'数值':count, '百分比':round(percentage,2)})
print(df2_col)
sns.countplot(x='Loan_Status', data=df2, palette='ocean')
for i, v in enumerate(count):
plt.text(i-0.05, v+10, str(v), fontweight='bold')
plt.ylim(ymax=500)
plt.title('“Loan_Status”列的计数图', pad=20, fontsize=20)
plt.gcf().set_size_inches(10,5)
plt.show()
图 1.“Loan_Status”列的计数图
#数值数据类型列的直方图
fig, ax = plt.subplots(3, 1, figsize=(10, 12))
sns.histplot(data=df, x='ApplicantIncome', kde=True, ax=ax[0], color='darkblue')
sns.histplot(data=df, x='CoapplicantIncome', kde=True, ax=ax[1], color='green')
sns.histplot(data=df, x='LoanAmount', kde=True, ax=ax[2], color='orange')
plt.show()
图 2. 数值数据类型列的直方图
#具有数字数据类型的列的箱线图
fig, ax = plt.subplots(3, 1, figsize=(10, 12))
sns.boxplot(x=df['ApplicantIncome'], ax=ax[0], color='darkblue')
sns.boxplot(x=df['CoapplicantIncome'], ax=ax[1], color='green')
sns.boxplot(x=df['LoanAmount'], ax=ax[2], color='orange')
plt.show()
图 3. 具有数字数据类型的列的箱线图
根据上面的图1、图2和图3,可以从单变量分析阶段获得的一些信息是:
一般来说,对于具有分类数据类型的列,几乎所有列都具有主导类别,如百分比 > 50% 所示。具体来说,对于“Loan_Status”列,类别比较为69:31(不平衡),这意味着需要进行特殊处理,以便以后创建的模型不会有过度预测某些类别的倾向。
数字数据类型的列(即“ApplicantIncome”、“CoapplicantIncome”和“LoanAmount”列)中存在异常值。随后,在数据准备阶段将进行异常值处理过程。
多变量分析
df_num = df[['ApplicantIncome', 'CoapplicantIncome', 'LoanAmount']]
#查看具有数字数据类型的多列的分布
sns.pairplot(df_num, diag_kind='kde')
plt.gcf().set_size_inches(10,10)
plt.show()
#melihat banyaknya status pengajuan pinjaman berdasarkan riwayat kredit peminjam
# x: x轴上的条形图,以x标签划分统计个数
# y: y轴上的条形图,以y标签划分统计个数
# hue: 在x或y标签划分的同时,再以hue标签划分统计个数
plt.figure(figsize=(12,7))
sns.countplot(x='Credit_History', data=df2, hue='Loan_Status', palette='ocean')
plt.title('基于借款人的信用记录、贷款状态的条形图',
pad=20, fontsize=20)
plt.show()
图 4. 基于贷款信用历史记录的多种贷款状态的条形图
plt.figure(figsize=(12,7))
sns.heatmap(data=df.corr(), annot=True, cmap='Reds')
plt.show()
根据上面的图4和图5,可以从多变量分析阶段获得的一些信息是:
具有不良历史的借款人的贷款申请往往会被拒绝。由于借款人历史记录中的缺失值主要由收到贷款的人主导,因此稍后这些缺失值将用值 1(Good)填充。
“LoanAmount”和“ApplicantIncome”列之间存在关联。
数据准备
以下是数据准备中使用的一些技术:
处理缺失值:有几个列缺少值,即“性别”、“已婚”、“家属”、“自营职业”、“贷款金额”和“信贷历史记录”列。具有分类数据类型的列将填充该列中最常出现的值,而具有数字数据类型的列将填充中值,以避免由于异常值而产生偏差。
更改数据类型:最好将数据类型更改为整数的一些列是“CoapplicantIncome”、“LoanAmount”和“Credit_History”列。
处理异常值:异常值可以在“ApplicantIncome”、“CoapplicantIncome”和“LoanAmount”列中找到。必须解决这个问题,因为异常值的存在会使所构建的模型性能较差。处理过程将使用四分位距法和以下公式进行。
特征工程:经过处理异常值的过程后,发现数值列中的数据分布仍然倾向于向某个方向倾斜。将要进行的特征工程过程是使用某些函数进行数据转换,目的是减少倾斜并使数据分布看起来更正常。
编码分类标签:要构建的模型不能接受分类类型的数据。因此,需要执行此过程,将一列的类别分解为多个值为 0 或 1 的单独列。
处理不平衡数据: “Loan_Status”列中的类别比例为 69:31(不平衡),这意味着需要进行特殊处理,以便以后创建的模型不会有过度预测某些类别的倾向。该处理过程将使用 SMOTE 方法进行。
数据分割:这是将数据集分为训练数据和测试数据的过程。稍后将训练训练数据以构建模型,而测试数据将用于测试模型对新数据的泛化程度。
数据标准化:执行此过程是为了缩放数字列中的数据。将使用的函数是 StandardScaler()。此函数会将分布中的每个值映射到正态分布中的值。
建模
在此阶段,将使用 LazyPredict 方法对 20 多种机器学习算法的分类案例进行比较。然后将选择 5 种在训练数据上始终提供良好性能的算法。接下来,将通过超参数调整来改进几个基线模型,目的是让研究人员知道可用于模型的最佳参数。
#import library yang dibutuhkan
import lazypredict
from lazypredict.Supervised import LazyClassifier
clf = LazyClassifier(verbose=0, ignore_warnings=True, custom_metric=None)
models, predictions = clf.fit(X_train, X_test, y_train, y_test)
models
表 3. LazyPredict 结果(第 5 次训练)
Model | Accuracy | Balanced Accuracy | ROC AUC | F1 Score | Time Taken |
---|---|---|---|---|---|
LinearSVC | 0.85 | 0.85 | 0.85 | 0.85 | 0.04 |
CalibratedClassifierCV | 0.85 | 0.84 | 0.84 | 0.85 | 0.12 |
KNeighborsClassifier | 0.85 | 0.84 | 0.84 | 0.85 | 0.09 |
SVC | 0.85 | 0.84 | 0.84 | 0.84 | 0.03 |
NuSVC | 0.84 | 0.84 | 0.84 | 0.84 | 0.04 |
RandomForestClassifier | 0.83 | 0.83 | 0.83 | 0.83 | 0.22 |
RidgeClassifier | 0.83 | 0.83 | 0.83 | 0.83 | 0.02 |
LinearDiscriminantAnalysis | 0.83 | 0.83 | 0.83 | 0.83 | 0.02 |
LGBMClassifier | 0.83 | 0.83 | 0.83 | 0.83 | 0.08 |
ExtraTreesClassifier | 0.83 | 0.83 | 0.83 | 0.83 | 0.14 |
LogisticRegression | 0.83 | 0.82 | 0.82 | 0.83 | 0.02 |
XGBClassifier | 0.82 | 0.82 | 0.82 | 0.82 | 0.08 |
RidgeClassifierCV | 0.83 | 0.82 | 0.82 | 0.83 | 0.02 |
AdaBoostClassifier | 0.82 | 0.82 | 0.82 | 0.82 | 0.10 |
NearestCentroid | 0.81 | 0.80 | 0.80 | 0.80 | 0.02 |
BernoulliNB | 0.81 | 0.80 | 0.80 | 0.80 | 0.01 |
BaggingClassifier | 0.80 | 0.80 | 0.80 | 0.80 | 0.03 |
DecisionTreeClassifier | 0.80 | 0.80 | 0.80 | 0.80 | 0.02 |
LabelSpreading | 0.79 | 0.79 | 0.79 | 0.79 | 0.04 |
LabelPropagation | 0.79 | 0.79 | 0.79 | 0.79 | 0.03 |
Perceptron | 0.79 | 0.79 | 0.79 | 0.79 | 0.01 |
PassiveAggressiveClassifier | 0.78 | 0.78 | 0.78 | 0.78 | 0.01 |
ExtraTreeClassifier | 0.76 | 0.76 | 0.76 | 0.76 | 0.01 |
SGDClassifier | 0.73 | 0.73 | 0.73 | 0.73 | 0.02 |
QuadraticDiscriminantAnalysis | 0.69 | 0.70 | 0.70 | 0.68 | 0.01 |
GaussianNB | 0.50 | 0.53 | 0.53 | 0.37 | 0.01 |
DummyClassifier | 0.48 | 0.50 | 0.50 | 0.31 | 0.01 |
以下是在训练数据上始终提供良好性能的 5 个模型。
CalibratedClassifierCV 校准分类器CV
SVC
LogisticRegression 逻辑回归
RandomForestClassifier 随机森林分类器
LinearSVC 线性SVC
CalibratedClassifierCV
CaliberatedClassifierCV 使用交叉验证方法来确保始终使用无偏数据来匹配校准器。
数据被分为 k (train_set, test_set) 对(由 cv 确定)。
当 ensemble=True(默认)时,对于每个交叉验证分割独立地重复以下过程:
首先在训练子集上训练 base_estimator 的克隆。
然后,使用其对测试子集的预测来匹配校准器(S形回归器或等渗回归器)。
这会产生 k 对(分类器、校准器)的集合,其中每个校准器将相应分类器的输出映射到 [0, 1]。
每对都在 caliblated_classifiers_ 属性中公开,其中每个条目都是使用生成校准概率的 Predict_proba 方法校准的分类器。
CalibrateClassifierCV 主实例的 Predict_proba 输出对应于 caliblated_classifiers_ 列表中 k 个估计器的平均预测概率。
预测的输出是概率最高的类别。
SVC
SVM 分类器的工作原理是创建一个决策边界或一个能够分隔两个或多个类的字段。方案:
首先,SVM 寻找每个类别的支持向量。支持向量是每个类别中与其他类别的样本距离最近的样本。
一旦找到支持向量,SVM 就会计算边际。
我们可以将边距视为分隔两个类的路径。
边距是基于支持向量创建的,其中支持向量充当道路边缘边界,或者我们通常所说的路肩。
SVM 寻找可以分隔两个类的最大边距或最宽路径。
找到最宽的道路后,然后根据该道路绘制决策边界。
决策边界是将道路或边缘划分为两个相等部分的线。
在非线性数据中,SVM算法计算的决策边界不是直线。
尽管在这种情况下确定决策边界相当复杂,但我们也获得了能够从每个分散的数据点捕获更复杂关系的优势。
对于非线性数据,支持向量分类器使用一种方法,即“核技巧”,使得数据可以线性分离。
核技巧是一种将某些维度(例如 2D)的数据更改为更高维度(3D)的方法,以便可以生成最佳超平面。
下面是内核技巧如何工作的说明。
图 6. 内核技巧说明
LogisticRegression 逻辑回归
Logistic回归,也称为logit回归、最大熵分类和对数线性分类,是一种常用的分类方法。在分类的情况下,逻辑回归通过计算样本的类别概率来工作。
顾名思义,逻辑回归使用如下逻辑函数来计算样本的类别概率。在预测分析的情况下,如果潜在借款人的资格被接受的概率为 82%,则该潜在借款人将被纳入贷款申请被接受的人群中。那么,如果潜在借款人的资格概率<50%,那么潜在借款人就属于贷款申请被拒绝的人群。
图 7. Logistic 函数图
RandomForestClassifier
随机森林是 bagging 方法的扩展,因为它使用 bagging 和随机特征来创建不相关的决策树。特征随机性,也称为特征装袋,生成特征的随机子集,这确保了决策树之间的低相关性。这是决策树和随机森林之间的主要区别。换句话说,决策树考虑所有可能的特征分割,而随机森林仅选择这些特征的子集。
图 8. 随机森林的图示
随机森林的优点:
产生较低的错误。
在分类中给出了良好的结果。
可以有效地处理大量的训练数据。
可以估计哪些变量在分类中很重要。
提供检测变量相互作用的实验方法。
随机森林的缺点:
处理时间很长,因为它使用大量数据,并且由于使用单个处理器而构建很多树模型以形成随机树。
解释很困难,需要对数据进行精确的调整模式。
当用于回归时,它们无法预测实验数据范围之外的情况,可能会将数据过度拟合到噪声数据集。
LinearSVC
LinearSVC(支持向量分类器)的目标是对给定的数据进行训练,然后返回“最适合”的超平面来对该数据进行划分或分类。在基本概念上,LinearSVC 与 SVC 类似。两者之间的区别包括 LinearSVC 使用“直线”进行线性分类,而 SVC 允许我们选择各种非线性内核。
以下是训练上述 5 个模型的准确率结果。
表 4. 训练和测试模型准确性
Model | 训练精准度 | 测试精准度 |
---|---|---|
CalibratedClassifierCV | 0.84 | 0.83 |
SVC | 0.97 | 0.87 |
LogisticRegression | 0.84 | 0.83 |
RandomForestClassifier | 0.96 | 0.83 |
LinearSVC | 0.84 | 0.85 |
评估
预测分析中使用的模型是分类类型模型。因此,将使用的评估指标是混淆矩阵和分类报告。
混淆矩阵
混淆矩阵是一种评估方法,可用于计算分类过程的性能或正确程度。混淆矩阵是一个包含 4 种不同的预测值和实际值组合的表格。
混淆矩阵中有四个表示分类过程结果的术语,即真阳性(TP)、真阴性(TN)、假阳性(FP)和假阴性(FN)。
以下是混淆矩阵表。
图 9. 具有 2 个类别的目标的混淆矩阵
信息 :
如果模型预测借款人属于值得获得贷款的类别(Positive),并且借款人的实际情况确实值得获得贷款(Positive),则出现TP(True Positive)。
如果模型预测借款人属于不值得获得贷款的类别(Negative),但借款人的实际情况值得获得贷款(Positive),则会出现 FN(False Negative)。
如果模型预测借款人属于值得获得贷款的类别(Positive),但借款人的实际情况不值得获得贷款(Negative),就会出现 FP(False Positive)。
如果模型预测借款人属于不值得贷款的类别(Negative),而借款人的实际情况确实不值得贷款(Negative),就会出现TN(True Negative) )。
以下是已训练的 5 个模型的混淆矩阵。
Confusion Matrix Model CalibratedClassifierCV:
[[ 77 28]
[ 9 107]]
Confusion Matrix Model SVC:
[[ 84 21]
[ 8 108]]
Confusion Matrix Model LogisticRegression:
[[ 77 28]
[ 9 107]]
Confusion Matrix Model RandomForestClassifier:
[[87 18]
[19 97]]
Confusion Matrix Model LinearSVC:
[[ 77 28]
[ 6 110]]
分类报告
基于混淆矩阵,以下是几个可以测量的指标。
准确率
精确率
召回率
F1 值
以下是已训练的5个模型的分类报告。
#为每个模型创建分类报告
cr_CCCV = classification_report(y_test, y_pred_CCCV)
cr_SVC = classification_report(y_test, y_pred_SVC_new)
cr_LogReg = classification_report(y_test, y_pred_LogReg_new)
cr_RFC = classification_report(y_test, y_pred_RFC_new)
cr_LSVC = classification_report(y_test, y_pred_LSVC)
print('Classification Report Model CalibratedClassifierCV:\n', cr_CCCV)
print('\nClassification Report Model SVC:\n', cr_SVC)
print('\nClassification Report Model LogisticRegression:\n', cr_LogReg)
print('\nClassification Report Model RandomForestClassifier:\n', cr_RFC)
print('\nClassification Report Model LinearSVC:\n', cr_LSVC)
输出结果:
Classification Report Model CalibratedClassifierCV:
precision recall f1-score support
0 0.90 0.73 0.81 105
1 0.79 0.92 0.85 116
accuracy 0.83 221
macro avg 0.84 0.83 0.83 221
weighted avg 0.84 0.83 0.83 221
Classification Report Model SVC:
precision recall f1-score support
0 0.91 0.80 0.85 105
1 0.84 0.93 0.88 116
accuracy 0.87 221
macro avg 0.88 0.87 0.87 221
weighted avg 0.87 0.87 0.87 221
Classification Report Model LogisticRegression:
precision recall f1-score support
0 0.90 0.73 0.81 105
1 0.79 0.92 0.85 116
accuracy 0.83 221
macro avg 0.84 0.83 0.83 221
weighted avg 0.84 0.83 0.83 221
Classification Report Model RandomForestClassifier:
precision recall f1-score support
0 0.82 0.83 0.82 105
1 0.84 0.84 0.84 116
accuracy 0.83 221
macro avg 0.83 0.83 0.83 221
weighted avg 0.83 0.83 0.83 221
Classification Report Model LinearSVC:
precision recall f1-score support
0 0.93 0.73 0.82 105
1 0.80 0.95 0.87 116
accuracy 0.85 221
macro avg 0.86 0.84 0.84 221
weighted avg 0.86 0.85 0.84 221
在预测分析的情况下,除了正在构建的模型预计能够提供借款人资格分类的真实预测之外,如果模型错误的位置更多地处于假阴性(FN)而不是假则更容易被接受阳性(FP)。这是因为,如果我们从商业角度来看,最好拒绝真正值得的潜在借款人(研究人员可以对模型进行进一步改进),而不是向实际上不值得的潜在借款人提供贷款。贷款。
从本案例的分析和机器学习建模结果得出的结论是,梦想住房金融公司用于预测潜在借款人适合性的模型是采用 RandomForestClassifier
算法的模型。该模型具有相当好的分类准确率性能。然而,尽管如此,仍然需要进一步改进以最小化 FP(假阳性)类型的分类错误。