在搭建模型时,二分类中,经常会遇到目标变量的分类数量相差很大,比如分类是1的数量是5000,分类是0的数量是100,这样如果对数据的不平衡性不做处理,模型的效果也会很差。今天用一个案例来进行实操:
1、案例目的:
找出有资金需求的中小企业借贷户并销售其贷款产品
2、背景:
对于中小企业而言,要快速成长最需要的就是资金。若能找出这些有资金需求的中小企业公司户并销售其贷款产品,将能为银行带来不少的营收,并改善中小企业的经营。
3、数据说明
训练数据包含26,144笔客户资料;每笔客户资料包含26个字段(1个客户ID字段、24个输入字段及1个目标字段-VV(是否为SME公司户;1代表有资金需求的中小企业公司户,0则代表没有资金需求的中小企业公司户)。
![每个字段的含义如图]
(https://img-blog.csdnimg.cn/fd912d79e0634a9c819e03772516aa81.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYnJ1Y2VsaW5fMTg4,size_20,color_FFFFFF,t_70,g_se,x_16)
需要说明一下area:区域代码第1码为大分类, 第1+2码为中分类, 依此类推
测试数据包含6,537笔客户资料;字段个数与训练数据相同,只有目标字段的值全部填“Withheld”。
建立一个分类预测模型,找出有资金需求的中小企业借贷户,并输出一个测试结果的档案(考生姓名_results.csv)。考生姓名_results.csv中只有两个字段,分别是客户ID以及预测客户是否是有资金需求的中小企业公司户。3.results.csv的形式如下:
ID,Predicted_Results
1,1
2,0
8,0
4、模型评估方式:
F-Measure,值越大越好
#导入第三方包
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity='all'
from scipy import stats
import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
from statsmodels.stats.multicomp import pairwise_tukeyhsd
import matplotlib.pyplot as plt
#导入数据
df_train = pd.read_csv('Training.csv')
#探查数据,数据总计26144行,每个字段的数据类型如下,
df_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26144 entries, 0 to 26143
Data columns (total 26 columns):
ID 26144 non-null int64
area 24423 non-null object
ck 24503 non-null object
ck-saveall 24504 non-null object
ck-drawall 24449 non-null object
ck-savetime 24518 non-null object
ck-drawtime 24495 non-null object
ck-saveavg 24485 non-null object
ck-drawavg 24454 non-null object
ck-avg 24512 non-null object
dep-saveall 24572 non-null object
dep-drawall 24471 non-null object
dep-savetime 24546 non-null object
dep-drawtime 24370 non-null object
depsaveavg 24482 non-null object
depdrawavg 24426 non-null object
dep-avg 24498 non-null object
dep-9201 24504 non-null object
fed-9201 24510 non-null object
fed-avg