世界一のデータサイエンティストを目指して 〜Kaggle参加レポート4〜

こんにちは!
株式会社キスモのKaggler 大越です。

まずはじめに嬉しい報告があります!
Googleが運営するKaggleで6月末まで開かれていた、データ分析の世界大会Avito Demand Prediction Challengeで、なんと、1917チームある中で7位に入りました!
またそれに伴い、上位13チームのみに送られる、最上位メダルのゴールドメダルを獲得しました!!
Kaggleを初めて約1年、最大の目標だったゴールドメダルを取れて嬉しすぎです!

さて、今回のブログではその際に使ったテキストデータの処理に注目して紹介しようと思います。  

テキストデータとは?

テキストデータとは文字通りテキストで書かれたデータの事を言います。

f:id:mishimanatsuki:20180726135107p:plain

この例は、コメントからお店の評価を予測するものです。
応用例としてはECサイトのコメント分析やニュース記事の分析、医療系の書類分析などが挙げられますね。

どのようにお店の評価を予測するのか

予測の際は、まずテキストを数値になおす必要があります。
この例では出てくる単語の数をカウントして数値にしています。

f:id:mishimanatsuki:20180726135110p:plain

そして、その数値を使って下記のような式を作ります

f:id:mishimanatsuki:20180726135116p:plain

こうして見るととても簡単ですよね!
一般的にテキストを用いた分析は、テキスト->数値->予測というプロセスを通して行ないます。

avitoでのソリューション

ここからは技術的な話になります。
今回のavitoの最終的なモデルはstacknetでした。
そのため多様なモデルを作る必要があり、様々なテキストの処理を行いました。
ツールはsklearnのCountVectorizerやTfidfVectorizerを使用しています。
CountVectorizerの説明はこちらがわかりやすいと思います。

vectorizer = FeatureUnion([
        ('text_word',CountVectorizer(
            ngram_range=(1, 2),
            max_features=500000,
            min_df=3,
            binary=True,
            preprocessor=get_col('txt'))),
        ('text_char',CountVectorizer(
            ngram_range=(2, 4),
            max_features=200000,
            min_df=30,
            binary=True,
            analyzer="char",
            preprocessor=get_col('txt')))
    ])

avitoではこれを基本として、下記のような様々な処理を施して多様性を生み出し、ベストなテキスト特徴を探索しました。

  • text_char(文字レベルのngram処理)を使う or 使わない
  • ngram_rangeの変更
  • binary = True or False
  • CountVectorizer or TfidfVectorizer
  • stemmingを使う or 使わない
  • 3種類あったテキストを別々に処理 or 結合して1つのテキストとして処理

どこまで効果があったか正確には測れていないですが、モデルを量産できた1つの要因はこのようなテキスト処理にあります。
これらの処理はメルカリコンペの1位のソリューションを参考にしたものです。

char ngram, ngram rangeの説明

f:id:mishimanatsuki:20180726135117p:plain

ngramとは指定したnの値分の単語または文字を1つのまとまりとする方法です。
n=2なら「見た目・は」という2単語を1つのまとまりとして、CountVectorizerの処理を行います。

また、ngramは分割の方法が2種類あります。
char ngramは「見た目は」というテキストを「見・た・目・は」のように文字ごとに分割してとngram処理を行います。
一方、word ngramは「見た目は」というテキストを「見た目・は」と単語ごとに分割して行います。

stemmingの説明

stemmingを使用すると、「美味しかった」と「美味しい」のように過去形現在形の表記揺れがあるものを同じ「美味しい」として扱ってくれるので、より単語の意味に沿った特徴を作れます。
今回はロシア語だったのでnltkのstemmingを使用しました。

まとめ

今回紹介したのはあくまでsolutionの1部で、さらに詳しいものはこちらに書いてあります。ぜひ読んでみてください!