機械翻訳について

3.3.4 評価

様々なメトリックと手法を使用してパフォーマンスを評価し、モデルが新しい目に見えないデータにどの程度効果的に一般化されているかを判断して、モデルを評価します。 このプロセスでは、モデル・タイプに応じて、精度、適合度、リコール、F1スコア、平均平方根誤差などのメトリックを使用して、予測と実績結果を比較します。 この評価は、モデルの長所と短所を特定し、さらなる改善やチューニングをガイドするのに役立ちます。

情報およびモデルの設定

ノート:

k-Meansモジュールで使用可能な設定の完全なリストを取得するには、次のスクリプトを実行します:
help(oml.algo.km)

次のステップは、様々なモデル詳細ビューの表示に役立ちます。

  • km_mod1を使用して、モデル設定、係数、フィット詳細など、k-Meansモデル・オブジェクトを介して使用可能なモデル詳細にアクセスします。
     km_mod1

    km_mod1モデルの出力を示します。

  • km_mod1.clustersを使用して、クラスタ情報をリストします。
    z.show(km_mod1.clusters)

    km_mod1のクラスタを示します。

  • 次のスクリプトを実行して、各列に関するモデルの重心を表示します。 数値属性の平均差異およびカテゴリ属性のモードを示します。
    z.show(km_mod1.centroids)

    km_mod1の中心を示します

  • kの最適値を決定するには、Elbowメソッドを使用します。 kが指定された範囲にある場合、指定された範囲内の各kに対してk-Meansを実行して、最適なkを検索します。 kごとに、クラスタ内の差異を検索します。 kの値が増加すると、クラスタ内の分散が減少します。 これは、より多くのセンターが、特定の重心のデータ・ポイントが平均してより少ない距離にあることを意味します。 各データ・ポイントが中心であると仮定すると、クラスタ内の差異はゼロになります。 kの最適な値より前は、クラスタ内の差異の減少は、新しいクラスタ内のデータ・ポイントがますます近くなるため、比較的大きくなります。 kの最適値の後、形成される新しいクラスタが互いに類似するため、減少は遅くなります。 kの範囲は、最適値で急激な減少が見られ、その後の遅い減少がプロットにほぼ線形パターンを形成するように選択すべきです。 通常、カーブ全体はLシェイプのように見え、最適なKは回転点またはLシェイプの肘にあります。
    incluster_sum = []
    for cluster in range(1, 9):
        setting = {'kmns_iterations': 15, 'KMNS_RANDOM_SEED': 1}   
        km_mod2 = oml.km(n_clusters = cluster, **setting).fit(CUSTOMER_DATA_CLEAN)
        incluster_sum.append(abs(km_mod2.score(CUSTOMER_DATA_CLEAN)))
         
    plt.plot(range(1, 9),incluster_sum) 
    plt.title('The Elobw Method Graph') 
    plt.xlabel('Number of clusters(k)') 
    plt.ylabel('wcss_list') 
    plt.show()

    グラフを表示します。

    エルボジョイントまたは最適なクラスタの数は、k=3で観察できます。

  • クラスタの最適値に従って最終モデルを構築します。
    try:
        oml.drop(model="CUST_CLUSTER_MODEL")
    except:
        pass
          
    setting = {'KMNS_ITERATIONS': 20,
               'KMNS_DISTANCE': 'KMNS_EUCLIDEAN',
               'KMNS_NUM_BINS': 10,
               'KMNS_DETAILS': 'KMNS_DETAILS_ALL',
               'PREP_AUTO': 'ON'}
    km_mod3 = oml.km(n_clusters = 3, **setting).fit(CUSTOMER_DATA_CLEAN, model_name = "CUST_CLUSTER_MODEL", case_id = 'CUST_ID')
  • 次のスクリプトを実行して、モデルのクラスタおよびクラスタ階層の親子関係を表示します。
    z.show(km_mod3.clusters)

    km_mod3のクラスタを示します。

    cluster_id 3、4および5のクラスタは、1369行、1442行および1422行のデータ・ポイントを含むリーフ・クラスタです。 cluster_idが1のクラスタは、parent_cluster_idがnanと同じであるため、バイナリ・ツリーのルートです。

  • 次のスクリプトを実行して、親/子関係のみを取得します。
    z.show(km_mod3.taxonomy)

    タクソノミを表示します。

  • リーフ・クラスタのクラスタ属性ごとのセンター(centroid)情報を表示するには、モデル属性centroidsを使用して、各クラスタおよび属性の平均、差異およびモード値などのモデル統計を表示します。
    km_mod3.centroids[km_mod3.centroids["CLUSTER_ID"]>=3]

    クラスタリングgt 3を示します。

    クラスタID 3には、Y_BOX_GAMESおよびCUST_INCOME_LEVELの平均が最も高いユーザーがあります。

  • モデルkm_mod3の場合、モデル属性cluster_histsを使用してクラスタ・ヒストグラムdetails.Toを表示します。クラスタID 5のCUST_INCOME_LEVEL属性のヒストグラムの詳細を参照してください。
    mod_histogram=km_mod3.cluster_hists
     
    z.show(mod_histogram[(mod_histogram['cluster.id']==3) & 
           ((mod_histogram['variable']=='CUST_INCOME_LEVEL:A: Below 30,000') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:B: 30,000 - 49,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:C: 50,000 - 69,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:D: 70,000 - 89,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:E: 90,000 - 109,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:F: 110,000 - 129,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:G: 130,000 - 149,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:H: 150,000 - 169,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:I: 170,000 - 189,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:J: 190,000 - 249,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:K: 250,000 - 299,999') | 
            (mod_histogram['variable']=='CUST_INCOME_LEVEL:L: 300,000 and above'))])

    km_mod3のmodヒストグラムを表示

    このヒストグラムは、クラスタID 3をCUST_INCOME_LEVELに基づいてビンにグループ化します。 顧客数が最も多いビンでは、年間190,000から249,999までの給与が得られます。

  • クラスタになんらかの確率でケースを割り当てる条件を提供するモデル属性ルールを使用して、リーフclusters(3,4 and 5)のサポートおよび信頼度レベルを確認します。 支持度および信頼度は、クラスタリング・ルールとケースとの関係を説明するメトリックです。 支持度は、ルールに該当するケースの割合です。 信頼度は、このルールによって記述されたケースがクラスタに割り当てられる確率です。

    km_mod3.rules

    ルールを表示します。

    前述のデータ・フレームの列ヘッダーでは、次の項目を指定します:

    • cluster.id: モデルrhs.support内のクラスタのID: レコード数rhs.conf:
    • rhs.support: レコード数
    • rhs.conf: レコードの信頼度
    • lhr.support: ルール・サポート
    • lhs.conf: ルールの信頼性
    • lhs.var: 属性述語名
    • lhs.var.support: 属性述語のサポート
    • lhs.var.conf: 属性述語の信頼度
    • 述語: 属性述語
  • 次のスクリプトを実行して、各リーフ・ノードに存在するクラスタIDとデータ・ポイントの合計数を取得します。 各ツリー・レベルのデータ・ポイントの合計数は、常に保存する必要があります。 ルート・ノードに存在するデータ・ポイントの合計数は、リーフ・ノードに存在するすべてのデータ・ポイントの合計と同じである必要があります(1369+1442+1422=4233)。
    z.show(km_mod3.leaf_cluster_counts)

