ゼファーネットのロゴ

Pythonで機械学習を使用したクロスセル予測

日付:


DevOps Tools Engineer試験のObjective

  • 自動車保険データを使用して、クロスセルとは何かを理解します。
  • クロスセル予測のモデルを構築する方法を学びます。

概要

機械学習の愛好家またはデータサイエンスの初心者の場合は、ガイド付きの旅と一連の優れたプロジェクトに触れることが重要です。この記事では、クロスセル予測に関する機械学習の初心者プロジェクトについて説明します。 予測問題を解決するための基本的なアプローチを示します。

このプロジェクトは、AnalyticsVidhyaが最近開始した非常に包括的な無料コースからの私の学習に触発されています。 あなたは以下のリンクを見つけることができます-

それでは、プロジェクトに飛び込みましょう。

クロスセル予測とは何ですか?

プロジェクトを開始する前に、問題のドメインと問題の定義で使用される重要な用語を理解することが重要です。 金融サービス業界では、クロスセリングが一般的な用語です。

クロスセリングには、既存の顧客に補完的な製品を販売することが含まれます。 これは、マーケティング業界で非常に効果的な手法のXNUMXつです。

理解を深めるために、あなたが銀行の代表者であり、投資信託または保険証券を既存の顧客に販売しようとしているとします。 この方法の背後にある主な目的は、すでに獲得した企業の顧客ベースからの売上高と利益を増やすことです。

クロスセリングは、クライアントとの関係をすでに確立しているため、おそらくビジネスを成長させる最も簡単な方法のXNUMXつです。 さらに、新規顧客の獲得コストが比較的高いため、収益性が高くなります。

クロスセル予測問題の問題ステートメント

このプロジェクトでは、私たちのクライアントは、顧客に健康保険を提供している保険会社XYZLimitedです。 今、彼らは、昨年の保険契約者が会社が提供する自動車保険にも関心があるかどうかを予測するためのモデルを構築したいと考えています。

顧客が自動車保険に関心があるかどうかを推定するモデルを開発することは、会社にとって非常に役立ちます。 これにより、組織はコミュニケーション戦略を計画して、これらの顧客に連絡を取り、ビジネスモデルを最適化できるようになります。

問題の説明とデータセットには、 AnalyticsVidhyaデータハックプラットフォーム。

問題の定義では、顧客が自動車保険に関心があるかどうかを予測するために、人口統計(性別、年齢、地域コードタイプ)、車両(車両の年齢、損傷)、ポリシー(プレミアム、調達チャネル)に関する情報があることを指定しています。 NS。

クロスセル予測のための仮説生成

問題の説明を理解し、必要なドメイン知識を収集したら。 次のステップは、仮説の生成です。 これは、問題の説明から直接発生します。 この段階で考えられる分析のセットが何であれ、それを書き留める必要があります。

構造化された思考アプローチは、ここで私たちを助けます。 私たちの問題ステートメントからいくつかの仮説を述べさせてください。

  1. 男性の顧客は女性よりも自動車保険を購入する傾向があります。
  2. 中年の顧客は保険の提供にもっと興味があるでしょう。
  3. 運転免許証を持っている顧客は、転向する傾向があります。
  4. 新しい車を持っている人は保険に加入することにもっと興味があるでしょう。
  5. すでに自動車保険に加入している顧客は、別の保険に加入することに興味がありません。
  6. 顧客が過去に自分の車を損傷した場合、彼らは保険を購入することにもっと興味を持つでしょう。

上記は、仮説生成のほんの一例です。 好きなだけ追加できます。 最後に仮説の準備ができたら、データを調べてステートメントを検証します。

Pythonでのクロスセル予測の実装

このセクションでは、プロジェクトを実装します。 データセットをデータハックプラットフォームからCSVファイルの形式でダウンロードしました。 データを読んで、私たちに何があるか見てみましょう。

ライブラリのインポート

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns!pip install imblearn from sklearn.metrics import Accuracy_score、f1_score、auc from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import GridSearch sklearn.ensembleからインポートRandomForestClassifier

データセットの読み取り

df = pd.read_csv( '/ content / train_data.csv')df.shape

ここで、最初のステップは、データフレームの上位5行を確認することです。 これにより、データの最初の全体像がわかります。

df.head()

クロスセル予測df-head

df.info()

ここでは、特定のデータセットの機能の基本的な詳細を確認します。 列と同様に、各列のnull以外の値、およびそれぞれのデータ型。

このデータセットには、int12、float64、objectなどのさまざまなデータ型の64列があります。

infoクロスセル予測

次に、指定されたデータセットで欠落している値を探します。

df.isna() 

クロスセル予測データに欠落している値

