В света на анализа на данни и разпознаването на образи клъстерирането е мощна техника за разкриване на основни структури в сложни набори от данни. Чрез групиране на подобни точки от данни заедно, алгоритмите за клъстериране предлагат изглед на данните от птичи поглед, улеснявайки откриването на ценни прозрения и смислени модели. Въпреки това, разбирането на значението на всеки клъстер може да бъде предизвикателна задача. Това е мястото, където дърветата на решенията идват на помощ! Дърветата на решенията са известни със способността си да предоставят ясна представа за процесите на вземане на решения.
В този блог ще проучим как дърветата на решенията могат да ни помогнат да интерпретираме резултатите от клъстерите, което улеснява разбирането и използването на ценната информация, скрита в клъстерите. Нека тръгнем на пътешествие, за да открием как дърветата на решенията отключват тайните на резултатите от клъстерирането, превръщайки ги в приложимо знание. Присъединете се към нас, докато изследваме очарователния свят на интерпретирането на резултатите от клъстерирането с помощта на дървета на решенията.
предварителни условия
- Google акаунт: Бих използвал Google colab в този блог за кодиране, тъй като библиотеките са предварително инсталирани над него.
- Познаване на python и SkLearn Library
- Данни: Изтеглете данните от https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud
Нека да започнем
Ще използвам KMeans за клъстериране на данните, K-означава клъстерирането е популярен неконтролиран алгоритъм за машинно обучение, използван за разделяне на данни в „K“ клъстери. Целта на K-средствата е да групира подобни точки от данни заедно и да отдели различни въз основа на техните характеристики. Алгоритъмът итеративно присвоява точки от данни към най-близкия центроид на клъстера и актуализира центроидите, за да минимизира сумата от квадратите на разстоянията между точките от данни и присвоените им центроиди.
- Качете набора от данни, който сте изтеглили, в 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