tf-idfを用いたnameの埋め込み(LB 0.8966→0.8187)

今回与えられている変数の中でnameを,単語の出現回数をベクトルでベクトル化するBag-of-Wordsのtf-idfという処理を用いてみます.

なおこの処理では未処理の場合と比べて精度はLBでは0.8966→0.8187と向上したため,nameの処理は非常に重要そうです.
また今回紹介する処理に加えて,nameの文章に対して前処理を行うことで,LB0.8060を達成することができます.

実装例

処理の流れとしては,tf-idfでベクトル化した後にSVDとNMFを用いて次元削減を行います.

import numpy as np
import pandas as pd
from pathlib import Path

from sklearn.decomposition import (
    PCA,
    TruncatedSVD,
    NMF,
)
from sklearn.pipeline import (
    make_pipeline, 
    make_union
)
from sklearn.feature_extraction.text import (
    CountVectorizer,
    TfidfVectorizer,
)

def get_sequence_tfidf(input_df, col, n_comp):
    vectorizer = make_pipeline(
        TfidfVectorizer(),
        make_union(
            TruncatedSVD(n_components=n_comp, random_state=42),
            NMF(n_components=min(n_comp, 10), random_state=42),
        n_jobs=1)
    )
    sequences = input_df[col]
    X = vectorizer.fit_transform(sequences).astype(np.float32)
    cols = (
        [f'{col}_tfidf_svd_{i}' for i in range(n_comp)]
        + [f'{col}_tfidf_nmf_{i}' for i in range(min(n_comp, 10))]
    )
    output_df = pd.DataFrame(X, columns=cols)
    return output_df


INPUT_DIR = Path('../input')
DATA_DIR = INPUT_DIR / 'probspace'

train = pd.read_csv(DATA_DIR / 'train_data.csv')
test = pd.read_csv(DATA_DIR / 'test_data.csv')

merge_df = pd.concat([train, test]).reset_index(drop=True)
merge_X = get_sequence_tfidf(merge_df, 'name', 32)
train_X, test_X = merge_X.iloc[:len(train)], merge_X.iloc[len(train):]

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。