xgb部分代码

#读取测试集数据
print(get_print_head('读取训练集数据'))
train = pd.read_excel('train.xlsx')
print(get_print_head("训练集 shape"))
print(train.shape)
print(get_print_head("完成训练集数据读取"))
print('\n')

# print(get_print_head("训练集01 head"))
# print(data1_1.head())
# print(get_print_head("训练集02 head"))
# print(data1_2.head())
# print('\n')

print(get_print_head('读取测试集数据'))
test = pd.read_excel('test.xlsx')
print(get_print_head("测试集 shape"))
print(test.shape)
print(get_print_head("完成测试集数据读取"))
print('\n')
train.rename(columns={"姓名":'name','回溯时间':'dt','身份证号':'idcard','手机号':'mobile'},inplace=True)
test.rename(columns={"姓名":'name','回溯时间':'dt','身份证号':'idcard','手机号':'mobile'},inplace=True)
train['dt'] = pd.to_datetime(train['dt'],format='%Y%m%d')
test['dt'] = pd.to_datetime(test['dt'],format='%Y%m%d')
train['dt'] = train['dt'].astype(str)
test['dt'] = test['dt'].astype(str)

print(get_print_head("获取原始变量列表"))
raw_xlist0 = train.columns.tolist()
raw_xlist0 = raw_xlist0[4:]
print("原始变量有{}个".format(str(len(raw_xlist0))))
print(get_print_head("保存原始变量列表"))
raw_xlist0_file = 'raw_xlist0.pkl'
print("原始变量文件名为:{}".format(raw_xlist0_file))
with open(raw_xlist0_file,'wb') as f:
    pickle.dump(raw_xlist0,f)
print(get_print_head("完成保存原始变量列表"))
print('\n')

print(get_print_head("训练集匹配率"))
print("训练集匹配率为{}".format(str(len(train[~train[raw_xlist0].isnull().T.all()])/20000)))
# print(get_print_head("去除未匹配上的训练数据"))
# train = train[~train[raw_xlist0].isnull().T.all()]
# print(get_print_head("完成去除未匹配上的训练数据"))
print('\n')

print(get_print_head("测试集匹配率"))
print("测试集匹配率为{}".format(str(len(test[~test[raw_xlist0].isnull().T.all()])/70000)))
# print(get_print_head("去除未匹配上的测试数据"))
# test = test[~test[raw_xlist0].isnull().T.all()]
# print(get_print_head("完成去除未匹配上的测试数据"))
print('\n')

print(get_print_head("检查字符型变量个数"))
float_xlist1 = raw_xlist0.copy()
for xvar in raw_xlist0:
    try:
        train[xvar] = train[xvar].astype(float)
    except:
        float_xlist1.remove(xvar)
print("字符型变量有{}个".format(str(len(raw_xlist0)-len(float_xlist1))))
print(get_print_head("保存非字符变量列表"))
float_xlist1_file = 'float_xlist1.pkl'
print("非字符变量文件名为:{}".format(float_xlist1_file))
with open(float_xlist1_file,'wb') as f:
    pickle.dump(float_xlist1,f)
print(get_print_head("完成保存非字符变量列表"))
print(get_print_head("保存字符变量列表"))
string_xlist1_file = 'string_xlist1.pkl'
string_xlist1 = list(set(raw_xlist0) - set(float_xlist1))
print("字符变量文件名为:{}".format(string_xlist1_file))
with open(string_xlist1_file,'wb') as f:
    pickle.dump(string_xlist1,f)
print(get_print_head("完成保存字符变量列表"))
print("\n")

print(get_print_head("检查缺失率高于95%变量个数"))
desc = train[float_xlist1].describe(percentiles=[.01,.05,.95,.99]).T
desc["%missing"] = (len(train) - desc["count"]) / len(train)
high_missing_remove_xlist2 = desc[desc["%missing"]<=0.95].index.tolist()
temp_xlist = high_missing_remove_xlist2.copy()
for xvar in temp_xlist:
    group = train.groupby(xvar).size()
    group = pd.DataFrame(group)
    group.reset_index(inplace=True)
    group.rename(columns={0:"cnt"},inplace=True)
    cnt = group["cnt"].max() 
    if cnt / len(train) > 0.95:
        high_missing_remove_xlist2.remove(xvar)
print('缺失率高于95%的变量为{}个'.format(str(len(float_xlist1) - len(high_missing_remove_xlist2))))
print(get_print_head("保存缺失率小于等于95%变量列表"))
high_missing_remove_xlist2_file = 'high_missing_remove_xlist2.pkl'
print("缺失率小于等于95%变量文件名为:{}".format(high_missing_remove_xlist2_file))
with open(high_missing_remove_xlist2_file,'wb') as f:
    pickle.dump(high_missing_remove_xlist2,f)
print(get_print_head("完成保存缺失率小于等于95%变量列表"))
print("\n")

