逆戻り、個人化、そしてKaggle症候群

「逆戻りから個人化へ、そしてKaggle症候群」

Artem Beliaikinさんによる写真(引用元:Unsplash)

最近、Kaggle Black Friday Predictionデータセットを使用した予測のケーススタディを行いました。このデータセットは6年前に作成され、32,000回以上ダウンロードされています。Kaggle上にはこのデータセットに関する100以上のノートブックが公開されていますが、他の場所でもさらに多くの解決策が提供されています。しかし、これらの解決策のほとんどは実装が不十分であるという問題があります。

他人の仕事の欠点を単に指摘するだけでは役に立ちません。しかし、同じ間違いを多くの人が犯している場合、その根本的なパターンを調査する価値があります。この投稿では、既存の解決策の一般的な問題点について説明し、なぜ私がKaggleのファンではなくなったのか、より良い解決策を提案し、個別の予測アプローチを概説します。

アジェンダ

· EDA目標の見落としKaggle症候群効果的な回帰パーソナライズまとめの言葉参考文献

EDA

Kaggle Black Friday Predictionデータセットは人気がありますが、その目的は明確ではなく、データの詳細を説明するデータ辞書もありません。さらなる分析を行うには、データセットの目標、準備方法、特定の方法で設計された理由を理解する必要があります。この情報は、特徴エンジニアリング、モデル選択、下流の評価に不可欠です。実世界の機械学習プロジェクトでは、最良の機械学習ソリューションはデータの深い理解に基づいて構築されるため、この予備分析も重要です。

EDAはスキップしましょう。サンプルデータは以下のようになります:

データセットは537577行12列で、ユーザープロファイル特徴グループと製品特徴グループに分かれています。以下に説明します:

ユーザープロファイル特徴グループ:

  • User_ID:ユーザーの一意のID。データセットには合計5891人のユーザーがいます。
  • Gender:トランザクションを行った人の性別をM/Fの形式で示します。
  • Age:トランザクションを行った人の年齢グループを示します。
  • Occupation:ユーザーの職業を示し、0から20の数値でラベル付けされます。
  • City_Category:ユーザーの居住する都市のカテゴリー。都市は「A」、「B」、「C」の3つの異なるカテゴリーに分類されます。
  • Stay_In_Current_City_Years:ユーザーがこの都市に住んでいる期間を示します。
  • Marital_Status:ユーザーが既婚でない場合は0、既婚の場合は1です。

製品特徴グループ:

  • Product_ID:製品の一意のID。データセットには合計3623個の製品があります。
  • Product_Category_1 to _3:製品のカテゴリー。すべてのカテゴリーは数値でラベル付けされています。

ターゲット:

  • Purchase:購入額。

データセットのプロフィールに示されているように、整数とカテゴリーの特徴があります。Product_Category_2の欠損値率は31.6%であり、Product_Category_3の欠損値率は69.7%です。

データには興味深い詳細があります。たとえば、Product_Category_1は常にProduct_Category_2よりも大きく、Product_Category_2は常にProduct_Category_3よりも大きいです。これはこれら3つの特徴間に論理的な関連があることを示唆していますが、説明されていません。おそらく、これらの3つのカテゴリーは時間的に制約されています。たとえば、出荷時間vs. 販売時間vs. 非販売時間などです。ただし、これは推測の過ぎるものです。このパターンを十分に活用することはできません。

データセットの目標が説明されていなかったため、私たちは探偵の帽子を被り、データセットデザイナーが真の意図を隠している場所を尋ねることにしましょう。「データセットデザイナーは真の意図をどこに隠しているのか?」 答えはテストセットにあります。なぜなら、テストセットは、データセットデザイナーがモデルのパフォーマンスを評価する方法だからです。ですから、トレーニングセットとテストセットを比較して、何が見つかるか見てみましょう。

実際には、トレーニングセットとテストセットを比較することで、テストセットにはトレーニングセットからのすべてのユーザーと製品が含まれていることが明らかになりましたが、テストセットとトレーニングセットの間で共有されるユーザー-製品ペアはありません。これは、予測が実際には個別の推奨システムであり、通常の回帰ではないことを意味します。つまり、分析者に、ユーザーの前回の購入情報に基づいて、すべてのユーザーの他の製品の購入を予測するように求めています。

