Методы выбора и отсеивания предикторов.¶

Следуя логики построения и исследования эмпирических моделей, первоначальный анализ должен начинаться с формирования потенциального множества предикторов для исследуемой выходной пременной (назовем его априорным множеством предикторов 0-го порядка). Это множество формируется на основе качественного анализа, при котором для каждого потенциального предиктора необходимо получить ответы на следующие вопросы:

  1. Может ли сооттвествующий предиктор (из первоначально множества 0-го порядка) оказывать влияние на результирующую переменную эмпирической модели ?
  2. Можно ли измерить соотвествующий предиктор с необходимой точностью и полнотой в определенных измерительных шкалах ?

Если по предиктору получен положительный ответ на оба этих вопроса он включается в априорное множество предикторов 0-го порядка. После формирования этого множества осуществляется процедура измерения предикторов в соотвествующих точках территориально-временного континиума. Аналогичные процедуры нужно осуществить и для выходной переменной создаваемой модели, если она может быть измерена. В результате будет создана информационная модель 0-го уровня, которая состоит из следующих информационных блоков:

  • матрицы предикторов :
$${\bf X} = \left( {\begin{array}{*{20}c} {\mathop x\nolimits_{{\rm 1}{\rm ,1}} } & {\mathop x\nolimits_{{\rm 1}{\rm ,2}} ...} & {\mathop x\nolimits_{{\rm 1}{\rm ,n}} } \\ {\mathop x\nolimits_{2,1} } & {\mathop x\nolimits_{{\rm 2}{\rm ,2}}... } & {\mathop x\nolimits_{{\rm 2}{\rm ,n}} } \\ {\mathop x\nolimits_{p,1} } & {\mathop x\nolimits_{p,2}... } & {\mathop x\nolimits_{p,n} } \\ \end{array}} \right){\rm \;\;\;\;(1)}$$
  • и вектора столбца выходной переменной:
$${\bf Y} = \left( {\begin{array}{*{20}c} {y_1 } \\ {y_2 } \\ {...} \\ {y_{p - 1} } \\ {y_p } \\ \end{array}} \right){\rm \;\;\;\;(2)}$$

Исследователь выдвигает гипотезу, что имеет место зависимость вида :

$${\bf Y} = {\bf \Phi }({\bf X}) = {\bf \Phi }({\bf x}_1 ,{\bf x}_2 ,....,{\bf x}_n ){\rm \;\;\;\;(3)}$$

где ${\bf x}_j$ ,$ j=1,2,...,n$ $\;\;j$-ый столбец матрицы матрицы ${\bf X}$.

На данном уровне знаний модель (3) представляет собой "черный ящик". В результате процедуры измерения возникает в общем случае символьная матрица ${\bf X}$ (в частном случае она представляет собой числовую матрицу, если предикторы измерались в метрических шкалах).Значение $n$ (число столбцов) может быть большим десятки и сотни, а значение p (число строк) должно быть таким, чтобы обеспечить репрезентативность будущей модели (т.е количество измерений должно таким,чтобы можно было оценить генеральную совокупность с приемлемой точностью) Оперировать и интерпретировать такие большие объемы информации даже в современных условиях весьма затруднительно. Поэтому возникает задача уменьшения значения $n$ до разумных пределов. Для решения разработано большое количество методов, которые условно можно разделить на две большие группы:

  • методы выбора и отсеивания предикторов ( анализ на уровне отдельных предикторов и их взаимодействий);

  • методы сокращения размерности на основе трансформации исходного пространства предикторов.

Процедура анализа информационной матрицы предикторов должна начинаться с первой группы методов, а затем можно переходить ко второй группе методов, если в этом остается необходимость. Вторая группа методов была нами рассмотрена достаточно подробно выше. В этом разделе разделе остновимся на первой группе методов сокращения размерности матрицы предикторов.

Оценка доли отсутствующих значений.¶

Предположим, у нас получена матрица ${\bf X}$. Что было бы первым шагом в ее использовании? Естественно, её нужно сначала изучить, прежде чем строить модель. Изучая данные в матрице ${\bf X}$, можно обнаружить, что для определенных ${\bf x}_j$ отсутствуют некоторые значения. Что делать? Здесь возможны два варианта. Во-первых, попытаться выяснить причину этих пропущенных значений, а затем заполнить их (используя соответствующие методы), если это возможно. Во-вторых, полностью исключить переменные, для которых отсутствуют значения. Но чтобы не потерять полезную информаци т.е "вместе с водой не выплиснуть ребенка" часто поступают компромисным спосом определяют предельный процент пропущенных значений для ${\bf x}_j$ ,например , 10 процентов. Т.е. предикторы, которые имеют больше 10 процентов "безжалостно удаляются", а для остальных предикторов,имеющих пропущенные значения, эти значения восстанавливаются тем или иным способом (например, берется среднее значение множества соседних точек или его медиана и т.д.)

Рассмотрим пример на python реализации процедуры анализа пропущенных значений в данных и отбора предикторов по величине заданного порога числа пропущенных значений (примем порог = 10%)

Для примера используем данные о десяти первых переменных, описывающих социально-экономические характеристики российских регионов

Код python

In [1]:
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
from pandas import Series, DataFrame
import pandas as pd
import openpyxl
import xlrd

data_regru =pd.ExcelFile('Region_Data.xlsx')
tabledat =data_regru.parse('dat01')
#print(tabledat )

#ФОРМИРОВАНИЕ МАССИВА  ИЗ 10 ПЕРЕМЕННЫХ
X =DataFrame(tabledat, columns=['P1','P2','P3','P4','P5','P6', 'P7','P8', 'P9', 'P10']) 
XX=np.array (X)

#ИМИТАЦИЯ ПРОПУЩЕННЫХ ЗНАЧЕНИЙ
r1=[2,6,9,11, 23,45,49,57,68,77,80]
r5=[9,34,78,]
r7=[2,6,8,16,34,46,67]
XX[r1,1]=None
XX[r5,5]=None
XX[r7,7]=None

XX =DataFrame(XX, columns=['P1','P2','P3','P4','P5','P6', 'P7','P8', 'P9', 'P10'])
#print(XX)

A= XX.isnull().sum()/len(XX)*100
#ОПРЕДЕЛЕНИЕ ПРОЦЕНТА ПРОПУЩЕННЫХ ЗНАЧЕНИЙ
print(A)

#ИСКЛЮЧЕНИЕ ПЕРЕМЕННЫХ , У КОТОРЫХ  ПРОПУЩЕННЫХ ЗНАЧЕНИЙ > 10%
variables = XX.columns
variable = [ ]
for i in range(0,10):
    if A[i]<=10:   #setting the threshold as 10%
        variable.append(variables[i])

