В света на анализа на данни и разпознаването на образи клъстерирането е мощна техника за разкриване на основни структури в сложни набори от данни. Чрез групиране на подобни точки от данни заедно, алгоритмите за клъстериране предлагат изглед на данните от птичи поглед, улеснявайки откриването на ценни прозрения и смислени модели. Въпреки това, разбирането на значението на всеки клъстер може да бъде предизвикателна задача. Това е мястото, където дърветата на решенията идват на помощ! Дърветата на решенията са известни със способността си да предоставят ясна представа за процесите на вземане на решения.

В този блог ще проучим как дърветата на решенията могат да ни помогнат да интерпретираме резултатите от клъстерите, което улеснява разбирането и използването на ценната информация, скрита в клъстерите. Нека тръгнем на пътешествие, за да открием как дърветата на решенията отключват тайните на резултатите от клъстерирането, превръщайки ги в приложимо знание. Присъединете се към нас, докато изследваме очарователния свят на интерпретирането на резултатите от клъстерирането с помощта на дървета на решенията.

предварителни условия

  1. Google акаунт: Бих използвал Google colab в този блог за кодиране, тъй като библиотеките са предварително инсталирани над него.
  2. Познаване на python и SkLearn Library
  3. Данни: Изтеглете данните от https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud

Нека да започнем

Ще използвам KMeans за клъстериране на данните, K-означава клъстерирането е популярен неконтролиран алгоритъм за машинно обучение, използван за разделяне на данни в „K“ клъстери. Целта на K-средствата е да групира подобни точки от данни заедно и да отдели различни въз основа на техните характеристики. Алгоритъмът итеративно присвоява точки от данни към най-близкия центроид на клъстера и актуализира центроидите, за да минимизира сумата от квадратите на разстоянията между точките от данни и присвоените им центроиди.

  1. Качете набора от данни, който сте изтеглили, в google colab, дадох името като creditcard.csv и създайте рамка с данни от него. В набора от данни всеки ред съответства на транзакция с кредитна карта и както беше показано по-рано, всеки ред съдържа 31 променливи. Сред тези променливи има една, наречена „Клас“, която служи като целева променлива.
# Import the libraries we need to use in this lab
import warnings
warnings.filterwarnings('ignore')

# from __future__ import print_function
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import normalize, StandardScaler
from sklearn.utils.class_weight import compute_sample_weight
from sklearn.metrics import roc_auc_score
import time
import gc, sys

# read the input data
raw_data = pd.read_csv('creditcard.csv')
raw_data = raw_data.dropna()
print("There are " + str(len(raw_data)) + " observations in the credit card fraud dataset.")
print("There are " + str(len(raw_data.columns)) + " variables in the dataset.")

# display the first rows in the dataset
raw_data.head()

y = raw_data[["Class"]]
X_df = raw_data.iloc[:,1:-1]
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
pipeline = Pipeline(steps=[
  ('scaler', StandardScaler())
])
pc = pipeline.fit_transform(X_df)
from sklearn.cluster import KMeans

3. Обучете данните с помощта на модул KMeans, присъстващ в Sklearn

kmeans_model = KMeans(n_clusters=4, random_state=42)
y_cluster = kmeans_model.fit_predict(pc)
raw_data['Cluster'] = y_cluster
raw_data.groupby('Cluster')['Class'].mean().reset_index()

И така, ние създадохме 4 клъстера за нашия набор от данни, горните резултати показват средната стойност на класа, групиран по клъстери.

Но сега предизвикателството е да се интерпретира какво означава клъстерът. Тук се появява Дървото на решенията.

Ще използваме нашия набор от данни X_df, но този път нашата целева променлива ще бъде клъстер

