ITPub博客

首页 > 人工智能 > 机器学习 > 「二分类算法」提供银行精准营销解决方案

「二分类算法」提供银行精准营销解决方案

原创 机器学习 作者:helaoshi 时间:2020-06-26 16:03:31 0 删除 编辑

数据分析准备工作

导入包

In [3]:
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport numpy as npimport sklearnfrom sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_splitfrom sklearn.metrics import roc_auc_scorefrom sklearn.metrics import classification_reportfrom sklearn import preprocessing
In [4]:
df_train=pd.read_csv(r"/home/kesci/input/bank_financial4287/train_set.csv")df_test=pd.read_csv(r"/home/kesci/input/bank_financial4287/test_set.csv")

数据集概要

In [5]:
df_train.info()df_test.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 25317 entries, 0 to 25316
Data columns (total 18 columns):
ID           25317 non-null int64
age          25317 non-null int64
job          25317 non-null object
marital      25317 non-null object
education    25317 non-null object
default      25317 non-null object
balance      25317 non-null int64
housing      25317 non-null object
loan         25317 non-null object
contact      25317 non-null object
day          25317 non-null int64
month        25317 non-null object
duration     25317 non-null int64
campaign     25317 non-null int64
pdays        25317 non-null int64
previous     25317 non-null int64
poutcome     25317 non-null object
y            25317 non-null int64
dtypes: int64(9), object(9)
memory usage: 3.5+ MB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10852 entries, 0 to 10851
Data columns (total 17 columns):
ID           10852 non-null int64
age          10852 non-null int64
job          10852 non-null object
marital      10852 non-null object
education    10852 non-null object
default      10852 non-null object
balance      10852 non-null int64
housing      10852 non-null object
loan         10852 non-null object
contact      10852 non-null object
day          10852 non-null int64
month        10852 non-null object
duration     10852 non-null int64
campaign     10852 non-null int64
pdays        10852 non-null int64
previous     10852 non-null int64
poutcome     10852 non-null object
dtypes: int64(8), object(9)
memory usage: 1.4+ MB
  • 一共17个特征,label为y;
  • 存在离散型和连续型特征,不存在null值
  • 训练集有25317条样本,测试集有10852条样本
In [6]:
df_train.head()
Out[6]:
ID age job marital education default balance housing loan contact day month duration campaign pdays previous poutcome y
0 1 43 management married tertiary no 291 yes no unknown 9 may 150 2 -1 0 unknown 0
1 2 42 technician divorced primary no 5076 yes no cellular 7 apr 99 1 251 2 other 0
2 3 47 admin. married secondary no 104 yes yes cellular 14 jul 77 2 -1 0 unknown 0
3 4 28 management single secondary no -994 yes yes cellular 18 jul 174 2 -1 0 unknown 0
4 5 42 technician divorced secondary no 2974 yes no unknown 21 may 187 5 -1 0 unknown 0
In [7]:
df_test.head()
Out[7]:
ID age job marital education default balance housing loan contact day month duration campaign pdays previous poutcome
0 25318 51 housemaid married unknown no 174 no no telephone 29 jul 308 3 -1 0 unknown
1 25319 32 management married tertiary no 6059 yes no cellular 20 nov 110 2 -1 0 unknown
2 25320 60 retired married primary no 0 no no telephone 30 jul 130 3 -1 0 unknown
3 25321 32 student single tertiary no 64 no no cellular 30 jun 598 4 105 5 failure
4 25322 41 housemaid married secondary no 0 yes yes cellular 15 jul 368 4 -1 0 unknown

字符型特征中存在unkwown值,我们认为unknown值是缺失值。特征为字符串格式,无法放到模型训练,后期需要该字段需要进行离散型特征编码。
通过具体的数值信息查看,对数据信息有一个大体的把握。
根据上面的数据特征,不难发现客户是否认购银行定期理财产品不仅与客户自身条件有关,也与银行销售行为有关。因此可以通过客户维度和业务维度两个方向来描述统计特征:

  1. 客户维度
    • 人口属性,如年龄、职业、受教育水平
    • 信用属性,如是否有违约记录、每年账户的平均余额、是否有贷款
  1. 业务维度
    • 营销属性,如最后一次联系的交流时长、在本次活动中,与该客户交流过的次数等

对数据进行解读后,我们观察到days(最后一次联系的时间(几号))和month(最后一次联系的时间(月份))与previous(距离上次活动最后一次联系该客户,过去了多久(999表示没有联系过))之间存在特征重合,保留previous特征。