#ПЕЧАТЬ ИМЕН СОХРАНЕННЫХ ПЕРЕМЕННЫХ
print(variable)
P1      0.000000
P2     13.580247
P3      0.000000
P4      0.000000
P5      0.000000
P6      3.703704
P7      0.000000
P8      8.641975
P9      0.000000
P10     0.000000
dtype: float64
['P1', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9', 'P10']

Видим,что пропущенные значения имеются у предикторов P2,P6 и P8, но только у P2 их больше 10 процентов, поэтому, исключается только эта переменная

$['P1', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9', 'P10']$ -имена сохраненных переменных

Фильтры низкой дисперсии и высокой корреляции¶

Идея лежащая в основе фильтра низуой дисперсии очень проста. Понятно, если значения определенной переменной постоянны или очень мало изменяются от объекта к объекту, то ценность этой переменной (предиктора)) практически нулевая, поэтому необходимо расчитать дисперсию (мере изменчивости значений) для каждой переменной и удалить из рассмотрения те переменные, у которых она близку к нулю. Филтер высокой корреляции основан на следующих соображениях. Высокая корреляция между двумя переменными означает, что они имеют схожие тенденции и, вероятно, несут схожую информацию. Это может резко снизить эффективность некоторых моделей (например, моделей линейной и логистической регрессии).Мы можем вычислить корреляцию между независимыми числовыми переменными. Если коэффициент корреляции превышает определенное пороговое значение, мы можем отбросить одну из переменных (выбор удаляемой переменной очень субъективен и всегда должен производиться с учетом предметной области).Если имеются значения целевой (выходной) переменной, то целесообразно оставить те переменные, которые показывают приличную или высокую корреляцию с ней.

Рассмотрим пример использования этих фильтров для данных о 17 показателях социально-экономического развития регионов РФ в 2019 году.

Код R

In [2]:
options(warn=-1)
library(openxlsx)
library(caret)

#rm(list=ls(all=TRUE))

#ЗАГРУЗКА ИЗ EXSEL ПЕРВИЧНЫХ ДАННЫХ
N=1 # номер листа с данными
x <-read.xlsx("Region_Data4.xlsx", sheet = N)
x

#ФОРМИРОВАНИЕ data.frame ОСНОВНЫЕ СОЦИАЛЬНО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ РЕГИОНОВ РФ 
xreg <-data.frame(P1=x$Pok_001,P2=x$Pok_002,P3=x$Pok_003,P4=x$Pok_004,
P5=x$Pok_005,P6=x$Pok_006,P7=x$Pok_007,P8=x$Pok_008,P9=x$Pok_009,P10=x$Pok_010,
P11=x$Pok_011,P12=x$Pok_012,P13=x$Pok_013,P14=x$Pok_014,P15=x$Pok_015,P16=x$Pok_016,
P17=x$Pok_017,P18=x$Pok_018)
#xreg
#Формирование фактора тип экономики региона
(xreg_f <- as.factor(x$Pok_018))

#ИСХОДНОЕ МНОЖЕСТВО ОСНОВНЫХ СОЦИАЛЬНО-ЭКОНОМИЧЕСКИХ ПОКАЗАТЕЛЕЙ РЕГИОНОВ РФ 2018 г.
#P1  - Площадь территории,тыс. км2
#P2  - Численность  населения на 1 января 2019 г., тыс. человек
#P3  - Среднегодовая численность  занятых, тыс. человек
#P4  - Среднедушевые денежные доходы (в месяц), руб
#P5  - Потребительские расходы в среднем на душу населения (в месяц), руб
#P6  - Среднемесячная номинальная начисленная заработная плата работников организаций, руб.
#P7  - Валовой  региональный  продукт в 2018 г. , млн руб
#P8  - Инвестиции в основной  капитал, млн руб
#P9  - Основные фонды в экономике (по полной учетной стоимости; на конец года),млн руб.
#P10 - Добыча  полезных  ископаемых ,млн. руб
#P11 - Обрабатывающие производства, млн руб
#P12 - Обеспечение электрической энергией, газом и паром, млн руб
#P13 - Водоснабжение; водоотведение, организация сбора и утилизации отходов, млн руб
#P14 - Продукция сельского хозяйства , млн руб
#P15 - Ввод  в действие  жилых домов, тыс. м2 
#P16 - Оборот  розничной торговли, млн руб
#P17 - Сальдированный финансовый результат деятельности организаций, млн руб.
#P18 - Тип региональной экономики (A,D,P,T)

#1. Удаление переменных с околонулевой дисперсией
#тестовый стобец 17
xreg[, 17]=7
xreg
# Создадим копию данных без столбца с откликом Class:
reg_ru = xreg[, -18]
# Функция nearZeroVar() возращает вектор номеров переменных,
# обладающих околонулевой дисперсией:
(nz = nearZeroVar(reg_ru))
print("Имена этих переменных:"); names(reg_ru)[nz]
# Удаляем предикторы с околонулевой дисперсией:
if (nz > 0 ){reg_ru.clean <-reg_ru[,-nz]}
reg_ru2 <-reg_ru.clean
reg_ru2

#2 Удаление сильно коррелированных переменных задаваемый уровень-cutoff 

# Функция findCorrelation() возвращает вектор
# номеров переменных с высокой корреляцией:
(highCor = findCorrelation(cor(reg_ru2),cutoff = 0.7))
print("Имена этих переменных:")
names(reg_ru2)[highCor]
# Удаляем эти переменные:
reg_ru3 = reg_ru2[, -highCor]
reg_ru3
A data.frame: 81 × 21
X1IndexRegPok_001Pok_002Pok_003Pok_004Pok_005Pok_006Pok_007Pok_008...Pok_010Pok_011Pok_012Pok_013Pok_014Pok_015Pok_016Pok_017Pok_018Pok_019
<chr><chr><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>...<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><chr><dbl>
1Белгородская область Reg_01 27.11547.4 752.6307782459631852 865979.0134161...148863 710829 26805 89362570381215.5 336148.5206103A1
2Брянская область Reg_02 34.91200.2 523.0265852287127251 328814.0 59719... 262 218544 17730 8901 85146 403.1 253157.2 8552T1
3Владимирская область Reg_03 29.11365.8 628.2235391976130460 440543.0 74311... 5005 448428 3629511257 29651 652.8 225731.2 39240P1
4Воронежская область Reg_04 52.22327.81110.2302892653031207 943595.6279213... 7726 448223 99618135122191511691.1 552288.4 32778A1
5Ивановская область Reg_05 21.41004.2 444.9245031940725729 197839.8 29850... 972 152792 31077 4687 16085 369.1 164827.4 -2236T1
6Калужская область Reg_06 29.81009.4 503.0291292335438197 465987.5 86508... 3938 830716 2328210017 43851 787.2 197086.7 42366P1
7Костромская область Reg_07 60.2 637.2 282.2237161956927724 180287.2 22439... 401 135820 36785 3374 15929 196.9 101815.8 4431P1
8Курская область Reg_08 30.01107.0 510.8272752156629937 428441.3119892... 91249 194723 58383 9053146703 594.8 213277.6 81982A1
9Липецкая область Reg_09 24.01144.1 566.1300102491931622 580504.0128533... 7052 756976 2553412409119304 903.0 256645.4143565P1
10Московская область Reg_10 44.37599.73385.74470735199519384201768.8897801... 127442600340287728945551084238866.62355264.1438805T1
11Орловская область Reg_11 24.7 739.5 314.5248952021727476 230706.2 49547... 232 115793 13794 3890 72247 290.1 132137.4 14206A1
12Рязанская область Reg_12 39.61114.1 498.3254411970931916 383110.2 56987... 1664 303564 38454 5859 56895 777.5 193216.7 28470P1
13Смоленская область Reg_13 49.8 942.4 432.5258882063329397 312857.0 71277... 1791 209367 55189 8791 24147 359.7 169721.9 15130T1
14Тамбовская область Reg_14 34.51016.0 466.0268282176426660 331631.2 93884... 200 162991 15773 3497127308 858.9 200455.6 35174A1
15Тверская область Reg_15 84.21269.6 605.0251251999231049 441653.6104120... 970 308286103028 6677 38927 424.9 223702.0 16888P1
16Тульская область Reg_16 25.71478.8 715.1272082239434662 636133.7154752... 6153 703297 4981210445 65785 734.8 289310.7103332P1
17Ярославская область Reg_17 36.21259.6 622.2270552131433474 560577.9 80251... 1566 390117 45608 9249 34072 767.5 235688.6 17797P1
18Республика Карелия Reg_18180.5 618.0 269.8291502373339402 280012.4 41237... 83395 121610 25664 4198 4498 271.0 121814.1-18589D2
19Республика Коми Reg_19416.8 830.2 408.9339612322050413 665735.7126595...400373 194301 44613 6331 10156 290.2 154571.4112787D2
20Архангельская область Reg_20589.91144.1 530.5338312766248307 819247.0191318...385402 247567 34886 5959 11017 322.6 263914.7 31702D2
21Вологодская область Reg_21144.51167.7 530.3269821992935497 582630.4149412... 798 692721 40464 7059 29255 535.5 186480.1235139P2
22Калинингpадская областьReg_22 15.11002.2 479.9274612283433385 460854.9130488... 18428 576618 37791 6433 34739 916.0 170195.8 45587P2
23Ленинградская область Reg_23 83.91847.9 778.43134124285436311104435.9466894... 15857109574513025213540 917172640.6 405492.0161923P2
24Мурманская область Reg_24144.9 748.1 363.9415643069958045 482547.9144604... 96258 185431 57999 9251 1823 46.3 169676.6 80341D2
25Новгородская область Reg_25 54.5 600.3 284.4252922201331462 262008.0 59629... 1178 201188 21582 3339 25982 264.4 115328.0 35927P2
26Псковская область Reg_26 55.4 629.7 282.7238802003326871 164228.5 31351... 1959 103644 11760 5513 36929 235.9 112140.5 6146A2
27Республика Адыгея Reg_27 7.8 454.8 151.6275532256927469 108417.6 31577... 3393 52529 2428 1503 21899 187.0 95164.4 2199T3
28Республика Калмыкия Reg_28 74.7 272.6 108.0170821061126049 73692.2 12973... 0 930 2700 0 26559 90.4 21333.1 1189A3
29Республика Крым Reg_29 26.11911.8 841.4215241660229640 391299.0296019... 14372 93537 37021 6455 43841 774.9 256198.0 -8237T3
30Краснодарский край Reg_30 75.55648.22603.13437231248338462344620.7481141... 524981025101121025323393824684414.91368124.7228937T3
...............................................................
52Самарская область Reg_52 53.6 3183.01652.9281802386333754 1510518.7 259152... 3681831098570125309 37642 889761782.2 648396.3 320981D5
53Саратовская область Reg_53 101.2 2440.81051.4214231737526823 712545.4 155260... 42026 398719101302 127631291751215.6 357332.5 22817A5
54Ульяновская область Reg_54 37.2 1238.4 570.9227971805228353 347854.1 81105... 7982 256859 28434 9935 37868 981.1 187446.3 2498P5
55Курганская область Reg_55 71.5 834.7 326.0203341613328159 213032.1 27098... 3222 105500 21324 3943 39511 231.5 114416.9 6232A6
56Свердловская область Reg_56 194.3 4315.72038.0367353175738052 2277576.3 318008... 765381968982243507 70627 849602088.21130702.0 314317P6
57Тюменская область Reg_571464.2 3724.02232.9461243242268664 8790443.42326785...65225931919669317522 45797 777932120.4 942830.12222263D6
58Челябинская область Reg_58 88.5 3475.71756.2243861823735219 1473727.8 259366... 809901491774122934 427811194171524.4 518609.5 181085P6
59Республика Алтай Reg_59 92.9 218.9 82.8195031348430953 50566.8 14470... 2688 3561 3048 395 11700 108.3 25989.4 4227T7
60Республика Тыва Reg_60 168.6 324.4 102.915603 987835779 68774.0 10485... 28678 518 4291 279 6141 93.1 23653.4 5488D7
61Республика Хакасия Reg_61 61.6 536.2 230.1215711885537874 235310.9 32559... 74047 91648 53140 1622 13824 188.2 83893.5 14979D7
62Алтайский край Reg_62 168.0 2332.81023.4228291725825519 549972.9 109925... 5023 322810 47440 10323131825 786.1 352257.4 32799A7
63Красноярский край Reg_632366.8 2874.01406.4300152311545635 2280025.9 420866... 7481091206799174982 28813 779141148.5 537966.9 532296D7
64Иркутская область Reg_64 774.8 2397.71084.8244341785542647 1392934.8 316397... 603873 513815120261 17839 63549 987.5 348024.9 402128D7
65Кемеровская область Reg_65 95.7 2674.31195.0231661774938023 1241598.6 260457...1097995 650683 95662 22063 46912 639.8 376622.0 249191D7
66Новосибирская область Reg_66 177.8 2793.41327.0288522289535686 1252258.7 195950... 90661 533607 61720 17314 801921738.4 501403.3 106953D7
67Омская область Reg_67 141.1 1944.2 891.7254312084432613 681619.5 118627... 3822 961524 53353 10937 94097 522.3 330565.4 38811P7
68Томская область Reg_68 314.4 1077.4 508.7272962031441901 579363.4 94507... 217696 188076 38368 8863 30728 436.9 158537.5 89527D7
69Республика Бурятия Reg_69 351.3 983.3 382.3240812068136047 226134.7 48754... 27974 65598 26273 1724 16214 247.8 177121.9 27162T8
70Республика Саха (Якутия) Reg_703083.5 967.0 497.0426693208068871 1084556.2 403427... 804388 37175 66210 5384 25781 530.1 228740.2 154686D8
71Забайкальский край Reg_71 431.9 1065.8 467.0239921835240740 326865.7 90058... 108400 23788 34259 3330 22904 186.5 164946.5 -11807D8
72Камчатский край Reg_72 464.3 314.7 163.9487583320173896 236483.5 39279... 21518 133151 18224 2501 8249 35.5 57195.1 30283D8
73Приморский край Reg_73 164.7 1902.7 971.0346192763842199 834023.4 141859... 22557 235888 66550 9550 39963 538.2 406297.1 62261T8
74Хабаровский край Reg_74 787.6 1321.5 691.8390843299747153 710639.6 129646... 91358 271571 57061 8244 17099 273.8 324055.1 14040D8
75Амурская область Reg_75 361.9 793.2 387.9309372493842315 301069.4 239705... 60169 34091 37046 3074 47637 158.9 170850.7 10131T8
76Магаданская область Reg_76 462.5 141.2 91.6597743524285631 170723.4 51512... 124937 4512 16012 933 2723 4.3 32286.4 17628D8
77Сахалинская область Reg_77 87.1 489.6 279.7537834314777499 1179668.7 218339...1016799 60300 18063 2621 11147 264.8 148497.4 93046D8
78Еврейская автономная областьReg_78 36.3 159.9 65.2246961906439242 55808.8 16821... 10330 6632 4455 519 5772 27.8 24075.7 -3598D8
79Чукотский автономный округ Reg_79 721.5 49.7 33.3788122950598864 78143.4 15068... 67502 1055 8805 491 1334 1.8 9573.8 17189D8
80г. Москва Reg_80 2.612615.38838.268386541308380117881516.22429320...18088236413663783384154014 73083541.24798454.03247670D1
81г. Санкт-Петербург Reg_81 1.4 5383.93151.6449993677460421 4193489.5 747407... 240352615910213389 59536 03950.31412406.0 604517P2
  1. A
  2. T
  3. P
  4. A
  5. T
  6. P
  7. P
  8. A
  9. P
  10. T
  11. A
  12. P
  13. T
  14. A
  15. P
  16. P
  17. P
  18. D
  19. D
  20. D
  21. P
  22. P
  23. P
  24. D
  25. P
  26. A
  27. T
  28. A
  29. T
  30. T
  31. D
  32. P
  33. T
  34. T
  35. A
  36. T
  37. A
  38. T
  39. T
  40. A
  41. P
  42. P
  43. A
  44. P
  45. D
  46. P
  47. P
  48. T
  49. P
  50. D
  51. A
  52. D
  53. A
  54. P
  55. A
  56. P
  57. D
  58. P
  59. T
  60. D
  61. D
  62. A
  63. D
  64. D
  65. D
  66. D
  67. P
  68. D
  69. T
  70. D
  71. D
  72. D
  73. T
  74. D
  75. T
  76. D
  77. D
  78. D
  79. D
  80. D
  81. P
Levels:
  1. 'A'
  2. 'D'
  3. 'P'
  4. 'T'
A data.frame: 81 × 18
P1P2P3P4P5P6P7P8P9P10P11P12P13P14P15P16P17P18
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><chr>
27.11547.4 752.6307782459631852 865979.01341611564553148863 710829 26805 89362570381215.5 336148.57A
34.91200.2 523.0265852287127251 328814.0 59719 841645 262 218544 17730 8901 85146 403.1 253157.27T
29.11365.8 628.2235391976130460 440543.0 74311 921603 5005 448428 3629511257 29651 652.8 225731.27P
52.22327.81110.2302892653031207 943595.62792132017212 7726 448223 99618135122191511691.1 552288.47A
21.41004.2 444.9245031940725729 197839.8 29850 569118 972 152792 31077 4687 16085 369.1 164827.47T
29.81009.4 503.0291292335438197 465987.5 865081096796 3938 830716 2328210017 43851 787.2 197086.77P
60.2 637.2 282.2237161956927724 180287.2 22439 452611 401 135820 36785 3374 15929 196.9 101815.87P
30.01107.0 510.8272752156629937 428441.3119892 938417 91249 194723 58383 9053146703 594.8 213277.67A
24.01144.1 566.1300102491931622 580504.01285331354811 7052 756976 2553412409119304 903.0 256645.47P
44.37599.73385.74470735199519384201768.88978018981281 127442600340287728945551084238866.62355264.17T
24.7 739.5 314.5248952021727476 230706.2 49547 522013 232 115793 13794 3890 72247 290.1 132137.47A
39.61114.1 498.3254411970931916 383110.2 569871118681 1664 303564 38454 5859 56895 777.5 193216.77P
49.8 942.4 432.5258882063329397 312857.0 71277 925280 1791 209367 55189 8791 24147 359.7 169721.97T
34.51016.0 466.0268282176426660 331631.2 93884 891585 200 162991 15773 3497127308 858.9 200455.67A
84.21269.6 605.0251251999231049 441653.61041201333698 970 308286103028 6677 38927 424.9 223702.07P
25.71478.8 715.1272082239434662 636133.71547521243801 6153 703297 4981210445 65785 734.8 289310.77P
36.21259.6 622.2270552131433474 560577.9 802511393220 1566 390117 45608 9249 34072 767.5 235688.67P
180.5 618.0 269.8291502373339402 280012.4 41237 744483 83395 121610 25664 4198 4498 271.0 121814.17D
416.8 830.2 408.9339612322050413 665735.71265953359325400373 194301 44613 6331 10156 290.2 154571.47D
589.91144.1 530.5338312766248307 819247.01913182337567385402 247567 34886 5959 11017 322.6 263914.77D
144.51167.7 530.3269821992935497 582630.41494121837512 798 692721 40464 7059 29255 535.5 186480.17P
15.11002.2 479.9274612283433385 460854.91304881038055 18428 576618 37791 6433 34739 916.0 170195.87P
83.91847.9 778.43134124285436311104435.94668943433453 15857109574513025213540 917172640.6 405492.07P
144.9 748.1 363.9415643069958045 482547.91446042043500 96258 185431 57999 9251 1823 46.3 169676.67D
54.5 600.3 284.4252922201331462 262008.0 59629 684936 1178 201188 21582 3339 25982 264.4 115328.07P
55.4 629.7 282.7238802003326871 164228.5 31351 420048 1959 103644 11760 5513 36929 235.9 112140.57A
7.8 454.8 151.6275532256927469 108417.6 31577 223255 3393 52529 2428 1503 21899 187.0 95164.47T
74.7 272.6 108.0170821061126049 73692.2 12973 226959 0 930 2700 0 26559 90.4 21333.17A
26.11911.8 841.4215241660229640 391299.02960192241915 14372 93537 37021 6455 43841 774.9 256198.07T
75.55648.22603.13437231248338462344620.74811416260527 524981025101121025323393824684414.91368124.77T
......................................................
53.6 3183.01652.9281802386333754 1510518.7 259152 3479558 3681831098570125309 37642 889761782.2 648396.37D
101.2 2440.81051.4214231737526823 712545.4 155260 2007804 42026 398719101302 127631291751215.6 357332.57A
37.2 1238.4 570.9227971805228353 347854.1 81105 853001 7982 256859 28434 9935 37868 981.1 187446.37P
71.5 834.7 326.0203341613328159 213032.1 27098 757646 3222 105500 21324 3943 39511 231.5 114416.97A
194.3 4315.72038.0367353175738052 2277576.3 318008 6448390 765381968982243507 70627 849602088.21130702.07P
1464.2 3724.02232.9461243242268664 8790443.423267852828272065225931919669317522 45797 777932120.4 942830.17D
88.5 3475.71756.2243861823735219 1473727.8 259366 3237476 809901491774122934 427811194171524.4 518609.57P
92.9 218.9 82.8195031348430953 50566.8 14470 142235 2688 3561 3048 395 11700 108.3 25989.47T
168.6 324.4 102.915603 987835779 68774.0 10485 114199 28678 518 4291 279 6141 93.1 23653.47D
61.6 536.2 230.1215711885537874 235310.9 32559 469018 74047 91648 53140 1622 13824 188.2 83893.57D
168.0 2332.81023.4228291725825519 549972.9 109925 986820 5023 322810 47440 10323131825 786.1 352257.47A
2366.8 2874.01406.4300152311545635 2280025.9 420866 3949492 7481091206799174982 28813 779141148.5 537966.97D
774.8 2397.71084.8244341785542647 1392934.8 316397 3033414 603873 513815120261 17839 63549 987.5 348024.97D
95.7 2674.31195.0231661774938023 1241598.6 260457 27389861097995 650683 95662 22063 46912 639.8 376622.07D
177.8 2793.41327.0288522289535686 1252258.7 195950 2259167 90661 533607 61720 17314 801921738.4 501403.37D
141.1 1944.2 891.7254312084432613 681619.5 118627 1131964 3822 961524 53353 10937 94097 522.3 330565.47P
314.4 1077.4 508.7272962031441901 579363.4 94507 1355788 217696 188076 38368 8863 30728 436.9 158537.57D
351.3 983.3 382.3240812068136047 226134.7 48754 743113 27974 65598 26273 1724 16214 247.8 177121.97T
3083.5 967.0 497.0426693208068871 1084556.2 403427 2443951 804388 37175 66210 5384 25781 530.1 228740.27D
431.9 1065.8 467.0239921835240740 326865.7 90058 989829 108400 23788 34259 3330 22904 186.5 164946.57D
464.3 314.7 163.9487583320173896 236483.5 39279 534999 21518 133151 18224 2501 8249 35.5 57195.17D
164.7 1902.7 971.0346192763842199 834023.4 141859 3424996 22557 235888 66550 9550 39963 538.2 406297.17T
787.6 1321.5 691.8390843299747153 710639.6 129646 1722484 91358 271571 57061 8244 17099 273.8 324055.17D
361.9 793.2 387.9309372493842315 301069.4 239705 1168547 60169 34091 37046 3074 47637 158.9 170850.77T
462.5 141.2 91.6597743524285631 170723.4 51512 347962 124937 4512 16012 933 2723 4.3 32286.47D
87.1 489.6 279.7537834314777499 1179668.7 218339 31701371016799 60300 18063 2621 11147 264.8 148497.47D
36.3 159.9 65.2246961906439242 55808.8 16821 259059 10330 6632 4455 519 5772 27.8 24075.77D
721.5 49.7 33.3788122950598864 78143.4 15068 190354 67502 1055 8805 491 1334 1.8 9573.87D
2.612615.38838.268386541308380117881516.224293204060231918088236413663783384154014 73083541.24798454.07D
1.4 5383.93151.6449993677460421 4193489.5 747407 7816952 240352615910213389 59536 03950.31412406.07P
17
[1] "Имена этих переменных:"
'P17'
A data.frame: 81 × 16
P1P2P3P4P5P6P7P8P9P10P11P12P13P14P15P16
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
27.11547.4 752.6307782459631852 865979.01341611564553148863 710829 26805 89362570381215.5 336148.5
34.91200.2 523.0265852287127251 328814.0 59719 841645 262 218544 17730 8901 85146 403.1 253157.2
29.11365.8 628.2235391976130460 440543.0 74311 921603 5005 448428 3629511257 29651 652.8 225731.2
52.22327.81110.2302892653031207 943595.62792132017212 7726 448223 99618135122191511691.1 552288.4
21.41004.2 444.9245031940725729 197839.8 29850 569118 972 152792 31077 4687 16085 369.1 164827.4
29.81009.4 503.0291292335438197 465987.5 865081096796 3938 830716 2328210017 43851 787.2 197086.7
60.2 637.2 282.2237161956927724 180287.2 22439 452611 401 135820 36785 3374 15929 196.9 101815.8
30.01107.0 510.8272752156629937 428441.3119892 938417 91249 194723 58383 9053146703 594.8 213277.6
24.01144.1 566.1300102491931622 580504.01285331354811 7052 756976 2553412409119304 903.0 256645.4
44.37599.73385.74470735199519384201768.88978018981281 127442600340287728945551084238866.62355264.1
24.7 739.5 314.5248952021727476 230706.2 49547 522013 232 115793 13794 3890 72247 290.1 132137.4
39.61114.1 498.3254411970931916 383110.2 569871118681 1664 303564 38454 5859 56895 777.5 193216.7
49.8 942.4 432.5258882063329397 312857.0 71277 925280 1791 209367 55189 8791 24147 359.7 169721.9
34.51016.0 466.0268282176426660 331631.2 93884 891585 200 162991 15773 3497127308 858.9 200455.6
84.21269.6 605.0251251999231049 441653.61041201333698 970 308286103028 6677 38927 424.9 223702.0
25.71478.8 715.1272082239434662 636133.71547521243801 6153 703297 4981210445 65785 734.8 289310.7
36.21259.6 622.2270552131433474 560577.9 802511393220 1566 390117 45608 9249 34072 767.5 235688.6
180.5 618.0 269.8291502373339402 280012.4 41237 744483 83395 121610 25664 4198 4498 271.0 121814.1
416.8 830.2 408.9339612322050413 665735.71265953359325400373 194301 44613 6331 10156 290.2 154571.4
589.91144.1 530.5338312766248307 819247.01913182337567385402 247567 34886 5959 11017 322.6 263914.7
144.51167.7 530.3269821992935497 582630.41494121837512 798 692721 40464 7059 29255 535.5 186480.1
15.11002.2 479.9274612283433385 460854.91304881038055 18428 576618 37791 6433 34739 916.0 170195.8
83.91847.9 778.43134124285436311104435.94668943433453 15857109574513025213540 917172640.6 405492.0
144.9 748.1 363.9415643069958045 482547.91446042043500 96258 185431 57999 9251 1823 46.3 169676.6
54.5 600.3 284.4252922201331462 262008.0 59629 684936 1178 201188 21582 3339 25982 264.4 115328.0
55.4 629.7 282.7238802003326871 164228.5 31351 420048 1959 103644 11760 5513 36929 235.9 112140.5
7.8 454.8 151.6275532256927469 108417.6 31577 223255 3393 52529 2428 1503 21899 187.0 95164.4
74.7 272.6 108.0170821061126049 73692.2 12973 226959 0 930 2700 0 26559 90.4 21333.1
26.11911.8 841.4215241660229640 391299.02960192241915 14372 93537 37021 6455 43841 774.9 256198.0
75.55648.22603.13437231248338462344620.74811416260527 524981025101121025323393824684414.91368124.7
................................................
53.6 3183.01652.9281802386333754 1510518.7 259152 3479558 3681831098570125309 37642 889761782.2 648396.3
101.2 2440.81051.4214231737526823 712545.4 155260 2007804 42026 398719101302 127631291751215.6 357332.5
37.2 1238.4 570.9227971805228353 347854.1 81105 853001 7982 256859 28434 9935 37868 981.1 187446.3
71.5 834.7 326.0203341613328159 213032.1 27098 757646 3222 105500 21324 3943 39511 231.5 114416.9
194.3 4315.72038.0367353175738052 2277576.3 318008 6448390 765381968982243507 70627 849602088.21130702.0
1464.2 3724.02232.9461243242268664 8790443.423267852828272065225931919669317522 45797 777932120.4 942830.1
88.5 3475.71756.2243861823735219 1473727.8 259366 3237476 809901491774122934 427811194171524.4 518609.5
92.9 218.9 82.8195031348430953 50566.8 14470 142235 2688 3561 3048 395 11700 108.3 25989.4
168.6 324.4 102.915603 987835779 68774.0 10485 114199 28678 518 4291 279 6141 93.1 23653.4
61.6 536.2 230.1215711885537874 235310.9 32559 469018 74047 91648 53140 1622 13824 188.2 83893.5
168.0 2332.81023.4228291725825519 549972.9 109925 986820 5023 322810 47440 10323131825 786.1 352257.4
2366.8 2874.01406.4300152311545635 2280025.9 420866 3949492 7481091206799174982 28813 779141148.5 537966.9
774.8 2397.71084.8244341785542647 1392934.8 316397 3033414 603873 513815120261 17839 63549 987.5 348024.9
95.7 2674.31195.0231661774938023 1241598.6 260457 27389861097995 650683 95662 22063 46912 639.8 376622.0
177.8 2793.41327.0288522289535686 1252258.7 195950 2259167 90661 533607 61720 17314 801921738.4 501403.3
141.1 1944.2 891.7254312084432613 681619.5 118627 1131964 3822 961524 53353 10937 94097 522.3 330565.4
314.4 1077.4 508.7272962031441901 579363.4 94507 1355788 217696 188076 38368 8863 30728 436.9 158537.5
351.3 983.3 382.3240812068136047 226134.7 48754 743113 27974 65598 26273 1724 16214 247.8 177121.9
3083.5 967.0 497.0426693208068871 1084556.2 403427 2443951 804388 37175 66210 5384 25781 530.1 228740.2
431.9 1065.8 467.0239921835240740 326865.7 90058 989829 108400 23788 34259 3330 22904 186.5 164946.5
464.3 314.7 163.9487583320173896 236483.5 39279 534999 21518 133151 18224 2501 8249 35.5 57195.1
164.7 1902.7 971.0346192763842199 834023.4 141859 3424996 22557 235888 66550 9550 39963 538.2 406297.1
787.6 1321.5 691.8390843299747153 710639.6 129646 1722484 91358 271571 57061 8244 17099 273.8 324055.1
361.9 793.2 387.9309372493842315 301069.4 239705 1168547 60169 34091 37046 3074 47637 158.9 170850.7
462.5 141.2 91.6597743524285631 170723.4 51512 347962 124937 4512 16012 933 2723 4.3 32286.4
87.1 489.6 279.7537834314777499 1179668.7 218339 31701371016799 60300 18063 2621 11147 264.8 148497.4
36.3 159.9 65.2246961906439242 55808.8 16821 259059 10330 6632 4455 519 5772 27.8 24075.7
721.5 49.7 33.3788122950598864 78143.4 15068 190354 67502 1055 8805 491 1334 1.8 9573.8
2.612615.38838.268386541308380117881516.224293204060231918088236413663783384154014 73083541.24798454.0
1.4 5383.93151.6449993677460421 4193489.5 747407 7816952 240352615910213389 59536 03950.31412406.0
  1. 12
  2. 7
  3. 16
  4. 8
  5. 3
  6. 9
  7. 11
  8. 13
  9. 2
  10. 5
  11. 4
[1] "Имена этих переменных:"
  1. 'P12'
  2. 'P7'
  3. 'P16'
  4. 'P8'
  5. 'P3'
  6. 'P9'
  7. 'P11'
  8. 'P13'
  9. 'P2'
  10. 'P5'
  11. 'P4'
A data.frame: 81 × 5
P1P6P10P14P15
<dbl><dbl><dbl><dbl><dbl>
27.1318521488632570381215.5
34.927251 262 85146 403.1
29.130460 5005 29651 652.8
52.231207 77262191511691.1
21.425729 972 16085 369.1
29.838197 3938 43851 787.2
60.227724 401 15929 196.9
30.029937 91249146703 594.8
24.031622 7052119304 903.0
44.351938 127441084238866.6
24.727476 232 72247 290.1
39.631916 1664 56895 777.5
49.829397 1791 24147 359.7
34.526660 200127308 858.9
84.231049 970 38927 424.9
25.734662 6153 65785 734.8
36.233474 1566 34072 767.5
180.539402 83395 4498 271.0
416.850413400373 10156 290.2
589.948307385402 11017 322.6
144.535497 798 29255 535.5
15.133385 18428 34739 916.0
83.943631 15857 917172640.6
144.958045 96258 1823 46.3
54.531462 1178 25982 264.4
55.426871 1959 36929 235.9
7.827469 3393 21899 187.0
74.726049 0 26559 90.4
26.129640 14372 43841 774.9
75.533846 524983824684414.9
...............
53.633754 368183 889761782.2
101.226823 420261291751215.6
37.228353 7982 37868 981.1
71.528159 3222 39511 231.5
194.338052 76538 849602088.2
1464.2686646522593 777932120.4
88.535219 809901194171524.4
92.930953 2688 11700 108.3
168.635779 28678 6141 93.1
61.637874 74047 13824 188.2
168.025519 5023131825 786.1
2366.845635 748109 779141148.5
774.842647 603873 63549 987.5
95.7380231097995 46912 639.8
177.835686 90661 801921738.4
141.132613 3822 94097 522.3
314.441901 217696 30728 436.9
351.336047 27974 16214 247.8
3083.568871 804388 25781 530.1
431.940740 108400 22904 186.5
464.373896 21518 8249 35.5
164.742199 22557 39963 538.2
787.647153 91358 17099 273.8
361.942315 60169 47637 158.9
462.585631 124937 2723 4.3
87.1774991016799 11147 264.8
36.339242 10330 5772 27.8
721.598864 67502 1334 1.8
2.6838011808823 73083541.2
1.460421 24035 03950.3

Существует ряд методов, которые позволяют ранжировать предикторы и отсеивать наименее значемые из них на основе данных о целевой переменной и гипотезе о виде модели (3).Подобные методы включают процесс оценки предикторов в процесс построения и оценивания модели.Поэтому, условно этот подход можно назвать модельным оцениванием важности предикторов. Мы рассмотрим два варианта использования данного подхода. Первый в качестве целевой переменной будем рассматривать переменную, значения которой измерено в номинальной шкале (для примера в качестве такой переменной используем переменную из наших данных "Тип экономики региона"). Второй вариант предпологает метрическую целевую переменную (мы будем использовать здесь показатель P15 "Ввод в действие жилых домов").

Модельное оценивание важности предикторов на основе решении задачи классификации.¶

Рассмотрим как можно оценить важность предикторов при реализации процедур классификаци (обучение с учителем).Будем использовать для этого несколько широко известных процедур классификации: Random Forest,Recursive partitioning,Naive bayesian classifier, KNN

Программный код на R пакет "caret" имеет следующий вид:

In [2]:
options(warn=-1)
library(caret)
library(openxlsx)
library(vegan)
library(randomForest)
library(class)
library(cluster)
library(e1071)
library(klaR)
library(rpart)
library(kknn)

#rm(list=ls(all=TRUE))

#ЗАГРУЗКА ИЗ EXSEL ПЕРВИЧНЫХ ДАННЫХ
N=1 # номер листа с данными
x <-read.xlsx("Region_Data4.xlsx", sheet = N)
#x

#ФОРМИРОВАНИЕ data.frame ОСНОВНЫЕ СОЦИАЛЬНО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ РЕГИОНОВ РФ 
xreg <-data.frame(P1=x$Pok_001,P2=x$Pok_002,P3=x$Pok_003,P4=x$Pok_004,
P5=x$Pok_005,P6=x$Pok_006,P7=x$Pok_007,P8=x$Pok_008,P9=x$Pok_009,P10=x$Pok_010,
P11=x$Pok_011,P12=x$Pok_012,P13=x$Pok_013,P14=x$Pok_014,P15=x$Pok_015,P16=x$Pok_016,
P17=x$Pok_017,P18=x$Pok_018)
#xreg
#Формирование фактора тип экономики региона
(xreg_f <- as.factor(x$Pok_018))
reg_ru = xreg[, -18]
y=xreg_f

#модель случайные деревья
train.index <- createDataPartition(y, p = .8, times = 20)
trControl = trainControl(method="oob", index = train.index)
print("Модель на основе исходного набора из 17 предикторов")
(modSource <- train(reg_ru, y, "rf", trControl = trControl))

#показатели важности переменных могут быть рассчитаны функцией varImp()

VagRf <-varImp(modSource, scale = FALSE)
x11()
plot(VagRf)

#Деревья на основе рекурсивного деления (recursive partitioning)
y=xreg_f
train.index <- createDataPartition(y, p = .8, times = 20)
trControl = trainControl(method="LGOCV", index = train.index)
print("Модель на основе исходного набора из 17 предикторов")
(modSource <- train(reg_ru, y, "rpart", trControl = trControl))

VagRp <-varImp(modSource, scale = FALSE)
x11()
plot(VagRp)

#Наивный байесовский классификатор
y=xreg_f
train.index <- createDataPartition(y, p = .8, times = 20)
trControl = trainControl(method="LGOCV", index = train.index)
print("Модель на основе исходного набора из 17 предикторов")
(modSource <- train(reg_ru, y, "nb", trControl = trControl))

VagNbc <-varImp(modSource, scale = FALSE)
x11()
plot(VagNbc)

#Алгоритм knn
w=c(10,11,14,16)
y=xreg_f
xx <-reg_ru
#xx <-xreg[,w]
train.index <- createDataPartition(y, p = .8, times = 20)
trControl = trainControl(method="LGOCV", index = train.index)
print("Модель на основе набора исходного набора из 17 предикторов")
(modSource <- train(xx, y, "kknn", trControl = trControl))


VagKNN <-varImp(modSource, scale = FALSE)
x11()
plot(VagKNN)

#Полученные результаты
  1. A
  2. T
  3. P
  4. A
  5. T
  6. P
  7. P
  8. A
  9. P
  10. T
  11. A
  12. P
  13. T
  14. A
  15. P
  16. P
  17. P
  18. D
  19. D
  20. D
  21. P
  22. P
  23. P
  24. D
  25. P
  26. A
  27. T
  28. A
  29. T
  30. T
  31. D
  32. P
  33. T
  34. T
  35. A
  36. T
  37. A
  38. T
  39. T
  40. A
  41. P
  42. P
  43. A
  44. P
  45. D
  46. P
  47. P
  48. T
  49. P
  50. D
  51. A
  52. D
  53. A
  54. P
  55. A
  56. P
  57. D
  58. P
  59. T
  60. D
  61. D
  62. A
  63. D
  64. D
  65. D
  66. D
  67. P
  68. D
  69. T
  70. D
  71. D
  72. D
  73. T
  74. D
  75. T
  76. D
  77. D
  78. D
  79. D
  80. D
  81. P
Levels:
  1. 'A'
  2. 'D'
  3. 'P'
  4. 'T'
[1] "Модель на основе исходного набора из 17 предикторов"
Random Forest 

81 samples
17 predictors
 4 classes: 'A', 'D', 'P', 'T' 

No pre-processing
Resampling: Out of Bag Resampling 
Summary of sample sizes: 66, 66, 66, 66, 66, 66, ... 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa    
   2    0.5432099  0.3760150
   9    0.6296296  0.4973107
  17    0.5802469  0.4286307

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 9.
[1] "Модель на основе исходного набора из 17 предикторов"
CART 

81 samples
17 predictors
 4 classes: 'A', 'D', 'P', 'T' 

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (20 reps, 75%) 
Summary of sample sizes: 66, 66, 66, 66, 66, 66, ... 
Resampling results across tuning parameters:

  cp          Accuracy   Kappa     
  0.05357143  0.5166667  0.34018849
  0.17857143  0.4700000  0.25573559
  0.28571429  0.3700000  0.08618519

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was cp = 0.05357143.
[1] "Модель на основе исходного набора из 17 предикторов"
Naive Bayes 

81 samples
17 predictors
 4 classes: 'A', 'D', 'P', 'T' 

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (20 reps, 75%) 
Summary of sample sizes: 66, 66, 66, 66, 66, 66, ... 
Resampling results across tuning parameters:

  usekernel  Accuracy   Kappa    
  FALSE      0.4933333  0.3302650
   TRUE      0.4633333  0.2856843

Tuning parameter 'fL' was held constant at a value of 0
Tuning
 parameter 'adjust' was held constant at a value of 1
Accuracy was used to select the optimal model using the largest value.
The final values used for the model were fL = 0, usekernel = FALSE and adjust
 = 1.
[1] "Модель на основе набора исходного набора из 17 предикторов"
k-Nearest Neighbors 

81 samples
17 predictors
 4 classes: 'A', 'D', 'P', 'T' 

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (20 reps, 75%) 
Summary of sample sizes: 66, 66, 66, 66, 66, 66, ... 
Resampling results across tuning parameters:

  kmax  Accuracy  Kappa    
  5     0.58      0.4344736
  7     0.58      0.4344736
  9     0.57      0.4220641

Tuning parameter 'distance' was held constant at a value of 2
Tuning
 parameter 'kernel' was held constant at a value of optimal
Accuracy was used to select the optimal model using the largest value.
The final values used for the model were kmax = 7, distance = 2 and kernel
 = optimal.
In [1]:
#Код python для RandomForest:
import warnings
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
from pandas import Series, DataFrame
import pandas as pd
import openpyxl
import xlrd
from sklearn.ensemble import RandomForestRegressor

warnings.simplefilter('ignore')
data_regru =pd.ExcelFile('Region_Data.xlsx')
tabledat =data_regru.parse('dat01')
#print(tabledat )

#ФОРМИРОВАНИЕ ЦЕЛЕВОЙ ПЕРЕМЕННОЙ
Y=tabledat['P18']

#ФОРМИРОВАНИЕ МАССИВА  ИЗ 17 ПЕРЕМЕННЫХ
X =DataFrame(tabledat, columns=['P1','P2','P3','P4','P5','P6', 'P7','P8', 'P9', 'P10','P11','P12',
'P13','P14','P15','P16','P17']) 


regr = RandomForestRegressor(max_depth=2, random_state=0)
regr.fit(X, Y)
features = X.columns
vagRf = regr.feature_importances_
indices = np.argsort(vagRf ) 
plt.title('Важность предикторов')
plt.barh(range(len(indices)),vagRf [indices], color='b', align='center')
plt.yticks(range(len(indices)), [features[i] for i in indices])
plt.xlabel('Уровень важности')
plt.show()

#Результаты работы кода python

Как видно из выше приведенных графиков есть в ранжировке предикторов по важности определенные отличия по методам их получения, но тем не менее ранжировки достаточно схожи и позволяют выделить несколько навиболее важных предикторов для классификации регионов по типу экономики: P6,P10,P14,P1,P11.

Оценивание важности предикторов на основе модели регрессии.¶

Здесь мы используем для оценки важности предикторов регрессии для целевой переменной,измеренной в метрической шкале. В качестве целевой переменной примем P15, а в качестве предикторов P2-P14,P16.

Модель множественной линейной регрессии является, безусловно, весьма полезной и широко применяемой для прогнозирования количественного отклика. Считается, что наиболее эффективный путь улучшения качества регрессии - исключение незначимых коэффициентов, или, выражаясь точнее, отбор информативного комплекса $S_q$ из $q$ переменных ($q < m$). Причины, по которым стоит проводить селекцию "оптимального подмножества" предикторов, состоит в следующем:

  • Принцип бритвы Оккама утверждает, что из нескольких вероятных объяснений явления лучшим является самое простое. Компактная модель, из которой удалены избыточные предикторы, лучше объясняет имеющиеся данные.

  • Ненужные предикторы добавляют шум к оценке влияния других интересующих нас факторов. Иначе степени свободы (часто ограниченные) будут тратиться впустую.

  • При наличии коллинеарности некоторые переменные будут "пытаться сделать одну и ту же работу" (т.е., повторно объяснять вариацию значений зависимой переменной).

  • Если модель используется для прогнозирования, то можно сэкономить время и/или деньги, не измеряя избыточные переменные.

Алгоритмы выбора оптимального подмножества $S_q$ обычно основаны на последовательном "переборном" процессе, при котором многократно создаются модели с различными наборами предикторов, лучшая из которых определяется по некоторому критерию эффективности Воспользуемся следующими методами: пошаговый (forward/backward) метод селекции,рекурсивное исключение переменных и процедуры, реализованные в пакете Boruta

Пошаговая (forward/backward)селекция ппеременных:

  • Сначала мы берем все n переменных, присутствующих в нашем наборе данных, и обучаем модель, используя их.

  • Затем мы рассчитываем эффективность модели.

  • Теперь мы вычисляем эффективность модели после исключения каждой переменной (n раз), т.е. мы отбрасываем по одной переменной каждый раз и обучаем модель на оставшихся n-1 переменных.

  • Мы определяем переменную, удаление которой привело к наименьшему (или отсутствию) изменения эффективности модели, а затем отбрасываем эту переменную.

  • Повторяйте этот процесс до тех пор, пока никакие переменные не будут удаляться.

Рекурсивное исключение переменных:

Алгоритм рекурсивного исключения (RFE - Recursive Feature Elimination) выполняется следующим образом. Вначале строится модель по всем предикторам, которые ранжируются по их важности. Далее рассматривается последовательность подмножеств $\bf S$ ( $\bf S_1>\bf S_2$ , и т.д.) из переменных наивысшего ранга. На каждой итерации подмножества $\bf S_i$ ранги предикторов пересматриваются, а модели пересчитываются. Итоговая модель основывается на подмножестве $\bf S_i$ , обеспечивающем оптимум заданному критерию качества.

Пакет Boruta:

  • Набор данных дополняется копиями всех предикторов - так называемыми “теневыми” предикторами. Их создается как минимум 5, даже если исходных предикторов меньше 5.

  • Значения добавленных предикторов случайным образом перемешиваются, чтобы они перестали быть связанными с целевой переменной.

  • Обучается модель типа "случайный лес" (можно использовать и другие модели), из которой извлекаются рассчитанные значения $Z$-оценок

  • Находится максимальное значение $Z$-оценки для "теневых" предикторов ($MZSA$ - maximum $Z$-score for shadow attributes). Отмечаются все предикторы, чьи оценки лучше $MZSA$.

  • Для каждого предиктора, чья важность неизвестна, выполняется двусторонний тест на равенство с $MZSA$.

  • Предикторы с важностью, статистически значимо меньшей MZSA, признаются "неважными" и безвозвратно удаляются из набора данных.

  • Предикторы с важностью, статистически значимо большей $MZSA$, признаются "важными".

  • Удаляются все "теневые" предикторы.

  • Процедура повторяется до тех пор, пока в наборе данных не останутся только важные предикторы, или пока не будет достигнуто заданное максимальное число итераций.

Реализум данные методы в R с использованием пакета "caret" . Программный код представлен ниже.

In [2]:
options(warn=-1)
library(openxlsx)
library(ggplot2)
library(car)
library(hexbin)
library(caret)
library(glmnet)

#ЗАГРУЗКА ИЗ EXSEL ПЕВИЧНЫХ ДАННЫХ
N=1 # номер листа с данными
x <-read.xlsx("Region_Data4.xlsx", sheet = N)
#x

#ОСНОВНЫЕ СОЦИАЛЬНО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ РЕГИОНОВ РФ ЗА 2018 ГОД

xreg <-data.frame(P1=x$Pok_001,P2=x$Pok_002,P3=x$Pok_003,P4=x$Pok_004,
P5=x$Pok_005,P6=x$Pok_006,P7=x$Pok_007,P8=x$Pok_008,P9=x$Pok_009,P10=x$Pok_010,
P11=x$Pok_011,P12=x$Pok_012,P13=x$Pok_013,P14=x$Pok_014,P15=x$Pok_015,P16=x$Pok_016,
P17=x$Pok_017,P18=x$Pok_018)
#xreg

#P1  - Площадь территории,тыс. км2
#P2  - Численность  населения на 1 января 2019 г., тыс. человек
#P3  - Среднегодовая численность  занятых, тыс. человек
#P4  - Среднедушевые денежные доходы (в месяц), руб
#P5  - Потребительские расходы в среднем на душу населения (в месяц), руб
#P6  - Среднемесячная номинальная начисленная заработная плата работников организаций, руб.
#P7  - Валовой  региональный  продукт в 2018 г. , млн руб
#P8  - Инвестиции в основной  капитал, млн руб
#P9  - Основные фонды в экономике (по полной учетной стоимости; на конец года),млн руб.
#P10 - Добыча  полезных  ископаемых ,млн. руб
#P11 - Обрабатывающие производства, млн руб
#P12 - Обеспечение электрической энергией, газом и паром, млн руб
#P13 - Водоснабжение; водоотведение, организация сбора и утилизации отходов, млн руб
#P14 - Продукция сельского хозяйства , млн руб
#P15 - Ввод  в действие  жилых домов, тыс. м2 
#P16 - Оборот  розничной торговли, млн руб
#P17 - Сальдированный финансовый результат деятельности организаций, млн руб.
#P18 - Тип региональной экономики (A,D,P,T)

w=c(-17,-18)
x_reg =xreg[,w]

w=c(-1,-15)
x_pred =x_reg[,w]
y = xreg[,15]

#нормирующая функция---------------------------
norm <-function(x){
return ((x-min(x))/(max(x)-min(x)))
}

x_pred.nor <-as.data.frame(lapply(x_pred,norm)) 
data_reg <-cbind(y,x_pred.nor)

#линейная модель на всех 14 предикторах
lm.y <- lm(y ~ ., data = data_reg[,1:15])
summary(lm.y)

#стандартная пошаговая процедура включений с 
#исключениями "слабых" предикторов
lm_step.y <- step(lm.y,trace = 0)
summary(lm_step.y)

(anova(lm.y,lm_step.y))

#Выполним тестирование обоих моделей функцией train()
#с использованием 10-кратной перекрестной проверки:

lm.y.cv <- train(y ~ ., data = data_reg[,1:15], method = 'lm',
trControl = trainControl(method = "cv"))
lm.y.cv

lm_step.y.cv <- train(y ~ P2 + P3 + P8 + P9 + P10 + P11 +P13+
P16, data = data_reg[,1:15], method = 'lm',
trControl = trainControl(method = "cv"))
lm_step.y.cv

#Рекурсивное исключение переменных

set.seed(10)
ctrl <- rfeControl(functions = lmFuncs, method = "cv",
verbose = FALSE, returnResamp = "final")
lmProfileF <- rfe(data_reg[,1:15], data_reg$y,
sizes = 1:15, rfeControl = ctrl)

x11()
ggplot(lmProfileF, metric = "Rsquared")
x11()
ggplot(lmProfileF, metric = "RMSE")

predictors(lmProfileF)
summary(lmProfileF$fit)
Call:
lm(formula = y ~ ., data = data_reg[, 1:15])

Residuals:
    Min      1Q  Median      3Q     Max 
-1066.4  -140.1   -31.9   225.6   747.4 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)     58.93     138.45   0.426 0.671777    
P2           13225.22    4766.69   2.775 0.007183 ** 
P3          -23832.86    6840.06  -3.484 0.000881 ***
P4            -628.29     994.45  -0.632 0.529703    
P5            -325.30     689.54  -0.472 0.638651    
P6             812.62     746.57   1.088 0.280346    
P7            -361.92    7313.36  -0.049 0.960680    
P8           11115.19    1689.62   6.579 9.03e-09 ***
P9           -6187.75    3317.13  -1.865 0.066572 .  
P10          -3903.06    2245.37  -1.738 0.086827 .  
P11            410.26    1599.03   0.257 0.798310    
P12          -5737.05    1784.36  -3.215 0.002019 ** 
P13           5835.09    1723.72   3.385 0.001202 ** 
P14            489.22     372.89   1.312 0.194075    
P16          10562.06    4536.83   2.328 0.022983 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 367.8 on 66 degrees of freedom
Multiple R-squared:  0.9285,	Adjusted R-squared:  0.9133 
F-statistic:  61.2 on 14 and 66 DF,  p-value: < 2.2e-16
Call:
lm(formula = y ~ P2 + P3 + P8 + P9 + P10 + P12 + P13 + P16, data = data_reg[, 
    1:15])

