Машинное обучение и анализ данных с помощью Python[22]
Давайте снова проведем выборку на основе переменных роста, веса и пола. Представьте, что мы создаем точечную диаграмму по осям X и Y для веса и роста с полом в качестве переменной. Так же, как и в регрессии дерева решений, структура выполняет процесс разделения, в регрессии она возвращает результат, взяв среднее значение в области для желаемого значения, в структуре классификации модель вычитает значение с наибольшим вхождением как прогнозируемое. ценность для нас.
Алгоритм ID3
Рассчитайте энтропию целевой переменной (y) для всего набора данных:
H(y) = — Σ (pi * log2(pi)), где pi — доля каждого класса в наборе данных.
Для каждого атрибута (x) в наборе данных рассчитайте прирост информации (IG): IG(x) = H(y) — H(y|x), где H(y|x) — энтропия заданной целевой переменной атрибут х.
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.tree import DecisionTreeClassifier,plot_tree from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt original_data=pd.read_csv("C:/Users/.../cancer_data.csv") data=original_data.copy() data=data.drop(columns=["id","Unnamed: 32"],axis=1) data.diagnosis=[1 if code=="M" else 0 for code in data.diagnosis] y=data["diagnosis"] X=data.drop(columns="diagnosis",axis=1) X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42) sc=StandardScaler() X_train=sc.fit_transform(X_train) X_test=sc.transform(X_test) model=DecisionTreeClassifier() model.fit(X_train,y_train) prediction=model.predict(X_test) acs=accuracy_score(y_test,prediction) print(acs*100) # 94.73684210526315 xname=list(X.columns) plot_tree(model,filled=True,fontsize=9,feature_names=xname) plt.show()
тюнинг часть
from sklearn.model_selection import train_test_split,GridSearchCV parameters={"criterion":["gini","entropy","log_loss"],"max_leaf_nodes":range(2,10), "max_depth":range(2,10),"min_samples_leaf":range(2,10),"min_samples_split":range(2,10)} grid=GridSearchCV(model,param_grid=parameters,cv=10,n_jobs=-1) grid.fit(X_train,y_train) print(grid.best_params_) # {'criterion': 'gini', 'max_depth': 6, # 'max_leaf_nodes': 9, 'min_samples_leaf': 3, 'min_samples_split': 2} model=DecisionTreeClassifier(random_state=0,criterion="gini",max_depth=6,min_samples_leaf=3,min_samples_split=2) print(acs*100) # 95.6140183077197