【违约预测】TASK 04

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
%matplotlib inline
plt.rcParams["font.sans-serif"] = ["FangSong"] 
plt.rcParams["axes.unicode_minus"] = False 
import warnings
warnings.filterwarnings("ignore")
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split,KFold,cross_validate,cross_val_score
import lightgbm
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestClassifier as RF

数据导入

train = pd.read_csv('train_done_1.csv',index_col='id')

X = train.drop(columns= 'isDefault')

y = train.isDefault

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/16, random_state=2020)

使用SMOTE对样本进行抽样

sm = SMOTE(sampling_strategy={0:600269,1:600269},k_neighbors=5)

X_train1,y_train1 = sm.fit_resample(X_train,y_train) 

X_train1 = X_train1.values
y_train1 = y_train1.values

建立lgb模型

lgb = lightgbm.LGBMClassifier(random_state=2020)

kf = KFold(n_splits=5,random_state=2020)

cross_validate(lgb,X_train1,y_train1,scoring='roc_auc')

使用贝叶斯调参

#  设置均方差为lbg模型参数寻优目标函数 
from bayes_opt import BayesianOptimization

def rf_cv(n_estimators,max_depth,num_leaves,min_child_samples,subsample,reg_alpha,reg_lambda):
    lgb = lightgbm.LGBMClassifier(n_estimators=int(n_estimators),max_depth=int(max_depth),num_leaves=int(num_leaves),
                                min_child_samples=int(min_child_samples),subsample=subsample,reg_alpha=reg_alpha,reg_lambda=reg_lambda)
    val = cross_val_score(lgb,X,y,scoring='roc_auc',cv=3).mean()
    return val

#  设置lgb参数优化的范围 

rf_bo = BayesianOptimization(rf_cv,
                             {
                                 "n_estimators":(10,250),
                                 'max_depth':(2,6),
                                 'num_leaves':(2,30),
                                 'min_child_samples':(5,40),
                                 'subsample':(0.6,1),
                                 'reg_alpha':(0,1),
                                 'reg_lambda':(0,1)
                             })

num_iter = 10
init_points = 5
rf_bo.maximize(init_points=init_points,n_iter=num_iter)
rf_bo.res["max"]
rf_bo.res["max"]['max_params'].values()
dict_values([245.58122100031977, 5.867566640000227, 28.93708799905978, 39.413612723596565, 0.8191231428753137, 0.9366482133870918, 0.12129469343688981])

结果预测

#  定义函数返回lgb模型 
def model_s(n_estimators,max_depth,num_leaves,min_child_samples,subsample,reg_alpha,reg_lambda):
    lgb = lightgbm.LGBMClassifier(n_estimators=int( n_estimators),max_depth=int(max_depth),num_leaves=int(num_leaves),
                                min_child_samples=int(min_child_samples),subsample=subsample,reg_alpha=reg_alpha,reg_lambda=reg_lambda)

    return lgb
lgb = model_s(245.58122100031977, 5.867566640000227, 28.93708799905978, 39.413612723596565, 0.8191231428753137, 0.9366482133870918, 0.12129469343688981)
{'boosting_type': 'gbdt',
 'class_weight': None,
 'colsample_bytree': 1.0,
 'importance_type': 'split',
 'learning_rate': 0.1,
 'max_depth': 5.867566640000227,
 'min_child_samples': 39.413612723596565,
 'min_child_weight': 0.001,
 'min_split_gain': 0.0,
 'n_estimators': 245.58122100031977,
 'n_jobs': -1,
 'num_leaves': 28.93708799905978,
 'objective': None,
 'random_state': 2020,
 'reg_alpha': 0.9366482133870918,
 'reg_lambda': 0.12129469343688981,
 'silent': True,
 'subsample': 0.8191231428753137,
 'subsample_for_bin': 200000,
 'subsample_freq': 0}
lgb.fit(X_train1,y_train1)

y_pre = lgb.predict_proba(X_test.values)

y_pre

from sklearn.metrics import roc_auc_score

np.array([i[1] for i in y_pre])

roc_auc_score(y_test.values,np.array([i[1] for i in y_pre]))

test_data = pd.read_csv('test_done_1.csv',index_col='id')

test_pre = lgb.predict_proba(test_data.values)

pd.DataFrame({'id':test_data.index,'isDefault':[i[1] for i in test_pre]}).set_index('id').to_csv('sub_1.csv')
LGBMClassifier(max_depth=5, min_child_samples=39, n_estimators=245,
               num_leaves=28, reg_alpha=0.9366482133870918,
               reg_lambda=0.12129469343688981, subsample=0.8191231428753137)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值