import md
import pandas as pd
import numpy as np
import gc
import scorecardpy as sc
from sklearn.metrics import roc_curve
import xgboost as xgb
import pickle
import json
def cal_iv(data,feature_list):
    fail = []
    bins = {}
    for x in feature_list:
        try:
            bins_ = sc.woebin(data[[x,'label']], y="label")
            bins.update(bins_)
        except:
            print(x)
            fail.append(x)

    iv = pd.Series()
    for k,v in bins.items():
        iv[k] = v['total_iv'].values[0]
    return iv, bins
def get_label(x):
    if x == 0:
        return 0
    elif x >=30:
        return 1
    else:
        return np.nan
    
def ks(y_predicted,y_true):
    fpr, tpr, thresholds = roc_curve(y_true.get_label(),y_predicted)
    return 'ks',-np.max(tpr-fpr)

def ks1(y_predicted,y_true):
    fpr, tpr, thresholds = roc_curve(y_true,y_predicted)
    return 'ks',-np.max(tpr-fpr)

def psi(data1,data2,var):
#数值型特征  
#     data1[var]=data1[var].astype(float)
#     data2[var]=data2[var].astype(float)
    try:
        _,bins = pd.qcut(data1[var],q=10,retbins=True,duplicates = 'drop')

        bins=np.sort(list(set([-np.inf] + bins.tolist()+[np.inf])))
        t1 = pd.cut(data1[var],bins=bins)
        t2 = pd.cut(data2[var],bins=bins)
        t11=t1.value_counts(dropna=False)
        t22=t2.value_counts(dropna=False)
        t11.index=t11.index.astype(str)
        t22.index=t22.index.astype(str)
        t = pd.concat([t11,t22],axis=1).sort_index()

        t.columns = ['base_cnt','test_cnt']
        t['feature']=var
        t.loc[t.base_cnt.isnull(),'base_cnt']=0
        t.loc[t.test_cnt.isnull(),'test_cnt']=0
        t['base_rate'] = t['base_cnt']/t['base_cnt'].sum()
        t['test_rate'] = t['test_cnt']/t['test_cnt'].sum()
        t['psi'] = (t['test_rate']-t['base_rate'])*np.log((t['test_rate']+0.000001)/(t['base_rate']+0.000001))    
        t['total_psi']= t['psi'].sum()
        columns=['feature','base_cnt','test_cnt','base_rate','test_rate','psi','total_psi']
        t=t.loc[:,columns]
        return t
    except:
        print('无数据!',var)
# group_all = pd.DataFrame()
# for xvar in xlist:
#     print(xvar)
#     group = raw.groupby([xvar,"label"]).size().reset_index()
#     group = pd.DataFrame(group)
#     group.rename(columns={0:"cnt"},inplace=True)
#     group0 = group[group["label"]==0]
#     group0.rename(columns={"cnt":"good"},inplace=True)
#     group1 = group[group["label"]==1]
#     group1.rename(columns={"cnt":"bad"},inplace=True)
#     group0 = group0[[xvar,"good"]]
#     group1 = group1[[xvar,"bad"]]
#     group = pd.merge(group0,group1,how='outer',on=xvar)
#     group["total"] = group["good"]+ group["bad"]
#     group["%total"] = group["total"] / group["total"].sum()
#     group["%bad"] = group["bad"] / group["total"]
#     group.rename(columns={xvar:"value"},inplace=True)
#     group["xvar"] = xvar
#     group = group[["xvar","value","good","bad","total","%total","%bad"]]
#     group_all = pd.concat([group_all,group])
with open(r"br2_features.pkl",'rb') as f:
    br2_feature = pickle.load(f)
train_xlist3 = list(iv_table[iv_table['iv']!=0]['xvar'])
with open("train_xlist3.pkl","wb") as f:
    pickle.dump(train_xlist3,f)
for xvar in train_xlist3:
    train[xvar] = train[xvar].astype(float)

train = pd.read_pickle('train.pkl')
test = pd.read_pickle('test.pkl')
with open("train_xlist3.pkl","rb") as f:
    train_xlist3 = pickle.load(f)
clf1 = xgb.XGBClassifier(learning_rate=0.1,max_depth=3,min_child_weight=250,subsample=0.7,colsample_bytree=0.6,reg_alpha=3,n_estimators=500,n_jobs=30,scale_pos_weight=167)
clf1.fit(train[train_xlist3],train["label"],
        eval_metric=ks,    #ks
        eval_set=[(train[train_xlist3],train["label"]),(test[train_xlist3],test['label'])],
        early_stopping_rounds=100)

importance = pd.DataFrame()
importance["xvar"] = train_xlist3
importance["importance"] = clf1.feature_importances_
importance["importance"] = importance["importance"].astype(float)
importance.sort_values('importance',ascending=False)
out = pd.DataFrame()
out['FLAG']=train['label']
out['Y_PRED']=clf1.predict_proba(train[train_xlist3])[:,1]
print(md.PowerX(out,'Y_PRED','FLAG'))
md.x_split_n(out,'Y_PRED','FLAG')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容