スコア

k-Meansによって検出されたクラスタは、新しいレコードが各kクラスタに属する確率を推定することによって、新しいレコードのスコアリングに使用されます。 確率が最も高いクラスタがレコードに割り当てられます。

  1. このステップでは、CUSTOMER_DATA_CLEANで予測を行い、CUST_IDをサプリメンタル列として追加して、スコアをデータに一意に関連付けることができます。 これを行うには、次のスクリプトを実行します:

    pred = km_mod3.predict(CUSTOMER_DATA_CLEAN, supplemental_cols = CUSTOMER_DATA_CLEAN[["CUST_ID"]])
    z.show(pred)

    テスト・データの予測を表示します。

  2. データ上の各クラスタの確率を返す予測を行うには、predict_proba関数を使用します。
    pred = km_mod3.predict_proba(CUSTOMER_DATA_CLEAN, supplemental_cols = CUSTOMER_DATA_CLEAN[["CUST_ID"]])
    z.show(pred)

    予測プローブを表示します。

  3. Embedded Python Executionを使用すると、前述のすべてのタスクを達成できます。 データベース環境によって生成および管理されるPythonエンジンでユーザー定義Python関数を呼び出すことができます。 oml.do_eval関数を使用して、k-Meansモデルを構築し、レコードをスコアリングして結果を表示するユーザー定義入力関数を実行します。
    def build_km_1():
        
        setting = {'KMNS_ITERATIONS': 20,
               'KMNS_DISTANCE': 'KMNS_EUCLIDEAN',
               'KMNS_NUM_BINS': 10,
               'KMNS_DETAILS': 'KMNS_DETAILS_ALL',
               'PREP_AUTO': 'ON'}
       
        # Create a KM model object and fit it.
        try:
            oml.drop(model="CUST_CLUSTER_MODEL_EPE")
        except:
            pass
        km_mod_epe = oml.km(n_clusters = 3, **setting).fit(CUSTOMER_DATA_CLEAN, model_name = "CUST_CLUSTER_MODEL_EPE", case_id = 'CUST_ID')
         
        # Show model details.
        #km_mod_epe
        pred=(km_mod_epe.predict(CUSTOMER_DATA_CLEAN,  supplemental_cols =CUSTOMER_DATA_CLEAN[:, ['CUST_ID']]))
        return pred
     
    z.show(oml.do_eval(func = build_km_1))

    do_evalの出力を示します。

  4. 次のスクリプトを実行して、各クラスタに属するCUST_ID (102308)を持つ顧客c1の確率スコアを表示します。
    c1=CUSTOMER_DATA_CLEAN[CUSTOMER_DATA_CLEAN['CUST_ID']==102308]
    km_mod3.predict_proba(c1, supplemental_cols =c1['CUST_ID'])

    1人の顧客の予測プローブを表示します。

新しいゲーム製品を販売するには、すでにY_BOX_GAMESを購入し、与信限度額が高い顧客をターゲットにする必要があります。 異なるクラスタへの移入が正常にセグメント化されており、cluster-idが3のクラスタのターゲット移入は、Y_BOX_GAMESをすでに購入した顧客の割合が最大で、平均CUST_CREDIT_LIMITが8322です。 そのため、cluster-id 3の顧客を自信を持ってターゲティングして、新しいゲーム製品を販売することができます。