code, coding, computer-1839406.jpg

Moja ściąga z 17 komendami przydatnymi w projektach ML

Pracując od kilku lat przy różnych projektach Machine Learning, zacząłem budować “ściągę” z różnymi komendami.

Większość z nich stosuje się na tyle rzadko, że trudno jest je zapamiętać. Z drugiej strony, kiedy jej nie miałem, łapałem się, że wielokrotnie wyszukuję te same rzeczy na Stacku.

Chciałbym się podzielić z Tobą fragmentem mojej ściągi – może również będzie przydatna w Twojej pracy.

Technologie, które używam w większości projektów to:

  1. Jupyter notebook (w przeglądarce) – do szybkiej analizy danych oraz wykonywania eksperymentów.
  2. Visual Studio Code – do pisania kodu bibliotecznego w Pythonie.
  3. Zdalne repozytorium.
  4. Linux.

Podstawowe biblioteki do szybkiej i prostej analizy danych to Pandas oraz Matplotlib.

Zaczynajmy!

import pandas as pd
import matplotlib.pyplot as plt
from IPython.core.display import HTML

I. Pandas

1. Wyświetlanie wszystkich wierszy tabeli

# turn on
pd.set_option('display.max_rows', None)

# turn off
pandas.reset_option('display.max_rows')

lub

with pd.option_context("display.max_rows", 1000):
    display(df)

Druga opcja jest o tyle lepsza, że nie musimy pamiętać o wyłączeniu opcji, gdy później nie chcemy z niej korzystać.

Zdarzało mi się wielokrotnie o tym zapomnieć i zawiesić notatnik, gdy chciałem wyświetlić dużą tabelę.

2. Operacje na tabeli w jednej linijce

df.rename(columns={'a': 'b'}) # zmiana nazwy kolumny z 'a' na 'b'
df.assign(one=1) # nowa kolumna 'one' z jedynkami
df.drop(columns=['campaign_id']) # usunięcie kolumny 'campaign_id'

3. Łączenie tabel

Wierszami:

df = df1.append(df2)

Kolumnami:

pd.concat([df1, df2], axis=1)

4. Dwukolumnowa tabela –> słownik

df.set_index('Position')['Letter'].to_dict()

Na odwrót:

pd.DataFrame.from_dict(my_dict, orient='index')

5. Dodatkowa kolumna z procentową statystyką w ramach grupy

Jeśli mamy liczbę kliknięć dla każdej kampanii reklamowej dla każdego dnia i chcemy obliczyć procentowy udział kliknięć dla każdej kampanii w każdym dniu, to piszemy:

df['clicks_perc'] = df[['clicks', 'campaign_id', 'day']].groupby(['campaign_id', 'day']).transform(lambda x: x / x.sum())

6. Dwie zmienne na jednym wykresie

df[['income', 'cost']].plot()
plt.show()

7. Wykres per kategoria

Jeśli mamy tabelkę z kliknięciami co godzinę dla każdej strony internetowej i chcemy na jednym wykresie pokazać kliknięcia godzinowe dla każdej strony z osobna to piszemy:

plot_df = df[['clicks', 'page', 'hour']].set_index(['page', 'hour']).unstack('hour')
plot_df.columns = [c for (_, c) in plot_df.columns]
plot_df.plot()

II. Wykresy

8. Ładne wykresy w matplotlib

plt.rcParams["figure.figsize"] = (20,10)
plt.rcParams["font.size"] = 22
plt.style.use('bmh')

# reset
plt.rcParams.update(plt.rcParamsDefault)

9. Pionowe i poziome linie na wykresie

Pionowa:

plt.axvline(x=0, color='grey', linestyle='-')

Pozioma:

plt.axhline(y=0.0, color='k', linestyle='-')

III. Jupyter

10. Notatnik + kod biblioteczny

W głównym katalogu projektu mam podkatalogi ipython z notatnikami jupyterowymi oraz lib z kodem bibliotecznym. Aby importować z katalogu lib należy w notatnikach wpisać:

import os
while 'ipython' in os.getcwd():
    os.chdir("../")

11. Rozszerzane okna

Domyślnie okno w Jupyterze nie zajmuje całej szerokości przeglądarki – często jest to strata miejsca, która przeszkadza w odczytywaniu szerokich tabel. Możemy to zmienić poprzez:

display(HTML("<style>.container { width:100% !important; }</style>"))

12. Ładne tytuły HTML w notatniku

display(HTML(f'<h3>{title}</h3>'))

IV. Terminal + git

13. Format JSON-a w terminalu

echo '{"a":[2,3]}' | json_pp

14. Procesy najbardziej zużywające pamięć

ps aux --sort=-%mem | head

15. Uruchamianie notatników w terminalu

runipy -o my_notebook.ipynb

16. Wybranie jednej z wersji plików w razie konfliktów GIT

Pomocne zwłaszcza przy konflikcie notatników jupyterowych.

git checkout --theirs [--ours] path/to/file

17. Cofanie commitów

Od piątego do trzeciego włącznie, (HEAD~2 cofa tylko trzeci ostatni commit):

git revert HEAD~5..HEAD~2

Podsumowanie

Mam nadzieję, że część z tych komend była dla Ciebie odkrywcza.

Czy Ty również masz swoją “ściągę”? Jeśli tak, daj koniecznie znać w komentarzu!