In [8]:
df_train.drop(['day','month'],inplace=True,axis=1)df_test.drop(['day','month'],inplace=True,axis=1)

统计信息

In [9]:
df_train.describe()
Out[9]:
ID age balance duration campaign pdays previous y
count 25317.000000 25317.000000 25317.000000 25317.000000 25317.000000 25317.000000 25317.000000 25317.000000
mean 12659.000000 40.935379 1357.555082 257.732393 2.772050 40.248766 0.591737 0.116957
std 7308.532719 10.634289 2999.822811 256.975151 3.136097 100.213541 2.568313 0.321375
min 1.000000 18.000000 -8019.000000 0.000000 1.000000 -1.000000 0.000000 0.000000
25% 6330.000000 33.000000 73.000000 103.000000 1.000000 -1.000000 0.000000 0.000000
50% 12659.000000 39.000000 448.000000 181.000000 2.000000 -1.000000 0.000000 0.000000
75% 18988.000000 48.000000 1435.000000 317.000000 3.000000 -1.000000 0.000000 0.000000
max 25317.000000 95.000000 102127.000000 3881.000000 55.000000 854.000000 275.000000 1.000000
In [10]:
df_test.describe()
Out[10]:
ID age balance duration campaign pdays previous
count 10852.000000 10852.000000 10852.000000 10852.000000 10852.000000 10852.000000 10852.000000
mean 30743.500000 41.040638 1393.157298 257.206137 2.770365 39.954755 0.546443
std 3132.846895 10.652369 3318.497101 250.480906 3.063481 99.524056 1.805938
min 25318.000000 18.000000 -2604.000000 0.000000 1.000000 -1.000000 0.000000
25% 28030.750000 33.000000 72.000000 102.000000 1.000000 -1.000000 0.000000
50% 30743.500000 39.000000 450.000000 181.000000 2.000000 -1.000000 0.000000
75% 33456.250000 49.000000 1440.250000 322.000000 3.000000 -1.000000 0.000000
max 36169.000000 94.000000 81204.000000 3102.000000 58.000000 871.000000 51.000000

我们可以观察到训练集和测试集中:

  • 平均和标准差都比较接近
  • 除了balance之外,其他字段的最大最小值也比较接近

数据清洗

重复值

In [11]:
df_train.duplicated().all()
Out[11]:
False

数据不存在完全重复的行。

异常值

对于连续型变量可以使用箱线图。感觉可以直接根据业务常识判断一下某一些值不为负即可。

In [51]:
df_train.boxplot()
Out[51]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f77d8561d30>

缺失值

前面我们已经观察到存在unknown值,所以需要我们进行缺失值处理。

In [13]:
def missing_data(data):
    total = data.isin(['unknown']).sum()
    percent = (data.isin(['unknown']).sum()/data.isin(['unknown']).count()*100)
    tt = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
    types = []
    for col in data.columns:
        dtype = str(data[col].dtype)
        types.append(dtype)
    tt['types'] = types
    return(np.transpose(tt))missing_data(df_train)
Out[13]:
ID age job marital education default balance housing loan contact duration campaign pdays previous poutcome y
Total 0 0 163 0 1065 0 0 0 0 7281 0 0 0 0 20677 0
Percent 0 0 0.643836 0 4.20666 0 0 0 0 28.7593 0 0 0 0 81.6724 0
types int64 int64 object object object object int64 object object object int64 int64 int64 int64 object int64
In [14]:
missing_data(df_test)
Out[14]:
ID age job marital education default balance housing loan contact duration campaign pdays previous poutcome
Total 0 0 60 0 448 0 0 0 0 3112 0 0 0 0 8877
Percent 0 0 0.552893 0 4.12827 0 0 0 0 28.6767 0 0 0 0 81.8006
types int64 int64 object object object object int64 object object object int64 int64 int64 int64 object

考虑到职业、教育程度、通讯方式都是离散型数据,采用众数进行填补。上一次联系结果poutcome因为是大部分缺失,依据80%原则(非缺失部分低于总样本量的80%)删除poutcome列。

In [15]:
df_train.drop('poutcome',inplace=True,axis=1)df_train.columns
Out[15]:
Index(['ID', 'age', 'job', 'marital', 'education', 'default', 'balance',
       'housing', 'loan', 'contact', 'duration', 'campaign', 'pdays',
       'previous', 'y'],
      dtype='object')
