DS В РЕАЛЬНОМ МИРЕ

Хаки для программирования машинного обучения, которые должен знать каждый инженер по данным - Часть 2

Шпаргалка для специалистов по анализу данных и машинного обучения.

Этот пост является продолжением поста, упомянутого ниже.



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

11. Управление широкими и длинными фреймами данных.

Наиболее эффективный метод преобразования широких данных в длинные и длинных в широкие - это функции pandas.melt () и pandas.pivot_table () соответственно. Вам не понадобится ничего, кроме этих функций, для преобразования длинных и широких данных друг в друга.

а. От широкого до длинного (растапливать)

>>> import pandas as pd
# create wide dataframe
>>> df_wide = pd.DataFrame(
...    {"student": ["Andy", "Bernie", "Cindy", "Deb"],
...     "school":  ["Z", "Y", "Z", "Y"],
...     "english": [66, 98, 61, 67],  # eng grades
...     "math":    [87, 48, 88, 47],  # math grades
...     "physics": [50, 30, 59, 54]   # physics grades
...    }
...  )
>>> df_wide
  student school  english  math  physics
0    Andy      Z       66    87       50
1  Bernie      Y       98    48       30
2   Cindy      Z       61    88       59
3     Deb      Y       67    47       54
>>> df_wide.melt(id_vars=["student", "school"],
...               var_name="subject",  # rename
...               value_name="score")  # rename
   student school  subject  score
0     Andy      Z  english     66
1   Bernie      Y  english     98
2    Cindy      Z  english     61
3      Deb      Y  english     67
4     Andy      Z     math     87
5   Bernie      Y     math     48
6    Cindy      Z     math     88
7      Deb      Y     math     47
8     Andy      Z  physics     50
9   Bernie      Y  physics     30
10   Cindy      Z  physics     59
11     Deb      Y  physics     54

б. От длинной к широкой (сводная таблица)

>>> import pandas as pd
# create long dataframe
>>> df_long = pd.DataFrame({
...         "student":
...             ["Andy", "Bernie", "Cindy", "Deb",
...              "Andy", "Bernie", "Cindy", "Deb",
...              "Andy", "Bernie", "Cindy", "Deb"],
...         "school":
...             ["Z", "Y", "Z", "Y",
...              "Z", "Y", "Z", "Y",
...              "Z", "Y", "Z", "Y"],
...         "class":
...             ["english", "english", "english", "english",
...              "math", "math", "math", "math",
...              "physics", "physics", "physics", "physics"],
...         "grade":
...             [66, 98, 61, 67,
...              87, 48, 88, 47,
...              50, 30, 59, 54]
... })
>>> df_long
   student school    class  grade
0     Andy      Z  english     66
1   Bernie      Y  english     98
2    Cindy      Z  english     61
3      Deb      Y  english     67
4     Andy      Z     math     87
5   Bernie      Y     math     48
6    Cindy      Z     math     88
7      Deb      Y     math     47
8     Andy      Z  physics     50
9   Bernie      Y  physics     30
10   Cindy      Z  physics     59
11     Deb      Y  physics     54
>>> df_long.pivot_table(index=["student", "school"], 
...                     columns='class', 
...                     values='grade')
class           english  math  physics
student school                        
Andy    Z            66    87       50
Bernie  Y            98    48       30
Cindy   Z            61    88       59
Deb     Y            67    47       54

12. Перекрестная таблица:

Когда вам нужно суммировать данные, кросс-табуляция играет большую роль для агрегирования двух или более факторов и вычисления частотной таблицы для значений. Это может быть реализовано с помощью функции pandas.crosstab (), которая также позволяет находить нормализованные значения при печати вывода с использованием параметра «normalize».

>>> import numpy as np
>>> import pandas as pd
>>> p = np.array(["s1", "s1", "s1", "s1", "b1", "b1",
...               "b1", "b1", "s1", "s1", "s1"], dtype=object)
>>> q = np.array(["one", "one", "one", "two", "one", "one",
...               "one", "two", "two", "two", "one"], dtype=object)
>>> r = np.array(["x", "x", "y", "x", "x", "y",
...               "y", "x", "y", "y", "y"], dtype=object)
>>> pd.crosstab(p, [q, r], rownames=['p'], colnames=['q', 'r'])
q  one    two   
r    x  y   x  y
p               
b1   1  2   1  0
s1   2  2   1  2
# get normalized output values
>>> pd.crosstab(p, [q, r], rownames=['p'], colnames=['q', 'r'], normalize=True)
q        one                 two          
r          x         y         x         y
p                                         
b1  0.090909  0.181818  0.090909  0.000000
s1  0.181818  0.181818  0.090909  0.181818

13. Темы Jupyter:

Одна из лучших библиотек в Python - jupyterthemes, которая позволяет вам изменять и контролировать стиль представления записной книжки, над которым работает большинство практиков машинного обучения. Поскольку большинство программистов предпочитают разные темы, такие как темный режим, светлый режим и т. Д., Или индивидуальный стиль, это может быть достигнуто в записных книжках Jupyter с помощью библиотеки jupyterthemes.

# pip install
$ pip install jupyterthemes
# conda install
$ conda install -c conda-forge jupyterthemes
# list available themes
$ jt -l
Available Themes:
   chesterish
   grade3
   gruvboxd
   gruvboxl
   monokai
   oceans16
   onedork
   solarizedd
   solarizedl
# apply the theme
jt -t chesterish
# reverse the theme
!jt -r

Вы можете найти больше об этом здесь, на Github https://github.com/dunovank/jupyter-themes.

14. Преобразование категориальной переменной в фиктивную:

Используя функцию pandas.get_dummies (), вы можете напрямую преобразовать категориальные функции в DataFrame в фиктивные переменные вместе с drop_first = True для удаления первого избыточного столбца.