Residuals:
     Min       1Q   Median       3Q      Max 
-1187.55  -154.16    -4.68   182.73   790.53 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)      7.534     74.735   0.101 0.919982    
P2           13924.065   2228.512   6.248 2.60e-08 ***
P3          -23457.400   3350.288  -7.002 1.10e-09 ***
P8           11498.955   1515.983   7.585 9.10e-11 ***
P9           -7134.183   2765.974  -2.579 0.011943 *  
P10          -3683.515   1540.961  -2.390 0.019448 *  
P12          -5495.556   1647.456  -3.336 0.001348 ** 
P13           5636.502   1176.176   4.792 8.61e-06 ***
P16           9838.592   2618.772   3.757 0.000346 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 358.4 on 72 degrees of freedom
Multiple R-squared:  0.9259,	Adjusted R-squared:  0.9177 
F-statistic: 112.5 on 8 and 72 DF,  p-value: < 2.2e-16
A anova: 2 × 6
Res.DfRSSDfSum of SqFPr(>F)
<dbl><dbl><dbl><dbl><dbl><dbl>
1668928902NA NA NA NA
2729250610-6-321708.40.39633010.8788324
Linear Regression 

81 samples
14 predictors

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 73, 73, 73, 73, 72, 73, ... 
Resampling results:

  RMSE      Rsquared   MAE     
  827.2515  0.7248196  491.4463