In [16]:
df_test.drop('poutcome',inplace=True,axis=1)df_test.columns
Out[16]:
Index(['ID', 'age', 'job', 'marital', 'education', 'default', 'balance',
       'housing', 'loan', 'contact', 'duration', 'campaign', 'pdays',
       'previous'],
      dtype='object')
In [17]:
df_train['job'].replace(['unknown'],df_train['job'].mode(),inplace=True)df_train['job'].isin(['unknown']).sum()
Out[17]:
0

同步操作test数据的值

In [18]:
df_test['job'].replace(['unknown'],df_test['job'].mode(),inplace=True)df_test['job'].isin(['unknown']).all()
Out[18]:
0
In [19]:
df_train['education'].replace(['unknown'],df_train['education'].mode(),inplace=True)df_train['education'].isin(['unknown']).all()
Out[19]:
0
In [20]:
df_test['education'].replace(['unknown'],df_test['education'].mode(),inplace=True)df_test['education'].isin(['unknown']).all()
Out[20]:
0
In [21]:
df_train['contact'].replace(['unknown'],df_train['contact'].mode(),inplace=True)df_train['contact'].isin(['unknown']).all()
Out[21]:
0
In [22]:
df_test['contact'].replace(['unknown'],df_test['contact'].mode(),inplace=True)df_test['contact'].isin(['unknown']).all()
Out[22]:
0

数据可视化

在这一步我们给出单个特征的购买占比,并且对定性变量进行编码。
首先将样本按照label分为购买和没有购买的两类

In [23]:
client_purchase=df_train[df_train.loc[:,'y']==1].copy()client_not_purchase=df_train[df_train.loc[:,'y']==0].copy()

label值

查看label的分布,确定数据集是否是偏斜样本

In [25]:
#两种方法可以计算#buy_rate=df_buy.shape[0]/df_train.shape[0]或者buy_rate=df_train['y'].sum()/df_train.shape[0]pie_data = {'purchase rate': client_purchase.shape[0],
            '': df_train.shape[0]-client_purchase.shape[0]}explode = (0.2, 0)  #  突出购买率fig1, ax = plt.subplots()sizes=pie_data.values()labels =['{}:{}'.format(key,value) for key,value in pie_data.items()]ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)ax.axis('equal')  # 确保圆形plt.show()

可以看出,定期理财产品的购买率不高,同时训练样本极其不均衡。后边可以使用过采样解决样本不均衡问题。

特征分析

客户维度包括age、job、marital、education、default(是否违约)、housing(是否有住房贷款)、loan(是否有个人贷款)。我们先进行单一数据特征的分析。

Age

在本数据集中年龄属于定量数据(连续型),直接给出直方图。

In [26]:
print("最小的年龄:{}".format(df_train['age'].min()))print("最大的年龄:{}".format(df_train['age'].max()))
最小的年龄:18
最大的年龄:95
In [27]:
fg = sns.FacetGrid(data=df_train,height=6,hue='y')fg = (fg.map(sns.distplot,'age',bins=[20,30,40,50,60,70,80,90])
      .add_legend())

通过年龄分布直方图发现:

  • 数据样本集中在年龄低的分段
  • 年龄超过60岁和年龄低30岁的人更喜欢定期理财

Job

职业为定性数据(离散型),给出条形图并对其职业特征进行编码。

In [28]:
pd.DataFrame(df_train.groupby('job'))[0]
Out[28]:
0            admin.
1       blue-collar
2      entrepreneur
3         housemaid
4        management
5           retired
6     self-employed
7          services
8           student
9        technician
10       unemployed
Name: 0, dtype: object

分析购买产品人的职业特征,首先查看数据集中的职业种类有11种。
其次分析每一种职业对于购买产品的影响,这一步主要是比较每一种职业下的购买率。

In [29]:
fg=sns.catplot(data=df_train,x='job',kind='bar',y='y',ci=None)fg=(fg.set_xticklabels(rotation=90)
    .set_axis_labels('','purchase rate')
    .despine(left=True))

通过职业分类查看观察到:

  • 退休人员和学生最青睐定期理财,其次是失业人员
  • 蓝领定期理财的比率最低

从上图我们观察到:

  • 无论接受教育的程度如何,进行定期理财的人主要是退休人员和学生,其次是失业人员。
  • 随着教育程度的提高,管理人员、技术人员、行政人员、蓝领、企业家、自由职业者、事业人员越来越倾向接受定期理财。

Marital

婚姻状况也是定性数据(离散型)。

