1.1 数据集描述
1.2 读取数据集
描述
首先,我们需要读取数据。并查看数据的前5行信息。查看数据可以了解各个字段取值的具体情况,字段的名称等等,对数据有一个基础的了解。使用Pandas中的read_csv()函数可以读取csv文件,结果会保存为一个DataFrame或Series对象,调用使用DataFrame或Series对象的head()方法查看可以查看前n行数据,默认为5。
read_csv()函数部分常见参数详解:
- filepath_or_buffer:文件所在处的路径(相对路径或绝对路径)
- sep:指定分隔符,默认为逗号
- header:指定行数用来作为列名,默认设置为0(即第一行作为列名)
- index_col :指定哪列数据作为行索引,可以是一列,也可以多列
以路径C:\data\sample.csv为例:
- 绝对路径:文件在硬盘上真正存在的路径,如:C:\data\sample.csv
- 相对路径:相对于自己当前文件所处目录的位置,sample.csv
任务步骤
- 请使用Pandas中的read_csv()函数读入数据,数据文件名称为credit.csv ,使用相对路径进行读取,将结果保存在变量credit中。
- 请查看数据的前5行,将结果保存在变量credit_5中。
import pandas as pd
#读取数据
credit = pd.read_csv('credit.csv')
#查看前5行
credit_5 = credit.head()
print(credit_5)
1.3 查看数据基本情况
描述
本节中,我们将查看数据集的基本信息,进一步了解数据的基本情况。DataFrame对象的info()方法用于打印DataFrame对象的摘要,包括列的数据类型dtype、名称以及有无缺失值,数据框的维度以及占用的内存等信息。
info()方法的参数:
- verbose:是否显示所有列的信息,若为False,则会省略一部分
- memory_usage:是否查看DataFrame的内存使用情况,默认为True
- null_counts:是否统计NaN值的个数,默认为True
任务步骤
- 调用info()方法来查看DataFrame对象credit的基本信息,将结果保存在credit_info中。
import pandas as pd
#查看数据的基本信息
credit_info = credit.info()
1.4 查看数据基本统计信息
描述
本节中,我们将查看数据的基本统计信息。DataFrame对象的describe()方法可以查看各个列的基本统计信息,describe()方法将输出一个DataFrame对象,对于object类型的列,会输出样本数量count,不同取值个数unique,众数top以及众数的频数freq,对于int或float类型的列,会输出均值mean,方差std,最小值min,下四分位数25%,中位数50%,上四分位数75%,最大值max等信息。
describe()方法参数:
- percentiles:结果返回的百分位数,默认值为[.25,.5,.75],即25%、50%和75%分位数,可以传入一个列表进行指定,如[.3,.5,.8]将返回30%、50%和80%分位数
- include:返回的结果包含哪些列,默认只返回int或float类型的列的统计量;指定为‘all’,返回所有列的统计量,指定为‘O’,返回object类型的列的统计量
- exclude:返回结果要排除哪些列,默认情况下, 不排除任何列
任务步骤
- 请用describe()方法查看DataFrame对象credit的基本统计信息,设置include=‘all’,将结果保存在credit_desc中。
import pandas as pd
#查看数据基本统计信息
credit_desc = credit.describe(include='all')
print(credit_desc)
2.2 违约与未违约数量柱状图
描述
本项目中,字段default表示是否违约,也是建模的目标,违约人数与未违约人数的分布比例对风控模型的构建至关重要。下面使用Seaborn中的countplot()函数绘制柱状图,展示违约与未违约人数的分布情况,参考样图如图1所示。
Seaborn中的countplot()函数主要参数如下:
- x:在x轴方向指定绘图的字段,即绘制柱状图,不能与y同时使用
- y:在y轴方向指定绘图的字段,即绘制条形图,不能与x同时使用
- hue:按照指定的字段进行分组
- data:传入DataFrame对象,用于绘图的数据框
- color:设置颜色
- palette:使用不同调色板
- ax:指定子图索引
任务步骤
- 调用Seaborn库中的countplot()函数绘制柱状图,查看违约与未违约人数的分布情况,设置x为default,data为credit。
import matplotlib.pyplot as plt
import seaborn as sns
fig = plt.figure(figsize=(7,5))
#绘制柱状图,查看违约与未违约的取值分布情况
sns.countplot(x='default',data=credit,palette='Set3')
plt.xlabel('是否违约',fontsize=10)
plt.ylabel('数量',fontsize=10)
plt.title('违约与未违约数量柱状图',fontsize=13)
plt.box(False)
2.3 贷款持续时间违约率条形图
描述
本节中,我们分析贷款持续时间months_loan_duration与是否违约的关系。由于贷款持续时间的取值较多,因此我们将贷款持续时间进行等距离散化,计算离散化后各个组的违约率,绘制条形图进行展示,参考样图如图1。
Pandas中的cut()函数可以进行等距离散化,主要参数有:
- x:需要离散化的数据对象,可以传入列表、一维NumPy数组或Series对象
- bins:输入整数,表示将x划分为多少个等距的区间,输入序列,表示将x按照指定区间进行离散化,列表中的元素表示分点,若不在区间范围内的数据,则表示为Nan
- right: 是否包含右分点
- labels:是否用标签来代替返回的值
- include_lowest:是否包含左分点
Seaborn的barplot()函数可以绘制条形图,主要参数有:
- x:x轴数据,柱状图时为标签名称,条形图时为数值
- y:y轴数据,柱状图时为数值,条形图时为标签名称
- hue:按照指定的字段进行分组
- data:传入DataFrame对象,用于绘图的数据框
- color:设置颜色
- palette:使用不同调色板
- ax:指定子图索引
任务步骤
- 使用Pandas库中的cut()函数将贷款持续时间months_loan_duration,按照给定的bins(保存在months中)进行等距离散化,将结果保存在months_cut中。
- 调用credit对象的groupby()方法,按照months_cut对数据进行分组。并计算各个分组的违约率,将结果保存在months_rata中。
- 调用Seaborn的barplot()函数绘制条形图,x轴为months_rate.values,y轴为months_rate.index,palette=“Set2”。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
months = (0,6,12,18,24,30,36,42,48,54,72)
#对'months_loan_duration'进行分组
months_cut = pd.cut(x=credit.months_loan_duration,bins=months)
#计算各个分组的违约率
months_rate = credit.groupby(months_cut)['default'].sum()/credit.groupby(months_cut)['default'].count()
#将各个分组的违约率绘制条形图进行展示
fig = plt.figure(figsize=(7,5))
sns.barplot(x=months_rate.values,y=months_rate.index,palette="Set2")
plt.xlabel('违约率',fontsize=10)
plt.ylabel('贷款持续时间',fontsize=10)
plt.title('贷款持续时间违约率条形图',fontsize=13)
plt.box(False)
2.4 违约与未违约贷款金额分布分组条形图
描述
本节中,我们分析贷款金额amount与是否违约的关系。由于贷款金额的取值较多,因此我们将贷款金额进行等距离散化,统计离散化后各个组违约与未违约人数的分布,绘制条形图进行展示。
任务步骤
- 将贷款额度amount使用Pandas库中的cut()函数,按照interval进行分组,将分组结果存放在amount_cut中。
- 调用Seaborn库中的countplot()函数绘制条形图,查看贷款金额按照default标签分类后的分布情况。y轴为amount_cut。设置参数hue=‘default’,data=credit。设置palette=‘Set2’。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
interval = (0,2000, 4000, 6000,8000,10000,12000,14000,16000,20000)
#对amount进行分组
amount_cut = pd.cut(x=credit.amount,bins=interval)
#绘制柱状图
fig = plt.figure(figsize=(7,5))
sns.countplot(y=amount_cut,hue='default',data=credit,palette='Set2')
plt.xlabel('数量',fontsize=10)
plt.ylabel('贷款金额',fontsize=10)
plt.title('违约与未违约贷款金额分布分组条形图',fontsize=13)
plt.box(False)
2.5 信用记录违约率条形图
描述
本节中,我们分析信用记录credit_history与是否违约的关系。将信用记录credit_history进行分组,并计算各个分组的违约率绘制条形图进行展示。
任务步骤
- 数据credit利用groupby()函数对信用记录credit_history进行分组,并计算各个分组的违约率。将结果存放在credit_history_rate中。
- 调用Seaborn库中的barplot()函数将违约率绘制条形图进行展示。x轴为credit_history_rate.values,y轴为credit_history_rate.index,palette=“Set3”。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
#分组,并计算违约率
credit_history_rate = credit.groupby(['credit_history'])['default'].sum()/credit.groupby(['credit_history'])['default'].count()
#绘制条形图
fig = plt.figure(figsize=(7,5))
sns.barplot(x=credit_history_rate.values,y=credit_history_rate.index,palette="Set3")
plt.xlabel('违约率',fontsize=10)
plt.ylabel('信用记录',fontsize=10)
plt.title('信用记录违约率条形图',fontsize=13)
plt.box(False)
也可以使用lambda函数
#分组,并计算违约率
credit_history_rate = credit.groupby(['credit_history']).apply(lambda x: x['default'].sum()/x['default'].count())
2.7 连续型特征与目标特征相关性
描述
在前面的环节中,我们进行了一系列的可视化分析,在本节中,我们计算探索连续型特征与建模目标特征之间的相关性。建模目标特征是离散型,常用的衡量连续型和离散型特征相关性的方法是方差分析(ANOVA)。
Sklearn中的SelectKBest()方法可用于特征选择,根据给定的方法,选择出前k个与目标最相关的特征,其主要参数如下:
- score_func:用于计算相关性的函数,函数接受两个数组X和y,并返回一对数组(scores,pvalues)或带scores的单个数组,scores表示得分,得分越高相关性越强,pvalues表示检验的P值,值越小表示相关性越强,默认值为f_classif,表示计算方差分析的F值,其它取值如下:
1.f_regression:计算相关系数的F值,适用于连续型与连续型的相关性计算
2.chi2:计算卡方统计量,适用于离散型与离散型的相关性计算
3.mutual_info_classif:离散型与离散型的互信息计算
4.mutual_info_regression:连续型与连续型的互信息计算 - k:需要选择的最佳特征个数,默认值为10。
- SelectKBest()方法调用fit()方法,传入X和y两组特征,计算它们之间的相关性,调用SelectKBest()方法的scores_属性得到相关性得分,调用pvalues_属性得到检验的P值
使用f-classif查看连续型特征与目标特征相关性,并将相关性得分用条形图进行展示。连续型特征的名称已保存在feature_int中。
任务步骤
- 定义SelectKBest对象,设置参数score_func为f_classif,k为len(feature_int),保存在selector`中。
- 调用selector的fit()方法,分别传入连续型特征和目标特征的值,计算相关性。
- 调用Seaborn库中的barplot()函数将相关性得分绘制成条形图进行展示。
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
feature_int = credit.dtypes[credit.dtypes=='int64'].index[:-1]
#定义SelectKBest对象
selector = SelectKBest(score_func=f_classif,k=len(feature_int))
#使用fit进行训练
selector.fit(credit[feature_int],credit['default'])
#将相关性大小绘制条形图
fig = plt.figure(figsize=(7,5))
sns.barplot(x=selector.scores_,y=feature_int,palette="Set3")
plt.xlabel('相关性',fontsize=10)
plt.ylabel('连续型字段',fontsize=10)
plt.title('连续型字段与标签相关性柱状图',fontsize=13)
plt.box(False)
2.8 离散型特征与目标特征相关性
描述
前面我们已经对SelectKBest的基本使用有了一定了解,下面使用chi2卡方检验查看离散型变量与目标之间的相关性,并将相关性大小绘制条形图进行展示。
另外,数据中离散型特征的取值很多仍然为中文,在计算相关性之前,需要将这些值进行数字编码,将中文类别映射为对应的数字。例如,foreign_worker有两个值yes和no,经过数字编码之后yes变为1,no变为0。
任务步骤
- 定义SelectKBest对象,设置参数score_func为chi2,k为len(feature_obj),保存在selector中。
- 调用selector的fit方法,分别传入离散型特征和目标特征的值,计算相关性。
- 调用Seaborn库中的barplot()函数将相关性得分绘制成条形图进行展示。
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#得到离散型特征列名
feature_obj = credit.dtypes[credit.dtypes=='object'].index
#数字编码
for col in feature_obj:
credit.loc[:,col] = LabelEncoder().fit_transform(credit[col])
#定义SelectKBest对象
selector=SelectKBest(score_func=chi2,k=len(feature_obj))
#使用fit进行训练
selector.fit(credit[feature_obj],credit['default'])
#将相关性大小绘制条形图
fig = plt.figure(figsize=(7,5))
sns.barplot(x=selector.scores_,y=feature_obj,palette="Set2")
plt.xlabel('相关性',fontsize=10)
plt.ylabel('离散型字段',fontsize=10)
plt.title('离散型字段与标签相关性柱状图',fontsize=13)
plt.box(False)
3.2 训练集测试集划分
描述
本节中,我们把数据划分为训练集和测试集,训练集用于训练模型,测试集用于评估模型性能。在Sklearn中的model_selection模块,train_test_split()函数可以进行训练集和测试集的划分。
函数语法为:
train_test_split(X, y, test_size=None, random_state=None,stratify=y)
其中:
- X,y:分别为预测所需的所有特征以及需要预测的特征(即违约情况default)。
- test_size:测试集比例,例如test_size=0.25表示划分25%的数据作为测试集。
- random_state:随机种子,因为划分过程是随机的,为了每次划分都得到相同的训练集和测试集,需要设置一个随机种子数,使结果重现。
- stratify:使用分层采样,保证训练集和测试集中违约和未违约客户的比例相同,并且与总体数据中的比例保持一致。
函数最终将返回四个值,分别为训练集特征、测试集特征、训练集标签和测试集标签。
任务步骤
- 预测所需的所有特征保存在X中,需要预测的特征,即违约情况default,保存在y中,请使用train_test_split()函数进行训练集测试集划分,其中测试集比例为0.25,随机种子random_state设定为10。分层参数stratify设置为y,即按default进行分层,返回的值依次命名为X_train,X_test,y_train和y_test。
from sklearn.model_selection import train_test_split
y = credit['default'].values
X = credit.drop('default',axis=1)
#训练集测试集划分
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25,random_state=10,stratify=y)
print(X_train.shape)
print(X_test.shape)
3.3 标准化和数值编码
描述
1 标准化
由于在下节中,我们将要构建逻辑回归模型,并且默认会添加L2正则化项,所以系数的大小会影响优化效果,所以在本节中,我们需要首先对连续型数据进行标准化。
在Sklearn的preprocessing模块中,StandardScaler()类可以对连续型数据进行Z-socre标准化,可调用的主要方法有:
- fit: 用于计算训练数据的均值和方差,后面用均值和方差来转换数据。
- transform: 按照保存的均值和方差转换数据。
- fit_transform: 不仅计算训练数据的均值和方差,还会基于计算出来的均值和方差来转换数据。
2 One-Hot编码
在建模之前,对于离散型特征,首先需要将字符映射为数字,但数字编码会给离散型特征引入原本不存在的次序关系,会使得距离计算变得不合理。为了解决这个问题,我们采用One-Hot编码来消除这种次序关系。One-Hot编码将包含K个取值的离散型字段转换成K个取值为0或1的二元特征。由于下一节会建立逻辑回归模型,为保证系数的大小也可以反映不同特征对目标的影响程度,需要对离散特征进行One-Hot编码,消除数字编码带来的次序关系。
Pandas中的get_dummies()函数可以进行One-Hot编码,主要参数如下:
- data:输入的数据,Series或DataFrame对象。
- prefix:One-Hot编码后,新特征列名的前缀,默认为None。
- prefix_sep:新特征列名的中间的分隔符,默认为’_'。
- columns:指定需要实现One-Hot编码的列名。
- drop_first:去除第一个二元特征,K个取值转换成K-1个二元特征,相当于进行哑编码。
任务步骤
标准化:
- 训练数据和测试数据分别保存在X_train和X_test中,请使用StandardScaler()新建一个对象,命名为scaler。
- 使用scaler.fit_transform计算训练数据的连续型特征的均值和方差并转换数据,连续型特征的列名已保存在feature_int中。
- 使用scaler.transform对测试数据的连续型特征进行数据转换。
One-Hot编码: - 使用get_dummies()函数对训练数据和测试数据中的离散型特征进行One-Hot编码,将结果保存在all-onehot中。
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 标准化
scaler = StandardScaler()
#训练并转换数据
X_train.loc[:,feature_int] = scaler.fit_transform(X_train[feature_int])
#转换数据
X_test.loc[:,feature_int] = scaler.transform(X_test[feature_int])
#One-Hot编码
all_onehot = pd.get_dummies(X_train[feature_obj].astype('object'),drop_first=False)
#合并标准化和One-Hot编码后的数据
X_train = pd.concat([all_onehot.iloc[:X_train.shape[0],:],X_train[feature_int]],axis=1)
X_test = pd.concat([all_onehot.iloc[X_train.shape[0]:,:],X_test[feature_int]],axis=1)
print(X_train.head())
3.4 逻辑回归模型训练
描述
下面我们将通过逻辑回归构建个人信用风险评估模型。
使用Scikit-learn中的LogisticRegression类可以构建逻辑回归模型,LogisticRegression算法位于sklearn.linear_model包,首先将其导入,然后再将划分好的训练集X_trian,y_train带入模型中,调用fit方法进行模型训练。
LogisticRegression模型参数如下:
- penalty:正则化项,也称为惩罚项,可选参数为l1和l2,默认为l2。如果在调参时主要目的是解决过拟合,一般会选择l2正则化。但是当预测结果不好时,可选用l1正则化。
- C:正则化系数\lambdaλ的倒数,float类型,默认为1.0,必须是正浮点数类型,数值越小则反应正则化越强。
- fit_intercept:是否拟合截距,默认为True,布尔类型。
- class_weight:类别权重,可以是字典或者字符串,默认值为None也就是不考虑权重。如果选择balanced,会根据训练样本类别占比分配类别权重,某种类型的样本量越多,则权重越低,样本量越少,则权重越高。
- random_state:随机种子,默认为None,仅在优化方法为sag或liblinear时有效。
- solver:逻辑回归的优化方法。 liblinear:使用开源的liblinear库实现,使用坐标轴下降法来迭代优化损失函数。 lbfgs:拟牛顿法的一种,利用损失函数二阶导数也即Hessian矩阵来迭代优化损失函数。 newton-cg:利用损失函数二阶导数也即Hessian矩阵来迭代优化损失函数。 - sag:随机平均梯度下降,与普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度。
- max_iter:算法收敛的最大迭代次数,默认为100。仅在正则优化算法为newton-cg、sag和lbfgs时有效。
- multi_class:面对多分类问题的分类方式,默认为’auto。’
任务步骤
- 使用LogisticRegression类初始化一个模型对象,命名为model_lr_base,设置参数class_weight=‘balanced’,random_state=10。
- 对model_lr_base调用fit方法,带入训练集X_train,y_train进行训练。
from sklearn.linear_model import LogisticRegression
#新建模型对象
model_lr_base = LogisticRegression(class_weight='balanced',random_state=10)
#模型训练
model_lr_base.fit(X_train,y_train)
3.5 逻辑回归模型评估
描述
训练模型后,可以使用模型在测试集X_test上作出预测。在Sklearn的分类算法中,通用的预测方法有两种: predict和predict_proba,前者直接预测分类标签,后者则输出概率估计(取值在0-1之间)。对于二分类问题,predict_proba方法返回形式为一个二维的数组对象,若两类用0和1表示,第一列表示样本属于0类的概率,第二列表示样本属于1类的概率,它们相加和为1。
类别不平衡的二分类问题,有一些特定的模型评价指标。首先是混淆矩阵(Confusion Matrix),若记0类为负类,1类为正类(一般数量较少的类别被称为正类),则对于真实的负类样本,我们可能预测其为正类或负类,同样对于真实为正类的样本,我们也可能预测其为负类或正类,这样会产生四种可能性,构成下列2×2的矩阵,称为混淆矩阵。
在Sklearn的metric模块中,classification_report函数可输出分类报告,内容包括Precision、Recall和F1-score(Precision和Recall的调和平均值),其主要参数为:
- y_true:真实标签
- y_pred:预测标签
函数average_precision_score可用于计算AP,其主要参数为: - y_true:真实标签
- y_score:正类预测概率
- pos_label:指定正类标签
函数roc_auc_score可用于计算AUC值,其主要参数为: - y_true:真实标签
- y_score:正类预测概率
任务步骤
- 对训练好的model_lr_base模型调用predict方法,带入测试集X_test进行预测,将结果保存到变量model_lr_base_prelabel中。
- 调用predict_proba方法,计算测试集X_test中正类(即1类)的预测概率,将结果保存到变量model_lr_base_prob中。
- 调用classification_report,设置参数y_true为测试集标签y_test,y_pred为测试集预测标签,查看模型预测结果的分类报告。
- 调用average_precision_score,设置y_true为测试集标签,y_score为正类预测概率,pos_label为1,即正类标签,计算模型的AP值。
- 调用roc_auc_score,设置y_true为测试集标签,y_score为正类预测概率,计算模型的AUC值。
from sklearn.metrics import classification_report,roc_auc_score,average_precision_score
#预测标签
model_lr_base_prelabel = model_lr_base.predict(X_test)
#预测概率,并取正类概率
model_lr_base_prob = model_lr_base.predict_proba(X_test)[:,1]
#输出分类报告
print(classification_report(y_test,model_lr_base_prelabel))
#输出AP值
print('LogisticRegression '+' AP:',average_precision_score(y_test,model_lr_base_prob,pos_label=1))
print('LogisticRegression '+' AUC:',roc_auc_score(y_test,model_lr_base_prob))
3.6 XGBoost模型训练
描述
XGBoost是一种集成学习算法,属于三类常用的集成方法(Bagging,Boosting,Stacking)中的Boosting算法的一种。它是一个加法模型,基模型一般选择树模型,但也可以选择逻辑回归模型。
XGBoost属于梯度提升树(GBDT)模型的改进算法,GBDT的基本想法是让新的基模型去拟合前面模型的偏差,从而不断将加法模型的偏差降低。相比于经典的GBDT,XGBoost做了一些改进,从而在效果和性能上有明显的提升。
- GBDT将目标函数泰勒展开到一阶,而XGBoost将目标函数泰勒展开到了二阶,保留了更多有关目标函数的信息,对提升效果有帮助;
- XGBoost加入了叶子节点权重的L2正则化项,因而有利于模型获得更低的方差;
- XGBoost增加了自动处理缺失值特征的策略。通过把带缺失值样本分别划分到左子树或者右子树,比较两种方案下目标函数的优劣,从而自动对有缺失值的样本进行划分,无需对缺失特征进行填充预处理;
- XGBoost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算量;
- XGBoost还支持候选分位点切割,特征并行等;
从xgboost库加载sklearn接口类XGBClassifier
,可以构建XGBoost模型,然后再将划分好的训练集X_trian
,y_train
带入模型中,调用fit
方法进行模型训练。
XGBClassifier模型主要参数如下:
常规参数:
- booster:gbtree 树模型做为基分类器(默认),gbliner 线性模型做为基分类器
- scale_pos_weight:正样本的权重,在二分类任务中,当正负样本比例失衡时,设置正样本的权重,模型效果更好。例如,当正负样本比例为1:10时,scale_pos_weight=10。
模型参数:
- n_estimatores:基模型的个数
- early_stopping_rounds:在测试集上,当连续n次迭代,评价分数没有提高后,提前终止训练,防止过拟合。
- max_depth:树的深度,默认值为6,典型值为3-10,值越大,越容易过拟合;值越小,越容易欠拟合。
- min_child_weight:最小叶节点样本权重,默认值为1,值越大,越容易欠拟合;值越小,越容易过拟合。
- subsample:训练每棵树时,使用的数据占全部训练集的比例,默认值为1,典型值为0.5-1,防止过拟合。
- colsample_bytree:训练每棵树时,使用的特征占全部特征的比例,默认值为1,典型值为0.5-1,防止过拟合。
学习任务参数:
- learning_rate:学习率,控制每次迭代更新权重时的步长,默认为0.3,值越小,训练越慢,典型值为0.01-0.2。
- objective 目标函数: 回归任务:reg:linear (默认)或logistic 。 二分类: binary:logistic(概率)或logitraw(类别)。 多分类:multi:softmax num_class=n(返回类别)softprob num_class=n(返回概率)。rank:pairwise 。
- eval_metric: 回归任务(默认rmse),rmse均方根误差,mae平均绝对误差。 分类任务(默认error),auc-roc曲线下面积,error错误率(二分类),merror错误率(多分类),logloss负对数似然函数(二分类),mlogloss负对数似然函数(多分类)。
- gamma:惩罚项系数,指定节点分裂所需的最小损失函数下降值。
- alpha:L1正则化系数,默认为1。
- lambda:L2正则化系数,默认为1。
任务步骤
- 使用XGBClassifier新建一个模型对象,命名为model_xgb_base,设置参数n_estimators=50,learning_rate=0.1,gamma=0.65,random_state=10。
- 对model_xgb_base调用fit方法,带入训练集X_train,y_train进行训练。
from xgboost import XGBClassifier
#新建模型对象
model_xgb_base = XGBClassifier(n_estimators=50,learning_rate=0.1,gamma=0.65,random_state=10,eval_metric=['logloss','auc','error'])
#模型训练
model_xgb_base.fit(X_train,y_train)
3.7 XGBoost模型评估
描述
模型训练好后便可使用测试集X_test进行预测。
使用sklearn.metrics中的classification_report查看模型结果的分类报告,average_precision_score计算模型的AP值,roc_auc_score计算模型的AUC值。
函数average_precision_score计算AP,其主要参数为:
- y_true:真实标签
- y_score:正类预测概率
- pos_label:指定正类标签
- 函数roc_auc_score计算AUC值,其主要参数为:
- y_true:真实标签
- y_score:正类预测概率
任务步骤
- 对训练好的model_xgb_base模型调用predict方法,带入测试集X_test进行预测,将结果保存到变量model_xgb_base_prelabel中。
- 调用predict_proba方法,计算测试集X_test中正类(即1类)的预测概率,将结果保存到变量model_xgb_base_prob中。
- 调用classification_report,设置参数y_true为测试集标签y_test,y_pred为测试集预测标签,查看模型预测结果的分类报告。
- 调用average_precision_score,设置y_true为测试集标签,y_score为正类预测概率,pos_label为1,即正类标签,计算模型的AP值-
- 调用roc_auc_score,设置y_true为测试集标签,y_score为正类预测概率,计算模型的AUC值。
from sklearn.metrics import classification_report,roc_auc_score,average_precision_score
#预测标签
model_xgb_base_prelabel = model_xgb_base.predict(X_test)
#预测概率,取正类概率
model_xgb_base_prob = model_xgb_base.predict_proba(X_test)[:,1]
#输出分类报告
print(classification_report(y_test,model_xgb_base_prelabel))
#输出AP值
print('XGBoost '+' AP:',average_precision_score(y_test,model_xgb_base_prob,pos_label=1))
#输出AUC值
print('XGBoost '+' AUC:',roc_auc_score(y_test,model_xgb_base_prob))
4.2 WOE编码
描述
WOE被称为证据权重(Weight of Evidence),是一种有监督的离散型特征编码方式,将预测类别的集中度属性作为编码的数值。在金融风控模型构建领域,WOE编码十分常用,对特征进行WOE编码后,表示特征取某个值的时对违约比例的一种影响。
从category_encoders库中导入WOEEncoder,可以进行WOE编码。
WOEEncoder常用参数:
- cols:对指定列进行编码,如果未指定则将对所有列进行编码。
- drop_invariant:布尔型,是否删除方差为0的列。
- regularization:正则化,浮点型,正则化的主要目的是防止被零除。
可调用的主要方法:
- fit: 用于计算训练数据的WOE值,后面用其来转换数据。
- transform: 按照保存的WOE值转换数据。
- fit_transform: 不仅计算训练数据的WOE值,还会基于计算出来的WOE值来转换数据。
任务步骤
- 声明一个WOEEncoder对象,指定cols=feature_obj,feature_obj中保存了离散型特征的名称,使用fit_transform方法,传入完整数据特征credit,再传入标签列,进行WOE编码。
from category_encoders import WOEEncoder
#WOE编码
credit = WOEEncoder(cols=feature_obj).fit_transform(credit,credit['default'])
print(credit.head())
4.3 数据标准化
描述
采用StandardScaler()对数据进行标准化。保证每个维度数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导。
StandardScaler()类可以对连续型数据进行Z-socre标准化,可调用的主要方法有:
- fit: 用于计算训练数据的均值和方差,后面就会用均值和方差来转换训练数据。
- transform: 只是进行转换,只是把训练数据转换成标准的正态分布。
- fit_transform: 不仅计算训练数据的均值和方差,还会基于计算出来的均值和方差来转换训练数据,从而把数据转换成标准的正态分布。
任务步骤
- 使用StandardScaler()新建一个对象,命名为scaler。
- 使用scaler.fit_transform对训练数据的连续型特征X_train[feature_int]进行训练并转换数据。
- 使用scaler.transform对测试数据的连续型特征X_test[feature_int]进行数据转换。
import pandas as pd
from sklearn.preprocessing import StandardScaler
#对进行WOE编码后的训练集和测试集进行标准化
scaler = StandardScaler()
X_train.loc[:,feature_int] = scaler.fit_transform(X_train[feature_int])
X_test.loc[:,feature_int] = scaler.transform(X_test[feature_int])
4.4 逻辑回归模型训练
描述
使用LogisticRegression类新建一个逻辑回归模型对象,将划分好的训练集X_trian,y_train带入模型中,调用fit方法进行模型训练。
任务步骤
- 使用LogisticRegression类初始化一个模型对象,命名为model_lr,设置参数class_weight=‘balanced’,random_state=10。
- 对model_lr调用fit方法,带入训练集X_train,y_train进行训练。
from sklearn.linear_model import LogisticRegression
#新建模型对象
model_lr = LogisticRegression(class_weight='balanced',random_state=10)
#模型训练
model_lr.fit(X_train,y_train)
4.5 逻辑回归模型评估
描述
模型训练好后便可使用测试集X_test进行预测。
使用sklearn.metrics中的classification_report查看模型结果的分类报告,roc_auc_score得到模型的AUC值,average_precision_score得到模型的AP值,plot_precision_recall_curve绘制模型的PR曲线,参考样图如图1,plot_roc_curve绘制模型的ROC曲线。
任务步骤
- 对训练好的model_lr模型调用predict方法,带入测试集X_test进行预测,将结果保存到变量model_lr_prelabel中。
- 调用predict_proba方法,计算测试集X_test中正类(即1类)的预测概率,将结果保存到变量model_lr_prob中。
- 调用classification_report,设置参数y_true为测试集标签y_test,y_pred为测试集预测标签,查看模型预测结果的分类报告。
- 调用average_precision_score,设置y_true为测试集标签,y_score为正类预测概率,pos_label为1,即正类标签,计算模型的AP值-
- 调用roc_auc_score,设置y_true为测试集标签,y_score为正类预测概率,pos_label为1,计算模型的AUC值。
- 调用plot_precision_recall_curve,设置参数,estimator=model_lr,X为测试集数据X_test,y为测试集标签,pos_label为1,绘制PR曲线。
- 调用plot_roc_curve,设置参数,estimator=model_lr,X为测试集数据X_test,y为测试集标签,pos_label为1,绘制ROC曲线。
from sklearn.metrics import classification_report,roc_auc_score,average_precision_score,plot_precision_recall_curve,plot_roc_curve
#预测标签
model_lr_prelabel = model_lr.predict(X_test)
#预测概率,并取正类的概率
model_lr_prob = model_lr.predict_proba(X_test)[:,1]
#输出分类报告
print(classification_report(y_test,model_lr_prelabel))
#输出AP值
print('LogisticRegression '+' AP:',average_precision_score(y_test,model_lr_prob,pos_label=1))
#输出AUC值
print('LogisticRegression '+' AUC:',roc_auc_score(y_test,model_lr_prob))
#画出PR曲线
plot_precision_recall_curve(estimator=model_lr,X=X_test,y=y_test,pos_label=1)
#画出ROC曲线
plot_roc_curve(estimator=model_lr,X=X_test,y=y_test,pos_label=1)
4.6 XGBoost模型训练
描述
使用XGBClassifier新建一个XGBoost模型对象,使用划分好的X_trian,y_train作为训练数据,调用fit方法进行模型训练。
任务步骤
- 使用XGBClassifier类初始化一个模型对象,命名为model_xgb,设置参数n_estimators=50,learning_rate=0.1,gamma=0.65,random_state=10。
- 调用model_xgb的fit方法,使用X_train,y_train进行模型训练。
from xgboost import XGBClassifier
#新建模型对象
model_xgb = XGBClassifier(n_estimators=50,learning_rate=0.1,gamma=0.65,random_state=10,eval_metric=['logloss','auc','error'])
#模型训练
model_xgb.fit(X_train,y_train)
4.7 XGBoost模型评估
描述
模型训练好后便可使用测试集X_test进行预测。
使用sklearn.metrics中的classification_report查看模型结果的分类报告,roc_auc_score得到模型的AUC值,average_precision_score得到模型的AP值,plot_precision_recall_curve绘制模型的PR曲线,参考样图如图1,plot_roc_curve绘制模型的ROC曲线。
任务步骤
- 对训练好的model_xgb模型调用predict方法,带入测试集X_test进行预测,将结果保存到变量model_xgb_prelabel中。
- 调用predict_proba方法,计算测试集X_test中正类(即1类)的预测概率,将结果保存到变量model_xgb_prob中。
- 调用classification_report,设置参数y_true为测试集标签y_test,y_pred为测试集预测标签,查看模型预测结果的分类报告。
- 调用average_precision_score,设置y_true为测试集标签,y_score为正类预测概率,pos_label为1,即正类标签,计算模型的AP值
- 调用roc_auc_score,设置y_true为测试集标签,y_score为正类预测概率,pos_label为1,计算模型的AUC值。
- 调用plot_precision_recall_curve,设置参数,estimator=model_xgb,X为测试集数据X_test,y为测试集标签,pos_label为1,绘制PR曲线。
- 调用plot_roc_curve,设置参数,estimator=model_xgb,X为测试集数据X_test,y为测试集标签,pos_label为1,绘制ROC曲线。
from sklearn.metrics import classification_report,roc_auc_score,average_precision_score,plot_precision_recall_curve,plot_roc_curve
#预测标签
model_xgb_prelabel = model_xgb.predict(X_test)
#预测概率,并取正类的概率
model_xgb_prob = model_xgb.predict_proba(X_test)[:,1]
#输出分类报告
print(classification_report(y_true=y_test,y_pred=model_xgb_prelabel))
#输出AP值
print('LogisticRegression '+' AP:',average_precision_score(y_true=y_test,y_score=model_xgb_prob,pos_label=1))
#输出AUC值
print('LogisticRegression '+' AUC:',roc_auc_score(y_true=y_test,y_score=model_xgb_prob))
#画出PR曲线
plot_precision_recall_curve(estimator=model_xgb,X=X_test,y=y_test,pos_label=1)
#画出ROC曲线
plot_roc_curve(estimator=model_xgb,X=X_test,y=y_test,pos_label=1)