Kaggle - 基本知识

Kaggle - 基本知识

202065

14:46

 

目录

-

- 1. 缺失值处理

        - 方法一,直接扔掉所在列

        - 方法二,缺失值补充

        - 方法三,记录缺失

- 2. 离散的特征取值如何处理?

        - 方法一: 丢弃

        - 方法二:Label Encoding

        - 方法三:One-hot Encoding

- 3. sklearn的封装API

- 4. 少量数据的交叉验证

- 5. 特征数据泄露

        - Target Leakage

        - Train-Test Contamination

 

 

1. 缺失值处理

数据中有缺失值是一件非常正常的事,常见的做法如下。

方法一,直接扔掉所在列

方法二,缺失值补充

就是缺失值插值算法。中值插值、均值插值,众数插值。文中说,复杂的插值在机器学习中可能并不能取得很好的效果,但是为什么?

方法三,记录缺失

这个是新增一行,True or False,记录你是否进行插值。但按照我直觉来看,这个应该作用不大,因为模型真的能够将你插值的值和你插值的行为tight起来吗?我觉得很难。

2. 离散的特征取值如何处理?

常见的取值,例如(男,女)这些究竟如何数据化?其实对于大多数模型来说,直接变成数字编号是没有道理的,因为编号的大小会影响模型的结果,但编号大小和数据离散值之间一般没有关系。

方法一: 丢弃

没什么好讲的。一般不用。

方法二:Label Encoding

如下图,给离散的值编号。但这种做法并不总是有意义的,因为特征值的多少影响模型结果,而给离散变量分类,编号的大小make sense与否,这很重要。不过,在决策树、随机森林一类模型中,特征值的大小并不影响模型结果,所以能使这个方法。图中的编号与实际标签就是一种有意义的编号。

注意点:

  • 需要处理train,val,test中标签集合不同的问题,可能有些便签val,test中有,train中没有。一般是去掉或者标记unknown,我在想,即使你算入集合中,train中没有的数据也学不到东西。

 

方法三:One-hot Encoding

这个方法第一次学到的时候,我觉得还是蛮神奇的。比较难描述,图片能说明这个方法。

即将离散值各自变成一列,然后用1,0表示选中,如同one-hot vector一样。

注意点:

  • 这个方法会使得数据量激增,一般的处理方法是大于某些阈值的就是使用label encoding

3. sklearn的封装API

sklearn的封装技巧。用pytorch的时候一般是用类封装的,这个也差不多,sklearn提供的API,简单来说就是可以在任何类,对象上面的一层管道,它的特点是你可以将一个任意处理序列封装成管道,可以指定DataFrame的哪些行作为对象。

不过我觉得还是不太灵活,有时候一些dl的模型比较复杂,这个不一定能handle住。

 

  1. # Preprocessing for numerical data

    numerical_transformer = SimpleImputer(strategy='constant')
  2. # Preprocessing for categorical data

    categorical_transformer = Pipeline(steps=[
  1.     ('imputer', SimpleImputer(strategy='most_frequent')),
  2.     ('onehot', OneHotEncoder(handle_unknown='ignore'))
  3. ])
  1. # Bundle preprocessing for numerical and categorical data

    preprocessor = ColumnTransformer(
  1.     transformers=[
  2.         ('num', numerical_transformer, numerical_cols),
  3.         ('cat', categorical_transformer, categorical_cols)
  4.     ])
  1. # Define model

    model = RandomForestRegressor(n_estimators=100, random_state=0)
  2. # Bundle preprocessing and modeling code in a pipeline

    clf = Pipeline(steps=[('preprocessor', preprocessor),
  1.                       ('model', model)
  2.                      ])

4. 少量数据的交叉验证

越大的val set,随机性噪声越少。直观地想象,如果val set只有一个样本,如果模型刚好识别不了该样本,那么val acc=0。

有时候,我们会担心是否val set选的不好(随机性问题)导致模型的performance差,那么就可以使用cross-validation,如图。很好理解,就是等量切成几块,分别用其一做val set,其余做train set。

5. 特征数据泄露

数据泄露是数据科学中的重要问题,它通常会影响你的训练结果,让一切看起来似乎很好,但在实际测试中缺不管用。

Target Leakage

标签泄露,这个指的是某些特征可能和标签具有很强的因果关系,但在测试集因为没有标签所以该特征也无法提供信息。说起来可能很抽象,举个例子就很容易理解了。例如在肺炎预测中,如果有一个特征是“是否服用抗生素”,这个特征和肺炎相关性非常强。在训练集中,你会发现只要是服用抗生素,几乎都是有肺炎。这看起来是一个很有用的特征,但事实上是因为得了肺炎医生才会给开抗生素,你在实际预测中,患者要是不知道自己有没有肺炎的情况下,是不可能服用抗生素的!

所以,这种标签泄露很影响结果,有时候又很难发现。

还有另一种情况更难发现,就是在你楼盘销售之后,属性会发现很大变化的特征上,同样容易发生Target泄露。例如在房价预测中,附近房子的平均房价。乍看好像没事,但文章中指出,这个平均价格实际上包含了你要预测的对象,平均价格随着你楼房的卖出会发生变动,考虑极端情况,一个小区只有一间房子,那么它就是你要预测的对象。

Train-Test Contamination

这个有点难理解,You can corrupt this process in subtle ways if the validation data affects the preprocessing behavior. This is sometimes called train-test contamination. 这是原文的描述,说是验证集影响数据预处理,就会造成这种数据泄露。

什么叫验证集影响数据预处理呢?其实就是你在对训练集和验证集进行数据预处理的时候,不能考虑验证集的信息,例如求验证机的均值、方差、分布等等,你不能依赖这些信息去做数据预处理。为什么呢?因为,你在实际应用的模型中,测试数据都是新数据,你不可能提前知道它们的相关信息,例如统计特性。

这一点非常常见,而且在数据预处理很复杂的时候,这件事就很难预防。
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值