In [30]:
fg=sns.catplot(data=df_train,x='marital',kind='bar',y='y',ci=None,aspect=.8)fg=(fg.set_axis_labels('marital','purchase rate')
    .despine(left=True))

按照婚姻情况分类观察到:

  • 单身相比离异和已婚倾向于定期理财。

Education

教育程度也是定性数据(离散型)。

In [31]:
fg=sns.catplot(data=df_train,x='education',kind='bar',y='y',ci=None,aspect=.6)fg=(fg.set_axis_labels('education','purchase rate')
    .despine(left=True))

Job-Education

In [32]:
g = sns.catplot(x='job', y='y', col='education',
                data=df_train, saturation=.5,
                kind='bar', col_order=['primary','secondary','tertiary'],
                aspect=1.2,ci=None)g = (g.set_axis_labels('job', 'purchase rate')
     .set_xticklabels(rotation=90)
     .set_titles('{col_name} {col_var}')
     .despine(left=True))

从上图我们观察到:

  • 无论接受教育的程度如何,进行定期理财的人主要是退休人员和学生,其次是失业人员。
  • 随着教育程度的提高,管理人员、技术人员、行政人员、蓝领、企业家、自由职业者、事业人员越来越倾向接受定期理财。

default、housing、loan

In [33]:
fg=sns.catplot(data=df_train,x='default',kind='bar',y='y',ci=None,order=['yes','no'])fg.set_axis_labels("default",'purchase rate')fg=sns.catplot(data=df_train,x='housing',kind='bar',y='y',ci=None,order=['yes','no'])fg.set_axis_labels("housing",'purchase rate')fg=sns.catplot(data=df_train,x='loan',kind='bar',y='y',ci=None,order=['yes','no'])fg.set_axis_labels("loan",'purchase rate')
Out[33]:
<seaborn.axisgrid.FacetGrid at 0x7f77d872dac8>

观察到:

  • 没有违约的人倾向于定期理财
  • 没有房贷的人倾向于定期理财
  • 没有个人贷款的人倾向于定期理财

contact、duration、 campaign、 pdays、 previous

In [34]:
fg=sns.catplot(data=df_train,x='contact',kind='bar',y='y',ci=None)fg.set_axis_labels("contact",'purchase rate')fg=sns.catplot(data=df_train,x='campaign',kind='bar',y='y',ci=None,aspect=2)fg.set_axis_labels("campaign",'purchase rate')fg = sns.FacetGrid(data=df_train,height=6,hue='y')fg = (fg.map(sns.distplot,'duration',bins=40)
      .add_legend())

通过沟通方式等特征分析观察到:

  • 通过移动电话沟通客户定期理财的比率高
  • 沟通次数长并不一定能够提高客户进行定期理财的比率
  • 最后一次沟通的超过一定时长(大约300)后定期理财比率提高

两个特征的相关性

In [65]:
fig,axes=plt.subplots(1,3)#pearson系数ax0=axes[0].imshow(X=df_train.corr())#kendall系数ax1=axes[1].imshow(X=df_train.corr(method='kendall'))#spearman系数ax2=axes[2].imshow(X=df_train.corr(method='spearman'))fig.colorbar(ax0,ax=[axes[0],axes[1],axes[2]])fig.set_size_inches(30,8)##当然可以使用sns.heatmap函数还可以显示对应的值
In [69]:
sns.heatmap(data=df_train.corr(),annot=True)
Out[69]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f77d629a080>

根据pearson系数,duration(最后一次联系的交流时长)与预测值成弱相关性,pdays(距离上次活动最后一次联系该客户,过去了多久)和previous(在本次活动之前,与该客户交流过的次数)成相关性。

数据模型(逻辑回归)

数据集预处理

In [36]:
# 尝试过LabelEncoder编码,评分只有0.6293498143665042# 采用哑变量进行编码train_data=pd.get_dummies(df_train.iloc[:,:-1])train_data.drop('ID',inplace=True,axis=1)train_target=df_train.loc[:,'y']

采用哑变量进行编码,为了避免哑变量编码产生更多的特征,需要

In [37]:
print(train_data.head())
   age  balance  duration  campaign  pdays  previous  job_admin.  \
0   43      291       150         2     -1         0           0   
1   42     5076        99         1    251         2           0   
2   47      104        77         2     -1         0           1   
3   28     -994       174         2     -1         0           0   
4   42     2974       187         5     -1         0           0   
   job_blue-collar  job_entrepreneur  job_housemaid  ...  education_secondary  \