達成されなかった目標

回帰と個別化の違いは、回帰モデルはグローバルなパターンを学習するのに対して、個別化モデルはユーザーと製品の間の相互作用を学習することです。通常の回帰モデルは、データサイズが小さい場合でも相互作用を学習することができます。実際の問題は、データサイズが大きくなると重要性が増します。

モデルが個別化の相互作用について学習するためには、ユーザーと製品の両方の特徴量をカテゴリカルな特徴量として扱う必要があります。ほとんどの場合、両方の特徴量は多数のレベルを持っています。ブラックフライデーパイプライン予測の場合、5891人のユーザーと3623の製品があります。これはすでに非常に小さなデータセットですが、通常の回帰モデルでは快適な領域を超えています。

回帰モデルがカテゴリカル特徴量を扱うための標準的な方法は、ワンホットエンコーディングです。つまり、各カテゴリカルレベルを新しい列として配置することです。ただし、この技術は個別化タスクではうまく機能しません。5891 x 3623は非常に大きくて非常に疎な2D配列を生成します。配列のセルの数は、データセットの行数よりもはるかに大きいです。結果の配列は非常に疎であり、大部分のセルは空です。これにより、計算が非常に困難になり、さらに重要なことに、高次元の呪いのために一般的な回帰モデルは配列から何も学習することができません。

高次元性の問題を回避するために、すべての公開分析では、製品列、ユーザー列、またはその両方を削除しました。製品列を削除すると、特定の製品カテゴリでユーザーの行動を予測したいと言っていることになります。ユーザーカラムを削除すると、特定の人口統計的特徴を共有するユーザーグループでの特定の製品の販売を予測したいと言っていることになります。ユーザーと製品の両方の特徴を削除すると、特定のユーザーグループで特定の製品カテゴリの購入を予測したいことを意味します。これらはまったく単一のユーザーから単一の製品への予測の種類ではありません。目標の明確な理解がなければ、すべての作業は失敗するでしょう。

Kaggle症候群

すべての公開分析は開始時点で失敗したことに気づきました。彼らはデータセットの目的を見つけるために十分な努力をせず、分析をトレーニングデータに限定し、タスクを通常の回帰問題として扱っていますが、タスクを十分に理解していません。この点はKaggleに共通する問題です。

私は機械学習の旅の初めにはKaggleの熱心なファンでしたが、すぐに興味が薄れました。技術的なアイデアを時折参照するためにKaggleをブラウズすることはありますが、もはや大ファンではありません。その理由の1つは、ランキング上位に入ることができなかったからです。もう1つの理由は、Kaggleのコンペのスタイルが実世界の機械学習の実践とは相性が悪いと感じたからです。

すべてのKaggleの競技者は、自分のモデルから性能を最大限に引き出すことに非常に集中しています。実世界では、優先事項は完全に逆です:ビジネスの価値を提供することがはるかに重要な最優先事項です。多くの場合、モデルのパフォーマンスはあまり重要な要件ではありません。モデルがビジネスに非常に適している場合、正確性が0.95であるか0.96であるかなど、誰も疑問に思わないでしょう。パフォーマンスがプロジェクトにとって重要である必要性はまれです。

コンペのもう1つの問題は、対話の欠如です。データセットが与えられたら、それだけです。参加者は質問をするための余地がほとんどありませんし、要件を変更する余地もほとんどありません。ブラックフライデーデータセットのような場合、興味深いパターンが見えますが、なぜそうなるのかわかりませんし、パターンを利用することもできません。実世界のプロジェクトでは、質問することはプロジェクトの失敗を防ぐための最も簡単な戦略です。

さらに重要なことは、Kaggleのコンテストは私たちにビジネスの文脈との「接触を失わせる」という習慣を身につけさせます。

私はいくつかの雇用者がKaggleのコンテストの勝者を採用していることを知っています。それは参加者にとっての刺激の一つです。しかし、私はKaggleスタイルの機械学習が現実のビジネスにとって有害かもしれないと心配しています。そのような例の一つがZillowです。ZillowはKaggleの住宅価格予測コンテストをスポンサーし、勝者に仕事の機会を提供しました。不動産市場が持続的に上昇したとき、Zillowは機械学習から多くの利益を得ました。しかし、不動産市場が逆方向に転換したとき、Zillowはほぼ破綻しかけました。

