首页 > 其他分享 >kaggle竞赛实战8——其他方案之XGBOOST及NLP特征优化

kaggle竞赛实战8——其他方案之XGBOOST及NLP特征优化

时间:2024-06-10 11:04:12浏览次数:21  
标签:NLP index XGBOOST kaggle train params eval test csv

之前都用的集成算法,发现差异不大,考虑在特征优化上提升数据质量,用NLP算法优化id列

有两种方法,分别是countervector和TF-IDF,前者就是词频,后者由TF(词频)和IDF(反文档词频)两部分组成,具体理论部分可参考推荐算法课程学习笔记2:文本特征提取基础_countervector-CSDN博客这篇文章

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer 
from sklearn.preprocessing import OneHotEncoder, LabelEncoder 
from scipy import sparse


      # 创建空DataFrame用于保存NLP特征 
      train_x = pd.DataFrame() 
      test_x = pd.DataFrame() 


      # 实例化CountVectorizer评估器与TfidfVectorizer评估器 
      cntv = CountVectorizer() 
      tfv = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, use_idf=1, smooth_idf=1, sublinear_tf=1) #max_df指词汇表中超过这个阈值的词会被剔除

  # 创建空列表用户保存修正后的列名称 

vector_feature=[]

 for co in ['merchant_id', 'merchant_category_id', 'state_id', 'subsector_id', 'city_id']: 
          vector_feature.extend([co+'_new', co+'_hist', co+'_all']) #


      # 提取每一列进行新特征衍生 
      for feature in vector_feature: 
          print(feature) 
          cntv.fit([feature].append(test[feature])) #统计词频
          train_x = sparse.hstack((train_x, cntv.transform(train[feature]))).tocsr() #tocsr作用是保存成稀疏矩阵的格式,sparse.hstack
          test_x = sparse.hstack((test_x, cntv.transform(test[feature]))).tocsr() 
           
          tfv.fit(train[feature].append(test[feature])) 
          train_x = sparse.hstack((train_x, tfv.transform(train[feature]))).tocsr() 
          test_x = sparse.hstack((test_x, tfv.transform(test[feature]))).tocsr() 


      # 保存NLP特征衍生结果 
      sparse.save_npz(\  preprocess/train_nlp.npz\  , train_x) 
      sparse.save_npz(\  preprocess/test_nlp.npz\  , test_x)  

接下来进行xgboost训练,先导入包
      import xgboost as xgb 
      from sklearn.feature_selection import f_regression 
      from numpy.random import RandomState 
      from bayes_opt import BayesianOptimization  

然后读数据

  train = pd.read_csv('preprocess/train.csv') 
      test = pd.read_csv('preprocess/test.csv')  

注意由于xgboost会自动做特征筛选,因此自己不会去筛

导入特征名和训练数据集

      features = train.columns.tolist() 
      features.remove('card_id') 
      features.remove('target') 

   train_x = sparse.load_npz(\  preprocess/train_nlp.npz\  ) 
      test_x = sparse.load_npz(\  preprocess/test_nlp.npz\  ) 
       
      train_x = sparse.hstack((train_x, train[features])).tocsr() 
      test_x = sparse.hstack((test_x, test[features])).tocsr()  
 

模型训练与优化

参数回调函数 (声明那些固定的参数)
      def params_append(params): 
          \  \  \   
       
          :param params: 
          :return: 
          \  \  \   
          params['objective'] = 'reg:squarederror' 
          params['eval_metric'] = 'rmse' 
          params['min_child_weight' ] = int(params[\  min_child_weight\  ]) 
          params['max_depth'] = int(params['max_depth']) 
          return params 

