Классификация дерева принятия решений - хорошее или плохое? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть база данных о ДТП. Мне нужно было построить дерево решений для классификации, чтобы найти интересную информацию между функциями. У меня есть 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)
  1. одна горячая кодировка
    одно горячее кодирование для исправления категорических особенностей

    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())

  1. Проверка данных после кодирования
    проверить данные

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)

  1. установить целевую переменную

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)
  1. Дерево-выход построить дерево
    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 %

1 Ответ

0 голосов
/ 10 июля 2019

Ваша целевая переменная является частью ввода.

Конечно, вы получите 100%, если ответ уже существует ...

Ваше дерево, вероятно, состоит из одного узла, который эквивалентендо:

return AccSeverity_A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...