Tuning parameter 'intercept' was held constant at a value of TRUE
Linear Regression 

81 samples
 8 predictor

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 73, 73, 73, 73, 72, 73, ... 
Resampling results:

  RMSE      Rsquared   MAE     
  682.6104  0.8103165  428.8649

Tuning parameter 'intercept' was held constant at a value of TRUE
  1. 'P3'
  2. 'P2'
  3. 'P16'
  4. 'P8'
  5. 'P9'
  6. 'P7'
  7. 'P13'
  8. 'P12'
  9. 'P10'
  10. 'P11'
Call:
lm(formula = y ~ ., data = tmp)

Residuals:
     Min       1Q   Median       3Q      Max 
-1192.32  -154.84    -5.32   180.18   799.24 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)      7.561     76.038   0.099 0.921080    
P3          -23994.671   6272.715  -3.825 0.000281 ***
P2           14249.446   4249.138   3.353 0.001291 ** 
P16           9733.817   3690.019   2.638 0.010272 *  
P8           11418.814   1642.181   6.953 1.52e-09 ***
P9           -7203.081   3104.133  -2.320 0.023235 *  
P7             453.251   6265.019   0.072 0.942533    
P13           5565.085   1554.215   3.581 0.000628 ***
P12          -5535.509   1729.209  -3.201 0.002059 ** 
P10          -3726.724   1972.243  -1.890 0.062955 .  
P11            137.776   1471.963   0.094 0.925694    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 363.5 on 70 degrees of freedom
Multiple R-squared:  0.9259,	Adjusted R-squared:  0.9153 
F-statistic:  87.5 on 10 and 70 DF,  p-value: < 2.2e-16
In [ ]:
#оценка важности предикторов в пакете Boruta
library(Boruta)
data_reg.mod <- as.data.frame(model.matrix(y ~ .,
data=data_reg[,2:15])[,-1])
data_reg.mod <- cbind(data_reg.mod, y=data_reg$y)
data_reg.Boruta <- Boruta(y ~ ., data = data_reg.mod,
doTrace = 2, ntree = 500)
getConfirmedFormula(data_reg.Boruta)
attStats(data_reg.Boruta)

