kaggle数据分析的学习经验

  • 由于大多数机器学习模型对非正态分布的数据的效果不佳,因此,我们对数据进行变换,修正倾斜:log(1+x)
  • 删除离群点
train.drop(train[(train['OverallQual']<5) & (train['SalePrice']>200000)].index, inplace=True)
train.drop(train[(train['GrLivArea']>4500) & (train['SalePrice']<300000)].index, inplace=True)
train.reset_index(drop=True, inplace=True)
  • 多模型stacking
  • 数值型feature进行简单的加减乘除,
  • 高势集类别进行经验贝叶斯转换成数值特征:什么是High Categorical的特征呢?一个简单的例子就是邮编,有100个城市就会有好几百个邮编,有些房子坐落在同一个邮编下面。很显然随着邮编的数量增多,如果用简单的one-hot编码显然效果不太好,因此有人就用一些统计学思想(经验贝叶斯)将这些类别数据进行一个map,得到的结果是数值数据。在这场比赛中有人分享了一篇paper里面就提到了具体的算法。详细就不仔细讲了,用了这个encoding之后,的确效果提升了很多。那么这场比赛中哪些数据可以进行这样的encoding呢,只要满足下面几点:1. 会重复,2. 根据相同的值分组会分出超过一定数量(比如100)的组。也就是说building_id, manager_id, street_address, display_address _ID类特征或者邮编特征 都能进行这样的encoding,而取舍就由最后的实验来决定了。
  • 稀疏特征集用one-hot编码,其实就相当于一系列标签,不同标签的个数也是挺多的,本次比赛我只是简单地采用了counterEncoding的方式进行one-hot编码。值得一提的是,有些标签是可以合并的,比如cat allowed 和 dog allowed可以合并成为 pet allowed,我在这场比赛中手工地合并了一些feature数据,最终结果略微有所提升。
  • 时间特征生成年、月、日等。但是仅提取这些是不够的,其他的点比如时间间隔也可以考虑进来
data["latest"] = (data["created"]- data["created"].min())

data["passed"] = (data["created"].max()- data["created"])

kaggle数据分析的学习经验_第1张图片

  • 将一些基础的特征转换成相应的输入input_X矩阵后,再将label也转换成数值形式
  • cross-validation(CV)
  • 地理位置特征。想到地理位置,就会想到聚类,一个简单的方式将每个房子划分到同一块区域中去;除了聚类以外,算出几个中心点坐标,计算曼哈顿距离或者欧式距离可能都会有神奇的效果。
  • 特征重要程度(feature importance)。通过对重要特征的重新再提取特征,能够发现很多有意思的新特征,这才是用FE打好一场比赛的关键所在。
  • 二值特征的处理方式:
    kaggle数据分析的学习经验_第2张图片
Featexp可以把一个数字特征,分成很多个样本数相等的区间 (Equal Population Bins)from featexp import get_univariate_plots
# Plots drawn for all features if nothing is passed in feature_list parameter.
get_univariate_plots(data=data_train, target_col='target',                     features_list=['DAYS_BIRTH'], bins=10)

横轴是年龄,坐标轴约向左,表示年龄越大
kaggle数据分析的学习经验_第3张图片
创建了一个等间隔的bins的数值特征,然后计算每个bin的均值,然后画到左边,在我们的例子中,目标的均值代表了违约的概率。这个图告诉我们,负值越大(越往左,年龄越大)的人,违约的概率越小。这个图帮助我们理解模型和数据,告诉我们数据如何影响模型的结果。右边的图显示了每个bin中的客户的数量,所有年龄段的人几乎是相等的。

  • 识别嘈杂特征
    两个指标
  1. 趋势变化
    当特征的趋势发生突变或者反复变化时,有可能就是嘈杂特征了。下图就是趋势的反复变化
    kaggle数据分析的学习经验_第4张图片
  2. 趋势相关性
    某特征在训练集和测试集上的趋势相差比较大。
    kaggle数据分析的学习经验_第5张图片
    虽然在训练集和测试集中相关性低的特征可以考虑删除,但是也不可以删去太多特征,否则影响模型效果,嘈杂的特征不一定特征重要性得分低
Featexp里有一个 get_trend_stats() 函数,可以返回一个数据框 (Dataframe) ,显示趋势相关性和趋势变化。代码如下:
from featexp import get_trend_stats
stats = get_trend_stats(data=data_train, target_col='target', data_test=data_test)

kaggle数据分析的学习经验_第6张图片
丢弃特征的相关性阈值越高,排行榜上的AUC越高。

加上不要丢弃重要特征这一条规则,AUC提升到了0.74。

你可能感兴趣的:(比赛)