3.3.4 評価
様々なメトリックと手法を使用してパフォーマンスを評価し、モデルが新しい目に見えないデータにどの程度効果的に一般化されているかを判断して、モデルを評価します。 このプロセスでは、モデル・タイプに応じて、精度、適合度、リコール、F1スコア、平均平方根誤差などのメトリックを使用して、予測と実績結果を比較します。 この評価は、モデルの長所と短所を特定し、さらなる改善やチューニングをガイドするのに役立ちます。
情報およびモデルの設定
ノート:
k
-Meansモジュールで使用可能な設定の完全なリストを取得するには、次のスクリプトを実行します:help(oml.algo.km)
次のステップは、様々なモデル詳細ビューの表示に役立ちます。
km_mod1
を使用して、モデル設定、係数、フィット詳細など、k-Meansモデル・オブジェクトを介して使用可能なモデル詳細にアクセスします。km_mod1
km_mod1.clusters
を使用して、クラスタ情報をリストします。z.show(km_mod1.clusters)
- 次のスクリプトを実行して、各列に関するモデルの重心を表示します。 数値属性の平均差異およびカテゴリ属性のモードを示します。
z.show(km_mod1.centroids)
- 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)
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]
クラスタ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'))])
このヒストグラムは、クラスタ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クラスタに属する確率を推定することによって、新しいレコードのスコアリングに使用されます。 確率が最も高いクラスタがレコードに割り当てられます。
-
このステップでは、CUSTOMER_DATA_CLEANで予測を行い、CUST_IDをサプリメンタル列として追加して、スコアをデータに一意に関連付けることができます。 これを行うには、次のスクリプトを実行します:
pred = km_mod3.predict(CUSTOMER_DATA_CLEAN, supplemental_cols = CUSTOMER_DATA_CLEAN[["CUST_ID"]]) z.show(pred)
- データ上の各クラスタの確率を返す予測を行うには、predict_proba関数を使用します。
pred = km_mod3.predict_proba(CUSTOMER_DATA_CLEAN, supplemental_cols = CUSTOMER_DATA_CLEAN[["CUST_ID"]]) z.show(pred)
- 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))
- 次のスクリプトを実行して、各クラスタに属するCUST_ID (102308)を持つ顧客c1の確率スコアを表示します。
c1=CUSTOMER_DATA_CLEAN[CUSTOMER_DATA_CLEAN['CUST_ID']==102308] km_mod3.predict_proba(c1, supplemental_cols =c1['CUST_ID'])
新しいゲーム製品を販売するには、すでにY_BOX_GAMESを購入し、与信限度額が高い顧客をターゲットにする必要があります。 異なるクラスタへの移入が正常にセグメント化されており、cluster-idが3のクラスタのターゲット移入は、Y_BOX_GAMESをすでに購入した顧客の割合が最大で、平均CUST_CREDIT_LIMITが8322です。 そのため、cluster-id 3の顧客を自信を持ってターゲティングして、新しいゲーム製品を販売することができます。
親トピック: クラスタリング・ユース・ケース