0                0                 0              0  ...                    0   
1                0                 0              0  ...                    0   
2                0                 0              0  ...                    1   
3                0                 0              0  ...                    1   
4                0                 0              0  ...                    1   
   education_tertiary  default_no  default_yes  housing_no  housing_yes  \
0                   1           1            0           0            1   
1                   0           1            0           0            1   
2                   0           1            0           0            1   
3                   0           1            0           0            1   
4                   0           1            0           0            1   
   loan_no  loan_yes  contact_cellular  contact_telephone  
0        1         0                 1                  0  
1        1         0                 1                  0  
2        0         1                 1                  0  
3        0         1                 1                  0  
4        1         0                 1                  0  
[5 rows x 31 columns]

建立模型并训练

In [38]:
train_data.columns.size
Out[38]:
31
In [39]:
#划分训练集和验证集X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size=0.2, random_state=0)LR=LogisticRegression(solver='liblinear')#对训练集X_train训练LR.fit(X_train,y_train)#给出训练的精度LR.score(X_train,y_train)
Out[39]:
0.892114748432331
In [40]:
train_data.head()
Out[40]:
age balance duration campaign pdays previous job_admin. job_blue-collar job_entrepreneur job_housemaid ... education_secondary education_tertiary default_no default_yes housing_no housing_yes loan_no loan_yes contact_cellular contact_telephone
0 43 291 150 2 -1 0 0 0 0 0 ... 0 1 1 0 0 1 1 0 1 0
1 42 5076 99 1 251 2 0 0 0 0 ... 0 0 1 0 0 1 1 0 1 0
2 47 104 77 2 -1 0 1 0 0 0 ... 1 0 1 0 0 1 0 1 1 0
3 28 -994 174 2 -1 0 0 0 0 0 ... 1 0 1 0 0 1 0 1 1 0
4 42 2974 187 5 -1 0 0 0 0 0 ... 1 0 1 0 0 1 1 0 1 0

5 rows × 31 columns

对验证集预测并给出预测分类的可能性:

In [41]:
#对于验证集x_test进行预测x_pre_test=LR.predict(X_test)x_pre_test
Out[41]:
array([0, 0, 0, ..., 0, 0, 0])

给出文本型预测分类报告:

In [42]:
print(classification_report(y_test, x_pre_test))
              precision    recall  f1-score   support
           0       0.90      0.98      0.94      4462
           1       0.60      0.19      0.29       602
    accuracy                           0.89      5064
   macro avg       0.75      0.59      0.62      5064
weighted avg       0.86      0.89      0.86      5064
In [43]:
x_pro_test = LR.predict_proba(X_test)print("验证集的预测可能性:{}".format(x_pro_test))#计算验证集的auc值,参数为预测值和概率估计auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc的值:{}".format(auc))
验证集的预测可能性:[[0.94521561 0.05478439]
 [0.93955074 0.06044926]
 [0.58348319 0.41651681]
 ...
 [0.70422518 0.29577482]
 [0.86875229 0.13124771]
 [0.98708957 0.01291043]]
auc的值:0.8506837361194047

可以看到auc的值为0.8506788964321825,可以进一步提高。

优化模型

对正规化调整

In [44]:
LR=LogisticRegression(solver='liblinear',penalty='l1')LR.fit(X_train,y_train)LR.score(X_train,y_train)x_pre_test=LR.predict(X_test)print("训练集的预测结果: {}".format(x_pre_test))print("分类报告:\n {}".format(classification_report(y_test, x_pre_test)))x_pro_test = LR.predict_proba(X_test)print("训练集的预测可能性:\n{}".format(x_pro_test))auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc值:{}".format(auc))
训练集的预测结果: [0 0 0 ... 0 0 0]
分类报告:
               precision    recall  f1-score   support
           0       0.90      0.98      0.94      4462
           1       0.60      0.19      0.29       602
    accuracy                           0.89      5064
   macro avg       0.75      0.59      0.62      5064
weighted avg       0.86      0.89      0.86      5064
训练集的预测可能性:
[[0.9449729  0.0550271 ]
 [0.94623096 0.05376904]
 [0.58475672 0.41524328]
 ...
 [0.70416892 0.29583108]
 [0.86859015 0.13140985]
 [0.98723593 0.01276407]]
auc值:0.8507957934927798

调高了一丢丢~

对年龄年龄特征进行离散化

对age特征的可视化分析我们可以对age年龄进行[30,60]的分箱