このデータには欠測値はありません。 したがって、探索的データ分析のステップに進むことができます。

探索的データ分析

特定の問題のモデリングと機械学習ベースのソリューションの作成に取り掛かる前に、データの基本的な特性を理解することが重要です。

たとえば、数値特徴の分布は何ですか? また、EDAは私たちの仮説を検証する役割を果たします。

fig、axes = plt.subplots(2、2、figsize =(10、10)) 

sns.countplot(ax = axes [0,0]、x = 'Gender'、hue = 'Response'、data = df、palette = "mako")sns.countplot(ax = axes [0,1]、x = 'Driving_License'、hue = 'Response'、data = df、palette = "mako")sns.countplot(ax = axes [1,0]、x = 'Previously_Insured'、hue = 'Response'、data = df、palette = "mako")sns.countplot(ax = axes [1,1]、x = 'Vehicle_Age'、hue = 'Response'、data = df、palette = "mako")

クロスセル予測データの棒グラフ

上記の視覚化から、次の推論を行うことができます。

男性の顧客はわずかに多くの車を所有しており、女性の顧客と比較して保険を購入する傾向があります。

同様に、運転免許証を持っている顧客は、それを持っていない顧客の代わりに保険を選ぶでしょう。

XNUMX番目の視覚化は、顧客が保険契約のみを希望していることを示しています。 それはすでに保険に加入している人は回心しないことを意味します。

最後のグラフでは、車両の年齢が2歳未満の顧客は、保険を購入する傾向があります。

sns.countplot(x = 'Vehicle_Damage'、hue = 'Response'、data = df、palette = "mako") 

クロスセル予測データのカウントプロット

上記のプロットから、車両が以前に損傷した場合、顧客はコストを知っているので保険の購入にもっと興味を持つだろうと推測できます。

問題がバランスの取れた問題なのか、アンバランスな問題なのかがわかるので、ターゲット列を確認することも重要です。 これにより、アプローチがさらに明確になります。

値1の応答変数が値XNUMXよりも大幅に低いため、与えられた問題は不均衡の問題です。

Response = df.loc [:、 "Response"]。value_counts()。rename( 'Count')plt.xlabel( "Response")plt.ylabel( 'Count')sns.barplot(Response.index、Response.values 、palette = "mako")

棒グラフ

ここに、年齢の分布があります。 ほとんどのお客様は20〜50歳の年齢層です。 同様に、年間保険料の分布を見ることができます

sns.displot(df ['Age'])

sns.distplot(df ['Annual_Premium'])

分布図

データ前処理

プロジェクトの次のステップは、モデリング用のデータを準備することです。 ここでは、次の前処理手法が使用されています

  1. カテゴリ機能をダミーに変換するか、カテゴリエンコーディングを実行します。
  2. 数値特徴のビニング。
  3. IDなどの不要な列を削除します。

ここにユーザー定義関数があります。 生のデータフレームを渡すだけで、前処理されたデータフレームを取得できます。

def data_prep(df):df = df.drop(columns = ['id'、 'Policy_Sales_Channel'、 'Vintage'])df = pd.get_dummies(df、columns = ['Gender']、prefix = 'Gender') df = pd.get_dummies(df、columns = ['Vehicle_Damage']、prefix = 'Damage')df = pd.get_dummies(df、columns = ['Driving_License']、prefix = 'License')df = pd.get_dummies( df、columns = ['Previously_Insured']、prefix = 'prev_insured')df ["Age"] = pd.cut(df ['Age']、bins = [0、29、35、50、100])df [ 'Age'] = df ['Age']。cat.codesdf ['Annual_Premium'] = pd.cut(df ['Annual_Premium']、bins = [0、30000、35000,40000、45000、50000、np。 inf])df ['Annual_Premium'] = df ['Annual_Premium']。cat.codesdf ['Vehicle_Age'] = df ['Vehicle_Age']。map({'<1 Year':0、 '1-2 Year ':1、'> 2年 ':2})df.drop(columns = [' Region_Code ']、inplace = True)return df df1 = data_prep(df)
df1.head()

df1ヘッドデータ

機能を選択

次のコードでは、モデルトレーニングでのみ使用する機能を選択します。

機能= ['Age'、 'Vehicle_Age'、 'Annual_Premium'、 "Gender_Female"、 "Gender_Male"、 "Damage_No"、 "Damage_Yes"、 "License_0"、 "License_1"、 "prev_insured_0"、 "prev_insured_1"]

トレイン-テスト分割

次のステップでは、手元にあるデータ全体をトレーニングデータとテストデータに分割します。

