背景 天池学习赛贷款违约预测
首次参加学习赛的过程在论坛中初识catBoost,希望能通过实践加深印象与理解
catboost 简介 ###三大优点
自动处理类别型特征(categorical features) 。首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成新的数值型特征(numerical features)
catboost还使用了组合类别特征 ,可以利用到特征之间的联系,这极大的丰富了特征维度 。
catboost的基模型采用的是对称树 ,同时计算leaf-value方式和传统的boosting算法也不一样,传统的boosting算法计算的是平均数,而catboost在这方面做了优化采用了其他的算法,这些改进都能防止模型过拟合 。
catboost 实战 首先通过pandas读入数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 import pandas as pdimport datetimeimport warningswarnings.filterwarnings('ignore' ) from sklearn.model_selection import StratifiedKFold #warnings.filterwarnings('ignore' ) #%matplotlib inline from sklearn.metrics import roc_auc_score ## 数据降维处理的 from sklearn.model_selection import train_test_split from catboost import CatBoostClassifier train=pd.read_csv("train.csv" ) testA=pd.read_csv("testA.csv" )
数据中包含了47种不同特征,而且特征的数据类型各不一样,有数值型(creative_height),布尔型(creative_is_js)等不同类型的特征。
而在catboost中不需要预处理数据,只需要提供,哪些特征属于类别特征,它会自动处理。代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 sub=testA[['id' ]].copy() sub['isDefault' ]=0 testA=testA.drop(['id' ,'issueDate' ],axis=1 ) data_x=train.drop(['isDefault' ,'id' ,'issueDate' ],axis=1 ) data_y=train[['isDefault' ]].copy() x, val_x, y, val_y = train_test_split( data_x, data_y, test_size=0.25 , random_state=1 , stratify=data_y ) col=['grade' ,'subGrade' ,'employmentTitle' ,'homeOwnership' ,'verificationStatus' ,'purpose' ,'postCode' ,'regionCode' , 'initialListStatus' ,'applicationType' ,'policyCode' ] for i in data_x.columns: if i in col: data_x[i] = data_x[i].astype('str' ) for i in testA.columns: if i in col: testA[i] = testA[i].astype('str' ) model=CatBoostClassifier( loss_function="Logloss" , eval_metric="AUC" , task_type="CPU" , learning_rate=0.1 , iterations=500 , random_seed=2020 , od_type="Iter" , depth=7 )
最后就是将数据喂给算法进行训练
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 answers = [] mean_score = 0 n_folds = 5 sk = StratifiedKFold(n_splits=n_folds, shuffle=True , random_state=2019 ) for train, test in sk.split(data_x, data_y): x_train = data_x.iloc[train] y_train = data_y.iloc[train] x_test = data_x.iloc[test] y_test = data_y.iloc[test] clf = model.fit(x_train,y_train, eval_set=(x_test,y_test),verbose=500 ,cat_features=col) yy_pred_valid=clf.predict(x_test) print ('cat验证的auc:{}' .format(roc_auc_score(y_test, yy_pred_valid))) mean_score += roc_auc_score(y_test, yy_pred_valid) / n_folds y_pred_valid = clf.predict(testA,prediction_type='Probability' )[:,-1 ] answers.append(y_pred_valid) print ('mean valAuc:{}' .format(mean_score))cat_pre=sum(answers)/n_folds sub['isDefault' ]=cat_pre sub.to_csv('D:/projects/python/test/jupyter/金融预测.csv' ,index=False )
结语 catboot简单易用且功能强大,减弱了对特征工程的依赖,如果面对需要特别多的前期数据处理和特征数值化 的任务,可以很高效锋发挥作用。
<
(no title)
>