Дърветата на решенията могат да помогнат за разбирането на клъстерите, като предоставят прозрачно и интуитивно представяне на процеса на вземане на решения във всеки клъстер. Чрез анализиране на разделянията и условията в дървото можем да идентифицираме най-влиятелните характеристики и техните прагове, които допринасят за формирането на отделни клъстери. Дърветата на решенията също ни позволяват да изследваме йерархията на характеристиките, позволявайки по-задълбочено разбиране на структурата на клъстера и неговите отличителни характеристики. Като мощен инструмент за визуализиране и обяснение на решенията, базирани на данни, дърветата на решенията играят решаваща роля в трансформирането на сложни клъстерни резултати в интерпретируеми прозрения, насърчавайки по-доброто разбиране на данните и информираното вземане на решения.

4. Импортиране на дървовиден класификатор на решенията

from sklearn.tree import _tree, DecisionTreeClassifier

5. Създайте влака и тестовия сплит

X = normalize(X_df, norm="l1")
y = y_cluster
# print the shape of the features matrix and the labels vector
print('X.shape=', X.shape, 'y.shape=', y.shape)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
print('X_train.shape=', X_train.shape, 'Y_train.shape=', y_train.shape)
print('X_test.shape=', X_test.shape, 'Y_test.shape=', y_test.shape)

6. Обучете дървото на решенията

w_train = compute_sample_weight('balanced', y_train)
from sklearn.tree import DecisionTreeClassifier
sklearn_dt = DecisionTreeClassifier(max_depth=4, random_state=35)
t0 = time.time()
sklearn_dt.fit(X_train, y_train, sample_weight=w_train)
sklearn_time = time.time()-t0
print("[Scikit-Learn] Training time (s):  {0:.5f}".format(sklearn_time))

7. Начертайте дървото на решенията, за да интерпретирате правилата, които дървото е научило, за да класифицира сегмента.

from sklearn import tree
import graphviz
dot_data = tree.export_graphviz(sklearn_dt,
               feature_names = list(X_df.columns),
               class_names = True,
                                filled=True)
graph = graphviz.Source(dot_data, format="png")
graph.render("decision_tree_graphivz")

8. Извлечете правилата от дървото

def extract_rules(tree, feature_names, class_names, rule_list=None, node_id=0, indent=""):
    if rule_list is None:
        rule_list = []
        
    # Get the feature index and threshold for the current node
    feature_index = tree.feature[node_id]
    threshold = tree.threshold[node_id]
    
    # Get the feature name from the feature index
    feature_name = feature_names[feature_index]
    
    # Get the class probabilities for the current node
    class_probabilities = tree.value[node_id][0]
    class_index = class_probabilities.argmax()
    class_name = class_names[class_index]
    rule = f"{indent}if {feature_name} <= {threshold:.2f} then {class_name} [class probabilities: {class_probabilities}]"
    rule_list.append(rule)
    
    # Recurse for the left and right subtrees
    left_child = tree.children_left[node_id]
    right_child = tree.children_right[node_id]
    
    if left_child != _tree.TREE_LEAF:
        extract_rules(tree, feature_names, class_names, rule_list, left_child, indent + "  ")
    
    if right_child != _tree.TREE_LEAF:
        extract_rules(tree, feature_names, class_names, rule_list, right_child, indent + "  ")
    
    return rule_list

# Example usage:
# Assuming you have already trained a decision tree classifier named "clf"
# with corresponding feature_names and class_names
# For example, feature_names = ['feature1', 'feature2', ...]
#              class_names = ['class1', 'class2', ...]

# Extract rules from the decision tree
tree_rules = extract_rules(sklearn_dt.tree_, list(X_df.columns), [0,1,2,3])

# Print the extracted rules
for rule in tree_rules:
    print(rule)

В заключение, използването на дървета на решенията за интерпретиране на резултатите от клъстерирането предлага ценна представа за основните модели в данните. Чрез трансформирането на клъстери в класове можем да разберем определящите характеристики на всяка група. Този подход преодолява пропастта между неконтролирано и контролирано обучение, позволявайки решения, базирани на данни, които стимулират иновациите и решават сложни проблеми в различни области. Прегърнете силата на интерпретирането на резултатите от клъстерирането, като използвате дървета на решения, за да разкриете скрити знания и да разгърнете пълния потенциал на вашите набори от данни.

последвайте ме в LinkedIn

LinkedIn: https://www.linkedin.com/in/shorya-sharma-b94161121