>>> import pandas as pd
>>> df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'],
...                     'C': [1, 2, 3]})
>>> df
   A  B  C
0  a  b  1
1  b  a  2
2  a  c  3
>>> pd.get_dummies(df[['A','B']])
   A_a  A_b  B_a  B_b  B_c
0    1    0    0    1    0
1    0    1    1    0    0
2    1    0    0    0    1
>>> dummy = pd.get_dummies(df[['A','B']], drop_first=True)
>>> dummy
   A_b  B_b  B_c
0    0    1    0
1    1    0    0
2    0    0    1
# concat dummy features to existing df
>>> df = pd.concat([df, dummy], axis=1)
>>> df
   A  B  C  A_b  B_b  B_c
0  a  b  1    0    1    0
1  b  a  2    1    0    0
2  a  c  3    0    0    1

15. Преобразовать в число:

При загрузке набора данных в pandas иногда числовой столбец принимает тип объекта, и числовые операции не могут выполняться с ним. Чтобы преобразовать их в числовые, мы можем использовать функцию pandas.to_numeric () и обновить существующую серию или столбец в DataFrame.

>>> import pandas as pd
>>> s = pd.Series(['1.0', '2', -3, '12', 5])
>>> s
0    1.0
1      2
2     -3
3     12
4      5
dtype: object
>>> pd.to_numeric(s)
0     1.0
1     2.0
2    -3.0
3    12.0
4     5.0
dtype: float64
>>> pd.to_numeric(s, downcast='signed')
0     1
1     2
2    -3
3    12
4     5
dtype: int8

16. Стратифицированная выборка / разделение.

При разбиении набора данных нам нужно иногда получать выборку совокупности данных при разбиении данных. Это более эффективно, когда классы недостаточно сбалансированы в наборе данных. В функции sklearn.model_selection.train_test_split () параметр с именем «stratify» может быть установлен с функцией целевого класса, чтобы правильно разделить данные с тем же соотношением, что и в неразделенном наборе данных для разных классов.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    stratify=y, 
                                                    test_size=0.25)

17. Выбор функций по типу:

В большинстве наборов данных у нас есть столбцы обоих типов: числовые и нечисловые. Нам часто требуется извлечь только числовые столбцы или категориальные столбцы в наборе данных и выполнить некоторые функции визуализации или пользовательские манипуляции с ними. В библиотеке pandas у нас есть функция DataFrame.select_dtypes (), которая выбирает определенные столбцы из заданного набора данных, которые соответствуют указанному типу данных.

>>> import pandas as pd
>>> df = pd.DataFrame({'a': [1, 2] * 3,
...                     'b': [True, False] * 3,
...                     'c': [1.0, 2.0] * 3})
>>> df
   a      b    c
0  1   True  1.0
1  2  False  2.0
2  1   True  1.0
3  2  False  2.0
4  1   True  1.0
5  2  False  2.0
>>> df.select_dtypes(include='bool')
       b
0   True
1  False
2   True
3  False
4   True
5  False
>>> df.select_dtypes(include=['float64'])
     c
0  1.0
1  2.0
2  1.0
3  2.0
4  1.0
5  2.0
>>> df.select_dtypes(exclude=['int64'])
       b    c
0   True  1.0
1  False  2.0
2   True  1.0
3  False  2.0
4   True  1.0
5  False  2.0

18. RandomizedSearchCV:

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

>>> from sklearn.datasets import load_iris
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from scipy.stats import uniform
>>> iris = load_iris()
>>> logistic = LogisticRegression(solver='saga', tol=1e-2, 
...                               max_iter=300,random_state=12)
>>> distributions = dict(C=uniform(loc=0, scale=4),
...                      penalty=['l2', 'l1'])
>>> clf = RandomizedSearchCV(logistic, distributions, random_state=0)
>>> search = clf.fit(iris.data, iris.target)
>>> search.best_params_
{'C': 2..., 'penalty': 'l1'}

19. Магическая функция -% история:

Пакет ранее запущенных команд в записной книжке можно получить с помощью волшебной функции «% history». Это предоставит все ранее выполненные команды и могут быть предоставлены настраиваемые параметры для выбора конкретных команд истории, которые вы можете проверить с помощью «% history?» В блокноте jupyter.

In [1]: import math

In [2]: math.sin(2)
Out[2]: 0.9092974268256817

In [3]: math.cos(2)
Out[3]: -0.4161468365471424
In [16]: %history -n 1-3
   1: import math
   2: math.sin(2)
   3: math.cos(2)

20. Горячие клавиши подчеркивания (_):

В python вы можете напрямую распечатать последний вывод, отправленный интерпретатором, используя функцию print (_) с подчеркиванием. Это может быть не очень полезно, но в IPython (jupyter notebook) эта функция была расширена, и вы можете распечатать любой n-й последний вывод, используя n подчеркиваний в функции print (). Например. print (__) с двумя символами подчеркивания даст вам предпоследний вывод, который пропускает все команды, у которых нет вывода.

Кроме того, еще одно подчеркивание, за которым следует номер строки, печатает связанный вывод.

In [1]: import math

In [2]: math.sin(2)
Out[2]: 0.9092974268256817

In [3]: math.cos(2)
Out[3]: -0.4161468365471424
In [4]: print(_)
-0.4161468365471424

In [5]: print(__)
0.9092974268256817
In [6]: _2
Out[13]: 0.9092974268256817

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

Быть в курсе.



Спасибо за чтение. Вы можете найти другие мои посты по машинному обучению здесь.

Надеюсь, этот пост был полезен. Я ценю отзывы и конструктивную критику. Если вы хотите поговорить об этой статье или других связанных темах, вы можете написать мне здесь или в LinkedIn.