x11()
plot(data_reg.Boruta, xlab = "Предикторы", xaxt = "n")
lz<-lapply(1:ncol(data_reg.Boruta$ImpHistory),function(i)
data_reg.Boruta$ImpHistory[is.finite(data_reg.Boruta$ImpHistory[,i]),i])
names(lz) <- colnames(data_reg.Boruta$ImpHistory)
Labels <- sort(sapply(lz,median))
axis(side = 1,las=2,labels = names(Labels),
at = 1:ncol(data_reg.Boruta$ImpHistory), cex.axis = 0.7)


data_reg.Boruta <- TentativeRoughFix(data_reg.Boruta)
data_reg.Boruta

#Функция attStats() выводит таблицу с Z-оценками и долей построенных 
#моделей, в которых переменная была важнее самого важного "теневого"
#предиктора:

knitr::kable(attStats(data_reg.Boruta))


#Зеленые линии соответствуют подтвержденным признакам, 
#красные - исключенным,а синие показывают минимальные, 
#средние и максимальные важности "теневых"
#предикторов
x11()
plotImpHistory(data_reg.Boruta)

Оценка важности предикторов: пакет Boruta Оценка важности предикторов: пакет Boruta

Для сокращения числа предикторов можно использовать также генетический алгоритм, но затраты времени на его реализацию дотаточно велики.