声明贝叶斯优化过程:

  def param_beyesian(train): 

          # Part 1.数据准备 
          train_y = pd.read_csv(\  data/train.csv\  )['target'] 
          # 数据封装 
          sample_index = train_y.sample(frac=0.1, random_state=2020).index.tolist() #随机抽取一些样例
          train_data = xgb.DMatrix(train.tocsr()[sample_index, : ], train_y.loc[sample_index].values, silent=True) 
           
          # 借助cv过程构建目标函数 :即输入一组超参数
          def xgb_cv(colsample_bytree, subsample, min_child_weight, max_depth, 
                     reg_alpha, eta, 
                     reg_lambda): 
           
              params = {'objective': 'reg:squarederror', 
                        'early_stopping_round': 50, 
                        'eval_metric': 'rmse'} 
              params['colsample_bytree'] = max(min(colsample_bytree, 1), 0) 
              params['subsample'] = max(min(subsample, 1), 0) 
              params['min_child_weight'] = int(min_child_weight) 
              params['max_depth'] = int(max_depth) 
              params['eta'] = float(eta) 
              params['reg_alpha'] = max(reg_alpha, 0) 
              params['reg_lambda'] = max(reg_lambda, 0) 
              print(params) 
              cv_result = xgb.cv(params, train_data, 
                                 num_boost_round=1000, 
                                 nfold=2, seed=2, 
                                 stratified=False, 
                                 shuffle=True, 
                                 early_stopping_rounds=30, 
                                 verbose_eval=False) 
              return -min(cv_result['test-rmse-mean']) 

          # 调用贝叶斯优化器进行模型优化 
          xgb_bo = BayesianOptimization( 
              xgb_cv, 
              {'colsample_bytree': (0.5, 1), 
               'subsample': (0.5, 1), 
               'min_child_weight': (1, 30), 
               'max_depth': (5, 12), 
               'reg_alpha': (0, 5), 
               'eta':(0.02, 0.2), 
               'reg_lambda': (0, 5)} 
          ) 

xgb_bo.maximize(init_points=21, n_iter=5)  # init_points表示初始点,n_iter代表迭代次数(即采样数) 
          print(xgb_bo.max['target'], xgb_bo.max['params']) 
          return xgb_bo.max['params'] 

      def train_predict(train, test, params): 
          \  \  \   
       
          :param train: 
          :param test: 
          :param params: 
          :return: 
          \  \  \   
          train_y = pd.read_csv(\  data/train.csv\  )['target'] 
          test_data = xgb.DMatrix(test) 
       
          params = params_append(params) 
          kf = KFold(n_splits=5, random_state=2020, shuffle=True) 
          prediction_test = 0 
          cv_score = [] 
          prediction_train = pd.Series() 
          ESR = 30 
          NBR = 10000 
          VBE = 50 
          for train_part_index, eval_index in kf.split(train, train_y): 
              # 模型训练 
              train_part = xgb.DMatrix(train.tocsr()[train_part_index, :], 
                                       train_y.loc[train_part_index]) 
              eval = xgb.DMatrix(train.tocsr()[eval_index, :], 
                                 train_y.loc[eval_index]) 
              bst = xgb.train(params, train_part, NBR, [(train_part, 'train'), 
                                                                (eval, 'eval')], verbose_eval=VBE, 
                              maximize=False, early_stopping_rounds=ESR, ) 
              prediction_test += bst.predict(test_data) 
              eval_pre = bst.predict(eval) 
              prediction_train = prediction_train.append(pd.Series(eval_pre, index=eval_index)) 
              score = np.sqrt(mean_squared_error(train_y.loc[eval_index].values, eval_pre)) 
              cv_score.append(score) 
          print(cv_score, sum(cv_score) / 5) 
          pd.Series(prediction_train.sort_index().values).to_csv(\  preprocess/train_xgboost.csv\  , index=False) 
          pd.Series(prediction_test / 5).to_csv(" preprocess/test_xgboost.csv" , index=False) 
          test = pd.read_csv('data/test.csv') 
          test['target'] = prediction_test / 5 
          test[['card_id', 'target']].to_csv(" result/submission_xgboost.csv" , index=False) 
          return  

发现私榜分数3.62,公榜3.72,提升了
             
       

标签:NLP,index,XGBOOST,kaggle,train,params,eval,test,csv
From: https://blog.csdn.net/m0_60792028/article/details/139397985

相关文章

  • Xinhui学习NLP的笔记本:基于MLP/CNN的姓氏分类系统
    ASurnameClassificationSystembasedonMLP基于MLP的姓氏分类系统ThisnotebookservesasmylearningjourneyintotheMultilayerPerceptron(MLP),whichisafundamentaltypeofFeedforwardNeuralNetwork.Throughoutthisarticle,Iwillbeundertakin......
  • 将stanfordcorenlp的tokenizer换成自定义的(或用stanfordcorenlp对自定义tokenizer分词
    本文是基于中文语料做的,对于英文语料应该也是同理,即同样适用的。分析stanfordcorenlp的分词结果,可以发现,它好像是对最小的中文词进行分词,即其对中文的分词粒度很小,这对于某些nlp场景可能就不太合适了,自然的就想到能不能将stanfordcorenlp中用于分词的tokenizer替换掉,替换成自......
  • 细说NLP中的Embedding层
    文章目录前言一、为什么要引入Embedding层二、Embedding层是怎么发挥作用的?三、感受Embedding的强大四、为什么理解Embedding的底层原理?总结前言在构建高效的自然语言处理模型时,Embedding层是不可或缺的组成部分。它不仅可以帮助我们捕获词汇之间的语义关系,还能提高......
  • NLP--词袋模型
    词袋模型如同所有单词打散放到一个袋子中,因此这种模型无法估计语义和语序问题,每个单词都是独立的。1.文本分词:调用jieba库,使用精确模式对每个句子进行分词,并存入列表。2.去除停用词:遍历停用词文件的每一行,删除字符串头和尾的空白字符(包括\n,\r,\t等),加到停用词集合里。然后遍历......
  • NLP--关键词
        在去停用词后的文本中进行词频统计和关键词统计以及词云图显示,来进行文本的关键词提取,让人一目了然。1.词频统计    统计文本中多次出现的词语,来寻找文章中的关键词,因为多次出现很可能就是关键内容。调用统计数量的Counter库和用来分词的jieba库。观察出现......
  • Python信贷风控模型:梯度提升Adaboost,XGBoost,SGD, GBOOST, SVC,随机森林, KNN预测金
    原文链接:http://tecdat.cn/?p=26184 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于信贷风控模型的研究报告,包括一些图形和统计输出。在此数据集中,我们必须预测信贷的违约支付,并找出哪些变量是违约支付的最强预测因子?以及不同人口统计学变量的类别,拖欠还款的概率如何......
  • kaggle竞赛实战6——方案优化之交叉验证
    特征选择一共有两种方法:filter和wrapper,前者根据指标(如相关系数),后者通过模型(如随机森林)筛选超参数搜索也有三种方法——网格搜索和TPE搜索、贝叶斯优化器搜索等,后两者可以进行一定程度的先验计算,并在实际搜索中不断调整先验判断。在完成上述过程后,还要用交叉验证来看超参数选......
  • Python实现SMA黏菌优化算法优化XGBoost回归模型(XGBRegressor算法)项目实战
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景黏菌优化算法(Slimemouldalgorithm,SMA)由Li等于2020年提出,其灵感来自于黏菌的扩散和觅食行为,属于元启发算法。具有收敛速度快,寻优能力强的特点。主......
  • kaggle竞赛系列基于图像对水稻分类代码案例
    目录依赖环境代码导入依赖包定义数据集路径:创建训练集、验证集和测试集的文件夹:代码的作用:设置新的数据集路径与类别名称代码的作用:定义数据预处理和增强变换:代码的作用:定义数据集评估划分与batch大小代码的作用:可视化代码的作用: 评估可视化代码的作用:网络结......
  • NLP--情感词典
    1.建立积极情感词典,消极情感词典,程度词词典和否定词词典。2.调用jieba进行分词。3.遍历分词后的文本列表。进行计算分值。4.输出最后的积极情感分值,消极情感分值和情感总分值。优点:基于词典和规则的模式可以随时添加和删除词语和规则,在情感词覆盖率和准确率高的情况下,情感......