何が間違っていたのでしょうか?公平に言えるのは、Zillowのデータサイエンティストはビジネスにあまりにも無頓着であったという問題です。そうでなければ、彼らは市場の転換点や何かが起こったときのリスクのレベルなどのトピックを調査するために時間を費やしたでしょう。私たちが見てきたように、彼らは市場の下降に対して準備不足ではなかったでしょう。

私はKaggleで日夜を過ごし機械学習を学ぶ初心者の皆さんに、ビジネスシナリオを考え、機械学習を現実世界で応用する洞察力を身につける時間を割いてほしいと思います。それは誰も教えることのできないソフトスキルです。ただ質問を増やすことから始めて、そこに到達しましょう。

うまくいく回帰

私たちが求めるものに近づくために、どのように定常回帰モデルを実装できるか見てみましょう。前述のように、一般的な回帰方法で個別化を行う際の主な問題の一つは、高次元の寸法です。従来のワンホットエンコーディングは機能しません。ラベルエンコーディングは見た目が良くありません。なぜなら、特徴のラベルがターゲットと順序的な関係を持つことを意味するからです。ビニングやハッシングも好きではありません。異なるエンコーディング方法を試してみましょう:ターゲットエンコーディングです。

ターゲットエンコーディングでは、カテゴリーレベルを整数ではなく、平均ターゲット値で置き換えます。これは高次元の問題をうまく解決し、代表的な値に情報をもたらすことができます。

モデルのトレーニングに移る前に、11つの特徴をすべてカテゴリカルとし、それらをターゲットエンコードします。また、ターゲットをsqrt()で正規化し、[0.0、10.0]の範囲にスケール変換します。なぜなら、私が試したいくつかのアルゴリズムは、その範囲のターゲット値のみを受け入れる制約があったからです。

コードは以下の通りです:

# Train_test_splitingX_train, X_test, y_train, y_test = train_test_split(df_blackfriday_data.drop('Purchase', axis=1), df_blackfriday_data['Purchase'], random_state=random_seed, test_size=0.25)print(X_train.shape, y_train.shape)print(X_test.shape, y_test.shape)# Target encodingfrom category_encoders import TargetEncoderencoder = TargetEncoder()enc = encoder.fit(X=X_train, y=y_train)df_train_X = enc.transform(X_train)df_test_X = enc.transform(X_test)# Model trainingxgb_reg = XGBRegressor( seed=random_seed)xgb_reg.fit(df_train_X, y_train)xgb_y_pred = xgb_reg.predict(df_test_X)print('Scaled RMSE:', sqrt(mean_squared_error(y_test, xgb_y_pred)))print("RMSE on the original test data is ",sqrt(mean_squared_error((y_test*15 + 3.464)*(y_test*15 + 3.464), (xgb_y_pred*15 + 3.464)*(xgb_y_pred*15 + 3.464))))

上記のコードは2つのRMSEを生成します。スケールされたRMSEは変換されたターゲットに対するものであり、もう一つは元のターゲットに対するものです。結果は次のようになりました:

Scaled RMSE: 0.8845836109788747

RMSE on the original test data is 2522.1269855375003

そのパフォーマンスは、すべてのオープンな分析結果を上回りました。特徴の重要性プロットから、その理由を明確に理解することができます:

最も重要な要素は、user_idとproduct_idの特徴であり、それらは多くの分析で無視されています。ターゲットエンコーディングは秘密の武器ではありませんが、正しい意思決定に至る洞察が違いを生み出しました。さらに改善する方法を見てみましょう。

パーソナライゼーション

上記の回帰解法は、高次元の寸法を処理するためにターゲットエンコーディングのトリックを利用しています。ターゲットエンコーディングは理想的ではないかもしれませんが、類似したターゲット平均値を持つユーザーや商品の違いをぼやかしてしまいます。巨大なユーザー-商品配列に直接対応する別のテクノロジーのファミリーがあります。それはレコメンデーションシステムとして知られています。レコメンデーション技術を使用して個別化された予測を提供することもできます。典型的なレコメンデーションシステムでは、入力データ構造は巨大な2次元配列であり、ユーザーが1次元、アイテムが他の次元、購入がセルの値となります。

