В этой части мы рассмотрим, как можно прогнозировать свою личную продуктивность, используя некоторые современные методы. Мы рассмотрим относительно простой пример того, как создать (статическое) интерактивное приложение исключительно с использованием Python.
Во-первых, как именно мы прогнозируем личную продуктивность? Во-первых, нам нужны данные. В идеале, изрядное количество. Во-вторых, нам нужно открыть наш набор инструментов. Теперь, если вы похожи на меня, вы, вероятно, всегда слышите на этом сайте такие слова, как «предиктивная аналитика» или «машинное обучение». Вы даже можете услышать более конкретные модные слова, такие как нейронные сети, случайный лес или повышение. Но что они означают? И, что более важно, как мы их используем?
Цель этой статьи не в том, чтобы быть слишком технической, поэтому мы будем кратки в деталях. Мы будем рассматривать конкретно нейронные сети и классификаторы на основе дерева решений. По сути, и это действительно чрезмерное упрощение, нейронная сеть по существу имитирует данные, на которых вы ее обучаете, а затем воспроизводите их на вашем тестовом наборе. Упрощенный пример: представьте себе нейронные сети как маленького ребенка, который распознает, что определенные слова и изображения совпадают. Они часто точны, но отсутствуют нюансы. Например, ребенку может быть трудно научиться социальным навыкам от простого узнавания. С другой стороны, деревья решений имитируют более традиционное программирование «если-то-иначе». Чтобы сохранить неудачную аналогию, дерево решений может с трудом расшифровывать изображение птицы. Представьте, что вы описываете птицу, отвечая на вопросы ребенка «да/нет», ее будет трудно отличить от других животных. Однако представьте, что ребенок задает вопросы о том, как . Случайный лес был бы подобен классу детей, задающих вопросы. XGBoost — это то же самое, что задавать вопросы подряд случайным образом и делать это до тех пор, пока не будет найдена наилучшая комбинация вопросов с точки зрения предсказания окончательного ответа.
Теперь вернемся к реализации идеи. Моя первоначальная цель в этом проекте состояла в том, чтобы предсказать, пойду ли я в спортзал или буду ли я продуктивным в данный день. Честно говоря, идея возникла из-за того, что я не посещал тренажерный зал, а также из-за своей продуктивности. Итак, я начал собирать данные о различных аспектах своего дня, чтобы увидеть, насколько хорошо они могут предсказать исход дня, который мне небезразличен, в данном случае посещение тренажерного зала или продуктивность.
Данные, которые я собирал, включали цвет моей рубашки, день недели, температуру на улице и другие. По общему признанию, для большинства людей они, вероятно, не очень продуктивны, но для меня они имели смысл. Несмотря на это, вы можете изменить личные данные, которые вы записываете о себе, если вы записываете достаточное количество переменных и в течение длительного периода времени.
Наконец, мы можем начать реализацию Python. Прежде чем мы начнем (извините), откройте блокнот Jupyter, чтобы начать этот код. Я рекомендую запускать ноутбук из оболочки Anaconda. Если вы похожи на меня и просто прокрутите до первого кода, который вы видите, добро пожаловать.
from ipywidgets import interact, interactive, IntSlider, Layout, interact_manual,interactive_output from ipywidgets import Button, HBox, VBox import ipywidgets as widgets from ipywidgets.embed import embed_minimal_html from IPython.display import display import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_split #here we Import Random Forest Model from sklearn.ensemble import RandomForestClassifier from sklearn.tree import DecisionTreeClassifier #Import scikit-learn metrics module for accuracy calculation from sklearn import metrics import xgboost as xgb from pywaffle import Waffle import warnings import seaborn as sn warnings.filterwarnings(“ignore”) from sklearn.linear_model import Perceptron from sklearn.neural_network import MLPClassifier mpl.style.use(‘seaborn’)
Так что это очень много зависимостей, и, вероятно, это может замедлить вашу реализацию, если они не все загружены, и за это я прошу прощения. Единственный, наверное, ненужный — это пивафля, но ничего не могу поделать, ОБОЖАЮ вафельные сюжеты. Они являются гораздо лучшей альтернативой круговым диаграммам, так как люди склонны с трудом визуализировать проценты на радиальной шкале.
Следующим шагом будет загрузка данных. Это довольно просто, если у вас есть соответствующий набор данных, сохраненный в том же каталоге, что и ваш файл Python.
data=pd.read_csv(‘randomstuff.csv’)
Достаточно легко. Теперь займемся небольшой уборкой. Да, это как-то нужно, хоть я и свои данные записал.
data[‘userid’]=data[‘userid’].str.split().str[0].str.strip().str.lower()
«userid» для меня относится к именам людей, от которых я собирал данные. Некоторые люди писали свои имена с заглавной буквы или включали имя и фамилию, поэтому этот фрагмент преобразует все первые слова в имени в нижний регистр.
Теперь мы преобразуем наши данные в категориальные. Например, в моем опросе ответы на вопросы обычно давались в формате да/нет. Этот код преобразует это с помощью пакета awesome pandas в факторы. Обратите внимание, что .astype(‘int’) также можно заменить на .astype(‘category’), что может помочь нам упростить методы «машинного обучения» для прогнозирования в паре фрагментов.
data[‘colorshirt’]=pd.factorize(data.colorshirt)[0] data[‘weekday’]=pd.factorize(data.weekday)[0] data[‘userid’]=pd.factorize(data.userid)[0] data[‘breakfast’]=pd.factorize(data.breakfast)[0].astype('int') data[‘lanes’]=pd.factorize(data.lanes)[0].astype('int') data[‘busy’]=pd.factorize(data.busy)[0].astype('int') data[‘gym’]=pd.factorize(data.gym)[0].astype('int') data[‘productive’]=pd.factorize(data.productive)[0].astype('int')
Разработка функций имеет решающее значение, и в зависимости от того, кого вы спросите, это утомительная/забавная часть предварительной сортировки данных, которая помогает повысить точность прогнозов. Разработка функции влечет за собой просмотр ваших данных и создание нового столбца/переменной на основе этих данных. Например, мы можем сделать функцию, основанную на том, ходили ли мы в спортзал накануне. Я ни в коем случае не выступаю за то, чтобы следующий код был эффективным способом создания этой функции, но он выполняет свою работу. Если вы найдете лучший способ сделать это, не стесняйтесь реализовать его! Не копируйте просто этот код, поверьте мне, это будет сдерживать вас в долгосрочной перспективе.
#one hot encoding might be better N=len(data.columns) n=len(data[‘gym’]) #data[‘gymdaybefore’][0]=0 data[‘gymdaybefore’]=1 cols = list(data.columns.values) cols=cols[0:N] #insert gymdaybefore column before the predicted outcome variables cols.insert(N-2, ‘gymdaybefore’) data=data[cols] #not a great solution, but manually set first value to data[‘gymdaybefore’][0]=0 #so we can see what data looks like data
Теперь мы успешно загрузили наши данные. Следующим шагом является начало нашего анализа. Я собираюсь включить здесь сразу много кода, так что будьте осторожны. Я решил сделать это, чтобы, если вы скопируете код (пожалуйста, не делайте этого), ничего не потерялось при переводе. Мы будем использовать три различных метода, чтобы предсказать интересующие нас результаты. Два из них основаны на дереве решений (случайный лес и XGboost), а также на простой нейронной сети. Интуиция подсказывает, что деревья будут доминировать здесь, поскольку такие результаты, как поход в спортзал, вероятно, можно очень хорошо предсказать с помощью логики «если-иначе». Представьте кого-то с определенным распорядком. Если вы спросите их, что они делают в определенные дни при определенных условиях, они могут дать вам убедительный ответ. Снова вернитесь к предыдущей аналогии. Нейронная сеть, вероятно, будет бороться, особенно потому, что данных недостаточно, чтобы точно имитировать результат. Код встроен в следующий смысл, чтобы ограничить длину этой части.
Вот ссылка на код. Надеюсь, это достаточно хорошо прокомментировано, чтобы все имело смысл. На самом деле он не продвинутый, за исключением части, которая использует понимание списка, что может быть не очень очевидным. Однако поищите их, это действительно одна из самых крутых функций Python. Одним из дополнений к коду является то, что в функции генерируется новая функция, чтобы определить, находимся ли мы в выходные дни. Это, вероятно, будет более предсказуемо, чем день недели, поскольку мы уменьшим количество факторов с 7 до 2. Однако мы должны спросить пользователя, ходили ли они вчера в спортзал, даже если это функция, которую мы рассчитываем в данных. Это связано с тем, что мы не знаем, посещал ли вчера пользователь, который вводит данные для прогноза, спортзал, мы просто знаем данные, которые он предоставил, до текущей даты.
Кроме того, есть закомментированный код, который позволит нам использовать прогнозируемые результаты в качестве предикторов. На самом деле это не было целью, но если вы не комментируете в определенных местах, код совместим.
Вот ссылка на интерактивную часть кода. Код также совместим для персонализированных и групповых прогнозов. Есть преимущества для обоих. Что касается групповых данных, у нас есть более подробные и полные данные, однако вы должны позволить характеристикам других людей определять ваши личные результаты. Это интересный компромисс. Если вы нажмете соло, это снимет зависимость от других пользователей. Ниже приведено изображение выходного статического интерактивного приложения.
Если вы хотите поиграть с внешним видом приложения, попробуйте следующий код.
Это изображение вывода:
Надеюсь, это имело смысл. Некоторые области, где что-то может пойти не так, связаны с загрузкой пакетов, в частности с вафельным сюжетом. Не стесняйтесь комментировать это, если это необходимо. Кроме того, обратите внимание, что это не совсем то, что нужно, если вы хотите сделать приложение для публикации. Мне еще предстоит полностью решить это, поэтому буду признателен за интересные решения.