In [45]:
bins = np.arange(18,100,10,int)  bins
Out[45]:
array([18, 28, 38, 48, 58, 68, 78, 88, 98])
In [46]:
train_data['age'] = np.digitize(df_train['age'], bins=bins)df_test['age'] = np.digitize(df_test['age'], bins=bins)
In [47]:
#划分训练集和验证集X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size=0.2, random_state=0)train_data.head()
Out[47]:
age balance duration campaign pdays previous job_admin. job_blue-collar job_entrepreneur job_housemaid ... education_secondary education_tertiary default_no default_yes housing_no housing_yes loan_no loan_yes contact_cellular contact_telephone
0 3 291 150 2 -1 0 0 0 0 0 ... 0 1 1 0 0 1 1 0 1 0
1 3 5076 99 1 251 2 0 0 0 0 ... 0 0 1 0 0 1 1 0 1 0
2 3 104 77 2 -1 0 1 0 0 0 ... 1 0 1 0 0 1 0 1 1 0
3 2 -994 174 2 -1 0 0 0 0 0 ... 1 0 1 0 0 1 0 1 1 0
4 3 2974 187 5 -1 0 0 0 0 0 ... 1 0 1 0 0 1 1 0 1 0

5 rows × 31 columns

In [48]:
LR.fit(X_train,y_train)LR.score(X_train,y_train)x_pre_test=LR.predict(X_test)print("训练集的预测结果: {}".format(x_pre_test))print("分类报告:\n {}".format(classification_report(y_test, x_pre_test)))x_pro_test = LR.predict_proba(X_test)print("训练集的预测可能性:\n{}".format(x_pro_test))auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc值:{}".format(auc))
训练集的预测结果: [0 0 0 ... 0 0 0]
分类报告:
               precision    recall  f1-score   support
           0       0.90      0.98      0.94      4462
           1       0.60      0.19      0.29       602
    accuracy                           0.89      5064
   macro avg       0.75      0.59      0.62      5064
weighted avg       0.86      0.89      0.86      5064
训练集的预测可能性:
[[0.94497089 0.05502911]
 [0.94660533 0.05339467]
 [0.58639371 0.41360629]
 ...
 [0.7030121  0.2969879 ]
 [0.86868258 0.13131742]
 [0.98723321 0.01276679]]
auc值:0.8507913260891902

反而降低了~

样本调整为均衡(过采样)

In [75]:
#自己的电脑可以klab这里运行显示没有模块from imblearn.over_sampling import SMOTEoversampler=SMOTE(random_state=0)os_train_data,os_train_target=oversampler.fit_sample(train_data,train_target)#划分训练集和验证集X_train, X_test, y_train, y_test = train_test_split(os_train_data, os_train_target, test_size=0.2, random_state=0)
---------------------------------------------------------------------------ModuleNotFoundError                       Traceback (most recent call last)<ipython-input-75-52ef3dce8e44> in <module>      1 #自己的电脑可以klab这里运行显示没有模块----> 2 from imblearn.over_sampling import SMOTE      3       4 oversampler=SMOTE(random_state=0)      5 os_train_data,os_train_target=oversampler.fit_sample(train_data,train_target)ModuleNotFoundError: No module named 'imblearn'
In [ ]:
os_train_data
In [ ]:
df_test
In [ ]:
LR=LogisticRegression(solver='liblinear')LR.fit(X_train,y_train)LR.score(X_train,y_train)x_pre_test=LR.predict(X_test)print("训练集的预测结果: {}".format(x_pre_test))print("分类报告:\n {}".format(classification_report(y_test, x_pre_test)))x_pro_test = LR.predict_proba(X_test)print("训练集的预测可能性:\n{}".format(x_pro_test))auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc值:{}".format(auc))

大幅度提高了~

结果预测

In [ ]:
df_out=pd.DataFrame(df_test['ID'].copy())df_test.drop('ID',inplace=True,axis=1)
In [ ]:
df_test=pd.get_dummies(df_test)
In [ ]:
#对测试集df_test进行预测y_pre_test=LR.predict(df_test)y_pre_test
In [ ]:
df_test
In [ ]:
#预测df_test分类的可能性y_test_pro=LR.predict_proba(df_test)y_test_pro
In [ ]:
df_out['pred']=y_test_pro[:,1]df_out=df_out[['ID','pred']]df_out.head()
In [ ]:
df_out.to_csv(r'./result.csv',index=False)


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69977871/viewspace-2700684/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2020-06-26

  • 博文量
    7
  • 访问量
    887