SaveText.Ru

ччч
  1. import numpy as np
  2. import matplotlib.pyplot as plt   # библиотека построения графиков
  3. import seaborn as sns             # библиотека визуализации статистики, высокоуровневая, на основе matplotlib
  4. df = pd.read_csv("real_estate_data.csv", sep=',', low_memory=False)
  5. df.info() # список столбцов с указанием типа даных
  6. <class 'pandas.core.frame.DataFrame'>
  7. RangeIndex: 403487 entries, 0 to 403486
  8. Data columns (total 17 columns):
  9. id                   403487 non-null int64
  10. type                 403487 non-null object
  11. sub_type             403487 non-null object
  12. start_date           403487 non-null object
  13. end_date             266298 non-null object
  14. listing_type         403487 non-null int64
  15. tom                  403487 non-null int64
  16. building_age         376097 non-null object
  17. total_floor_count    375466 non-null object
  18. floor_no             368191 non-null object
  19. room_count           403487 non-null object
  20. size                 257481 non-null float64
  21. address              403487 non-null object
  22. furnished            0 non-null float64
  23. heating_type         375517 non-null object
  24. price                402772 non-null float64
  25. price_currency       402772 non-null object
  26. dtypes: float64(3), int64(3), object(11)
  27. memory usage: 35.4+ MB
  28. # первые строки из набора
  29. df.head()
  30. id      type    sub_type        start_date      end_date        listing_type    tom     building_age    total_floor_count       floor_no        room_count      size    address furnished       heating_type    price   price_currency
  31. 0       1       Konut   Rezidans        12/10/18        1/9/19  2       30      0       20 ve üzeri    2       2+1     90.0    İstanbul/Kartal/Kordonboyu     NaN     Fancoil 3500.0  TRY
  32. 1       2       Konut   Daire   2/13/19 NaN     1       14      0       20 ve üzeri    20 ve üzeri    1+0     43.0    İstanbul/Kartal/Kordonboyu     NaN     Fancoil 490000.0        TRY
  33. 2       3       Konut   Daire   10/9/18 11/8/18 1       30      0       1       Yüksek Giriş  2+1     NaN     Tekirdağ/Çorlu/Reşadiye      NaN     Fancoil 155000.0        TRY
  34. 3       4       Konut   Rezidans        9/10/18 10/10/18        1       30      3       20 ve üzeri    20 ve üzeri    6+1     450.0   İstanbul/Beşiktaş/Levent     NaN     Fancoil 32500000.0      TRY
  35. 4       5       Konut   Rezidans        12/10/18        1/9/19  1       30      0       20 ve üzeri    2       2+1     90.0    İstanbul/Kartal/Kordonboyu     NaN     Fancoil 1450000.0       TRY
  36. # размер датасета
  37. df.shape
  38. (403487, 17)
  39. # список колонок
  40. df.columns
  41. Index(['id', 'type', 'sub_type', 'start_date', 'end_date', 'listing_type',
  42.        'tom', 'building_age', 'total_floor_count', 'floor_no', 'room_count',
  43.        'size', 'address', 'furnished', 'heating_type', 'price',
  44.        'price_currency'],
  45.       dtype='object')
  46. df.describe().T
  47. # транспонированная матрица статистичесикх характеристик
  48. count   mean    std     min     25%     50%     75%     max
  49. id      403487.0        201744.000000   1.164768e+05    1.0     100872.5        201744.0        302615.5        4.034870e+05
  50. listing_type    403487.0        1.294235        4.677333e-01    1.0     1.0     1.0     2.0     3.000000e+00
  51. tom     403487.0        57.022739       4.435893e+01    0.0     29.0    40.0    90.0    1.800000e+02
  52. size    257481.0        279.349094      9.429195e+03    1.0     85.0    110.0   140.0   9.482350e+05
  53. furnished       0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN
  54. price   402772.0        354641.661933   4.809503e+06    -250.0  2500.0  199000.0        342000.0        2.000000e+09
  55. анализ пустых значений
  56. print(df.isna().sum()) # вывод количества неизвестных значений (NaN) в столбцах
  57. print(df.isna().sum() / len(df) * 100) # процент пропущенных значений в колонках
  58. id                        0
  59. type                      0
  60. sub_type                  0
  61. start_date                0
  62. end_date             137189
  63. listing_type              0
  64. tom                       0
  65. building_age          27390
  66. total_floor_count     28021
  67. floor_no              35296
  68. room_count                0
  69. size                 146006
  70. address                   0
  71. furnished            403487
  72. heating_type          27970
  73. price                   715
  74. price_currency          715
  75. dtype: int64
  76. id                     0.000000
  77. type                   0.000000
  78. sub_type               0.000000
  79. start_date             0.000000
  80. end_date              34.000848
  81. listing_type           0.000000
  82. tom                    0.000000
  83. building_age           6.788323
  84. total_floor_count      6.944709
  85. floor_no               8.747742
  86. room_count             0.000000
  87. size                  36.186048
  88. address                0.000000
  89. furnished            100.000000
  90. heating_type           6.932070
  91. price                  0.177205
  92. price_currency         0.177205
  93. dtype: float64
  94. Выводы
  95. колонка furnished содержит все значения Nan - удаляем, неинформативная
  96. колонка end_date = NaN - срок активности на рынке не окончен - нормально
  97. колонка size - 36% пропусков подумаем, что делать
  98. Удаляем колонку furnished
  99. df = df.drop(columns = "furnished")
  100. поиск дубликатов строк
  101. print(df.shape, df.drop_duplicates().shape)
  102. (403487, 16) (403487, 16)
  103. дубликатов - нет, все хорошо
  104.  
  105. Анализ значений по колонкам
  106. колонка type¶
  107. # разнообразные значения
  108. df["type"].unique()
  109. array(['Konut'], dtype=object)
  110. Konut = Housing - строения
  111.  
  112. колонка sub_type
  113. df["sub_type"].unique()
  114. array(['Rezidans', 'Daire', 'Villa', 'Müstakil Ev', 'Kooperatif',
  115.        'Yazlık', 'Komple Bina', 'Prefabrik Ev', 'Köşk / Konak / Yalı',
  116.        'Çiftlik Evi', 'Yalı Dairesi', 'Loft'], dtype=object)
  117. df["sub_type"].value_counts()
  118. Daire                  354549
  119. Villa                   21324
  120. Müstakil Ev              9563
  121. Rezidans                 7716
  122. Yazlık                   5929
  123. Komple Bina              2607
  124. Prefabrik Ev              679
  125. Çiftlik Evi               528
  126. Köşk / Konak / Yalı       301
  127. Yalı Dairesi              187
  128. Kooperatif                 70
  129. Loft                       34
  130. Name: sub_type, dtype: int64
  131. кодировка понятна только для первого значения "Daire = Flat"
  132.  
  133. колонка listing_type
  134. # разнообразные значения
  135. df["listing_type"].unique()
  136. array([2, 1, 3], dtype=int64)
  137. закодирована не как в описании - Satılık = Sale, Kiralık = Rent Будем разбираться
  138.  
  139. df["listing_type"].value_counts()
  140. 1    287009
  141. 2    114236
  142. 3      2242
  143. Name: listing_type, dtype: int64
  144. колонка tom - время на рынке
  145. df["tom"].value_counts()
  146. 30     82216
  147. 60     22325
  148. 0      11151
  149. 90      9868
  150. 61      6738
  151. 1       4855
  152. 120     4504
  153. 91      4333
  154. 62      4292
  155. 2       4255
  156. 7       4083
  157. 6       3894
  158. 5       3811
  159. 14      3762
  160. 4       3741
  161. 8       3730
  162. 21      3692
  163. 9       3655
  164. 13      3642
  165. 15      3357
  166. 12      3258
  167. 92      3235
  168. 63      3215
  169. 3       3004
  170. 11      2926
  171. 20      2914
  172. 22      2886
  173. 27      2875
  174. 19      2875
  175. 16      2862
  176.        ...  
  177. 149      700
  178. 159      687
  179. 160      679
  180. 144      671
  181. 166      657
  182. 162      641
  183. 108      637
  184. 167      637
  185. 129      612
  186. 174      597
  187. 168      585
  188. 175      565
  189. 163      565
  190. 170      530
  191. 176      521
  192. 115      521
  193. 165      501
  194. 173      496
  195. 158      494
  196. 169      468
  197. 172      465
  198. 177      464
  199. 180      457
  200. 136      422
  201. 179      379
  202. 143      313
  203. 157      287
  204. 164      210
  205. 178      196
  206. 171      158
  207. Name: tom, Length: 181, dtype: int64
  208. скорее всего дни
  209.  
  210. колонка building_age - возраст здания
  211. “arası” means between
  212.  
  213. df["building_age"].value_counts()
  214. 0              140174
  215. 6-10 arası      50495
  216. 11-15 arası     32309
  217. 16-20 arası     31333
  218. 1               20355
  219. 4               19032
  220. 21-25 arası     18438
  221. 2               17466
  222. 3               15651
  223. 5               13589
  224. 26-30 arası     10581
  225. 31-35 arası      4268
  226. 36-40 arası      1347
  227. 40 ve üzeri      1059
  228. Name: building_age, dtype: int64
  229. категориальная переменная - порядковая, надо перевести в отдельную нумерацию, если использовать далее
  230.  
  231. # словарь перевода - заменяем интервал на середину (6-10 -> 8, ...)
  232. # первый интервал - 1-5 заменим на середину - 3
  233. d = {'0': 0, '1': 3, '2': 3, '3': 3, '4': 3, '5': 3, '6-10 arası': 8, '11-15 arası': 13, '16-20 arası': 18, '21-25 arası': 23, '26-30 arası':28, '31-35 arası': 33,
  234.      '36-40 arası': 38, '40 ve üzeri': 50}
  235. df['building_age'] = df['building_age'].map(d)
  236. df['building_age'].value_counts()
  237. 0.0     140174
  238. 3.0      86093
  239. 8.0      50495
  240. 13.0     32309
  241. 18.0     31333
  242. 23.0     18438
  243. 28.0     10581
  244. 33.0      4268
  245. 38.0      1347
  246. 50.0      1059
  247. Name: building_age, dtype: int64
  248. колонка total_floor_count число этажей в здании
  249. df["total_floor_count"].value_counts()
  250. 4              83082
  251. 3              77956
  252. 5              70104
  253. 10-20 arası    36512
  254. 2              27742
  255. 6              23348
  256. 10             12558
  257. 7              12284
  258. 8              11207
  259. 9               9029
  260. 20 ve üzeri     6679
  261. 1               4965
  262. Name: total_floor_count, dtype: int64
  263. категориальная переменная - порядковая, надо перевести в отдельную нумерацию, если использовать далее
  264.  
  265. df["total_floor_count"].unique()
  266. array(['20 ve üzeri', '1', '10-20 arası', '4', '2', '3', '8', '7', '6',
  267.        '5', '10', nan, '9'], dtype=object)
  268. # словарь перевода - заменяем интервал на середину (6-10 -> 8, ...)
  269. d = {'1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10':10, '10-20 arası': 15,
  270.      '20 ve üzeri': 25}
  271. df['total_floor_count'] = df['total_floor_count'].map(d)
  272. df['total_floor_count'].value_counts()
  273. 4.0     83082
  274. 3.0     77956
  275. 5.0     70104
  276. 15.0    36512
  277. 2.0     27742
  278. 6.0     23348
  279. 10.0    12558
  280. 7.0     12284
  281. 8.0     11207
  282. 9.0      9029
  283. 25.0     6679
  284. 1.0      4965
  285. Name: total_floor_count, dtype: int64
  286. колонка floor_no номер этажа для квартир
  287. df["floor_no"].value_counts()
  288. 2               65864
  289. 3               52690
  290. 1               46756
  291. 4               34465
  292. Yüksek Giriş    24045
  293. 5               21193
  294. Müstakil        21165
  295. Bahçe katı      19065
  296. Giriş Katı      10431
  297. 6                9747
  298. 7                7698
  299. 8                6099
  300. Kot 1            5036
  301. Kot 2            4987
  302. 9                4855
  303. 10               3863
  304. Kot 3            3793
  305. Çatı Katı        3566
  306. Zemin Kat        3441
  307. Komple           2958
  308. 11               2894
  309. 12               2309
  310. Kot 4            2269
  311. 13               1702
  312. 20 ve üzeri      1563
  313. 14               1328
  314. 15                911
  315. En Üst Kat        894
  316. Bodrum Kat        815
  317. 16                600
  318. 17                373
  319. 18                334
  320. Teras Kat         293
  321. 19                177
  322. Asma Kat           12
  323. Name: floor_no, dtype: int64
  324. # словарь перекодировки по данным описания
  325. d = {'Yüksek Giriş':'1st floor', 'Giriş Katı': 'ground floor',
  326.      'Kot 1':'ground floor', 'Kot 2':'ground floor', 'Kot 3':'ground floor', 'Kot 4':'ground floor',
  327.      'Zemin Kat': 'ground floor', 'En Üst Kat':'ground floor', 'Bodrum Kat':'ground floor', 'Teras Kat':'ground floor',
  328.      'Asma Kat':'ground floor',
  329.      'Çatı Katı': 'penthouse apartment', 'Bahçe katı': 'garden floor flat',
  330.      '20 ve üzeri': 20,
  331.      '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10':10,
  332.      '11': 11, '12': 12, '13': 13, '14': 14, '15': 15, '16': 16, '17': 17, '18': 18, '19': 19}
  333. df['floor_no'] =df['floor_no'].map(d)
  334. df['floor_no'].value_counts()
  335. 2                      65864
  336. 3                      52690
  337. 1                      46756
  338. 4                      34465
  339. ground floor           31971
  340. 1st floor              24045
  341. 5                      21193
  342. garden floor flat      19065
  343. 6                       9747
  344. 7                       7698
  345. 8                       6099
  346. 9                       4855
  347. 10                      3863
  348. penthouse apartment     3566
  349. 11                      2894
  350. 12                      2309
  351. 13                      1702
  352. 20                      1563
  353. 14                      1328
  354. 15                       911
  355. 16                       600
  356. 17                       373
  357. 18                       334
  358. 19                       177
  359. Name: floor_no, dtype: int64
  360. колонка heating_type
  361. df["heating_type"].value_counts()
  362. Kombi (Doğalgaz)                   204150
  363. Klima                               68197
  364. Merkezi Sistem (Isı Payı Ölçer)     30595
  365. Merkezi Sistem                      22855
  366. Kalorifer (Doğalgaz)                10928
  367. Soba (Kömür)                         8450
  368. Yerden Isıtma                        6958
  369. Yok                                  6098
  370. Kat Kaloriferi                       5655
  371. Kombi (Elektrikli)                   3449
  372. Soba (Doğalgaz)                      2602
  373. Güneş Enerjisi                       1754
  374. Kalorifer (Kömür)                    1503
  375. Jeotermal                            1418
  376. Fancoil                               495
  377. Kalorifer (Akaryakıt)                 410
  378. Name: heating_type, dtype: int64
  379. категориальная переменная - надо перекодировать в соответствии с описанием
  380.  
  381. Kalorifer (Doğalgaz) = central heating/natural gas,
  382. Kalorifer (Kömür) = central heating/coal,
  383. Kombi (Elektrikli) = combi boiler
  384. Klima = air-conditioning
  385. Kombi (Doğalgaz) = gas-combi boiler
  386. Merkezi Sistem = central heating
  387. Merkezi Sistem (Isı Payı Ölçer) =central heating
  388. Yerden Isıtma = floor heating
  389. Soba (Kömür) = heating stove/coal,
  390. Soba (Doğalgaz) = heating stove/natural gas
  391. Güneş Enerjisi = solar energy,
  392. Jeotermal = geothermal energy
  393. Fancoil = a type of air conditioner
  394. Kat Kaloriferi = central heating
  395. Kalorifer (Akaryakıt) = central heating/fuel oil
  396. Yok = None
  397. # словарь перекодировки по данным описания
  398. d = {'Kombi (Doğalgaz)': 'gas-combi boiler', 'Klima': 'air-conditioning',
  399.      'Merkezi Sistem (Isı Payı Ölçer)': 'central heating', 'Merkezi Sistem': 'central heating',
  400.      'Kalorifer (Doğalgaz)': 'central heating/natural gas', 'Soba (Kömür)': 'heating stove/coal',
  401.      'Yerden Isıtma': 'floor heating', 'Yok': 'None', 'Kat Kaloriferi': 'central heating', 'Kombi (Elektrikli)': 'combi boiler',
  402.      'Soba (Doğalgaz)': 'heating stove/natural gas', 'Güneş Enerjisi': 'solar energy',
  403.      'Kalorifer (Kömür)': 'central heating/coal', 'Jeotermal': 'geothermal energy', 'Fancoil': 'air conditioner',
  404.      'Kalorifer (Akaryakıt)': 'central heating/fuel oil'}
  405. df['heating_type'] =df['heating_type'].map(d)
  406. df['heating_type'].value_counts()
  407. gas-combi boiler               204150
  408. air-conditioning                68197
  409. central heating                 59105
  410. central heating/natural gas     10928
  411. heating stove/coal               8450
  412. floor heating                    6958
  413. None                             6098
  414. combi boiler                     3449
  415. heating stove/natural gas        2602
  416. solar energy                     1754
  417. central heating/coal             1503
  418. geothermal energy                1418
  419. air conditioner                   495
  420. central heating/fuel oil          410
  421. Name: heating_type, dtype: int64
  422. Сессия 2
  423. Отбор признаков
  424. # Сначала узнаем число срок, где возраст здания = Nan
  425. df["building_age"].isna().sum()
  426. 27390
  427. # подклбчение доп. графических библиотек
  428. from IPython.core.pylabtools import figsize
  429. sns.set(font_scale = 2)
  430. from sklearn.model_selection import train_test_split
  431. df["building_age"].value_counts()
  432. 0.0     140174
  433. 3.0      86093
  434. 8.0      50495
  435. 13.0     32309
  436. 18.0     31333
  437. 23.0     18438
  438. 28.0     10581
  439. 33.0      4268
  440. 38.0      1347
  441. 50.0      1059
  442. Name: building_age, dtype: int64
  443. figsize(10, 10)
  444.  
  445.  
  446. # Распределение building_age
  447. plt.style.use('fivethirtyeight')
  448. plt.hist(df['building_age'].dropna(), bins =100, edgecolor = 'k');
  449. plt.xlabel('Building Age'); plt.ylabel('Number of Buildings');
  450. plt.title('Building Age Distribution');
  451.  
  452. видим что много новостроек - возраст = 0, остальных количество плавно убывает
  453.  
  454. figsize(10, 10)
  455.  
  456.  
  457. # Распределение building_age, если не брать новостройки
  458. plt.style.use('fivethirtyeight')
  459. plt.hist(df[df['building_age'] > 0]['building_age'].dropna(), bins =100, edgecolor = 'k');
  460. plt.xlabel('Building Age'); plt.ylabel('Number of Buildings');
  461. plt.title('Building Age Distribution for Age>0');
  462.  
  463. ### построим графики гистограмм
  464. sns.countplot(df["heating_type"])
  465. <matplotlib.axes._subplots.AxesSubplot at 0x1f0a4dd0>
  466.  
  467. df["heating_type"].value_counts()
  468. gas-combi boiler               204150
  469. air-conditioning                68197
  470. central heating                 59105
  471. central heating/natural gas     10928
  472. heating stove/coal               8450
  473. floor heating                    6958
  474. None                             6098
  475. combi boiler                     3449
  476. heating stove/natural gas        2602
  477. solar energy                     1754
  478. central heating/coal             1503
  479. geothermal energy                1418
  480. air conditioner                   495
  481. central heating/fuel oil          410
  482. Name: heating_type, dtype: int64
  483. посмотрим зависимости building_age от числовых признаков
  484. df.describe().T
  485. count   mean    std     min     25%     50%     75%     max
  486. id      403487.0        201744.000000   1.164768e+05    1.0     100872.5        201744.0        302615.5        4.034870e+05
  487. listing_type    403487.0        1.294235        4.677333e-01    1.0     1.0     1.0     2.0     3.000000e+00
  488. tom     403487.0        57.022739       4.435893e+01    0.0     29.0    40.0    90.0    1.800000e+02
  489. building_age    376097.0        6.943879        8.746804e+00    0.0     0.0     3.0     13.0    5.000000e+01
  490. total_floor_count       375466.0        5.897719        4.432264e+00    1.0     3.0     4.0     6.0     2.500000e+01
  491. size    257481.0        279.349094      9.429195e+03    1.0     85.0    110.0   140.0   9.482350e+05
  492. price   402772.0        354641.661933   4.809503e+06    -250.0  2500.0  199000.0        342000.0        2.000000e+09
  493. df.corr()
  494. id      listing_type    tom     building_age    total_floor_count       size    price
  495. id      1.000000        0.033796        -0.003890       -0.003405       0.168879        0.008551        -0.001938
  496. listing_type    0.033796        1.000000        -0.126534       0.175749        0.082590        -0.010385       -0.044270
  497. tom     -0.003890       -0.126534       1.000000        -0.020789       -0.015280       -0.011847       0.011818
  498. building_age    -0.003405       0.175749        -0.020789       1.000000        -0.114209       0.011994        0.016409
  499. total_floor_count       0.168879        0.082590        -0.015280       -0.114209       1.000000        0.000153        0.000802
  500. size    0.008551        -0.010385       -0.011847       0.011994        0.000153        1.000000        0.005889
  501. price   -0.001938       -0.044270       0.011818        0.016409        0.000802        0.005889        1.000000
  502. plt.figure(figsize = (10,8))
  503. sns.heatmap(df.corr(), annot = True, fmt = ".01f")
  504. <matplotlib.axes._subplots.AxesSubplot at 0x20090cf0>
  505.  
  506. Для признака building_age - числовые признаки мало связаны Наибольший по модулю коэффициент корреляции - 0.2 для признака listing_type (какая операция сней производится, но кодировка не известная - она не совпадает с заявленной в описании)
  507.  
  508. Отбор признаков
  509. На возраст здания должны влиять признаки:
  510.  
  511. - start_date - дата нвыставления на рынок (чем больше, тем старше дом)
  512. - tom - время на рынке - чем больше, тем выше шансы, что дом старше
  513. - heating_type - тип отопления
  514. - address - наверное, есть районы старой застройки
  515. Только эти признаки и имеет смысл рассматривать для обучения
  516.  
  517. # уберем строки где building_age = NaN
  518. df = df[df["building_age"].isnull() == False]
  519. df.info()
  520. <class 'pandas.core.frame.DataFrame'>
  521. Int64Index: 376097 entries, 0 to 403325
  522. Data columns (total 16 columns):
  523. id                   376097 non-null int64
  524. type                 376097 non-null object
  525. sub_type             376097 non-null object
  526. start_date           376097 non-null object
  527. end_date             250047 non-null object
  528. listing_type         376097 non-null int64
  529. tom                  376097 non-null int64
  530. building_age         376097 non-null float64
  531. total_floor_count    369204 non-null float64
  532. floor_no             338034 non-null object
  533. room_count           376097 non-null object
  534. size                 244351 non-null float64
  535. address              376097 non-null object
  536. heating_type         369509 non-null object
  537. price                375780 non-null float64
  538. price_currency       375780 non-null object
  539. dtypes: float64(4), int64(3), object(9)
  540. memory usage: 35.9+ MB
  541. df.isna().sum()
  542. id                        0
  543. type                      0
  544. sub_type                  0
  545. start_date                0
  546. end_date             126050
  547. listing_type              0
  548. tom                       0
  549. building_age              0
  550. total_floor_count      6893
  551. floor_no              38063
  552. room_count                0
  553. size                 131746
  554. address                   0
  555. heating_type           6588
  556. price                   317
  557. price_currency          317
  558. dtype: int64
  559. # проверим значения признака heating_type
  560. df["heating_type"].value_counts()
  561. gas-combi boiler               201355
  562. air-conditioning                67161
  563. central heating                 58255
  564. central heating/natural gas     10460
  565. heating stove/coal               8105
  566. floor heating                    6904
  567. None                             5919
  568. combi boiler                     3437
  569. heating stove/natural gas        2487
  570. solar energy                     1724
  571. central heating/coal             1437
  572. geothermal energy                1384
  573. air conditioner                   490
  574. central heating/fuel oil          391
  575. Name: heating_type, dtype: int64
  576. # Удалим строки где отопление не известно
  577. df = df[df["heating_type"].isnull() == False]
  578. df.info()
  579. <class 'pandas.core.frame.DataFrame'>
  580. Int64Index: 369509 entries, 0 to 375516
  581. Data columns (total 16 columns):
  582. id                   369509 non-null int64
  583. type                 369509 non-null object
  584. sub_type             369509 non-null object
  585. start_date           369509 non-null object
  586. end_date             245892 non-null object
  587. listing_type         369509 non-null int64
  588. tom                  369509 non-null int64
  589. building_age         369509 non-null float64
  590. total_floor_count    363376 non-null float64
  591. floor_no             333367 non-null object
  592. room_count           369509 non-null object
  593. size                 240095 non-null float64
  594. address              369509 non-null object
  595. heating_type         369509 non-null object
  596. price                369201 non-null float64
  597. price_currency       369201 non-null object
  598. dtypes: float64(4), int64(3), object(9)
  599. memory usage: 35.2+ MB
  600. df_for_analis = df[["start_date", "tom", "address", "heating_type", "building_age"]]
  601. df_for_analis
  602. start_date      tom     address heating_type    building_age
  603. 0       12/10/18        30      İstanbul/Kartal/Kordonboyu     air conditioner 0.0
  604. 1       2/13/19 14      İstanbul/Kartal/Kordonboyu     air conditioner 0.0
  605. 2       10/9/18 30      Tekirdağ/Çorlu/Reşadiye      air conditioner 0.0
  606. 3       9/10/18 30      İstanbul/Beşiktaş/Levent     air conditioner 3.0
  607. 4       12/10/18        30      İstanbul/Kartal/Kordonboyu     air conditioner 0.0
  608. 5       11/9/18 30      İstanbul/Maltepe/Altayçeşme  air conditioner 3.0
  609. 6       1/4/19  54      İstanbul/Kartal/Kordonboyu     air conditioner 0.0
  610. 7       10/3/18 92      İzmir/Urla/M. Fevzi Çakmak    air conditioner 0.0
  611. 9       12/26/18        0       İstanbul/Fatih/Sarıdemir      air conditioner 3.0
  612. 10      11/13/18        13      Muğla/Bodrum/Ortakentyahşi    air conditioner 0.0
  613. 11      1/5/19  13      İzmir/Bayraklı/Adalet air conditioner 3.0
  614. 12      9/13/18 30      Aydın/Efeler/Ata       air conditioner 0.0
  615. 13      10/3/18 30      Mersin/Yenişehir/Akkent        air conditioner 0.0
  616. 14      9/22/18 158     Manisa/Turgutlu/Şehitler       air conditioner 3.0
  617. 15      10/2/18 94      İzmir/Urla/Çamlıçay air conditioner 8.0
  618. 16      11/9/18 30      İstanbul/Şişli/İnönü      air conditioner 0.0
  619. 17      12/10/18        30      İstanbul/Kartal/Kordonboyu     air conditioner 0.0
  620. 18      11/22/18        97      İstanbul/Maltepe/Altayçeşme  air conditioner 3.0
  621. 19      9/10/18 154     İstanbul/Beşiktaş/Levent     air conditioner 3.0
  622. 20      9/20/18 0       Ankara/Çankaya/Karataş        air conditioner 3.0
  623. 21      10/9/18 141     İstanbul/Bağcılar/Göztepe   air conditioner 3.0
  624. 22      11/9/18 30      İstanbul/Maltepe/Altayçeşme  air conditioner 3.0
  625. 23      11/23/18        52      Mersin/Yenişehir/Afetevler     air conditioner 3.0
  626. 24      9/13/18 61      Aydın/Efeler/Ata       air conditioner 0.0
  627. 25      10/13/18        30      İstanbul/Kartal/Kordonboyu     air conditioner 0.0
  628. 26      11/1/18 118     Balıkesir/Edremit/Akçay       air conditioner 3.0
  629. 27      11/9/18 30      İstanbul/Maltepe/Altayçeşme  air conditioner 3.0
  630. 28      12/5/18 30      İstanbul/Kartal/Çavuşoğlu   air conditioner 0.0
  631. 29      10/3/18 60      İzmir/Urla/M. Fevzi Çakmak    air conditioner 0.0
  632. 30      10/14/18        136     Muğla/Bodrum/Bitez     air conditioner 0.0
  633. ...     ...     ...     ...     ...     ...
  634. 375487  12/27/18        30      Balıkesir/Edremit/Akçay       central heating 3.0
  635. 375488  11/24/18        30      Balıkesir/Edremit/Akçay       central heating 8.0
  636. 375489  10/20/18        90      Muğla/Bodrum/Yalıkavak        central heating 0.0
  637. 375490  10/11/18        33      Çanakkale/Ezine/Dalyan Köyü  central heating 13.0
  638. 375491  10/2/18 30      İzmir/Urla/Sıra       central heating 8.0
  639. 375492  11/22/18        30      Balıkesir/Edremit/Akçay       central heating 0.0
  640. 375493  1/27/19 31      Balıkesir/Edremit/Altınoluk   central heating 0.0
  641. 375494  1/17/19 30      Balıkesir/Edremit/Akçay       central heating 0.0
  642. 375495  10/10/18        65      Balıkesir/Edremit/Akçay       central heating 0.0
  643. 375496  9/26/18 46      Aydın/Kuşadası/Soğucak      central heating 0.0
  644. 375497  9/26/18 139     İzmir/Karabağlar/Muammer Akar central heating 33.0
  645. 375498  9/13/18 150     Balıkesir/Edremit/Akçay       central heating 0.0
  646. 375499  12/11/18        73      Antalya/Muratpaşa/Yeşilbahçe central heating 13.0
  647. 375500  2/18/19 9       İzmir/Urla/Denizli     central heating 18.0
  648. 375501  10/27/18        123     Balıkesir/Edremit/Altınoluk   central heating 3.0
  649. 375502  9/17/18 8       Balıkesir/Edremit/Akçay       central heating 0.0
  650. 375503  1/11/19 30      Balıkesir/Edremit/Akçay       central heating 0.0
  651. 375504  10/2/18 30      Balıkesir/Edremit/Akçay       central heating 0.0
  652. 375505  1/18/19 40      Tekirdağ/Şarköy/Cumhuriyet   central heating 0.0
  653. 375506  9/26/18 91      Balıkesir/Edremit/Akçay       central heating 0.0
  654. 375507  1/10/19 30      Balıkesir/Edremit/Altınoluk   central heating 0.0
  655. 375508  10/4/18 146     Aydın/Efeler/Kardeşköy       central heating 8.0
  656. 375509  10/19/18        60      Aydın/Didim/Çamlık   central heating 0.0
  657. 375510  9/15/18 25      Aydın/Didim/Altınkum  central heating 0.0
  658. 375511  10/25/18        68      Çanakkale/Ayvacık/Hamdibey    central heating 0.0
  659. 375512  11/7/18 94      Muğla/Dalaman/Atakent  central heating 0.0
  660. 375513  11/21/18        60      Afyonkarahisar/Merkez/Erenler   central heating 3.0
  661. 375514  9/1/18  30      Aydın/Kuşadası/Kadınlar Denizi      central heating 0.0
  662. 375515  11/9/18 62      Balıkesir/Edremit/Altınoluk   central heating 3.0
  663. 375516  11/10/18        90      Çanakkale/Ayvacık/Küçükkuyu Bld. (Mıhlı) central heating 3.0
  664. 369509 rows × 5 columns
  665.  
  666. # Остальные признаки - категориальные, используем кодировщик
  667. from sklearn.preprocessing import LabelEncoder # вытаскиваем кодировщика данных
  668. le_ht = LabelEncoder() # объект класса кодировщика
  669. df_for_analis["heating_type"].isna().sum()
  670. 0
  671. df_for_analis["heating_type"] = le_ht.fit_transform(df_for_analis["heating_type"])
  672. C:UsersKiddAnaconda3libsite-packagesipykernel_launcher.py:1: SettingWithCopyWarning:
  673. A value is trying to be set on a copy of a slice from a DataFrame.
  674. Try using .loc[row_indexer,col_indexer] = value instead
  675.  
  676. See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  677.   """Entry point for launching an IPython kernel.
  678. le_sd = LabelEncoder()
  679. df_for_analis["start_date"] = le_sd.fit_transform(df_for_analis["start_date"])
  680. C:UsersKiddAnaconda3libsite-packagesipykernel_launcher.py:2: SettingWithCopyWarning:
  681. A value is trying to be set on a copy of a slice from a DataFrame.
  682. Try using .loc[row_indexer,col_indexer] = value instead
  683.  
  684. See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  685.  
  686. le_ad = LabelEncoder()
  687. df_for_analis["address"] = le_ad.fit_transform(df_for_analis["address"])
  688. C:UsersKiddAnaconda3libsite-packagesipykernel_launcher.py:2: SettingWithCopyWarning:
  689. A value is trying to be set on a copy of a slice from a DataFrame.
  690. Try using .loc[row_indexer,col_indexer] = value instead
  691.  
  692. See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  693.  
  694. df_for_analis
  695. start_date      tom     address heating_type    building_age
  696. 0       93      30      6221    1       0.0
  697. 1       127     14      6221    1       0.0
  698. 2       61      30      5210    1       0.0
  699. 3       152     30      6008    1       3.0
  700. 4       93      30      6221    1       0.0
  701. 5       91      30      6275    1       3.0
  702. 6       25      54      6221    1       0.0
  703. 7       53      92      7142    1       0.0
  704. 9       110     0       6155    1       3.0
  705. 10      66      13      4253    1       0.0
  706. 11      26      13      6642    1       3.0
  707. 12      155     30      1165    1       0.0
  708. 13      53      30      4201    1       0.0
  709. 14      165     158     3962    1       3.0
  710. 15      42      94      7154    1       8.0
  711. 16      91      30      6618    1       0.0
  712. 17      93      30      6221    1       0.0
  713. 18      76      97      6275    1       3.0
  714. 19      152     154     6008    1       3.0
  715. 20      163     0       739     1       3.0
  716. 21      61      141     5877    1       3.0
  717. 22      91      30      6275    1       3.0
  718. 23      77      52      4200    1       3.0
  719. 24      155     61      1165    1       0.0
  720. 25      35      30      6221    1       0.0
  721. 26      62      118     1385    1       3.0
  722. 27      91      30      6275    1       3.0
  723. 28      118     30      6233    1       0.0
  724. 29      53      60      7142    1       0.0
  725. 30      36      136     4229    1       0.0
  726. ...     ...     ...     ...     ...     ...
  727. 375487  111     30      1385    3       3.0
  728. 375488  78      30      1385    3       8.0
  729. 375489  43      90      4262    3       0.0
  730. 375490  33      33      5664    3       13.0
  731. 375491  42      30      7145    3       8.0
  732. 375492  76      30      1385    3       0.0
  733. 375493  19      31      1387    3       0.0
  734. 375494  8       30      1385    3       0.0
  735. 375495  32      65      1385    3       0.0
  736. 375496  169     46      1225    3       0.0
  737. 375497  169     139     6846    3       33.0
  738. 375498  155     150     1385    3       0.0
  739. 375499  94      73      1109    3       13.0
  740. 375500  132     9       7136    3       18.0
  741. 375501  50      123     1387    3       3.0
  742. 375502  159     8       1385    3       0.0
  743. 375503  2       30      1385    3       0.0
  744. 375504  42      30      1385    3       0.0
  745. 375505  9       40      5222    3       0.0
  746. 375506  169     91      1385    3       0.0
  747. 375507  1       30      1387    3       0.0
  748. 375508  56      146     1176    3       8.0
  749. 375509  41      60      1163    3       0.0
  750. 375510  157     25      1151    3       0.0
  751. 375511  48      68      5592    3       0.0
  752. 375512  89      94      4272    3       0.0
  753. 375513  75      60      224     3       3.0
  754. 375514  151     30      1222    3       0.0
  755. 375515  91      62      1387    3       3.0
  756. 375516  63      90      5603    3       3.0
  757. 369509 rows × 5 columns
  758.  
  759. df_for_analis["building_age"].value_counts()
  760. 0.0     137737
  761. 3.0      84601
  762. 8.0      49683
  763. 13.0     31708
  764. 18.0     30746
  765. 23.0     18141
  766. 28.0     10374
  767. 33.0      4181
  768. 38.0      1313
  769. 50.0      1025
  770. Name: building_age, dtype: int64
  771. from sklearn.preprocessing import StandardScaler # класс для масштабирования
  772. # выровняем разбросы по переменным
  773. scal = StandardScaler() # создаем объект класса
  774. # матожидание будет 0, дисперсия 1
  775. df_scal = scal.fit_transform(df_for_analis.drop("building_age", axis = 1))
  776. pd.DataFrame(df_scal, columns=df_for_analis.drop("building_age", axis = 1).columns)
  777. start_date      tom     address heating_type
  778. 0       0.025668        -0.611589       1.030558        -1.702145
  779. 1       0.685493        -0.974459       1.030558        -1.702145
  780. 2       -0.595343       -0.611589       0.599725        -1.702145
  781. 3       1.170658        -0.611589       0.939789        -1.702145
  782. 4       0.025668        -0.611589       1.030558        -1.702145
  783. 5       -0.013145       -0.611589       1.053570        -1.702145
  784. 6       -1.293982       -0.067284       1.030558        -1.702145
  785. 7       -0.750596       0.794532        1.423038        -1.702145
  786. 8       0.355581        -1.291970       1.002432        -1.702145
  787. 9       -0.498310       -0.997138       0.191904        -1.702145
  788. 10      -1.274575       -0.997138       1.209965        -1.702145
  789. 11      1.228878        -0.611589       -1.124032       -1.702145
  790. 12      -0.750596       -0.611589       0.169744        -1.702145
  791. 13      1.422944        2.291370        0.067896        -1.702145
  792. 14      -0.964069       0.839891        1.428151        -1.702145
  793. 15      -0.013145       -0.611589       1.199737        -1.702145
  794. 16      0.025668        -0.611589       1.030558        -1.702145
  795. 17      -0.304244       0.907929        1.053570        -1.702145
  796. 18      1.170658        2.200653        0.939789        -1.702145
  797. 19      1.384131        -1.291970       -1.305570       -1.702145
  798. 20      -0.595343       1.905821        0.883964        -1.702145
  799. 21      -0.013145       -0.611589       1.053570        -1.702145
  800. 22      -0.284838       -0.112643       0.169318        -1.702145
  801. 23      1.228878        0.091472        -1.124032       -1.702145
  802. 24      -1.099915       -0.611589       1.030558        -1.702145
  803. 25      -0.575937       1.384196        -1.030281       -1.702145
  804. 26      -0.013145       -0.611589       1.053570        -1.702145
  805. 27      0.510834        -0.611589       1.035672        -1.702145
  806. 28      -0.750596       0.068792        1.423038        -1.702145
  807. 29      -1.080509       1.792424        0.181676        -1.702145
  808. ...     ...     ...     ...     ...
  809. 369479  0.374987        -0.611589       -1.030281       -1.090695
  810. 369480  -0.265431       -0.611589       -1.030281       -1.090695
  811. 369481  -0.944662       0.749173        0.195739        -1.090695
  812. 369482  -1.138729       -0.543551       0.793195        -1.090695
  813. 369483  -0.964069       -0.611589       1.424316        -1.090695
  814. 369484  -0.304244       -0.611589       -1.030281       -1.090695
  815. 369485  -1.410421       -0.588909       -1.029428       -1.090695
  816. 369486  -1.623894       -0.611589       -1.030281       -1.090695
  817. 369487  -1.158135       0.182189        -1.030281       -1.090695
  818. 369488  1.500571        -0.248719       -1.098464       -1.090695
  819. 369489  1.500571        1.860462        1.296899        -1.090695
  820. 369490  1.228878        2.109935        -1.030281       -1.090695
  821. 369491  0.045075        0.363624        -1.147897       -1.090695
  822. 369492  0.782526        -1.087855       1.420481        -1.090695
  823. 369493  -0.808816       1.497592        -1.029428       -1.090695
  824. 369494  1.306505        -1.110535       -1.030281       -1.090695
  825. 369495  -1.740334       -0.611589       -1.030281       -1.090695
  826. 369496  -0.964069       -0.611589       -1.030281       -1.090695
  827. 369497  -1.604487       -0.384795       0.604839        -1.090695
  828. 369498  1.500571        0.771853        -1.030281       -1.090695
  829. 369499  -1.759740       -0.611589       -1.029428       -1.090695
  830. 369500  -0.692376       2.019218        -1.119345       -1.090695
  831. 369501  -0.983476       0.068792        -1.124885       -1.090695
  832. 369502  1.267691        -0.724986       -1.129999       -1.090695
  833. 369503  -0.847629       0.250227        0.762512        -1.090695
  834. 369504  -0.051958       0.839891        0.200001        -1.090695
  835. 369505  -0.323651       0.068792        -1.525035       -1.090695
  836. 369506  1.151252        -0.611589       -1.099742       -1.090695
  837. 369507  -0.013145       0.114151        -1.029428       -1.090695
  838. 369508  -0.556530       0.749173        0.767200        -1.090695
  839. 369509 rows × 4 columns
  840.  
  841. df_scal
  842. array([[ 0.02566821, -0.61158869,  1.03055777, -1.70214476],
  843.        [ 0.68549307, -0.97445855,  1.03055777, -1.70214476],
  844.        [-0.59534343, -0.61158869,  0.59972495, -1.70214476],
  845.        ...,
  846.        [ 1.15125179, -0.61158869, -1.0997422 , -1.0906952 ],
  847.        [-0.01314502,  0.11415103, -1.02942823, -1.0906952 ],
  848.        [-0.5565302 ,  0.74917329,  0.76720002, -1.0906952 ]])
  849. Разбиение выборки на тестовую и обучающую
  850. x = df_scal.copy() # копирует массив в x
  851. y = df["building_age"] # целевая переменная y
  852. from sklearn.model_selection import train_test_split
  853. выборка не сбалансированная по классам, поэтому проведеем случайное разбиение, выравненное по целевой переменной
  854.  
  855. x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1, stratify = y)
  856. Обучение
  857. так как есть категориалный признаки, то ограничимся методами:
  858.  
  859. Дерево решений
  860. случайный лес
  861. Дерево решений
  862. from sklearn.tree import DecisionTreeClassifier # загрузка класса дерева решений
  863. clf = DecisionTreeClassifier(random_state=1)
  864. clf.fit(x_train, y_train) # обучение модели
  865. DecisionTreeClassifier(random_state=1)
  866. clf.score(x_test, y_test) # accuracy
  867. 0.12580546179809757
  868. Очень плохой результат
  869.  
  870. y_test[:5]
  871. 130295    0.0
  872. 276295    0.0
  873. 85229     0.0
  874. 47652     0.0
  875. 287407    0.0
  876. Name: building_age, dtype: float64
  877. y_pred = clf.predict(x_test) # предсказали и вывели первые 10
  878. y_pred[:10]
  879. array([18., 18., 13., 13.,  8.,  8., 18., 13.,  8., 18.])
  880. from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
  881. accuracy_score(y_test, y_pred)
  882. 0.12580546179809757
  883. print(classification_report(y_test, y_pred));
  884. C:UsersKiddAnaconda3libsite-packagessklearnmetrics_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.
  885.   _warn_prf(average, modifier, msg_start, len(result))
  886. C:UsersKiddAnaconda3libsite-packagessklearnmetrics_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.
  887.   _warn_prf(average, modifier, msg_start, len(result))
  888.               precision    recall  f1-score   support
  889.  
  890.          0.0       0.81      0.19      0.31      5466
  891.          3.0       0.29      0.04      0.08      1817
  892.          8.0       0.00      0.00      0.00         0
  893.         13.0       0.00      0.00      0.00         0
  894.         18.0       0.00      0.00      0.00         0
  895.         23.0       0.84      0.06      0.12      5161
  896.         28.0       0.00      0.00      0.00         0
  897.         33.0       0.27      0.33      0.30       380
  898.         38.0       0.26      0.34      0.30       119
  899.         50.0       0.34      0.31      0.33        93
  900.  
  901.     accuracy                           0.13     13036
  902.    macro avg       0.28      0.13      0.14     13036
  903. weighted avg       0.73      0.13      0.20     13036
  904.  
  905. C:UsersKiddAnaconda3libsite-packagessklearnmetrics_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.
  906.   _warn_prf(average, modifier, msg_start, len(result))
  907. # посмотрим на матрицу ошибок
  908. sns.heatmap(confusion_matrix(y_test, y_pred), annot = True, fmt=".0f")
  909. <matplotlib.axes._subplots.AxesSubplot at 0x1c4d5550>
  910.  
  911. #Просто ужас - некоторые классы вообще не распознаются
  912. Настройка гиперпараметров модели
  913. может быть удастся за счет настройки повысить шансы на удачную классификацию
  914.  
  915. clf = DecisionTreeClassifier(random_state=1)
  916. from sklearn.model_selection import GridSearchCV
  917. # сетка поиска Cross Validation - перебор тестовой выборки ровно с одинаковым шагом (к-блочная перекрестная проверка)
  918. params = {"max_depth": np.arange(1,7,1), "min_samples_leaf": range(1,7,1)} # словарь с гиперпараметрами
  919. # настраниваем глубину дерева - max_depth - 1,2,...,6
  920. # и сколько наблюдений в конечном листе - min_samples_lea - 1,2,...,6
  921. grid = GridSearchCV(clf, params, cv = 5, n_jobs = -1)
  922. %%timeit
  923. grid.fit(x_train, y_train) # обучение на кросс-валидации
  924. 1min 21s ± 12.4 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
  925.  
  926. grid.best_params_ # параметры лучшей модели
  927. {'max_depth': 6, 'min_samples_leaf': 6}
  928. best_clf = grid.best_estimator_ # лучший алгоритм
  929. # по результатам предыдущего обучения
  930. print(classification_report(y_test, y_pred))
  931. C:UsersKiddAnaconda3libsite-packagessklearnmetrics_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.
  932.   _warn_prf(average, modifier, msg_start, len(result))
  933. C:UsersKiddAnaconda3libsite-packagessklearnmetrics_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.
  934.   _warn_prf(average, modifier, msg_start, len(result))
  935. C:UsersKiddAnaconda3libsite-packagessklearnmetrics_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.
  936.   _warn_prf(average, modifier, msg_start, len(result))
  937.               precision    recall  f1-score   support
  938.  
  939.          0.0       0.81      0.19      0.31      5466
  940.          3.0       0.29      0.04      0.08      1817
  941.          8.0       0.00      0.00      0.00         0
  942.         13.0       0.00      0.00      0.00         0
  943.         18.0       0.00      0.00      0.00         0
  944.         23.0       0.84      0.06      0.12      5161
  945.         28.0       0.00      0.00      0.00         0
  946.         33.0       0.27      0.33      0.30       380
  947.         38.0       0.26      0.34      0.30       119
  948.         50.0       0.34      0.31      0.33        93
  949.  
  950.     accuracy                           0.13     13036
  951.    macro avg       0.28      0.13      0.14     13036
  952. weighted avg       0.73      0.13      0.20     13036
  953.  
  954. grid.best_score_
  955. 0.41774472372818644
  956. Анализ результатов примеенения модели "Дерево решений"
  957. Результаты улучшились с 0.12 до 0.41, но все равно плохие Случайный лес не успею запустить
  958.  
  959. ### Случайный лес
  960. from sklearn.ensemble import RandomForestClassifier
  961. rf_cls = RandomForestClassifier(n_estimators=300, random_state = 1)
  962. rf_cls.fit(x_train, y_train)
  963. y_pred = rf_cls.predict(x_test)
  964. print(classification_report(y_test, y_pred))
  965. params = {"n_estimators": [100,200,300]} # словарь с гиперпараметрами
  966. # в случайном лесу важно число деревьев
  967. # max_depth - не надо варьировать,
  968. # min_saples_leaf - не надо задавать
  969. grid = GridSearchCV(rf_cls, params, cv = 5, n_jobs = -1)
  970. %%timeit
  971. grid.fit(x_train, y_train) # обучение на кросс-валидации
  972. grid.best_params_ # параметры лучшей модели
  973. best_clf = grid.best_estimator_ # лучший алгоритм
  974. y_pred = best_clf.predict(x_test)
  975. print(classification_report(y_test, y_pred))
  976. grid.best_score_
  977. #### Анализ результатов примеенения модели "Случайный лес"
  978. с преобразованием даты из строки в тип дата не знаком, поэтому закодирвал как и все отсальные номинальные признаки

Share with your friends:

Print