推薦分析和個性化分析最經典的方法是協同過濾。換句話說,它通過對用戶與用戶或項目與項目之間的相似性進行評分來預測用戶的偏好。如果你搜索推薦或協同過濾,你經常會看到以下類似的圖表,因為這些想法是在一個電影推薦競賽中發明的。在那種情境下,概念是用戶、電影和評分,這與我們的情況下的用戶、產品和購買相等。

自那時以來,還出現了一些其他技術。其中一種方法是矩陣分解,將巨大的矩陣分解為幾個低秩矩陣的乘積。另一個著名的解決方案是深度學習。

讓我們嘗試使用FastAI來構建一個基準DNN模型。請注意,我們的模型僅使用用戶和產品特徵進行訓練,所有其他特徵都被忽略。

from fastai.collab import CollabDataLoaders, collab_learner
# 構建用戶-項目-評分數據框
ratings_dict = {'item': list(trainset.Product_ID),
                'user': list(trainset.User_ID),
                'rating': list((trainset.Purchase.pow(1/2)- 3.464)/15)}
ratings = pd.DataFrame(ratings_dict)

ratings_test_dict = {'item': list(testset.Product_ID),
                     'user': list(testset.User_ID),
                     'rating': list((testset.Purchase.pow(1/2) -3.464)/15)}
ratings_test = pd.DataFrame(ratings_test_dict)

# 模型訓練
learn = collab_learner(dls, n_factors=160, use_nn=True, y_range=(0, 10))

import warnings
with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    learn.fit_one_cycle(5, 5e-3, wd=0.1)

# 評估
dl = learn.dls.test_dl(ratings_test, with_labels=True)
with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    aaa = learn.get_preds(dl=dl)
    aaatestset['y'] = (testset['Purchase'].pow(1/2) -3.464)/15
testset['y_pred'] = [x.tolist()[0] for x in aaa[0]]

from sklearn.metrics import mean_squared_error
from math import sqrt
print('標準化後的RMSE', sqrt(mean_squared_error(testset['y'], testset['y_pred'])))
testset['Purchase_pred'] = (testset.y_pred*15 +3.464) * (testset.y_pred*15 +3.464)
print('原始測試集的RMSE', sqrt(mean_squared_error(testset['Purchase'], testset['Purchase_pred'])))

結果如下:

標準化後的RMSE 0.8624311160502426

原始測試集的RMSE 2460.1524061340824

這個結果比基於target_encoded用戶ID和產品ID的先前XGBoost模型顯著好。訓練的DNN模型非常簡單:

該模型使用嵌入來轉換用戶ID和產品ID,並且只使用一個梯度下降層。你可能會想知道為什麼我們必須放棄所有用戶屬性和產品信息。我們是否可以在預測中包含所有這些特徵?

這是一個合理的問題。在實際的業務場景中,典型的推薦系統的一個缺點是我們對所學的模式沒有控制力。它更像是一個黑箱,沒有透明度,沒有手段來操縱結果。它對於與其他記錄沒有相似之處的新用戶或新產品該如何處理一無所知。這就是所謂的冷啟動問題。協同過濾或矩陣分解結構中的這個問題需要更多的努力來解決,因為這些技術無法處理多變量數據。DNN模型可以輕松解決這個問題。我們只需要將其他特徵的嵌入作為輸入,修改模型參數,就完成了。

結語

在我們的實驗中,我們發現看似貧瘠的用戶ID和產品ID特徵中包含著豐富的信息。我們只根據用戶自身的歷史行為就可以發現非常有用的模式,而無需其他任何信息。我們沒有進一步優化超參數調整或任何性能增強技術。一旦我們找到了正確的方向,獲得良好的結果就非常簡單。

このケーススタディでは、最も重要なのは文脈を理解し、適切な技術を選択することです。ビジネスの洞察力がこの分析に重要な役割を果たしました。実際、ビジネス問題は、映画の推薦問題を解決するために開発された協調フィルターシステムなど、機械学習ソリューションの大半のインスピレーションとなっています。同様に、ビジネスの理解は機械学習を学ぶための良い加速剤です。

参考文献

ブラックフライデー

Kaggleは世界最大のデータサイエンスコミュニティであり、強力なツールとリソースを提供してデータ分析をサポートします…

www.kaggle.com

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more