{"id":285327,"date":"2017-04-21T14:25:33","date_gmt":"2017-04-21T10:25:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=285327"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=285327","title":{"rendered":"\u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 TJ"},"content":{"rendered":"<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u0442\u043e\u043c\u043d\u044b\u043c \u0432\u0435\u0447\u0435\u0440\u043e\u043c, \u0441\u0438\u0434\u044f \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u043c\u0435\u043b\u044c\u043a\u0430\u044e\u0449\u0435\u0439 \u043b\u0435\u043d\u0442\u044b tjournal \u0438 \u043f\u043e\u043f\u0438\u0432\u0430\u044f \u0440\u043e\u043c\u0430\u0448\u043a\u043e\u0432\u044b\u0439 \u0447\u0430\u0439, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0441\u0435\u0431\u044f \u0437\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0441\u043e\u0432\u0435\u0442\u0441\u043a\u0443\u044e \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0441\u0432\u0435\u0449\u0430\u043b\u0430 \u0447\u0435\u0439-\u0442\u043e \u043f\u043e\u0434\u044a\u0435\u0437\u0434 \u0443\u0436\u0435 80 \u043b\u0435\u0442. \u0414\u0430, \u0432\u0435\u0441\u044c\u043c\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e <del>\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443<\/del> \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0418\u0418 \u0432 \u0438\u0433\u0440\u0435 \u0434\u0443\u043c, \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u043a\u0435\u0442 SpaceX \u0438, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u2014 \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b-\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432. \u0410 \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u0431\u0438\u0440\u0430\u044e\u0442 \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0438? \u041f\u043e\u0441\u0442\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u0442\u0432\u0438\u0442 \u043f\u0440\u043e \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0430\u043a\u0446\u0438\u044e \u0438\u043b\u0438 \u0436\u0435 \u0442\u0430\u043b\u043c\u0443\u0434\u044b \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0438\u043d\u043e\u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438? \u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u0442\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0447\u0435\u0445\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0439 Jupyter notebook \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<p><div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/487\/76d\/3ee\/48776d3ee7ac4672b8dfa7099e3b2b5b.jpg\" \/><\/div>\n<p><a name=\"habracut\"><\/a><br \/>  \u0418\u0442\u0430\u043a, \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0430\u044f \u2014 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 \u0441\u0442\u0430\u0442\u044c\u0438, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Python 3.*, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u0435\u0442 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (pandas, numpy, scipy, scikit-learn), \u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0432 Jupyter notebook. \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 <a href=\"https:\/\/github.com\/vangaa\/tj_habra_article\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  <\/p>\n<h2 id=\"sbor-bazy\">\u0421\u0431\u043e\u0440 \u0431\u0430\u0437\u044b<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u0434\u043e\u0431\u044b\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 TJ \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e API, \u0442\u043e \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u043c \u0434\u043e\u0431\u0440\u044b\u043c \u0441\u043a\u0440\u0430\u043f\u0438\u043d\u0433\u043e\u043c \u0433\u043e\u043b\u043e\u0433\u043e html \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/docs.python-requests.org\/en\/master\/\">requests<\/a> \u0438 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/\">BeautifulSoup<\/a>. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 39116 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441 2014 \u0433\u043e\u0434\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0430\u043c\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 html \u0431\u043b\u043e\u043a\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0438\u0441\u0443\u0449\u0438\u043c\u0438 \u0435\u0439 \u043a\u0443\u0447\u0435\u0439 \u0442\u044d\u0433\u043e\u0432, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442. \u0421\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442 <a href=\"https:\/\/github.com\/vangaa\/tj_habra_article\/blob\/master\/tj_fetcher.py\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  <\/p>\n<h2 id=\"feature-engineering\">Feature Engineering<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0430\u0441\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0435\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 39000 \u0441\u0442\u0430\u0442\u0435\u0439, \u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0444\u0438\u0447\u0438 \u0432\u0441\u0435\u0445 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import json import datetime import numpy as np import pandas as pd import snowballstemmer from bs4 import BeautifulSoup import itertools  from scipy.sparse import csr_matrix, hstack from sklearn.feature_extraction.text import TfidfTransformer, CountVectorizer from sklearn.cross_validation import train_test_split from sklearn.decomposition import LatentDirichletAllocation from gensim.models import Word2Vec import lightgbm as lgb from sklearn.metrics import r2_score, mean_absolute_error  import seaborn as sns import  matplotlib.pyplot as plt  %matplotlib inline<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0448 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">dataframe = pd.read_json(&quot;data\/tj_dataset.json&quot;) dataframe.head()<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/e64\/9bd\/7ba\/e649bd7ba647450caf3319786e3cfa69.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043f\u043e\u0441\u0442\u0430 \u0438 \u0434\u0430\u0442\u0443 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u0442\u043e \u0438 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u043d\u0433\u0430 \u0444\u0438\u0447 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0443\u0434\u0438\u0442\u044c \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0444\u0438\u0447: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0438 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0435 (\u0434\u0430-\u0434\u0430, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0430\u043c). \u041a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u043e\u0441\u0442\u0430: \u043a\u043e\u043b-\u0432\u043e \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u044e\u0442\u0443\u0431, \u043d\u0430 \u0442\u0432\u0438\u0442\u0442\u0435\u0440, \u043a\u043e\u043b-\u0432\u043e \u0441\u043b\u043e\u0432 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0441\u0442\u0430, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u0441\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u0438 \u0442.\u043f. \u0412\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043b\u043e\u0432\u0438\u0442\u044c (\u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0437-\u0437\u0430 \u043c\u0430\u043b\u043e\u0433\u043e \u043a\u043e\u043b-\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445), \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u043c \u043d\u0430 -9999, \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u044b\u0439 \u0431\u0443\u0441\u0442\u0438\u043d\u0433 \u043d\u0430\u0441 \u043f\u043e\u0439\u043c\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0438\u0447. \u0418 \u0442\u0443\u0442 \u0432\u0441\u0435 \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0433\u043e\u0434, \u043c\u0435\u0441\u044f\u0446, \u0434\u0435\u043d\u044c, \u0447\u0430\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0442\u044b, \u0438\u0437 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u043d\u0433\u0430 \u0444\u0438\u0447 \u0442\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u043d\u044c \u043d\u0435\u0434\u0435\u043b\u0438:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043c\u0435\u0441\u044f\u0446\u0430\u043c\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def get_time(x):     time = x.split()[-1]     h, m = time.split(&quot;:&quot;)     return int(h)*60 + int(m)  m_keys = {     '\u044f\u043d\u0432\u0430\u0440\u044f': 1,     '\u0444\u0435\u0432\u0440\u0430\u043b\u044f': 2,     '\u043c\u0430\u0440\u0442\u0430': 3,     '\u0430\u043f\u0440\u0435\u043b\u044f': 4,     '\u043c\u0430\u044f': 5,     '\u0438\u044e\u043d\u044f': 6,     '\u0438\u044e\u043b\u044f': 7,     '\u0430\u0432\u0433\u0443\u0441\u0442\u0430': 8,     '\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f': 9,     '\u043e\u043a\u0442\u044f\u0431\u0440\u044f': 10,     '\u043d\u043e\u044f\u0431\u0440\u044f': 11,     '\u0434\u0435\u043a\u0430\u0431\u0440\u044f': 12, }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<pre><code class=\"python\">dataframe['month'] = dataframe.date.apply(lambda x: m_keys[x.split()[1]]) dataframe['time'] = dataframe.date.apply(get_time) dataframe['day'] = dataframe.date.apply(lambda x: int(x.split()[0])) dataframe['year'] = dataframe.date.apply(lambda x: int(x.split()[2][:-1])) dataframe[&quot;weekday&quot;] = dataframe[[&quot;year&quot;, &quot;month&quot;, &quot;day&quot;]].apply(lambda x: datetime.date(*x).weekday(), axis=1)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u0430\u044f \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0432\u043e\u043b\u044e \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u0435, \u0447\u0442\u043e \u0434\u0443\u0448\u0435 \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0437 html \u0431\u043b\u043e\u043a\u0430 \u0433\u043e\u043b\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430, \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043c\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">stemmer = snowballstemmer.RussianStemmer() rus_chars = set([chr(i) for i in range(1072, 1104)])  def tokenize_sent(sent):     sent = sent.lower()     sent = &quot;&quot;.join([i if i in rus_chars else &quot; &quot; for i in sent])     words = stemmer.stemWords(sent.split())     return words<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f, \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0444\u0438\u0447 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b-\u0432\u043e \u0441\u043b\u043e\u0432 \u0432 \u043f\u043e\u0441\u0442\u0435 \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435, \u043a\u043e\u043b-\u0432\u043e html \u0442\u044d\u0433\u043e\u0432, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043a\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043b-\u0432\u0430 \u0441\u043b\u043e\u0432 \u0432 \u0431\u043b\u043e\u043a\u0430\u0445. \u041f\u043e\u0441\u0442\u044b \u043d\u0430 tj \u043f\u0435\u0441\u0442\u0440\u044f\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438, \u0432\u0438\u0434\u0435\u043e, \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u0430\u043c\u0438 \u043d\u0430 \u0442\u0432\u0438\u0442\u0442\u0435\u0440 \u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0444\u0438\u0447<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def get_p_data(article):     html = BeautifulSoup(article, &quot;lxml&quot;)     data = html.findAll(&quot;p&quot;)     return [i.text for i in data]  def get_p_count(article):     html = BeautifulSoup(article, &quot;lxml&quot;)     data = html.findAll(&quot;p&quot;)     return len(data)  def get_p_sizes(article):     html = BeautifulSoup(article, &quot;lxml&quot;)     data = html.findAll(&quot;p&quot;)     return [len(preprocess_sent(i.text)) for i in data]  def get_tags_count(article):     html = BeautifulSoup(article, &quot;lxml&quot;)     data = html.findAll()     return len(data)  def mean_p(x):     if not len(x):         return -9999     return np.mean(x)  def std_p(x):     if not len(x):         return -9999     return np.std(x)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<pre><code class=\"python\">dataframe['p_list'] = dataframe.article.apply(get_p_data) dataframe['text_chained'] = dataframe.p_list.apply(lambda x: &quot;\\n&quot;.join(x))  dataframe['p_list_tokenized'] = dataframe.p_list.apply(lambda x: [tokenize_sent(i) for i in x]) dataframe['p_list_tokenized_joined'] = dataframe.p_list_tokenized.apply(lambda x: list(itertools.chain(*x))) dataframe['title_tokenized'] = dataframe.title.apply(tokenize_sent)  dataframe['images_count'] = dataframe.article.apply(lambda x: x.count(&quot;wrapper-image&quot;)) dataframe['wide_labels_count'] = dataframe.article.apply(lambda x: x.count(&quot;wrapper-wide&quot;)) dataframe['link_widget_count'] = dataframe.article.apply(lambda x: x.count(&quot;link-widget&quot;)) dataframe['links_count'] = dataframe.article.apply(lambda x: x.count(&quot;a href&quot;)) - \\     (dataframe.images_count + dataframe.link_widget_count) dataframe['youtube_count'] = dataframe.article.apply(lambda x: x.count(&quot;wrapper-video&quot;)) dataframe['tweets_count'] = dataframe.article.apply(lambda x: x.count(&quot;wrapper-tweet&quot;)) dataframe[&quot;tags_count&quot;] = dataframe.article.apply(get_tags_count) dataframe[&quot;p_count&quot;] = dataframe.p_list.apply(len) dataframe[&quot;text_sizes&quot;] = dataframe.p_list_tokenized.apply(lambda x: [len(i) for i in x]) dataframe[&quot;text_sizes_mean&quot;] = dataframe.text_sizes.apply(mean_p) dataframe[&quot;text_sizes_std&quot;] = dataframe.text_sizes.apply(std_p) dataframe[&quot;text_words_count&quot;] = dataframe.p_list_tokenized.apply(lambda x: len(list(itertools.chain(*x)))) dataframe[&quot;title_words_count&quot;] = dataframe.title_tokenized.apply(lambda x: len(x))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0441 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0444\u0438\u0447\u0430\u043c\u0438 \u0434\u0435\u043b\u043e \u043e\u0431\u0441\u0442\u043e\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0418 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0443\u043c: tf-idf \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e \u043e\u0434\u0438\u043d \u043b\u0438\u0448\u044c tf-idf \u043d\u0435 \u0432\u043d\u0443\u0448\u0430\u0435\u0442 \u0434\u043e\u0432\u0435\u0440\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0449\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Latent_Dirichlet_allocation\">Latent Dirihlet Allocation<\/a> (LDA) \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u0442\u0430 \u0434\u043e 10-50-\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0442\u0440\u0438 LDA \u043f\u043e 10, 20 \u0438 50 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">count_vec = CountVectorizer(tokenizer = tokenize_sent, min_df=10, max_df=0.95) text_count_vec = count_vec.fit_transform(dataframe.text_chained) text_tfidf_vec = TfidfTransformer().fit_transform(text_count_vec).toarray()  lda_features = [] topic_counts = [10, 20, 50] for topics in topic_counts:     lda = LatentDirichletAllocation(topics, n_jobs=7, learning_method=&quot;batch&quot;)     feats = lda.fit_transform(text_count_vec)     lda_features.append(feats)  lda_features = np.concatenate(lda_features, axis=1)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0435\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c? \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, <a href=\"https:\/\/radimrehurek.com\/gensim\/models\/word2vec.html\">word2vec<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">w2v = Word2Vec(dataframe.p_list_tokenized_joined, size=300, workers=7, min_count=5) w2v_dict = {key:w2v.wv.syn0[val.index] for key, val in w2v.wv.vocab.items()}  vectors = list(w2v_dict.values()) words = list(w2v_dict.keys()) words_set = set(words)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u043b\u043e\u0432 \u043f\u043e 300 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u043a\u0430\u043a-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 2 \u0442\u0435\u0445\u043d\u0438\u043a\u0438: \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u043b\u043e\u0432 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u2014 \u0435\u0441\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0430 c \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0441\u043b\u043e\u0432, \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0441\u0438, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0441\u0442\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0432\u044b\u0448\u0435 :<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def get_mean_vec(sent):     matrix = [w2v_dict[i] for i in sent if i in words_set]     if not matrix:         return np.full((300,), -9999)     return np.mean(matrix, axis=0)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0421\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c \u0441\u043b\u043e\u0432 \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043b\u043e\u0432\u0443 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043a \u0442\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443, \u0442.\u0435. \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 CountVectorizer-\u0430 \u043d\u0430 \u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u0445. \u0422\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 LDA, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e KMeans \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043e\u043b-\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432: <\/p>\n<p>  <\/p>\n<pre><code class=\"python\">kmeans = [] clusters_counts = [10, 50, 100, 500, 1000] for clusters in clusters_counts:     kmeans.append(KMeans(clusters, precompute_distances=True, n_jobs=7).fit(vectors))<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u0441\u0442\u0430 \u043f\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">word_mappings = [] for kmean in kmeans:     labels = kmean.labels_     word_mappings.append(dict(zip(words, labels)))  def get_centroids_vec(sent):     words = [i for i in sent if i in words_set]     if not words:         return np.full((sum(clusters_counts),), -9999)     result_total = np.asarray([])     for cnt, mapper in zip(clusters_counts, word_mappings):         result = np.zeros((cnt, ))         for word in words:             result[mapper[word]] += 1         result_total = np.concatenate([result_total, result])     return result_total<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<pre><code class=\"python\">mean_texts = np.asarray([get_mean_vec(s) for s in dataframe.p_list_tokenized_joined.tolist()]) mean_titles = np.asarray([get_mean_vec(s) for s in dataframe.title_tokenized.tolist()]) clusters_texts = np.asarray([get_centroids_vec(s) for s in dataframe.p_list_tokenized_joined.tolist()]) clusters_titles = np.asarray([get_centroids_vec(s) for s in dataframe.title_tokenized.tolist()])<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0444\u0438\u0447\u0438 \u0441\u043e\u0431\u0440\u0430\u043b\u0438, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">feats = [&quot;time&quot;, &quot;day&quot;, &quot;weekday&quot;, &quot;month&quot;,          &quot;images_count&quot;, &quot;wide_labels_count&quot;,          &quot;link_widget_count&quot;, &quot;links_count&quot;,          &quot;youtube_count&quot;, &quot;tweets_count&quot;,          &quot;tags_count&quot;, &quot;p_count&quot;, &quot;text_sizes_mean&quot;,          &quot;text_sizes_std&quot;, &quot;text_words_count&quot;,          &quot;title_words_count&quot;] X = dataframe[feats].as_matrix()  preprocessed_df = np.concatenate([X, mean_texts, mean_titles, lda_features, clusters_texts, clusters_titles], axis=1)  full_df = hstack([csr_matrix(preprocessed_df), text_tfidf_vec]).tocsr()<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"trenirovka-modeli\">\u0422\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 \u0438 \u0440\u0435\u0439\u0442\u0438\u043d\u0433, \u0442\u043e \u0442\u0443\u0442 \u043f\u0440\u044f\u043c \u043d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438. \u0410 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f, \u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441\u043a\u043e\u0441\u0430 \u0438\u0445 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043e-\u043d\u0430\u043b\u0435\u0432\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">dataframe.hits.hist(bins=200)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/212\/20b\/548\/21220b548e3740dc814a8285d2802b5d.png\" alt=\"hits histogram\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043c\u043e \u2014 \u0442\u0430\u043a\u043e\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">dataframe.hits.apply(np.log).hist(bins=200)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bc2\/06a\/e0c\/bc206ae0cca341668a23d38f8891bc23.png\" alt=\"log hits histogram\"\/><\/p>\n<p>  <\/p>\n<p>\u0423\u0436\u0435 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435, \u0445\u043e\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438 \u0441\u043c\u0443\u0449\u0430\u044e\u0442 \u044d\u0442\u0438 \u0434\u0432\u0435 \u0433\u043e\u0440\u044b. \u041d\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435, \u0432\u0435\u0434\u044c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u043c\u0435\u0441\u044f\u0446\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0432\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 tj \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0438 \u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432. \u0422.\u0435. \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u043e\u0441\u043e\u0432. \u0414\u043b\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 200 \u043f\u043e\u0441\u0442\u043e\u0432, \u0441\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0431\u0440\u0430\u0432 \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 99-\u043e\u0439 \u043f\u0435\u0440\u0446\u0435\u043d\u0442\u0438\u043b\u044f\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">hits_y = dataframe.hits  step = 200 new_hits = [] for i in range(step, dataframe.shape[0]):     hits = hits_y.iloc[i-step: i+1]     perc_high = np.percentile(hits, 99)     perc_low = np.percentile(hits, 1)     hits = hits[(hits &gt; perc_low)&amp;(hits &lt; perc_high)]     mean = hits.mean()     std = hits.std()     val = max(min(hits_y.iloc[i], perc_high), perc_low)     new_hits.append((val - mean)\/std)  hits_y = np.asarray(new_hits) full_df = full_df[step:]  min_val = hits_y.min() hits_log = np.log(hits_y - min_val+1e-6)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043f\u043e\u0437\u0430\u0434\u0438, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u043c\u043e\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0434 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0441\u0440\u0430\u0437\u0443 \u0431\u0435\u0440\u0443\u0442 xgboost, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b, \u0438\u0431\u043e \u043e\u043d \u0443\u0436\u0435 \u0437\u0430\u0432\u043e\u0435\u0432\u0430\u043b \u0441\u0432\u043e\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043d\u0430 kaggle \u0438 \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u0433\u0443\u0440\u0443. \u041d\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c \u043d\u0430 <a href=\"https:\/\/medium.com\/implodinggradients\/benchmarking-lightgbm-how-fast-is-lightgbm-vs-xgboost-15d224568031\">\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/a> \u0434\u0432\u0443\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0431\u0443\u0441\u0442\u0438\u043d\u0433\u0430, \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0432\u043b\u0435\u043a \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/Microsoft\/LightGBM\">LigthGBM<\/a> \u043e\u0442 Microsoft \u0441\u0432\u043e\u0438\u043c\u0438 \u0430\u043f\u043f\u0435\u0442\u0438\u0442\u043d\u044b\u043c\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0438\u0447\u043a\u0430 xgboost \u043a\u0430\u043a \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043d\u0430 xgboost \u2014 \u0442\u044b\u043a\u0430\u0435\u043c \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 max_depth \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u043e\u0432\u0435\u0440\u0444\u0438\u0442\u0430, \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u043f\u043e\u0434 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 learning_rate.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0442\u0430\u0441\u0435\u0442 \u0434\u043b\u044f LigthGBM \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0432 \u043c\u0435\u0441\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0438\u0447<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">features = (feats +     list(itertools.chain(*[[f&quot;lda_{lda}_{i}&quot; for i in range(lda)] for lda in topic_counts])) +      [f&quot;mean_matrix_body_{i}&quot; for i in range(300)] +      [f&quot;mean_matrix_title_{i}&quot; for i in range(300)] +      list(itertools.chain(*[[f&quot;clusters_body_{i}_{j}&quot; for j in range(i)] for i in clusters_counts])) +     list(itertools.chain(*[[f&quot;clusters_title_{i}_{j}&quot; for j in range(i)] for i in clusters_counts])) +     [f&quot;tf_idf_{i}&quot; for i in range(text_tfidf_vec.shape[1])])<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<pre><code class=\"python\">X_train, X_test, y_train, y_test = train_test_split(full_df, hits_log, test_size=0.2, random_state=753)  train_data = lgb.Dataset(X_train, label=y_train, feature_name=features) test_data = train_data.create_valid(X_test, label=y_test)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0431\u0443\u0441\u0442\u0438\u043d\u0433\u0430 (\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u043b\u0433\u0438\u0445 \u0447\u0430\u0441\u043e\u0432 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043e\u043a):<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">param = {'num_trees': 100000,          'application':'regression',          'learning_rate': 0.01, 'num_threads': 7,           'max_depth': 10,          'lambda_l2': 1e-3} param['metric'] = 'mae'<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c\u0430 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">bst = lgb.train(param, train_data, param['num_trees'], valid_sets=[test_data], early_stopping_rounds=200)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u0447:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">importance = sorted(zip(features, bst.feature_importance()), key=lambda x: x[1], reverse=True) for imp in importance[:20]: print(&quot;Feature '{}', importance={}&quot;.format(*imp))<\/code><\/pre>\n<p>  <\/p>\n<pre><code>Feature 'tags_count', importance=546 Feature 'month', importance=510 Feature 'weekday', importance=431 Feature 'images_count', importance=377 Feature 'lda_20_6', importance=332 Feature 'time', importance=316 Feature 'wide_labels_count', importance=291 Feature 'lda_50_48', importance=227 Feature 'text_sizes_std', importance=215 Feature 'mean_matrix_title_134', importance=174 Feature 'title_words_count', importance=161 Feature 'text_sizes_mean', importance=160 Feature 'lda_20_15', importance=149 Feature 'mean_matrix_body_262', importance=142 Feature 'mean_matrix_body_194', importance=141 Feature 'mean_matrix_title_115', importance=138 Feature 'mean_matrix_body_61', importance=136 Feature 'mean_matrix_title_13', importance=136 Feature 'tf_idf_1427', importance=132 Feature 'lda_10_1', importance=130<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0413\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0444\u0438\u0447<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">importance = pd.DataFrame([{&quot;imp&quot;: imp, &quot;feat&quot;: feat} for feat, imp in importance]) sns.barplot(x=&quot;imp&quot;, y=&quot;feat&quot;, data=importance.iloc[:20])<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c69\/c4f\/caa\/c69c4fcaa807429cb2395858be948118.png\" alt=\"features\"\/><\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043d\u0430\u0448\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">predictions = bst.predict(X_test) print(&quot;r2 score = {}&quot;.format(r2_score(y_test, predictions))) print(&quot;mae error = {}&quot;.format(mean_absolute_error(y_test, predictions)))<\/code><\/pre>\n<p>  <\/p>\n<pre><code>r2 score = 0.3166155559972065 mae error = 0.4209721870443455<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"itogi\">\u0418\u0442\u043e\u0433\u0438<\/h2>\n<p>  <\/p>\n<p>C \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u0444\u0438\u0447\u0430\u043c\u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u043e r2 score \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c 0.317, \u0430 \u043f\u043e absolute mean error \u2014 0.42. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u043b\u0438 \u044d\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442? \u0412\u043f\u043e\u043b\u043d\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0434\u0430\u0436\u0435 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0435\u0449\u0435 \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 (\u043a\u0430\u043a \u0440\u0435\u043a\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0435, \u0442\u0430\u043a \u0438 \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u044b\u0435, \u0441 Embedding \u0441\u043b\u043e\u0435\u043c \u0438 \u0432\u0435\u0441\u0430\u043c\u0438 word2vec), \u043a LDA \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 PCA, NMF \u0438 \u043f\u0440\u043e\u0447\u0443\u044e \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0438\u0447\u0438 \u0438\u0437 \u0440\u0430\u0437\u0440\u044f\u0434\u0430 &quot;\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b-\u0432\u0430 \u043f\u0443\u043d\u043a\u0442\u0443\u0430\u0446\u0438\u0438 \u043a \u043a\u043e\u043b-\u0432\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043e\u0432 \u0441\u0442\u0440\u043e\u043a&quot;. \u041d\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u043c.<\/p>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/327072\/\"> https:\/\/habrahabr.ru\/post\/327072\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u0442\u043e\u043c\u043d\u044b\u043c \u0432\u0435\u0447\u0435\u0440\u043e\u043c, \u0441\u0438\u0434\u044f \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u043c\u0435\u043b\u044c\u043a\u0430\u044e\u0449\u0435\u0439 \u043b\u0435\u043d\u0442\u044b tjournal \u0438 \u043f\u043e\u043f\u0438\u0432\u0430\u044f \u0440\u043e\u043c\u0430\u0448\u043a\u043e\u0432\u044b\u0439 \u0447\u0430\u0439, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0441\u0435\u0431\u044f \u0437\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0441\u043e\u0432\u0435\u0442\u0441\u043a\u0443\u044e \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0441\u0432\u0435\u0449\u0430\u043b\u0430 \u0447\u0435\u0439-\u0442\u043e \u043f\u043e\u0434\u044a\u0435\u0437\u0434 \u0443\u0436\u0435 80 \u043b\u0435\u0442. \u0414\u0430, \u0432\u0435\u0441\u044c\u043c\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e <del>\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443<\/del> \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0418\u0418 \u0432 \u0438\u0433\u0440\u0435 \u0434\u0443\u043c, \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u043a\u0435\u0442 SpaceX \u0438, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u2014 \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b-\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432. \u0410 \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u0431\u0438\u0440\u0430\u044e\u0442 \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0438? \u041f\u043e\u0441\u0442\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u0442\u0432\u0438\u0442 \u043f\u0440\u043e \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0430\u043a\u0446\u0438\u044e \u0438\u043b\u0438 \u0436\u0435 \u0442\u0430\u043b\u043c\u0443\u0434\u044b \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u0438\u043d\u043e\u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438? \u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u0442\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0447\u0435\u0445\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0439 Jupyter notebook \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<p><div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/487\/76d\/3ee\/48776d3ee7ac4672b8dfa7099e3b2b5b.jpg\" \/><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-285327","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/285327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=285327"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/285327\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=285327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=285327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=285327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}