Kaggle實戰入門(四)之Cat-In-The-Dat-ii

2020-09-22 11:00:38

第四個專案比較簡單和有趣,因為它的資料集全部都是分型別特徵,在這種情況下,我們又應該怎麼做呢。在這裡給大家分享一個比較好用的模型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.總結

這個專案並不是很難,主要是想和大家分享兩個小幫手,來處理這種只有分型別特徵的資料集。希望能對大家有幫助。文中有轉載的部分都有貼上原文的連結,希望大家也可以看看詳細的內容。謝謝大家的閱讀!