Блог им. afecn19

ML - to be or not to be. Part 2.

Ну вот значит мы получили, что если переусложнить модель, то можем найти черную кошку в черной комнате, даже если ее там нет. Но RF позволяет еще и оценить значимость той или иной фичи, и даже получить пороговые значения, по которым RF и принимает решения. Напомню что в качестве смысловой фичи у нас выступает Week. Когда Week от 1 до 4 (что символизирует дни от понедельника до четверга), то вероятность события 1 и 2 50/50. То есть белый шум. А вот когда 5 (пятница), то с вероятностью 60% наступит событие 1, то есть вот та самая неэффективность которую мы и ищем на рынке.  
 С помощью команды feat_importances = round(feat_importances.nlargest(10), 3) выводим самые важные по мнению RF фичи. Сначала выводим по итогам трейни на первых 10 тысяч данных и… о ужас:
46    0.134
67    0.095
4     0.090
60    0.071
15    0.069
week  0.068
26    0.067
2     0.065
53    0.065
84    0.058
  Week у нас всего лишь на 6 месте с ничем не примечательными коеффами важности, а во главе фича «46», которая между нами говоря никакого смысла и не имеет, ибо случайно сгенерированный ряд. Обьяснить это можно только одним-фича week детерминирует наш таргет на 52%, что совсем не густо, а фича 46, была сгенерированна так что ее ценность случайно оказалась выше. Ну то есть мы все понимаем что если посадить макаку торговать, то будет она торговать в ноль, но если посадить 1 млн макак и каждой дать по терминалу, то наверняка среди 1 млн окажется парочку «макак-гуру», которые в силу случайности покажут длинную серию успешных трейдов (я кстати думаю что также обьясняется появление гуру среди людей), а если посадить за комп 1 млрд макак, то наверняка парочка вообще не совершит неправильных кликов, и это будет «макака-Баффет», все будут смотреть ей в рот, удивляться ее гениальности, а «макака Баффет» откроет блог и начнет давать советы как торговать правильно. Ну вот и в нашем пример, так получилось, что макака под номером «46» случайно понажимала кнопки правильней и RF назвал ее особо ценной.
 Само собой случайность она на то и случайность, что взяв тестовый переиод уже за два года мы «макаку 46» уже и не увидим:
39    0.185
week  0.161
51    0.116
89    0.098
24    0.086
56    0.083
15    0.066
47    0.065
52    0.053
72    0.044
  У нас «макака 39» в лидерах. Ну и бес с ней, главное что та единственная, действительно разумная фича скаканула на 2 место. 
  Трейн за три года:
week  0.263
96    0.123
9     0.091
29    0.062
74    0.059
67    0.059
83    0.057
11    0.055
84    0.049
75    0.047
За 4: 
week  0.188
82    0.089
23    0.083
65    0.074
51    0.069
59    0.065
71    0.065
53    0.063
26    0.058
74    0.057
За 5
week  0.314
15    0.155
39    0.104
82    0.083
51    0.077
53    0.073
70    0.069
74    0.045
47    0.034
30    0.024
  Но хотя по мере роста выборки все вроде встает на свои круги, однако по прежнему RF считает что помимо week есть другие фичи с далеко не нулевой ценностью. Так что если вы вдруг нашли чудесный индикатор который чего то там предсказывает, или нашли гуру, «который никогда не ошибается» то может все дело в… макаке. Точно могу сказать что для RF такие макаки не нужны, они скрывают за своим шумом истинные фичи, так что если кто то думает «загоню побольше фичей а дальше и так сойдет» — то не сойдет. 
  А теперь глянем под капот RF чтобы понять, правильно ли наша моделька определила пороговое значение фичи week. Вуаля:
ML - to be or not to be. Part 2.

На втором уровне справа видим Week с порогом 4.5, то есть RF все сделал правильно. 

to be continued
★4
8 комментариев
если посадить за комп 1 млрд макак,
то наверняка парочка вообще не совершит неправильных кликов
Уверены?
Или для хохмы пишете?
avatar
А вот такую красивую схему в виде дерева фич его тоже sklearn рисует?
avatar
ch5oh, from sklearn.tree import export_graphviz
avatar
для одного дерева понятно, но как вы такую схему для леса делаете? 
avatar
alewmt, вы про визуализацию?
avatar
Марат, да
avatar
alewmt, построение задаю:

export_graphviz(model.estimators_[1], out_file=str(year+N_)+'tree.dot',
feature_names = list(X_train.columns.values),
# class_names = (target_names),
# class_names = list(target.columns.values),
rounded = True, proportion = False,
# feature_names = True,
precision = 2, filled = True)

и визуализацию дереьев там перебираю в model.estimators_[1], меняя число в квадратных скобках

avatar
Марат, спасибо
avatar

теги блога Марат

....все тэги



UPDONW
Новый дизайн