a newbie in Porto Seguro’s Safe Driver Prediction(solo参赛 TOP 5%)

本文记录了作者参加Porto Seguro's Safe Driver Prediction比赛的心路历程,从初学者逐步提升,最终取得前5%的排名。文章详细介绍了数据探索、预处理、模型调参、特征筛选、stacking等步骤,以及在面对他人成果诱惑时保持独立思考的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于kaggle

 kaggle是一个国际性质的机器学习竞赛平台,跟国内很多出名的别的平台比,kaggle上参与者之间的交流多很多,可以很大程度上提高参赛人员水平。而且kaggle本身难度也比国内的很多比赛要大很多。

Porto Seguro’s Safe Driver Prediction

 这个比赛是一家巴西的公司发起的预测购买汽车保险后一年内是否会发生理赔。整个比赛组织方提供了一个训练集和一个预测集,原始训练数据有59列,595212条,需要预测的数据有892816条。整个数据集都被处理过,无法通过每一列数据的列名以及其中的数据都被加密。
 比赛过程中每天可以提交五份答案,成绩计算方式是gini系数(2×auc1),答案中的30%将被用于public Leaderboard的排名,这个每次提交都可以看到。剩余数据用于private Leaderboard排名的计算,这个排名是比赛的最终排名在比赛截止的时候会用选手之前上交的且由选手选定的两份答案计算。

大概的历程(絮叨部分)

 整个比赛的过程,从刚开始一个对于分类问题似懂非懂而且自身比较弱的状态慢慢变得有了一些了解。做比赛的过程中自己的成绩从一个负数慢慢做到了0.285,中间学习了很多东西包括stacking,cv等等。
 慢慢的自己的排名接近到了6%的位置,当时由于一些考试的原因,离开比赛去复习了一周左右的时间,考完试回来发现自己排名跌落到了20%左右的位置。
 当时很着急,发现是因为有人公布了自己一个0.287的kernel,这个kernel利用很多别人公布的kernel的输出的答案,进行一次求平均,最后自己可以达到0.287,当时那个阶段完全靠自己的方案达到0.287的非常少。
 在那之后陆续有人通过平均自己的结果与一些公开的kernel的结果达到了很高的排名。这个方法在当时看来是非常有诱惑力的做法,当时很多人就开始就这种方案开始讨论,这种方法是不是一种过拟合。当时我的想法是想自己好好做一份结果出来并不想平均别人的结果,因为自己是来锻炼自己,来学习成长的而不是单纯追求一个成绩。
 在这之后一直在挣扎着想要获得更高的成绩,结果发现就算自己尝试各种方法去融合各种模型也不能达到效果,自己的最高成绩就只是0.285。
 越来越临近比赛的截止日期,每天都有很多人超越自己的排名,慢慢的自己排名就跌到了百分之二十几的位置,每天都很糟心,尝试各种东西catboost,rf,gbdt,xgb,lgb,mlp等等,但是这些算法的各种融合都不能使自己的成绩有很大的提升,自己的成绩稳定在0.285(local cv 0.2895)左右。
 越到后期,越糟心关于比赛的进展,在最后一天,自己决定尝试一下平均自己的答案和别人公布的kernel的输出,最后发现这样可以达到0.286。在最后选择两份答案作为最终计算排名的答案的时候,犹豫了一段时间,自己决定两种方式都试一下,提交一份完全自己做的(0.285),提交一份和其他人平均的结果(0.286),在出成绩的前三分钟里,我在kaggle平台上写了一个discussion,想表达一下自己虽然努力了,但是结果不好的,有点沮丧,想感谢一下比赛中那些回答过自己问题,给予过自己帮助的人。
 在我discussion写一半的时候出成绩了,当时惊喜地发现自己的当初的选择是正确的,相信自己,相信local cv是正确的,很多人都过拟合了,自己public LB的成绩是0.290(private LB 0.285),这个和local cv的结果比较接近,最终自己的排名定在了第240名,总共有5169支队伍参赛。
 整个比赛结束,总结一下要相信自己,要努力,无论何时都要保持一个冷静的心态来面对各种情况。
 整个比赛做完,自己学到了很多东西,收获很多,自己做的东西不足的地方也很多,下面大致列一下自己的大致解决方案,欢迎每一位朋友指出其中的问题与缺陷

整体方案(干货)

数据探索

 面对数据集,里面有空值(原始数据集空值用-1表示),这里先不着急对空值进行处理,先简单判断了一些所有列直接的一个相关性,并画出相关性图,如下:

import pandas as pd;
import numpy  as np;
import seaborn as sns;
import matplotlib.pyplot as plt;
train_data_raw=pd.read_csv("D:/general_file_unclassified/about_code/kaggle/Porto_Seguro_s_Safe_Driver_Prediction/train/train_s.csv");
test_data_raw=pd.read_csv("D:/general_file_unclassified/about_code/kaggle/Porto_Seguro_s_Safe_Driver_Prediction/test/test_s.csv");
train_data_raw=train_data_raw.drop(['id'],axis=1);
corrmat = train_data_raw.corr()
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True);

这里写图片描述

 从上面的图像中可以发现所有名字中带有ps_calc的列与其他列的相关性非常低,这一点将作为后面特征筛选的依据。
 关于空值,由于本次比赛的数据中-1的意义特殊,我们可以通过一些画图手段发现一些列的值为-1的时候该样本发起诉讼的可能性很大,或者很小,例如:

sns.pointplot(x="ps_ind_04_cat", y="target", data=train_data_raw);

这里写图片描述

数据预处理

  1. 去除含有’ps_calc’的列
  2. 保留所有值为-1的空值
  3. 将所有带有cat的列进行onehot
  4. 剩下的所有数据调整尺度到[0,1]之间
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 11 10:58:10 2017

@author: 56390
"""
import pandas as pd;
import numpy  as np;

from sklearn.ensemble import BaggingClassifier;
from sklearn.ensemble import ExtraTreesClassifier;
from sklearn.neural_network import MLPClassifier;
from sklearn.linear_model import LogisticRegression;
from sklearn.svm import SVC, LinearSVC;
from sklearn.ensemble import RandomForestClassifier;
from sklearn.neighbors import KNeighborsClassifier;
from sklearn.naive_bayes import GaussianNB;
from sklearn.linear_model import Perceptron;
from sklearn.linear_model import SGDClassifier;
from sklearn.tree import DecisionTreeClassifier;
from sklearn.metrics import roc_auc_score;
from sklearn.ensemble import GradientBoostingClassifier;
from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
import xgboost as xgb;
import lightgbm as lgb;

from sklearn.feature_selection import RFECV;

from sklearn.preprocessing import OneHotEncoder;
from sklearn.preprocessing import MinMaxScaler;


from preprocess import rawDataProcess;
from stacker import stacker;
from stacker import linearBlending;
from catboost import CatBoostClassifier;

train_data_raw=pd.read_csv("/home/lj407/Data/Lxy_data/kaggle/PortoPrediction/train/train.csv");
test_data_raw=pd.read_csv("/home/lj407/Data/Lxy_data/kaggle/PortoPrediction/test/test.csv");


train_data_raw=train_data_raw.drop(['id'],axis=1);

colListDrop=[];
for column in train_data_raw:
    if 'ps_calc_' in column:
        colListDrop.append(column);

print('ps_calc_以及一些相关性很低的特征删除,,去除的列如下')
print('-'*60);
train_data_raw=train_data_raw.drop(colListDrop,axis=1);        
pri
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值