第四个项目比较简单和有趣,因为它的数据集全部都是分类型特征,在这种情况下,我们又应该怎么做呢。在这里给大家分享一个比较好用的模型catboost和对分类型特征处理的编码方式TargetEncoder。在这个项目中可以方便快捷的对数据进行处理和建模。
Part1.数据导入
import numpy as np
import pandas as pd
import os
from sklearn.exceptions import ConvergenceWarning
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.simplefilter(action='ignore', category=ConvergenceWarning)
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# separate target, remove id and target
test_ids = test['id']
target = train['target']
train.drop(columns=['id', 'target'], inplace=True)
test.drop(columns=['id'], inplace=True)
train.head()
可以看到这次的23个特征全部都是分类型特征,分类型特征是无法直接建模的。一个一个地去处理又比较麻烦,这里我们可以直接使用一个高效的编码方式TargetEncoder
Part2.数据处理
import category_encoders as ce
te = ce.TargetEncoder(cols=train.columns.values, smoothing=0.3).fit(train, target)
train = te.transform(train)
train.head()
TargetEncoder将所有的分类型特征全部变成了可以直接建模的数字
sklearn中多种编码方式——category_encoders
TargetEncoder
目标编码是一种不仅基于特征值本身,还基于相应因变量的类别变量编码方法。对于分类问题:将类别特征替换为给定某一特定类别值的因变量后验概率与所有训练数据上因变量的先验概率的组合。对于连续目标:将类别特征替换为给定某一特定类别值的因变量目标期望值与所有训练数据上因变量的目标期望值的组合。该方法严重依赖于因变量的分布,但这大大减少了生成编码后特征的数量。
公式:
此方法同样容易引起过拟合,以下方法用于防止过拟合:
①增加正则项a的大小
②在训练集该列中添加噪声
③使用交叉验证
如果想了解其他的编码方式,可以点击上面的链接去了解更详细的知识
Part3.数据建模
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
x_train, x_test, y_train, y_test = train_test_split(
train, target,
test_size=0.2,
random_state=100
)
#分训练集和测试集
from catboost import CatBoostClassifier
best_params_cat = {
'max_depth': 2,
'n_estimators': 600,
'random_state': 289,
'verbose': 0
}
#预测
def predict(estimator, features):
return estimator.predict_proba(features)[:, 1]
#计算auc分数
def auc(estimator):
y_pred = predict(estimator, x_test)
return roc_auc_score(y_test, y_pred)
SEARCH_NOW = False
# 搜索最佳参数
if SEARCH_NOW:
params = {
'max_depth': [2, 3, 4, 5],
'n_estimators': [50, 100, 200, 400, 600],
'random_state': [289],
'verbose': [0]
}
best_params_cat = make_search(CatBoostClassifier(), params)
# 建模
cat = CatBoostClassifier()
cat.set_params(**best_params_cat)
cat.fit(x_train, y_train)
print('roc auc = %.4f' % auc(cat))
这里用到的模型catboost,如果想要详细了解的话可以点击下面的链接。
CatBoost原理及实践
简单的说catboost是一种能够很好地处理类别型特征的梯度提升算法库。
可以用来防止我们使用了TargetEncoder后的过拟合,能够降低它带给我们的影响。
为了将所有样本用于训练,CatBoost给出了一种解决方案,即首先对所有样本进行随机排序,然后针对类别型特征中的某个取值,每个样本的该特征转为数值型时都是基于排在该样本之前的类别标签取均值,同时加入了优先级和优先级的权重系数。公式示例如下
这种做法可以降低类别特征中低频次特征带来的噪声。
#数据预测
test = te.transform(test)
pre =cat.predict_proba(test)[:,1]
#数据保存
res = pd.DataFrame()
res['id'] = test_ids
res['target'] = pre
res.to_csv('submission.csv', index=False)
Part4.总结
这个项目并不是很难,主要是想和大家分享两个小帮手,来处理这种只有分类型特征的数据集。希望能对大家有帮助。文中有转载的部分都有贴上原文的链接,希望大家也可以看看详细的内容。谢谢大家的阅读!