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_selection
class, которая используется для определения случайного набора гиперпараметров для упомянутого алгоритма обучения, она случайным образом выбирает разные значения для каждого гиперпараметра, предоставленного для настройки и применения перекрестной проверки для каждого выбранного значения и определения лучшего из них, используя разные механизм подсчета очков при поиске.
>>> 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.