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):]