import pandas as pd
#读取数据
credit = pd.read_csv("credit.csv")
#查看前5行
credit_5 = credit.head()
print(credit_5)
import pandas as pd
#查看数据的基本信息
credit_info = credit.info()
import pandas as pd
#查看数据基本统计信息
credit_desc = credit.describe(include = 'all')
print(credit_desc)
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)
Seaborn中的countplot()函数主要参数如下:
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)
#groupby操作计算各个分组的违约率
months_rate = credit.groupby(months_cut)['default'].apply(lambda x:x.sum()/len(x))
#将各个分组的违约率绘制条形图进行展示
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)
Pandas中的cut()函数可以进行等距离散化,主要参数有:
Seaborn的barplot()函数可以绘制条形图,主要参数有:
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(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)
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'].apply(lambda x:x.sum()/len(x))
#绘制条形图
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)
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)
Sklearn中的SelectKBest()方法可用于特征选择,根据给定的方法,选择出前k个与目标最相关的特征,其主要参数如下:
score_func:用于计算相关性的函数,函数接受两个数组X和y,并返回一对数组(scores,pvalue)或带scores的单个数组,scores表示得分,得分越高相关性越强,pvalue表示检验的P值,值越小表示相关性越强,默认值为f_classif,表示计算方差分析的F值,其它取值如下:
k:需要选择的最佳特征个数,默认值为10。
SelectKBest()方法调用fit()方法,传入X和y两组特征,计算它们之间的相关性,调用SelectKBest()方法的score_属性得到相关性得分,调用pvalues_属性得到检验的P值
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)
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 = .25, random_state = 10, stratify = y)
print(X_train.shape)
print(X_test.shape)
在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:使用分层采样,保证训练集和测试集中违约和未违约客户的比例相同,并且与总体数据中的比例保持一致。
函数最终将返回四个值,分别为训练集特征、测试集特征、训练集标签和测试集标签。
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.fit_transform(X_test[feature_int])
#One-Hot编码
all_onehot = pd.get_dummies(pd.concat([X_train[feature_obj], X_test[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())
在Sklearn的preprocessing模块中,StandardScaler()类可以对连续型数据进行Z-socre标准化,可调用的主要方法有:
Pandas中的get_dummies()函数可以进行One-Hot编码,主要参数如下:
from sklearn.linear_model import LogisticRegression
#新建模型对象
model_lr_base = LogisticRegression(class_weight='balanced', random_state=10)
#模型训练
model_lr_base.fit(X_train, y_train)
LogisticRegression模型参数如下:
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_true = y_test, y_pred = model_lr_base_prelabel))
#输出AP值
print('LogisticRegression '+' AP:',average_precision_score(y_test, model_lr_base_prob))
print('LogisticRegression '+' AUC:',roc_auc_score(y_test, model_lr_base_prob))
在Sklearn的metric模块中,classification_report函数可输出分类报告,内容包括Precision、Recall和F1-score(Precision和Recall的调和平均值),其主要参数为:
函数average_precision_score可用于计算AP,其主要参数为:
函数roc_auc_score可用于计算AUC值,其主要参数为:
from xgboost import XGBClassifier
#新建模型对象
model_xgb_base = XGBClassifier(n_estimators=50, learning_rate=0.1,
gamma=0.65, random_state=10, n_jobs=1 ,eval_metric=['logloss','auc','error'])
#模型训练
model_xgb_base.fit(X_train, y_train)
XGBClassifier模型主要参数如下:
常规参数:
模型参数:
学习任务参数:
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))
#输出AUC值
print('XGBoost '+' AUC:',roc_auc_score(y_test, model_xgb_base_prob))
函数average_precision_score计算AP,其主要参数为:
函数roc_auc_score计算AUC值,其主要参数为:
from category_encoders import WOEEncoder
#WOE编码
credit = WOEEncoder(cols=feature_obj).fit_transform(credit, credit['default'])
print(credit.head())
从category_encoders库中导入WOEEncoder,可以进行WOE编码。
WOEEncoder常用参数:
可调用的主要方法:
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])
StandardScaler()类可以对连续型数据进行Z-socre标准化,可调用的主要方法有:
from sklearn.linear_model import LogisticRegression
#新建模型对象
model_lr = LogisticRegression(class_weight='balanced', random_state=10)
#模型训练
model_lr.fit(X_train, y_train)
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))
#输出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)
from xgboost import XGBClassifier
#新建模型对象
model_xgb = XGBClassifier(n_estimators=50, learning_rate=0.1, gamma=0.65, random_state=10, n_jobs=1
,eval_metric=['logloss','auc','error'])
#模型训练
model_xgb.fit(X_train, y_train)
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_test, model_xgb_prelabel))
#输出AP值
print('XGBoost'+' AP:',average_precision_score(y_test, model_xgb_prob))
#输出AUC值
print('XGBoost'+' AUC:',roc_auc_score(y_test, 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)