Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 04.03.2018
Сообщений: 1

Случайный лес слишком случайный

08.03.2018, 20:22. Показов 1410. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Пытаюсь разобраться с алгоритмом "случайный лес". Когда использую библиотеку sklearn, задавая количество деревьев 100 штук, получаю правильность на тестовом наборе 97%. Но когда попытался сам реализовать этот же алгоритм, столкнулся с проблемой. На той же обучающей выборке обычное решающее дерево (также собственноручно написанное) стабильно выдаёт правильность в 93%, а при 100 деревьях (когда пытаюсь использовать этот самый случайный лес) правильность скачет от 37 до 95%. Сначала думал, что дело в параметрах, которые нужно точнее задавать, но потом где-то прочитал, что у случайного леса правильность в любом случае больше или равна, чем у одиночного дерева. Меньше быть не может.
Если кто-нибудь подскажет, в чём может быть ошибка, буду благодарен.
Код прилагается.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from TreeClassifier import tree_classifier as tree
import random
import copy
import numpy as np
import math
 
random.seed()
 
from sklearn.datasets import load_breast_cancer
cancer_dataset = load_breast_cancer()
 
from sklearn.model_selection import train_test_split
 
X_train, X_test, y_train, y_test = train_test_split(
    cancer_dataset['data'], cancer_dataset['target'], random_state=0)
 
 
class random_forest_classifier():
 
    def __init__(self, N):
        '''N - Это количество деревьев. forest - список объектов-деревьев, voting - будущий список
        ответов этих деревьев, которые будут использоваться для голосования'''
        self.voting = []
        self.forest = []
        for i in range(0, N):
            new_tree = tree()
            self.forest.append(new_tree)
 
    def shiffle(self, X_train, y_train, size):
        '''В этой функции создаются случайные выборки для всех деревьев.
        X_train и y_train - массив объектов и ответов соответственно.
        size - это количество признаков, выбранных случайным образом из всех
        признаков для обучения очередного дерева.'''
        X_trains = [] #Это будут новые массивы для деревьев
        y_trains = []
 
        for i in range(0, len(self.forest)):
            new_X_train = copy.copy(X_train)
            new_y_train = copy.copy(y_train)
            '''Просто скопировал массивы в новые переменные'''
            for j in range(0, len(X_train)):
                rand = random.randint(0, len(X_train)-1)
                new_X_train[j] = copy.copy(X_train[rand])
                new_y_train[j] = copy.copy(y_train[rand])
                '''Случайным образом копирую элементы из исходного массива'''
            numb = len(X_train[0]) - size
            '''Строчка выше - это такой ублюдский костыль. Просто сначала задумывалось,
                что будет задаваться количество признаков, которое следует убрать от 
                общего числа признаков, а потом я переделал, чтобы нужно было задать
                количество признаков, которое нужно использовать от общего числа признаков.
                Извиняюсь.'''
            while numb>0:
                rand2 = random.randint(0, len(new_X_train[0])-1)
                new_X_train = np.delete(new_X_train, rand2, axis=1)
                numb -= 1
                '''Удаляю случайные признаки.'''
            X_trains.append(new_X_train)
            y_trains.append(new_y_train)
            '''Формирую окончательные массивы для всех деревьев и возвращаю их'''
        return X_trains, y_trains
 
    def most_frequent(self, mas):
        '''Функция возвращает наиболее часто встречающийся
        класс из имеющихся в массиве'''
        clMas = []
        for i in range(0, len(mas)):
            add = 1
            for j in range(0, len(clMas)):
                if mas[i] == clMas[j][0]:
                    add = 0
                    clMas[j][1] += 1
                    break
            if add == 1:
                clMas.append([mas[i], 1])
 
        max = clMas[0]
        for i in range(0, len(clMas)):
            if max[1] < clMas[i][1]:
                max = clMas[i]
 
        return max[0]
 
    def learn_forest(self, X_train, y_train, tree_size, train_size=int(math.sqrt(len(X_train[0])))):
        '''Обучаем лес, что и следует из названия. tree_size - это ограничение по размеру дерева.
        train_size - Это количество признаков от их общего числа, которое надо использовать
        для каждого дерева'''
        train = self.shiffle(X_train, y_train, train_size)
        '''Хм. train - это список со случайными выборками для каждого дерева в лесе
        [0] - соответствует массивам объектов, [1] - массивам ответов'''
        for i in range(0, len(self.forest)):
            self.forest[i].learn(train[0][i], train[1][i], tree_size)
            print(i)
 
    def predict_forest(self, X_new):
        '''Предсказание. X_new - наш объект со своими признаками'''
        self.voting.clear()
        for i in range(0, len(self.forest)):
            self.voting.append(self.forest[i].predict(X_new))
        return self.most_frequent(self.voting)
 
 
new_forest = random_forest_classifier(15)
new_forest.learn_forest(X_train, y_train, 20)
 
'''Всё, что ниже - для оценки правильности даваемых ответов'''
divide = [0, 0]
for i in range(0, len(X_test)):
    if new_forest.predict_forest(X_test[i]) == y_test[i]:
        divide[0] += 1
    else:
        divide[1] += 1
 
print(divide[0]/len(y_test))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2018, 20:22
Ответы с готовыми решениями:

Случайный лес
Всем доброго времени суток! подскажите пожалуйста! есть такой код %%time # Set target variables, all other variables will be...

Случайный массив
Есть такая задача: ограничение по времени на тест:0.5 секунд ограничение по памяти на тест:256 мегабайт Входные данные Первая...

Случайный выбор функции
Доброго времени суток, нужна помощь. Не могу понять в чем проблема и как ее решить. Есть четыре функции, которые я решил поместить в...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2018, 20:22
Помогаю со студенческими работами здесь

Заменить случайный список указанным
Тут есть программа, и этот программа работает с рандомом. И тут нужно изменить рандом на массивы, чтобы программа взял значение из массива....

Случайный выбор из списка в файле
Здравствуйте, уважаемые форумчане! Пишем программу для тестирования. Вопросы берутся из txt файла. В списке например 6 вопросов....

Работа с файлами (Случайный порядок)
Необходимо сделать варианты ответов с вопросами из txt-файла в def load_questions, используя random.shuffle() и создав пустой список lst = ...

Случайный выбор элемента из списка
25. Напишите программу на Python для случайного выбора элемента из списка.

Выбрать случайный элемент из части списка
Недавно изучаю питон, есть вопрос, допустим у меня есть список: foo = как мне сделать, чтобы я мог выбрать случайный элемент не среди...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru