У меня есть база данных о ДТП. Мне нужно было построить дерево решений для классификации, чтобы найти интересную информацию между функциями. У меня есть 3 категориальных объекта: «Доступность», «Сдвиг», «День», но когда я использую одну из этих функций в качестве целевой переменной, я получаю дерево с числовой классификацией. Я хочу, чтобы дерево обрабатывало эти категориальные особенности способом без чисел или, по крайней мере, без значений с плавающей запятой.
Я использовал кодировку one-ho для подгонки моих категориальных функций к дереву.
1. настройка моих функций
мои особенности
features = ["SK_Tik_Teuna", "Hour", "Year", "Month", "DriversInvolved", "Jewish", "UnknownReligon", "NotJewish", "UnknownCar", "Else", "Empty", "Distric", "Lighing", "Urban_NotUrban", "Crossroads_NotCrossroads", "Координаты", "Площадь", "AccSeverity_A", "AccSeverity_B", "AccSeverity_C", "Day_D1", "Day_D2", "Day_D3", "Day_D4 », "Day_D5", "Day_D6", "Day_D6", "Day_D7", "Shift_A", "Shift_B", "Shift_C"]
2. Построение дерева решений
классификация дерева решений
print("Training size: {}; Test size: {}".format(len(train),len(test)) )
#result from the line above
Training size: 2024; Test size: 998
#define the tree parameters
c=DecisionTreeClassifier(criterion='gini',
min_samples_leaf=5,
min_samples_split=5,
max_depth=None,
random_state=0)
- одна горячая кодировка
одно горячее кодирование для исправления категорических особенностей
data = data.copy()
data = pd.get_dummies(data, columns=['AccSeverity'], prefix = ['AccSeverity'])
data = pd.get_dummies(data, columns=['Day'], prefix = ['Day'])
data = pd.get_dummies(data, columns=['Shift'], prefix = ['Shift'])
print(data.head())
- Проверка данных после кодирования
проверить данные
data.info ()
RangeIndex: 3022 записей, от 0 до 3021
Столбцы данных (всего 40 столбцов):
SK_Tik_Teuna 3022 ненулевой int64
Час 3022 ненулевой int64
Год 3022 ненулевой int64
Месяц 3022 ненулевой int64
DriversInvolved 3022 ненулевой int64
Еврейский 3022 ненулевой int64
UnknownReligon 3022 ненулевой int64
NotJewish 3022 ненулевой int64
UnknownCar 3022 ненулевой int64
Остальное 3022 ненулевое int64
Two_Third_Wheel 3022 ненулевой int64
Тендер 3022 ненулевой int64
Трактор 3022 ненулевой int64
ATV 3022 ненулевой int64
Неизвестный 3022 ненулевой int64
Кабина 3022 ненулевой int64
CommercialVehicle 3022 ненулевой int64
Грузовик 3022 ненулевой int64
PrivateCar 3022 ненулевой int64
PublicVehicle 3022 ненулевой int64
Пустой 3022 ненулевой int64
Distric 3022 ненулевой int64
Lighing 3022 ненулевой int64
Urban_NotUrban 3022 ненулевой int64
Crossroads_NotCrossroads 3022 ненулевой int64
Координаты 3022 ненулевые int64
Площадь 3022 ненулевое int64
AccSeverity_A 3022 ненулевой uint8
AccSeverity_B 3022 ненулевой uint8
AccSeverity_C 3022 ненулевой uint8
Day_D1 3022 ненулевой uint8
Day_D2 3022 ненулевой uint8
Day_D3 3022 ненулевой uint8
Day_D4 3022 ненулевой uint8
Day_D5 3022 ненулевой uint8
Day_D6 3022 ненулевой uint8
Day_D7 3022 ненулевой uint8
Shift_A 3022 ненулевой uint8
Shift_B 3022 ненулевой uint8
Shift_C 3022 ненулевой uint8
dtypes: int64 (27), uint8 (13)
- установить целевую переменную
x_train=train[features]
y_train=train["AccSeverity_A"]
x_test=test[features]
y_test=test["AccSeverity_A"]
#train
dt=c.fit(x_train,y_train)
- Дерево-выход
построить дерево
def show_tree(tree,features, path):
f=io.StringIO()
export_graphviz(tree,out_file=f, feature_names=features)
pydotplus.graph_from_dot_data(f.getvalue()).write_png(path)
img=misc.imread(path)
plt.rcParams["figure.figsize"]=(20,20)
plt.imshow(img)
# показать дерево
#show_tree (dt, features, 'dec_tree_01.png')
#predict
y_pred=c.predict(x_test)
#rsult after running the line above
y_pred
array([1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1,
0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1,
1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1,
1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1,
1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,
1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1,
0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0,
1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1, 0, 1, 0, 1, 1, 1, 1], dtype=uint8)
#accuracy finding
from sklearn.metrics import accuracy_score
score=accuracy_score(y_test, y_pred) *100
print("Accuracy using Desicion Tree:", round(score, 1), "%")
#result
#Accuracy using Desicion Tree: 100.0 %