列車データは、その名前が示すように、機械学習モデルのトレーニングに使用されます。 一方、テストでは、データを使用して予測を行い、トレーニング済みモデルをテストします。

ここでは、テスト用に全データの30%を保持し、残りの70%をモデルトレーニングに使用します。

from sklearn.model_selection import train_test_split X_train、X_test、Y_train、Y_test = train_test_split(df1 [Features]、df1 ['Response']、test_size = 0.3、random_state = 101)X_train.shape、X_test.shape

データの形

不均衡データの問題を処理する

EDAセクションのターゲット変数の分布から、それが不均衡の問題であることがわかります。 不均衡なデータセットには、独自の課題がある可能性があります。

たとえば、疾患予測モデルの精度は99%ですが、患者を正常に分類できない場合は役に立ちません。

したがって、このような問題を処理するために、データをリサンプリングできます。 次のコードでは、アンダーサンプリングを使用します。

アンダーサンプリングは、特定のポイントまで多数決クラスの発生を減らす方法です。

imblearn.under_samplingからimportRandomUnderSampler RUS = RandomUnderSampler(sampling_strategy = .5、random_state = 3、)X_train、Y_train = RUS.fit_resample(df1 [Features]、df1 ['Response'])

クロスセル予測–モデルのトレーニングと予測

次に、モデルをトレーニングして予測を行います。 ここでは、モデルのパフォーマンスを測定するためのユーザー定義関数を作成しました。

パフォーマンス測定には、精度スコアとF1スコアを使用します。 ここで重要なのは、不均衡な分類問題の場合、F1スコアがより重要なメトリックであるということです。

def performance_met(model、X_train、Y_train、X_test、Y_test):

    acc_train = accuracy_score(Y_train、model.predict(X_train))f1_train = f1_score(Y_train、model.predict(X_train))acc_test = accuracy_score(Y_test、model.predict(X_test))f1_test = f1_score(Y_test、model.predict(X ))print( "トレインスコア:精度:{} f1:{}"。format(acc_train、f1_train))print( "テストスコア:精度:{} f1:{}"。format(acc_test、f1_test))

このセクションでは、最初にXNUMXつのモデルをトレーニングします

  • ロジスティック回帰
  • 決定木
  • ランダムフォレスト

ロジスティック回帰

model = LogisticRegression()model.fit(X_train、Y_train)performance_met(model、X_train、Y_train、X_test、Y_test) 

ロジスティック回帰

決定木

model_DT = DecisionTreeClassifier(random_state = 1)model_DT.fit(X_train、Y_train)performance_met(model_DT、X_train、Y_train、X_test、Y_test)

決定木

ランダムフォレスト

Forest = RandomForestClassifier(random_state = 1)Forest.fit(X_train、Y_train)performance_met(Forest、X_train、Y_train、X_test、Y_test)

ランダムフォレスト

すべてのモデルで、ロジスティック回帰モデルのパフォーマンスは大幅に低くなっていますが、決定木モデルとランダムフォレストモデルはほぼ同じパフォーマンスを示しています。

ハイパーパラメータ調整

このプロジェクトの最後のステップは、ハイパーパラメータの調整を行うことです。 これは、最もパフォーマンスの高いハイパーパラメータを見つけるプロセスです。

ここでは、ランダムフォレスト分類器の最適なパラメーターを見つけるためにGridSearchアルゴリズムを使用します。

rf = RandomForestClassifier(random_state = 1)parameters = {'bootstrap':[True]、 'max_depth':[20、25]、 'min_samples_leaf':[3、4]、 'min_samples_split':[100,300]、} grid_search_1 = GridSearchCV(rf、parameters、cv = 3、verbose = 2、n_jobs = -1)grid_search_1.fit(X_train、Y_train)performance_met(grid_search_1、X_train、Y_train、X_test、Y_test)

グリッド検索出力

基本的なハイパーパラメータ調整を使用した後、f1スコアがわずかに改善されたことがわかります。 これをさらに進めて、モデルのパフォーマンスを向上させることができます。

まとめ

この記事では、クロスセル予測について包括的に説明しました。 クロスセル予測は、業界に関連する非常に一般的な機械学習の問題です。

これは、データサイエンスの旅の最初の頃に行った基本的な機械学習プロジェクトです。 機械学習の初心者の場合は、いくつかのプロジェクトを実際に体験することが不可欠です。

ここで機械学習を最初から学びたい場合は、無料のコースがあります-

PlatoAi。 Web3の再考。 増幅されたデータインテリジェンス。
アクセスするには、ここをクリックしてください。

出典:https://www.analyticsvidhya.com/blog/2021/09/cross-sell-prediction-using-machine-learning-in-python/

スポット画像

最新のインテリジェンス

スポット画像