Код R реализующий генетический алгоритм:

In [ ]:
library(openxlsx)
library(ggplot2)
library(car)
library(hexbin)
library(caret)
library(glmnet)

#ЗАГРУЗКА ИЗ EXSEL ПЕВИЧНЫХ ДАННЫХ
N=1 # номер листа с данными
x <-read.xlsx("D:/Machine learning/DATA/Region_Data4.xlsx", sheet = N)
#x

#ОСНОВНЫЕ СОЦИАЛЬНО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ РЕГИОНОВ РФ ЗА 2018 ГОД

xreg <-data.frame(P1=x$Pok_001,P2=x$Pok_002,P3=x$Pok_003,P4=x$Pok_004,
P5=x$Pok_005,P6=x$Pok_006,P7=x$Pok_007,P8=x$Pok_008,P9=x$Pok_009,P10=x$Pok_010,
P11=x$Pok_011,P12=x$Pok_012,P13=x$Pok_013,P14=x$Pok_014,P15=x$Pok_015,P16=x$Pok_016,
P17=x$Pok_017,P18=x$Pok_018)
#xreg

w=c(-17,-18)
x_reg =xreg[,w]
w=c(-1,-15)
x_pred =x_reg[,w]
y = xreg[,15]

#нормирующая функция---------------------------
norm <-function(x){
return ((x-min(x))/(max(x)-min(x)))
}

x_pred.nor <-as.data.frame(lapply(x_pred,norm)) 
data_reg <-cbind(y,x_pred.nor) 



#Генетический алгоритм поиска набор предикторов модели

set.seed(10)
ctrl <- gafsControl(functions = rfGA, method = "cv",
verbose = FALSE, returnResamp = "final")
lmProfGafs <- gafs(data_reg[, 2:15], data_reg$y,
iters = 5, # 10 генераций
gafsControl = ctrl)
lmProfGafs

Оценка важности предикторов: генетический алгоритм