Copy disabled (too large)
Download .txt
Showing preview only (17,608K chars total). Download the full file to get everything.
Repository: yandexdataschool/Practical_RL
Branch: master
Commit: e77705c1fcef
Files: 105
Total size: 16.8 MB
Directory structure:
gitextract_0vwfat_i/
├── .gitignore
├── Amazon GPU howto.md
├── LICENSE.md
├── README.md
├── docker/
│ ├── Dockerfile
│ ├── README.md
│ ├── deeplearning.yaml
│ └── run_jupyter.sh
├── setup_colab.sh
├── week01_intro/
│ ├── README.md
│ ├── crossentropy_method.ipynb
│ ├── deep_crossentropy_method.ipynb
│ ├── pong.py
│ ├── primer_python_for_ml/
│ │ ├── recap_ml.ipynb
│ │ └── train.csv
│ ├── project_starter_evolution_strategies.ipynb
│ ├── seminar-es-task.ipynb
│ └── seminar_gymnasium_interface.ipynb
├── week02_value_based/
│ ├── README.md
│ ├── mdp.py
│ └── seminar_vi.ipynb
├── week03_model_free/
│ ├── README.md
│ └── homework.ipynb
├── week04_[recap]_deep_learning/
│ ├── README.md
│ ├── mnist.py
│ ├── notmnist.py
│ ├── seminar_pytorch.ipynb
│ └── seminar_tensorflow.ipynb
├── week04_approx_rl/
│ ├── README.md
│ ├── dqn/
│ │ ├── __init__.py
│ │ ├── analysis.py
│ │ ├── atari_wrappers.py
│ │ ├── logger.py
│ │ ├── replay_buffer.py
│ │ └── utils.py
│ ├── homework_pytorch_debug.ipynb
│ ├── homework_pytorch_main.ipynb
│ ├── homework_tf.ipynb
│ ├── requirements.txt
│ ├── seminar_pytorch.ipynb
│ ├── seminar_tf.ipynb
│ └── test_td_loss/
│ └── compute_td_loss.py
├── week05_explore/
│ ├── README.md
│ ├── q_learning_agent.py
│ ├── replay_buffer.py
│ └── week5.ipynb
├── week06_policy_based/
│ ├── README.md
│ ├── a2c-optional.ipynb
│ ├── atari_wrappers.py
│ ├── env_batch.py
│ ├── reinforce_pytorch.ipynb
│ ├── reinforce_tensorflow.ipynb
│ └── runners.py
├── week07_[recap]_rnn/
│ ├── README.md
│ ├── arxiv_data.csv
│ ├── mtg_card_names.txt
│ ├── names
│ ├── seminar_pytorch.ipynb
│ └── seminar_tf.ipynb
├── week07_seq2seq/
│ ├── README.md
│ ├── basic_model_tf.py
│ ├── basic_model_torch.py
│ ├── bonus_pytorch.ipynb
│ ├── he-pron-wiktionary.txt
│ ├── main_dataset.txt
│ ├── practice_tf.ipynb
│ ├── practice_torch.ipynb
│ └── voc.py
├── week08_pomdp/
│ ├── README.md
│ ├── atari_util.py
│ ├── env_pool.py
│ ├── practice_pytorch.ipynb
│ └── practice_tensorflow.ipynb
├── week09_policy_II/
│ ├── README.md
│ ├── mujoco_wrappers.py
│ ├── ppo.ipynb
│ ├── seminar_TRPO_pytorch.ipynb
│ ├── seminar_TRPO_tensorflow.ipynb
│ ├── td3_and_sac/
│ │ ├── hw-continuous-control_pytorch.ipynb
│ │ └── logger.py
│ └── test_ppo/
│ ├── actions.npy
│ ├── advantages.npy
│ ├── log_probs.npy
│ ├── observations.npy
│ ├── policy
│ ├── resets.npy
│ ├── rewards.npy
│ ├── state.npy
│ ├── value_targets.npy
│ └── values.npy
├── week10_planning/
│ ├── README.md
│ └── seminar_MCTS.ipynb
├── xvfb
├── yet_another_week/
│ ├── README.md
│ └── _resource/
│ ├── README.md
│ ├── a3c_scheme.odp
│ ├── conv_salary_architecture.odp
│ ├── dqn_arch.odp
│ ├── exp_replay.odp
│ ├── nnet_arch.odp
│ ├── pomdp_arch.odp
│ ├── qlearning_scheme.odp
│ ├── qlearning_scheme.pgm
│ └── target_net.odp
└── youtube_dl_lectures.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# node and NPM
npm-debug.log
node_modules
..bfg-report
# swap files
*~
*.swp
env.sh
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
bin/
build/
develop-eggs/
dist/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg/
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
.idea
.ipynb_checkpoints
# Rope
.ropeproject
# Django stuff:
*.log
*.pot
# Sphinx documentation
docs/_build/
docs/tmp*
# OS X garbage
.DS_Store
# Debian things
debian/reproducible-experiment-platform
debian/files
*.substvars
*.debhelper.log
================================================
FILE: Amazon GPU howto.md
================================================
**Warning: this guide has not been updated since we migrated away from Theano/Lasagne, which happened a long time ago.**
# How to set up an Amazon EC2 GPU instance
## Create an instance
Use `p2.xlarge` instance type and `ami-e00a8180` AMI image. [Details](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)
Open ports `22` (ssh) and `80` (http) on your freshly created instance, then create a [security group](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html) and attach it to your instance to get the ports open.
## Launch notebook
The instance you have created contains all you need: fresh versions of theano, lasagne, CUDA driver and cuDNN,
just launch Jupyter and get your hands dirty:
```bash
$ sudo su
$ export THEANO_FLAGS='cuda.root=/usr/local/cuda,device=gpu,floatX=float32'
$ export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
$ jupyter notebook
```
================================================
FILE: LICENSE.md
================================================
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org>
================================================
FILE: README.md
================================================
# Practical_RL
An open course on reinforcement learning in the wild.
Taught on-campus at [HSE](https://cs.hse.ru) and [YSDA](https://yandexdataschool.com/) and maintained to be friendly to online students (both english and russian).
#### Manifesto:
* __Optimize for the curious.__ For all the materials that aren’t covered in detail there are links to more information and related materials (D.Silver/Sutton/blogs/whatever). Assignments will have bonus sections if you want to dig deeper.
* __Practicality first.__ Everything essential to solving reinforcement learning problems is worth mentioning. We won't shun away from covering tricks and heuristics. For every major idea there should be a lab that makes you to “feel” it on a practical problem.
* __Git-course.__ Know a way to make the course better? Noticed a typo in a formula? Found a useful link? Made the code more readable? Made a version for alternative framework? You're awesome! [Pull-request](https://help.github.com/articles/about-pull-requests/) it!
[](https://github.com/yandexdataschool/Practical_RL/graphs/contributors)
# Course info
* __FAQ:__ [About the course](https://github.com/yandexdataschool/Practical_RL/wiki/Practical-RL), [Technical issues thread](https://github.com/yandexdataschool/Practical_RL/issues/1), [Lecture Slides](https://yadi.sk/d/loPpY45J3EAYfU), [Online Student Survival Guide](https://github.com/yandexdataschool/Practical_RL/wiki/Online-student's-survival-guide)
* Anonymous [feedback form](https://docs.google.com/forms/d/e/1FAIpQLSdurWw97Sm9xCyYwC8g3iB5EibITnoPJW2IkOVQYE_kcXPh6Q/viewform).
* Virtual course environment:
* [__Google Colab__](https://colab.research.google.com/) - set open -> github -> yandexdataschool/pracical_rl -> {branch name} and select any notebook you want.
* [Installing dependencies](https://github.com/yandexdataschool/Practical_RL/issues/1) on your local machine (recommended).
* Alternative: [Azure Notebooks](https://notebooks.azure.com/).
# Additional materials
* [RL reading group](https://github.com/yandexdataschool/Practical_RL/wiki/RL-reading-group)
# Syllabus
The syllabus is approximate: the lectures may occur in a slightly different order and some topics may end up taking two weeks.
* [__week01_intro__](./week01_intro) Introduction
* Lecture: RL problems around us. Decision processes. Stochastic optimization, Crossentropy method. Parameter space search vs action space search.
* Seminar: Welcome into openai gym. Tabular CEM for Taxi-v0, deep CEM for box2d environments.
* Homework description - see week1/README.md.
* [__week02_value_based__](./week02_value_based) Value-based methods
* Lecture: Discounted reward MDP. Value-based approach. Value iteration. Policy iteration. Discounted reward fails.
* Seminar: Value iteration.
* Homework description - see week2/README.md.
* [__week03_model_free__](./week03_model_free) Model-free reinforcement learning
* Lecture: Q-learning. SARSA. Off-policy Vs on-policy algorithms. N-step algorithms. TD(Lambda).
* Seminar: Qlearning Vs SARSA Vs Expected Value SARSA
* Homework description - see week3/README.md.
* [__recap_deep_learning__](./week04_\[recap\]_deep_learning) - deep learning recap
* Lecture: Deep learning 101
* Seminar: Intro to pytorch/tensorflow, simple image classification with convnets
* [__week04_approx_rl__](./week04_approx_rl) Approximate (deep) RL
* Lecture: Infinite/continuous state space. Value function approximation. Convergence conditions. Multiple agents trick; experience replay, target networks, double/dueling/bootstrap DQN, etc.
* Seminar: Approximate Q-learning with experience replay. (CartPole, Atari)
* [__week05_explore__](./week05_explore) Exploration
* Lecture: Contextual bandits. Thompson Sampling, UCB, bayesian UCB. Exploration in model-based RL, MCTS. "Deep" heuristics for exploration.
* Seminar: bayesian exploration for contextual bandits. UCB for MCTS.
* [__week06_policy_based__](./week06_policy_based) Policy Gradient methods
* Lecture: Motivation for policy-based, policy gradient, logderivative trick, REINFORCE/crossentropy method, variance reduction(baseline), advantage actor-critic (incl. GAE)
* Seminar: REINFORCE, advantage actor-critic
* [__week07_seq2seq__](./week07_seq2seq) Reinforcement Learning for Sequence Models
* Lecture: Problems with sequential data. Recurrent neural networks. Backprop through time. Vanishing & exploding gradients. LSTM, GRU. Gradient clipping
* Seminar: character-level RNN language model
* [__week08_pomdp__](./week08_pomdp) Partially Observed MDP
* Lecture: POMDP intro. POMDP learning (agents with memory). POMDP planning (POMCP, etc)
* Seminar: Deep kung-fu & doom with recurrent A3C and DRQN
* [__week09_policy_II__](./week09_policy_II) Advanced policy-based methods
* Lecture: Trust region policy optimization. NPO/PPO. Deterministic policy gradient. DDPG
* Seminar: Approximate TRPO for simple robot control.
* [__week10_planning__](./week10_planning) Model-based RL & Co
* Lecture: Model-Based RL, Planning in General, Imitation Learning and Inverse Reinforcement Learning
* Seminar: MCTS for toy tasks
* [__yet_another_week__](./yet_another_week) Inverse RL and Imitation Learning
* All that cool RL stuff that you won't learn from this course :)
# Course staff
Course materials and teaching by: _[unordered]_
- [Pavel Shvechikov](https://github.com/pshvechikov) - lectures, seminars, hw checkups, reading group
- [Nikita Putintsev](https://github.com/qwasser) - seminars, hw checkups, organizing our hot mess
- [Alexander Fritsler](https://github.com/Fritz449) - lectures, seminars, hw checkups
- [Oleg Vasilev](https://github.com/Omrigan) - seminars, hw checkups, technical support
- [Dmitry Nikulin](https://github.com/pastafarianist) - tons of fixes, far and wide
- [Mikhail Konobeev](https://github.com/MichaelKonobeev) - seminars, hw checkups
- [Ivan Kharitonov](https://github.com/neer201) - seminars, hw checkups
- [Ravil Khisamov](https://github.com/zshrav) - seminars, hw checkups
- [Anna Klepova](https://github.com/q0o0p) - hw checkups
- [Fedor Ratnikov](https://github.com/justheuristic) - admin stuff
# Contributions
* Using pictures from [Berkeley AI course](http://ai.berkeley.edu/home.html)
* Massively refering to [CS294](http://rll.berkeley.edu/deeprlcourse/)
* Several tensorflow assignments by [Scitator](https://github.com/Scitator)
* A lot of fixes from [arogozhnikov](https://github.com/arogozhnikov)
* Other awesome people: see github [contributors](https://github.com/yandexdataschool/Practical_RL/graphs/contributors)
* [Alexey Umnov](https://github.com/alexeyum) helped us a lot during spring2018
================================================
FILE: docker/Dockerfile
================================================
ARG device
ARG username="jovyan"
FROM ubuntu:24.04 AS base-cpu
FROM nvidia/cuda:12.9.1-base-ubuntu24.04 AS base-gpu
FROM base-$device AS base
ARG username
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get -qq update && \
apt-get install -y wget unzip git cmake xvfb sudo freeglut3-dev ffmpeg
RUN adduser --disabled-password --gecos "Default user" $username && \
adduser $username sudo && \
echo "%sudo ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
mkdir /notebooks && \
chown -R $username /notebooks
RUN su $username -c \
"wget https://repo.anaconda.com/archive/Anaconda3-2025.06-0-Linux-x86_64.sh \
-O /tmp/anaconda3.sh" && \
mkdir -p /opt/conda && \
chown -R $username /opt/conda && \
su $username -c "/bin/bash /tmp/anaconda3.sh -b -p /opt/conda -u" && \
rm /tmp/anaconda3.sh && \
ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
su $username -c "echo '. /opt/conda/etc/profile.d/conda.sh' >> ~/.bashrc" && \
su $username -c "echo 'conda activate base' >> ~/.bashrc"
ADD deeplearning.yaml /tmp/deeplearning-template.yaml
USER $username
SHELL ["/bin/bash", "-i", "-c"]
RUN conda install -y jupyter
FROM base AS stage-cpu
RUN sed -e "s/{tensorflow}/tensorflow/g" -e "s/{pytorch}/pytorch/g" /tmp/deeplearning-template.yaml > /tmp/deeplearning.yaml
FROM base AS stage-gpu
RUN sed -e "s/{tensorflow}/tensorflow-gpu/g" -e "s/{pytorch}/pytorch-gpu/g" /tmp/deeplearning-template.yaml > /tmp/deeplearning.yaml
FROM stage-$device as final
LABEL maintainer "Alexander Panin <justheuristic@gmail.com>, Dmitry Mittov <mittov@gmail.com>"
ARG username
USER $username
SHELL ["/bin/bash", "-i", "-c"]
RUN conda env create -f /tmp/deeplearning.yaml && \
conda activate deeplearning && \
python -m ipykernel install --user --name python3 --display-name "Python 3"
RUN sudo rm /tmp/deeplearning*.yaml
EXPOSE 8888
VOLUME /notebooks
WORKDIR /notebooks
ENV PATH /opt/conda/bin:$PATH
COPY run_jupyter.sh /
CMD ["/run_jupyter.sh"]
================================================
FILE: docker/README.md
================================================
To simplify installation process, you can deploy a container (~virtual machine) with all dependencies pre-installed.
_tl;dr [dockerhub url](https://hub.docker.com/r/justheuristic/practical_rl/)_
## Install Docker
We recommend you to use either native docker (recommended for linux) or kitematic(recommended for windows).
* Installing [kitematic](https://kitematic.com/), a simple interface to docker (all platforms)
* Pure docker: Guide for [windows](https://docs.docker.com/docker-for-windows/), [linux](https://docs.docker.com/engine/installation/), or [macOS](https://docs.docker.com/docker-for-mac/).
* If you want to use your GPU make sure you have [nvidia-container-toolkit](https://github.com/NVIDIA/nvidia-container-toolkit) and [NVidia driver](https://www.nvidia.com/en-us/drivers/unix/) + [CUDA 10.2](https://developer.nvidia.com/cuda-downloads) installed
Below are the instructions for both approaches.
## Kitematic
Find dmittov/practical_rl in the search menu. Download and launch the container.
Click on "web preview" screen in the top-right __or__ go to settings, ports and find at which port your jupyter is located, usually 32***.
## Native
`docker run --rm -it -v /path/to/your/repo:/notebooks -p <local_port>:8888 dmittov/practical_rl:spring2020-cpu`
For example,
```docker run --rm -it -v /home/myuser/Documents/practical_rl:/notebooks -p 8888:8888 dmittov/practical_rl:spring2020-cpu```
Then you can access your jupyter in a browser at `localhost:<local_port>/?token=<token_you_see_in_container_logs>`, e.g. `localhost:8888/?token=ad1a5a0aab43efb47a9a805388fcf508d0b5f84a16e4542b&token=ad1a5a0aab43efb47a9a805388fcf508d0b5f84a16e4542b`
#### GPU
`docker run --rm -it -v /path/to/your/repo:/notebooks -p <local_port>:8888 --gpus all dmittov/practical_rl:spring2020-cuda-10.2`
## Manual
Build container
`docker build -t practical_rl --build-arg device=cpu .`
to build GPU version
`docker build -t practical_rl --build-arg device=gpu .`
Run it
`$ docker run --rm -it -v <local_dir>:/notebooks -p <local_port>:8888 practical_rl`
to run GPU version
`$ docker run --rm -it -v <local_dir>:/notebooks -p <local_port>:8888 --gpus all practical_rl`
examples:
```$ docker run --rm -it -v `pwd`:/notebooks -p 8888:8888 practical_rl```
Copy the token from console and run
http://localhost:8888/?token=<token>
================================================
FILE: docker/deeplearning.yaml
================================================
name: deeplearning
channels:
- defaults
dependencies:
- graphviz
- python-graphviz
- ipykernel
- keras
- numpy=1.16.6
- pip
- scipy
- {tensorflow}=1.13.1
- tqdm
- pyopengl-accelerate
- {pytorch}
- torchvision
- opencv
- pip:
- atari-py
- sklearn
- matplotlib
- seaborn
- scikit-image
- imageio
- pyglet
- psutil
- gym
- gym[box2d]
- gym[atari]
- requests
- editdistance
prefix: /opt/conda/envs/deeplearning
================================================
FILE: docker/run_jupyter.sh
================================================
#!/usr/bin/env bash
jupyter notebook --no-browser --ip 0.0.0.0
================================================
FILE: setup_colab.sh
================================================
#!/usr/bin/env bash
apt-get -qq update
apt-get -qq install -y xvfb
wget -q https://raw.githubusercontent.com/yandexdataschool/Practical_RL/master/xvfb -O ../xvfb
# Download & import Atari ROMs (Colab stopped bundling them around the beginning of June 2021)
gdown -q https://drive.google.com/uc?id=1c6_W2Fig92hm5FRIc2Mpc_ZZyr6o52lF
# Alternative download:
# wget -q http://www.atarimania.com/roms/Roms.rar
pip install -q unrar
mkdir ./roms
unrar x Roms.rar ./roms > /dev/null 2>&1
python -m atari_py.import_roms ./roms > /dev/null 2>&1
================================================
FILE: week01_intro/README.md
================================================
## Materials:
* [__Lecture slides__](https://yadi.sk/i/-EUHXUXOTC5t9Q)
* __Russian:__
* Intro to RL - [video](https://yadi.sk/i/HpRw6zYv3SPmFf)
* Seminar - [video](https://yadi.sk/i/gRTVCHfM3SPmHo)
* __English:__
* [__main__] Video-intro by David Silver (english) - [video](https://www.youtube.com/watch?v=2pWv7GOvuf0)
* [__main__] Lecture by J Schulman with crossentropy method explained (english) - [url](https://www.youtube.com/watch?v=aUrX-rP_ss4&list=PLCTc_C7itk-GaAMxmlChrkPnGKtjz8hv1)
* Optional lecture by David Silver (english) - [video](https://www.youtube.com/watch?v=lfHX2hHRMVQ)
## More materials:
* __[recommended]__ - awesome openai post about evolution strategies - [blog post](https://openai.com/research/evolution-strategies), [article](https://arxiv.org/abs/1703.03864)
* __[recommended]__ - formal explanation of crossentropy method in [general](https://people.smp.uq.edu.au/DirkKroese/ps/CEEncycl.pdf) and for [optimization](https://people.smp.uq.edu.au/DirkKroese/ps/CEopt.pdf)
* Deep learning course (if you want to learn in parallel) - https://github.com/yandexdataschool/HSE_deeplearning
* Video on genetic algorithms (english) - [video](https://www.youtube.com/watch?v=ejxfTy4lI6I)
* Another guide to genetic algorithm (english) - [video](https://www.youtube.com/watch?v=zwYV11a__HQ)
* About Differential evolution (english) - [pdf](http://jvanderw.une.edu.au/DE_1.pdf)
* Video on Ant Colony Algorithm (english) - [video](https://www.youtube.com/watch?v=D58nLNLkb0I)
* Longer video on Ant Colony Algorithm (english) - [video](https://www.youtube.com/watch?v=xpyKmjJuqhk)
* Longer video on corssentropy method (russian) - [video](https://yadi.sk/i/5yf_4oGI3EDJhJ)
## Practice assignment
Instant dive in: [__seminar_gymnasium_interface__](https://colab.research.google.com/github/yandexdataschool/Practical_RL/blob/master/week01_intro/seminar_gymnasium_interface.ipynb), [__crossentropy_method__](https://colab.research.google.com/github/yandexdataschool/Practical_RL/blob/master/week01_intro/crossentropy_method.ipynb),
[__deep_crossentropy_method__](https://colab.research.google.com/github/yandexdataschool/Practical_RL/blob/master/week01_intro/deep_crossentropy_method.ipynb)
* Open `seminar_gymnasium_interface.ipynb` and follow instructions from there
* After you're done there, proceed to `crossentropy_method.ipynb`
* You can find homework and bonus assignment descriptions at the end of that notebook.
* Note: so far it's enough to say `pip install gymnasium` on top of any data-science-stuffed python, but we'd appreciate if you gradually switch to [full installation](https://github.com/Farama-Foundation/Gymnasium).
================================================
FILE: week01_intro/crossentropy_method.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "7XGyc-FCG35I"
},
"source": [
"# Crossentropy method\n",
"\n",
"This notebook will teach you to solve reinforcement learning problems with crossentropy method. We'll follow-up by scaling everything up and using neural network policy."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "2jwz8moTG35K"
},
"outputs": [],
"source": [
"import sys, os\n",
"if 'google.colab' in sys.modules and not os.path.exists('.setup_complete'):\n",
" !wget -q https://raw.githubusercontent.com/yandexdataschool/Practical_RL/master/setup_colab.sh -O- | bash\n",
" !touch .setup_complete\n",
"\n",
"# This code creates a virtual display to draw game images on.\n",
"# It will have no effect if your machine has a monitor.\n",
"if type(os.environ.get(\"DISPLAY\")) is not str or len(os.environ.get(\"DISPLAY\")) == 0:\n",
" !bash ../xvfb start\n",
" os.environ['DISPLAY'] = ':1'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "oe7EKolvLC67"
},
"outputs": [],
"source": [
"!pip install \"gymnasium[toy_text]\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ltjzx5AFG35K"
},
"outputs": [],
"source": [
"import gymnasium as gym\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"env = gym.make(\"Taxi-v3\", render_mode=\"rgb_array\")\n",
"print(env.reset(seed=0))\n",
"plt.imshow(env.render())\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "O6waF01eG35L",
"outputId": "8ca46444-7a7f-4091-c50c-0cab96a995e9"
},
"outputs": [],
"source": [
"n_states = env.observation_space.n\n",
"n_actions = env.action_space.n\n",
"\n",
"print(f\"n_states={n_states}, n_actions={n_actions}\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IHXnU2QWG35L"
},
"source": [
"# Create stochastic policy\n",
"\n",
"This time our policy should be a probability distribution.\n",
"\n",
"```policy[s,a] = P(take action a | in state s)```\n",
"\n",
"Since we still use integer state and action representations, you can use a 2-dimensional array to represent the policy.\n",
"\n",
"Please initialize the policy __uniformly__, that is, probabililities of all actions should be equal."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"id": "9qL5eW-rG35L"
},
"outputs": [],
"source": [
"def initialize_policy(n_states, n_actions):\n",
" <YOUR CODE: create an array to store action probabilities>\n",
"\n",
" return policy\n",
"\n",
"\n",
"policy = initialize_policy(n_states, n_actions)\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"id": "G1SeRRGgG35L"
},
"outputs": [],
"source": [
"assert type(policy) in (np.ndarray, np.matrix)\n",
"assert np.allclose(policy, 1.0 / n_actions)\n",
"assert np.allclose(np.sum(policy, axis=1), 1)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9zR1fCUrG35L"
},
"source": [
"# Play the game\n",
"\n",
"Just like before, but we also record all states and actions we took."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"id": "d4v8WmvlG35L"
},
"outputs": [],
"source": [
"def generate_session(env, policy, t_max=10**4):\n",
" \"\"\"\n",
" Play game until end or for t_max ticks.\n",
" :param policy: an array of shape [n_states,n_actions] with action probabilities\n",
" :returns: list of states, list of actions and sum of rewards\n",
" \"\"\"\n",
" states, actions = [], []\n",
" total_reward = 0.0\n",
"\n",
" s, _ = env.reset()\n",
"\n",
" for t in range(t_max):\n",
" # Hint: you can use np.random.choice for sampling action\n",
" # https://numpy.org/doc/stable/reference/random/generated/numpy.random.choice.html\n",
"\n",
" a = <YOUR CODE: sample action from policy>\n",
"\n",
" new_s, r, terminated, truncated, _ = env.step(a)\n",
"\n",
" # Record information we just got from the environment.\n",
" states.append(s)\n",
" actions.append(a)\n",
" total_reward += r\n",
"\n",
" s = new_s\n",
" if terminated or truncated:\n",
" break\n",
"\n",
" return states, actions, total_reward\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"id": "a1EUUZ29G35M"
},
"outputs": [],
"source": [
"s, a, r = generate_session(env, policy)\n",
"assert type(s) == type(a) == list\n",
"assert len(s) == len(a)\n",
"assert type(r) in [float, np.float64]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "_5YEDTKnG35M"
},
"outputs": [],
"source": [
"# let's see the initial reward distribution\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"sample_rewards = [generate_session(env, policy, t_max=1000)[-1] for _ in range(200)]\n",
"\n",
"plt.hist(sample_rewards, bins=20)\n",
"plt.vlines([np.percentile(sample_rewards, 50)], [0], [100], label=\"50'th percentile\", color='green')\n",
"plt.vlines([np.percentile(sample_rewards, 90)], [0], [100], label=\"90'th percentile\", color='red')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EeWtL3F5G35M"
},
"source": [
"### Crossentropy method steps"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "00WWzr0KG35N"
},
"outputs": [],
"source": [
"def select_elites(states_batch, actions_batch, rewards_batch, percentile):\n",
" \"\"\"\n",
" Select states and actions from games that have rewards >= percentile\n",
" :param states_batch: list of lists of states, states_batch[session_i][t]\n",
" :param actions_batch: list of lists of actions, actions_batch[session_i][t]\n",
" :param rewards_batch: list of rewards, rewards_batch[session_i]\n",
"\n",
" :returns: elite_states,elite_actions, both 1D lists of states and respective actions from elite sessions\n",
"\n",
" Please return elite states and actions in their original order\n",
" [i.e. sorted by session number and timestep within session]\n",
"\n",
" If you are confused, see examples below. Please don't assume that states are integers\n",
" (they will become different later).\n",
" \"\"\"\n",
"\n",
" reward_threshold = <YOUR CODE: compute minimum reward for elite sessions. Hint: use np.percentile()>\n",
"\n",
" elite_states = <YOUR CODE>\n",
" elite_actions = <YOUR CODE>\n",
"\n",
" return elite_states, elite_actions\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "teOLBGojG35N"
},
"outputs": [],
"source": [
"states_batch = [\n",
" [1, 2, 3], # game1\n",
" [4, 2, 0, 2], # game2\n",
" [3, 1], # game3\n",
"]\n",
"\n",
"actions_batch = [\n",
" [0, 2, 4], # game1\n",
" [3, 2, 0, 1], # game2\n",
" [3, 3], # game3\n",
"]\n",
"rewards_batch = [\n",
" 3, # game1\n",
" 4, # game2\n",
" 5, # game3\n",
"]\n",
"\n",
"test_result_0 = select_elites(states_batch, actions_batch, rewards_batch, percentile=0)\n",
"test_result_30 = select_elites(\n",
" states_batch, actions_batch, rewards_batch, percentile=30\n",
")\n",
"test_result_90 = select_elites(\n",
" states_batch, actions_batch, rewards_batch, percentile=90\n",
")\n",
"test_result_100 = select_elites(\n",
" states_batch, actions_batch, rewards_batch, percentile=100\n",
")\n",
"\n",
"assert np.all(test_result_0[0] == [1, 2, 3, 4, 2, 0, 2, 3, 1]) and np.all(\n",
" test_result_0[1] == [0, 2, 4, 3, 2, 0, 1, 3, 3]\n",
"), \"For percentile 0 you should return all states and actions in chronological order\"\n",
"assert np.all(test_result_30[0] == [4, 2, 0, 2, 3, 1]) and np.all(\n",
" test_result_30[1] == [3, 2, 0, 1, 3, 3]\n",
"), \"For percentile 30 you should only select states/actions from two first\"\n",
"assert np.all(test_result_90[0] == [3, 1]) and np.all(\n",
" test_result_90[1] == [3, 3]\n",
"), \"For percentile 90 you should only select states/actions from one game\"\n",
"assert np.all(test_result_100[0] == [3, 1]) and np.all(\n",
" test_result_100[1] == [3, 3]\n",
"), \"Please make sure you use >=, not >. Also double-check how you compute percentile.\"\n",
"\n",
"print(\"Ok!\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "wYLBHFFwG35N"
},
"outputs": [],
"source": [
"def get_new_policy(elite_states, elite_actions):\n",
" \"\"\"\n",
" Given a list of elite states/actions from select_elites,\n",
" return a new policy where each action probability is proportional to\n",
"\n",
" policy[s_i,a_i] ~ #[occurrences of s_i and a_i in elite states/actions]\n",
"\n",
" Don't forget to normalize the policy to get valid probabilities and handle the 0/0 case.\n",
" For states that you never visited, use a uniform distribution (1/n_actions for all states).\n",
"\n",
" :param elite_states: 1D list of states from elite sessions\n",
" :param elite_actions: 1D list of actions from elite sessions\n",
"\n",
" \"\"\"\n",
"\n",
" new_policy = np.zeros([n_states, n_actions])\n",
"\n",
" <YOUR CODE: set probabilities for actions given elite states & actions>\n",
" # Don't forget to set 1/n_actions for all actions in unvisited states.\n",
"\n",
" return new_policy\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "I1VbNcpoG35O"
},
"outputs": [],
"source": [
"elite_states = [1, 2, 3, 4, 2, 0, 2, 3, 1]\n",
"elite_actions = [0, 2, 4, 3, 2, 0, 1, 3, 3]\n",
"\n",
"new_policy = get_new_policy(elite_states, elite_actions)\n",
"\n",
"assert np.isfinite(\n",
" new_policy\n",
").all(), \"Your new policy contains NaNs or +-inf. Make sure you don't divide by zero.\"\n",
"assert np.all(\n",
" new_policy >= 0\n",
"), \"Your new policy can't have negative action probabilities\"\n",
"assert np.allclose(\n",
" new_policy.sum(axis=-1), 1\n",
"), \"Your new policy should be a valid probability distribution over actions\"\n",
"\n",
"reference_answer = np.array(\n",
" [\n",
" [1.0, 0.0, 0.0, 0.0, 0.0],\n",
" [0.5, 0.0, 0.0, 0.5, 0.0],\n",
" [0.0, 0.33333333, 0.66666667, 0.0, 0.0],\n",
" [0.0, 0.0, 0.0, 0.5, 0.5],\n",
" ]\n",
")\n",
"assert np.allclose(new_policy[:4, :5], reference_answer)\n",
"\n",
"print(\"Ok!\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WVvZq1fSG35O"
},
"source": [
"# Training loop\n",
"Generate sessions, select N best and fit to those."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3CmH7Aj4G35O"
},
"outputs": [],
"source": [
"from IPython.display import clear_output\n",
"\n",
"\n",
"def show_progress(rewards_batch, log, percentile, reward_range=[-990, +10]):\n",
" \"\"\"\n",
" A convenience function that displays training progress.\n",
" No cool math here, just charts.\n",
" \"\"\"\n",
"\n",
" mean_reward = np.mean(rewards_batch)\n",
" threshold = np.percentile(rewards_batch, percentile)\n",
" log.append([mean_reward, threshold])\n",
"\n",
" plt.figure(figsize=[8, 4])\n",
" plt.subplot(1, 2, 1)\n",
" plt.plot(list(zip(*log))[0], label=\"Mean rewards\")\n",
" plt.plot(list(zip(*log))[1], label=\"Reward thresholds\")\n",
" plt.legend()\n",
" plt.grid()\n",
"\n",
" plt.subplot(1, 2, 2)\n",
" plt.hist(rewards_batch, range=reward_range)\n",
" plt.vlines(\n",
" [np.percentile(rewards_batch, percentile)],\n",
" [0],\n",
" [100],\n",
" label=\"percentile\",\n",
" color=\"red\",\n",
" )\n",
" plt.legend()\n",
" plt.grid()\n",
" clear_output(True)\n",
" print(\"mean reward = %.3f, threshold=%.3f\" % (mean_reward, threshold))\n",
" plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "tz0Yd964G35O"
},
"outputs": [],
"source": [
"# reset policy just in case\n",
"policy = initialize_policy(n_states, n_actions)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "-cNq5hndG35O"
},
"outputs": [],
"source": [
"n_sessions = 250 # sample this many sessions\n",
"percentile = 50 # discard this percentage of sessions with lowest rewards\n",
"learning_rate = 0.5 # how quickly the policy is updated, on a scale from 0 to 1\n",
"\n",
"log = []\n",
"\n",
"for i in range(100):\n",
" %time sessions = [ <YOUR CODE: generate a list of n_sessions new sessions> ]\n",
"\n",
" states_batch, actions_batch, rewards_batch = zip(*sessions)\n",
"\n",
" elite_states, elite_actions = <YOUR CODE: select elite states & actions>\n",
"\n",
" new_policy = <YOUR CODE: compute new policy>\n",
"\n",
" policy = learning_rate * new_policy + (1 - learning_rate) * policy\n",
"\n",
" # display results on chart\n",
" show_progress(rewards_batch, log, percentile)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "K5LIoVTuG35O"
},
"source": [
"### Reflecting on results\n",
"\n",
"You may have noticed that the taxi problem quickly converges from less than -1000 to a near-optimal score and then descends back into -50/-100. This is in part because the environment has some innate randomness. Namely, the starting points of passenger/driver change from episode to episode.\n",
"\n",
"In case CEM failed to learn how to win from one distinct starting point, it will simply discard it because no sessions from that starting point will make it into the \"elites\".\n",
"\n",
"To mitigate that problem, you can either reduce the threshold for elite sessions (duct tape way) or change the way you evaluate strategy (theoretically correct way). For each starting state, you can sample an action randomly, and then evaluate this action by running _several_ games starting from it and averaging the total reward. Choosing elite sessions with this kind of sampling (where each session's reward is counted as the average of the rewards of all sessions with the same starting state and action) should improve the performance of your policy."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ubIHBgQ-G35O"
},
"source": [
"\n",
"### You're not done yet!\n",
"\n",
"Go to [`./deep_crossentropy_method.ipynb`](./deep_crossentropy_method.ipynb) for a more serious task"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: week01_intro/deep_crossentropy_method.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "I_i1q1TWG9zH"
},
"source": [
"# Deep Crossentropy method\n",
"\n",
"In this section we'll extend your CEM implementation with neural networks! You will train a multi-layer neural network to solve simple continuous state space games. __Please make sure you're done with tabular crossentropy method from the previous notebook.__\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "t4CJ1sRyG9zJ"
},
"outputs": [],
"source": [
"import sys, os\n",
"if 'google.colab' in sys.modules and not os.path.exists('.setup_complete'):\n",
" !wget -q https://raw.githubusercontent.com/yandexdataschool/Practical_RL/master/setup_colab.sh -O- | bash\n",
" !touch .setup_complete\n",
"\n",
"# This code creates a virtual display to draw game images on.\n",
"# It will have no effect if your machine has a monitor.\n",
"if type(os.environ.get(\"DISPLAY\")) is not str or len(os.environ.get(\"DISPLAY\")) == 0:\n",
" !bash ../xvfb start\n",
" os.environ['DISPLAY'] = ':1'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "C2xd5vPwPVCb"
},
"outputs": [],
"source": [
"# Install gymnasium if you didn't\n",
"!pip install \"gymnasium[toy_text,classic_control]\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "_2zbc7ahG9zK"
},
"outputs": [],
"source": [
"import gymnasium as gym\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"# if you see \"<classname> has no attribute .env\", remove .env or update gym\n",
"env = gym.make(\"CartPole-v0\", render_mode=\"rgb_array\").env\n",
"\n",
"env.reset()\n",
"n_actions = env.action_space.n\n",
"state_dim = env.observation_space.shape[0]\n",
"\n",
"plt.imshow(env.render())\n",
"print(\"state vector dim =\", state_dim)\n",
"print(\"n_actions =\", n_actions)\n",
"\n",
"env.close()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z72_alhdG9zK"
},
"source": [
"# Neural Network Policy\n",
"\n",
"For this assignment we'll utilize the simplified neural network implementation from __[Scikit-learn](https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html)__. Here's what you'll need:\n",
"\n",
"* `agent.partial_fit(states, actions)` - make a single training pass over the data. Maximize the probability of :actions: from :states:\n",
"* `agent.predict_proba(states)` - predict probabilities of all actions, a matrix of shape __[len(states), n_actions]__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "wLItY4unG9zL"
},
"outputs": [],
"source": [
"from sklearn.neural_network import MLPClassifier\n",
"\n",
"agent = MLPClassifier(\n",
" hidden_layer_sizes=(20, 20),\n",
" activation=\"tanh\",\n",
")\n",
"\n",
"# initialize agent to the dimension of state space and number of actions\n",
"agent.partial_fit([env.reset()[0]] * n_actions, range(n_actions), classes=range(n_actions))"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"id": "eyFS3oUmG9zL"
},
"outputs": [],
"source": [
"def generate_session(env, agent, t_max=1000):\n",
" \"\"\"\n",
" Play a single game using agent neural network.\n",
" Terminate when game finishes or after :t_max: steps\n",
" \"\"\"\n",
" states, actions = [], []\n",
" total_reward = 0\n",
"\n",
" s, _ = env.reset()\n",
"\n",
" for t in range(t_max):\n",
"\n",
" # use agent to predict a vector of action probabilities for state :s:\n",
" probs = <YOUR CODE>\n",
"\n",
" assert probs.shape == (env.action_space.n,), \"make sure probabilities are a vector (hint: np.reshape)\"\n",
"\n",
" # use the probabilities you predicted to pick an action\n",
" # sample proportionally to the probabilities, don't just take the most likely action\n",
" a = <YOUR CODE>\n",
" # ^-- hint: try np.random.choice\n",
"\n",
" new_s, r, terminated, truncated, _ = env.step(a)\n",
"\n",
" # record sessions like you did before\n",
" states.append(s)\n",
" actions.append(a)\n",
" total_reward += r\n",
"\n",
" s = new_s\n",
" if terminated or truncated:\n",
" break\n",
" return states, actions, total_reward\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "4xgrTCgJG9zL"
},
"outputs": [],
"source": [
"dummy_states, dummy_actions, dummy_reward = generate_session(env, agent, t_max=5)\n",
"print(\"states:\", np.stack(dummy_states))\n",
"print(\"actions:\", dummy_actions)\n",
"print(\"reward:\", dummy_reward)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "p85lt16qG9zL"
},
"source": [
"### CEM steps\n",
"Deep CEM uses exactly the same strategy as the regular CEM, so you can copy your function code from previous notebook.\n",
"\n",
"The only difference is that now each observation is not a number but a `float32` vector."
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"id": "4On-p7p4G9zL"
},
"outputs": [],
"source": [
"def select_elites(states_batch, actions_batch, rewards_batch, percentile=50):\n",
" \"\"\"\n",
" Select states and actions from games that have rewards >= percentile\n",
" :param states_batch: list of lists of states, states_batch[session_i][t]\n",
" :param actions_batch: list of lists of actions, actions_batch[session_i][t]\n",
" :param rewards_batch: list of rewards, rewards_batch[session_i]\n",
"\n",
" :returns: elite_states,elite_actions, both 1D lists of states and respective actions from elite sessions\n",
"\n",
" Please return elite states and actions in their original order\n",
" [i.e. sorted by session number and timestep within session]\n",
"\n",
" If you are confused, see examples below. Please don't assume that states are integers\n",
" (they will become different later).\n",
" \"\"\"\n",
"\n",
" <YOUR CODE: copy-paste your implementation from the previous notebook>\n",
"\n",
" return elite_states, elite_actions\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xc40V4DaG9zM"
},
"source": [
"# Training loop\n",
"Generate sessions, select N best and fit to those."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"id": "PPwVKwF7G9zM"
},
"outputs": [],
"source": [
"from IPython.display import clear_output\n",
"\n",
"\n",
"def show_progress(rewards_batch, log, percentile, reward_range=[-990, +10]):\n",
" \"\"\"\n",
" A convenience function that displays training progress.\n",
" No cool math here, just charts.\n",
" \"\"\"\n",
"\n",
" mean_reward = np.mean(rewards_batch)\n",
" threshold = np.percentile(rewards_batch, percentile)\n",
" log.append([mean_reward, threshold])\n",
"\n",
" clear_output(True)\n",
" print(\"mean reward = %.3f, threshold=%.3f\" % (mean_reward, threshold))\n",
" plt.figure(figsize=[8, 4])\n",
" plt.subplot(1, 2, 1)\n",
" plt.plot(list(zip(*log))[0], label=\"Mean rewards\")\n",
" plt.plot(list(zip(*log))[1], label=\"Reward thresholds\")\n",
" plt.legend()\n",
" plt.grid()\n",
"\n",
" plt.subplot(1, 2, 2)\n",
" plt.hist(rewards_batch, range=reward_range)\n",
" plt.vlines(\n",
" [np.percentile(rewards_batch, percentile)],\n",
" [0],\n",
" [100],\n",
" label=\"percentile\",\n",
" color=\"red\",\n",
" )\n",
" plt.legend()\n",
" plt.grid()\n",
"\n",
" plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "euK7WRQiG9zM"
},
"outputs": [],
"source": [
"n_sessions = 100\n",
"percentile = 70\n",
"log = []\n",
"\n",
"for i in range(100):\n",
" # generate new sessions\n",
" sessions = [ <YOUR CODE: generate a list of n_sessions new sessions> ]\n",
"\n",
" states_batch, actions_batch, rewards_batch = map(np.array, zip(*sessions))\n",
"\n",
" elite_states, elite_actions = <YOUR CODE: select elite actions just like before>\n",
"\n",
" <YOUR CODE: partial_fit agent to predict elite_actions(y) from elite_states(X)>\n",
"\n",
" show_progress(\n",
" rewards_batch, log, percentile, reward_range=[0, np.max(rewards_batch)]\n",
" )\n",
"\n",
" if np.mean(rewards_batch) > 190:\n",
" print(\"You Win! You may stop training now via KeyboardInterrupt.\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yeNWKjtsG9zM"
},
"source": [
"# Results"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "RJwsWl4kG9zM"
},
"outputs": [],
"source": [
"# Record sessions\n",
"\n",
"from gymnasium.wrappers import RecordVideo\n",
"\n",
"with RecordVideo(\n",
" env=gym.make(\"CartPole-v0\", render_mode=\"rgb_array\"),\n",
" video_folder=\"./videos\",\n",
" episode_trigger=lambda episode_number: True,\n",
") as env_monitor:\n",
" sessions = [generate_session(env_monitor, agent) for _ in range(100)]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "kLPXdME7G9zN"
},
"outputs": [],
"source": [
"# Show video. This may not work in some setups. If it doesn't\n",
"# work for you, you can download the videos and view them locally.\n",
"\n",
"from pathlib import Path\n",
"from base64 import b64encode\n",
"from IPython.display import HTML\n",
"\n",
"video_paths = sorted([s for s in Path(\"videos\").iterdir() if s.suffix == \".mp4\"])\n",
"video_path = video_paths[-1] # You can also try other indices\n",
"\n",
"if \"google.colab\" in sys.modules:\n",
" # https://stackoverflow.com/a/57378660/1214547\n",
" with video_path.open(\"rb\") as fp:\n",
" mp4 = fp.read()\n",
" data_url = \"data:video/mp4;base64,\" + b64encode(mp4).decode()\n",
"else:\n",
" data_url = str(video_path)\n",
"\n",
"HTML(\n",
" \"\"\"\n",
"<video width=\"640\" height=\"480\" controls>\n",
" <source src=\"{}\" type=\"video/mp4\">\n",
"</video>\n",
"\"\"\".format(\n",
" data_url\n",
" )\n",
")\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6d_3oOQ1G9zN"
},
"source": [
"# Homework part I\n",
"\n",
"### Tabular crossentropy method\n",
"\n",
"You may have noticed that the taxi problem quickly converges from -100 to a near-optimal score and then descends back into -50/-100. This is in part because the environment has some innate randomness. Namely, the starting points of passenger/driver change from episode to episode.\n",
"\n",
"### Tasks\n",
"- __1.1__ (2 pts) Find out how the algorithm performance changes if you use a different `percentile` and/or `n_sessions`. Provide here some figures so we can see how the hyperparameters influence the performance.\n",
"- __1.2__ (1 pts) Tune the algorithm to end up with positive average score.\n",
"\n",
"It's okay to modify the existing code.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "L88LySiVG9zN"
},
"source": [
"```<Describe what you did here>```"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7LpAJc4rG9zN"
},
"source": [
"# Homework part II\n",
"\n",
"### Deep crossentropy method\n",
"\n",
"By this moment, you should have got enough score on [CartPole-v0](https://gymnasium.farama.org/environments/classic_control/cart_pole/) to consider it solved (see the link). It's time to try something harder.\n",
"\n",
"* if you have any trouble with CartPole-v0 and feel stuck, feel free to ask us or your peers for help.\n",
"\n",
"### Tasks\n",
"\n",
"* __2.1__ (3 pts) Pick one of environments: `MountainCar-v0` or `LunarLander-v2`.\n",
" * For MountainCar, get average reward of __at least -150__\n",
" * For LunarLander, get average reward of __at least +50__\n",
"\n",
"See the tips section below, it's kinda important.\n",
"__Note:__ If your agent is below the target score, you'll still get some of the points depending on the result, so don't be afraid to submit it.\n",
" \n",
" \n",
"* __2.2__ (up to 6 pts) Devise a way to speed up training against the default version\n",
" * Obvious improvement: use [`joblib`](https://joblib.readthedocs.io/en/latest/). However, note that you will probably need to spawn a new environment in each of the workers instead of passing it via pickling. (2 pts)\n",
" * Try re-using samples from 3-5 last iterations when computing threshold and training. (2 pts)\n",
" * Obtain __-100__ at `MountainCar-v0` or __+200__ at `LunarLander-v2` (2 pts). Feel free to experiment with hyperparameters, architectures, schedules etc.\n",
" \n",
"__Please list what you did in Anytask submission form__. This reduces probability that somebody misses something.\n",
" \n",
" \n",
"### Tips\n",
"* Gymnasium pages: [MountainCar](https://gymnasium.farama.org/environments/classic_control/mountain_car/), [LunarLander](https://gymnasium.farama.org/environments/box2d/lunar_lander/)\n",
"* Sessions for MountainCar may last for 10k+ ticks. Make sure ```t_max``` param is at least 10k.\n",
" * Also it may be a good idea to cut rewards via \">\" and not \">=\". If 90% of your sessions get reward of -10k and 10% are better, than if you use percentile 20% as threshold, R >= threshold __fails to cut off bad sessions__ while R > threshold works alright.\n",
"* _issue with gym_: Some versions of gym limit game time by 200 ticks. This will prevent cem training in most cases. Make sure your agent is able to play for the specified __t_max__, and if it isn't, try `env = gym.make(\"MountainCar-v0\").env` or otherwise get rid of TimeLimit wrapper.\n",
"* If you use old _swig_ lib for LunarLander-v2, you may get an error. See this [issue](https://github.com/openai/gym/issues/100) for solution.\n",
"* If it doesn't train, it's a good idea to plot reward distribution and record sessions: they may give you some clue. If they don't, call course staff :)\n",
"* 20-neuron network is probably not enough, feel free to experiment.\n",
"\n",
"You may find the following snippet useful:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "qcjz-nm_G9zN"
},
"outputs": [],
"source": [
"def visualize_mountain_car(env, agent):\n",
" # Compute policy for all possible x and v (with discretization)\n",
" xs = np.linspace(env.min_position, env.max_position, 100)\n",
" vs = np.linspace(-env.max_speed, env.max_speed, 100)\n",
"\n",
" grid = np.dstack(np.meshgrid(xs, vs[::-1])).transpose(1, 0, 2)\n",
" grid_flat = grid.reshape(len(xs) * len(vs), 2)\n",
" probs = (\n",
" agent.predict_proba(grid_flat).reshape(len(xs), len(vs), 3).transpose(1, 0, 2)\n",
" )\n",
"\n",
" # # The above code is equivalent to the following:\n",
" # probs = np.empty((len(vs), len(xs), 3))\n",
" # for i, v in enumerate(vs[::-1]):\n",
" # for j, x in enumerate(xs):\n",
" # probs[i, j, :] = agent.predict_proba([[x, v]])[0]\n",
"\n",
" # Draw policy\n",
" f, ax = plt.subplots(figsize=(7, 7))\n",
" ax.imshow(\n",
" probs,\n",
" extent=(env.min_position, env.max_position, -env.max_speed, env.max_speed),\n",
" aspect=\"auto\",\n",
" )\n",
" ax.set_title(\"Learned policy: red=left, green=nothing, blue=right\")\n",
" ax.set_xlabel(\"position (x)\")\n",
" ax.set_ylabel(\"velocity (v)\")\n",
"\n",
" # Sample a trajectory and draw it\n",
" states, actions, _ = generate_session(env, agent)\n",
" states = np.array(states)\n",
" ax.plot(states[:, 0], states[:, 1], color=\"white\")\n",
"\n",
" # Draw every 3rd action from the trajectory\n",
" for (x, v), a in zip(states[::3], actions[::3]):\n",
" if a == 0:\n",
" plt.arrow(x, v, -0.1, 0, color=\"white\", head_length=0.02)\n",
" elif a == 2:\n",
" plt.arrow(x, v, 0.1, 0, color=\"white\", head_length=0.02)\n",
"\n",
"\n",
"with gym.make(\"MountainCar-v0\", render_mode=\"rgb_arrary\").env as env:\n",
" visualize_mountain_car(env, agent)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Dzk41lDPG9zO"
},
"source": [
"### Bonus tasks\n",
"\n",
"* __2.3 bonus__ (2 pts) Try to find a network architecture and training params that solve __both__ environments above (_Points depend on implementation. If you attempted this task, please mention it in Anytask submission._)\n",
"\n",
"* __2.4 bonus__ (4 pts) Solve continuous action space task with `MLPRegressor` or similar.\n",
" * Since your agent only predicts the \"expected\" action, you will have to add noise to ensure exploration.\n",
" * Choose one of [MountainCarContinuous-v0](https://gymnasium.farama.org/environments/classic_control/mountain_car_continuous/) (90+ pts to solve), [LunarLanderContinuous-v2](https://gymnasium.farama.org/environments/box2d/lunar_lander/) (`env = gym.make(\"LunarLander-v2\", continuous=True)`)(200+ pts to solve)\n",
" * 4 points for solving. Slightly less for getting some results below solution threshold. Note that discrete and continuous environments may have slightly different rules, aside from action spaces."
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: week01_intro/pong.py
================================================
"""Auxilary files for those who wanted to solve breakout with CEM or policy gradient"""
import numpy as np
import gym
from scipy.misc import imresize
from gym.core import Wrapper
from gym.spaces.box import Box
def make_pong():
"""creates breakout env with all preprocessing done for you"""
return PreprocessAtari(gym.make("PongDeterministic-v0"))
class PreprocessAtari(Wrapper):
def __init__(self, env, height=42, width=42,
crop=lambda img: img[34:34 + 160], n_frames=4):
"""A gym wrapper that reshapes, crops and scales image into the desired shapes"""
super(PreprocessAtari, self).__init__(env)
self.img_size = (height, width)
self.crop = crop
self.observation_space = Box(0.0, 1.0, [n_frames, height, width])
self.framebuffer = np.zeros([n_frames, height, width])
def reset(self):
"""resets breakout, returns initial frames"""
self.framebuffer = np.zeros_like(self.framebuffer)
self.update_buffer(self.env.reset())
return self.framebuffer
def step(self, action):
"""plays breakout for 1 step, returns 4-frame buffer"""
new_img, r, done, info = self.env.step(action)
self.update_buffer(new_img)
return self.framebuffer, r, done, info
###image processing###
def update_buffer(self, img):
img = self.preproc_image(img)
self.framebuffer = np.vstack([img[None], self.framebuffer[:-1]])
def preproc_image(self, img):
"""what happens to the observation"""
img = self.crop(img)
img = imresize(img, self.img_size).mean(-1)
img = img.astype('float32') / 255.
return img
================================================
FILE: week01_intro/primer_python_for_ml/recap_ml.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<center>\n",
"A crash course in\n",
"<br><br>\n",
"<b><font size=44px>Surviving Titanic</font></b>\n",
"<br><br>\n",
"(with numpy and matplotlib)\n",
"</center>\n",
"\n",
"---\n",
"\n",
"This notebook is going to teach you to use the basic data science stack for Python: Jupyter, Numpy, matplotlib, and sklearn."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Part I: Jupyter notebooks in a nutshell\n",
"* You are reading this line in a jupyter notebook.\n",
"* A notebook consists of cells. A cell can contain either code or hypertext. \n",
" * This cell contains hypertext. The next cell contains code.\n",
"* You can __run a cell__ with code by selecting it (click) and pressing `Ctrl + Enter` to execute the code and display output(if any).\n",
"* If you're running this on a device with no keyboard, ~~you are doing it wrong~~ use the top bar (esp. play/stop/restart buttons) to run code.\n",
"* Behind the curtains, there's a Python interpreter that runs that code and remembers anything you defined.\n",
"\n",
"Run these cells to get started"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a = 5"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n"
]
}
],
"source": [
"print(a * 2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* `Ctrl + S` to save changes (or use the button that looks like a floppy disk)\n",
"* Top menu → Kernel → Interrupt (or Stop button) if you want it to stop running cell midway.\n",
"* Top menu → Kernel → Restart (or cyclic arrow button) if interrupt doesn't fix the problem (you will lose all variables).\n",
"* For shortcut junkies like us: Top menu → Help → Keyboard Shortcuts\n",
"\n",
"\n",
"* More: [Hacker's guide](http://arogozhnikov.github.io/2016/09/10/jupyter-features.html), [Beginner's guide](https://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/), [Datacamp tutorial](https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook)\n",
"\n",
"Now __the most important feature__ of jupyter notebooks for this course: \n",
"* if you're typing something, press `Tab` to see automatic suggestions, use arrow keys + enter to pick one.\n",
"* if you move your cursor inside some function and press `Shift + Tab`, you'll get a help window. `Shift + (Tab , Tab)` (press `Tab` twice) will expand it."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# run this first\n",
"import math"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# place your cursor at the end of the unfinished line below to find a function\n",
"# that computes arctangent from two parameters (should have 2 in it's name)\n",
"# once you chose it, press shift + tab + tab(again) to see the docs\n",
"\n",
"math.a # <---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Part II: Loading data with Pandas\n",
"Pandas is a library that helps you load the data, prepare it and perform some lightweight analysis. The god object here is the `pandas.DataFrame` - a 2D table with batteries included. \n",
"\n",
"In the cells below we use it to read the data on the infamous titanic shipwreck.\n",
"\n",
"__please keep running all the code cells as you read__"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# If you are running in Google Colab, this cell will download the dataset from our repository.\n",
"# Otherwise, this cell will do nothing.\n",
"\n",
"import sys\n",
"if 'google.colab' in sys.modules:\n",
" !wget -q https://raw.githubusercontent.com/yandexdataschool/Practical_RL/master/week01_intro/primer_python_for_ml/train.csv"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"# this yields a pandas.DataFrame\n",
"data = pd.read_csv(\"train.csv\", index_col='PassengerId')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Name</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>SibSp</th>\n",
" <th>Parch</th>\n",
" <th>Ticket</th>\n",
" <th>Fare</th>\n",
" <th>Cabin</th>\n",
" <th>Embarked</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Braund, Mr. Owen Harris</td>\n",
" <td>male</td>\n",
" <td>22.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>A/5 21171</td>\n",
" <td>7.2500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
" <td>female</td>\n",
" <td>38.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>PC 17599</td>\n",
" <td>71.2833</td>\n",
" <td>C85</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Heikkinen, Miss. Laina</td>\n",
" <td>female</td>\n",
" <td>26.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>STON/O2. 3101282</td>\n",
" <td>7.9250</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
" <td>female</td>\n",
" <td>35.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>113803</td>\n",
" <td>53.1000</td>\n",
" <td>C123</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Allen, Mr. William Henry</td>\n",
" <td>male</td>\n",
" <td>35.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>373450</td>\n",
" <td>8.0500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Moran, Mr. James</td>\n",
" <td>male</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>330877</td>\n",
" <td>8.4583</td>\n",
" <td>NaN</td>\n",
" <td>Q</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>McCarthy, Mr. Timothy J</td>\n",
" <td>male</td>\n",
" <td>54.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>17463</td>\n",
" <td>51.8625</td>\n",
" <td>E46</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Palsson, Master. Gosta Leonard</td>\n",
" <td>male</td>\n",
" <td>2.0</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>349909</td>\n",
" <td>21.0750</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)</td>\n",
" <td>female</td>\n",
" <td>27.0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>347742</td>\n",
" <td>11.1333</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Nasser, Mrs. Nicholas (Adele Achem)</td>\n",
" <td>female</td>\n",
" <td>14.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>237736</td>\n",
" <td>30.0708</td>\n",
" <td>NaN</td>\n",
" <td>C</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Survived Pclass \\\n",
"PassengerId \n",
"1 0 3 \n",
"2 1 1 \n",
"3 1 3 \n",
"4 1 1 \n",
"5 0 3 \n",
"6 0 3 \n",
"7 0 1 \n",
"8 0 3 \n",
"9 1 3 \n",
"10 1 2 \n",
"\n",
" Name Sex Age \\\n",
"PassengerId \n",
"1 Braund, Mr. Owen Harris male 22.0 \n",
"2 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 \n",
"3 Heikkinen, Miss. Laina female 26.0 \n",
"4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 \n",
"5 Allen, Mr. William Henry male 35.0 \n",
"6 Moran, Mr. James male NaN \n",
"7 McCarthy, Mr. Timothy J male 54.0 \n",
"8 Palsson, Master. Gosta Leonard male 2.0 \n",
"9 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.0 \n",
"10 Nasser, Mrs. Nicholas (Adele Achem) female 14.0 \n",
"\n",
" SibSp Parch Ticket Fare Cabin Embarked \n",
"PassengerId \n",
"1 1 0 A/5 21171 7.2500 NaN S \n",
"2 1 0 PC 17599 71.2833 C85 C \n",
"3 0 0 STON/O2. 3101282 7.9250 NaN S \n",
"4 1 0 113803 53.1000 C123 S \n",
"5 0 0 373450 8.0500 NaN S \n",
"6 0 0 330877 8.4583 NaN Q \n",
"7 0 0 17463 51.8625 E46 S \n",
"8 3 1 349909 21.0750 NaN S \n",
"9 0 2 347742 11.1333 NaN S \n",
"10 1 0 237736 30.0708 NaN C "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Selecting rows\n",
"head = data[:10]\n",
"\n",
"head # if you leave an expression at the end of a cell, jupyter will \"display\" it automatically"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### About the data\n",
"Here's some of the columns\n",
"* Name - a string with person's full name\n",
"* Survived - 1 if a person survived the shipwreck, 0 otherwise.\n",
"* Pclass - passenger class. Pclass == 3 is cheap'n'cheerful, Pclass == 1 is for moneybags.\n",
"* Sex - a person's gender (in those good ol' times when there were just 2 of them)\n",
"* Age - age in years, if available\n",
"* Sibsp - number of siblings on a ship\n",
"* Parch - number of parents on a ship\n",
"* Fare - ticket cost\n",
"* Embarked - port where the passenger embarked\n",
" * C = Cherbourg; Q = Queenstown; S = Southampton"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"len(data) = 891\n",
"data.shape = (891, 11)\n"
]
}
],
"source": [
"# table dimensions\n",
"print(\"len(data) =\", len(data))\n",
"print(\"data.shape =\", data.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Survived 1\n",
"Pclass 1\n",
"Name Futrelle, Mrs. Jacques Heath (Lily May Peel)\n",
"Sex female\n",
"Age 35\n",
"SibSp 1\n",
"Parch 0\n",
"Ticket 113803\n",
"Fare 53.1\n",
"Cabin C123\n",
"Embarked S\n",
"Name: 4, dtype: object\n"
]
}
],
"source": [
"# select a single row by PassengerId (using .loc)\n",
"print(data.loc[4])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Survived 1\n",
"Pclass 1\n",
"Name Futrelle, Mrs. Jacques Heath (Lily May Peel)\n",
"Sex female\n",
"Age 35\n",
"SibSp 1\n",
"Parch 0\n",
"Ticket 113803\n",
"Fare 53.1\n",
"Cabin C123\n",
"Embarked S\n",
"Name: 4, dtype: object\n"
]
}
],
"source": [
"# select a single row by index (using .iloc)\n",
"print(data.iloc[3])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"PassengerId\n",
"1 22.0\n",
"2 38.0\n",
"3 26.0\n",
"4 35.0\n",
"5 35.0\n",
"6 NaN\n",
"7 54.0\n",
"8 2.0\n",
"9 27.0\n",
"10 14.0\n",
"Name: Age, dtype: float64\n"
]
}
],
"source": [
"# select a single column.\n",
"ages = data[\"Age\"]\n",
"print(ages[:10]) # alternatively: data.Age"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Fare</th>\n",
" <th>Pclass</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>8.0500</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>8.4583</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>51.8625</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>21.0750</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>11.1333</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>30.0708</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Fare Pclass\n",
"PassengerId \n",
"5 8.0500 3\n",
"6 8.4583 3\n",
"7 51.8625 1\n",
"8 21.0750 3\n",
"9 11.1333 3\n",
"10 30.0708 2"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# select several columns and rows at once\n",
"# alternatively: data[[\"Fare\",\"Pclass\"]].loc[5:10]\n",
"data.loc[5:10, (\"Fare\", \"Pclass\")]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Your turn:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Select passengers number 13 and 666 (with these PassengerId values). Did they survive?\n",
"\n",
"<YOUR CODE>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Compute the overall survival rate: what fraction of passengers survived the shipwreck?\n",
"\n",
"<YOUR CODE>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pandas also has some basic data analysis tools. For one, you can quickly display statistical aggregates for each column using `.describe()`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some columns contain __NaN__ values - this means that there is no data there. For example, passenger `#6` has unknown age. To simplify the future data analysis, we'll replace NaN values by using pandas `fillna` function.\n",
"\n",
"_Note: we do this so easily because it's a tutorial. In general, you think twice before you modify data like this._"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.loc[6]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data['Age'] = data['Age'].fillna(value=data['Age'].mean())\n",
"data['Fare'] = data['Fare'].fillna(value=data['Fare'].mean())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.loc[6]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"More pandas: \n",
"* A neat [tutorial](http://pandas.pydata.org/) from pydata\n",
"* Official [tutorials](https://pandas.pydata.org/pandas-docs/stable/tutorials.html), including this [10 minutes to pandas](https://pandas.pydata.org/pandas-docs/stable/10min.html#min)\n",
"* Bunch of cheat sheets awaits just one google query away from you (e.g. [basics](http://blog.yhat.com/static/img/datacamp-cheat.png), [combining datasets](https://pbs.twimg.com/media/C65MaMpVwAA3v0A.jpg) and so on). "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Part III: Numpy and vectorized computing\n",
"\n",
"Almost any machine learning model requires some computational heavy lifting usually involving linear algebra problems. Unfortunately, raw Python is terrible at this because each operation is interpreted at runtime. \n",
"\n",
"So instead, we'll use `numpy` - a library that lets you run blazing fast computation with vectors, matrices and other tensors. Again, the god object here is `numpy.ndarray`:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a = [1 2 3 4 5]\n",
"b = [5 4 3 2 1]\n",
"a + 1 = [2 3 4 5 6]\n",
"a * 2 = [ 2 4 6 8 10]\n",
"a == 2 [False True False False False]\n",
"a + b = [6 6 6 6 6]\n",
"a * b = [5 8 9 8 5]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 4, 5])\n",
"b = np.array([5, 4, 3, 2, 1])\n",
"\n",
"print(\"a =\", a)\n",
"print(\"b =\", b)\n",
"\n",
"# math and boolean operations can applied to each element of an array\n",
"print(\"a + 1 =\", a + 1)\n",
"print(\"a * 2 =\", a * 2)\n",
"print(\"a == 2\", a == 2)\n",
"# ... or corresponding elements of two (or more) arrays\n",
"print(\"a + b =\", a + b)\n",
"print(\"a * b =\", a * b)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Your turn: compute half-products of a and b elements (i.e. ½ of the products of corresponding elements)\n",
"<YOUR CODE>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# compute elementwise quotient between squared a and (b plus 1)\n",
"<YOUR CODE>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"\n",
"### How fast is it, Harry?\n",
"\n",
"\n",
"Let's compare computation time for Python and Numpy\n",
"* Two arrays of $10^6$ elements\n",
" * first one: from 0 to 1 000 000\n",
" * second one: from 99 to 1 000 099\n",
" \n",
"* Computing:\n",
" * elementwise sum\n",
" * elementwise product\n",
" * square root of first array\n",
" * sum of all elements in the first array\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"# ^-- this \"magic\" measures and prints cell computation time\n",
"\n",
"# Option I: pure Python\n",
"arr_1 = range(1000000)\n",
"arr_2 = range(99, 1000099)\n",
"\n",
"\n",
"a_sum = []\n",
"a_prod = []\n",
"sqrt_a1 = []\n",
"for i in range(len(arr_1)):\n",
" a_sum.append(arr_1[i]+arr_2[i])\n",
" a_prod.append(arr_1[i]*arr_2[i])\n",
" a_sum.append(arr_1[i]**0.5)\n",
"\n",
"arr_1_sum = sum(arr_1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"\n",
"# Option II: start from Python, convert to numpy\n",
"arr_1 = range(1000000)\n",
"arr_2 = range(99, 1000099)\n",
"\n",
"arr_1, arr_2 = np.array(arr_1), np.array(arr_2)\n",
"\n",
"\n",
"a_sum = arr_1 + arr_2\n",
"a_prod = arr_1 * arr_2\n",
"sqrt_a1 = arr_1 ** .5\n",
"arr_1_sum = arr_1.sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"\n",
"# Option III: pure numpy\n",
"arr_1 = np.arange(1000000)\n",
"arr_2 = np.arange(99, 1000099)\n",
"\n",
"a_sum = arr_1 + arr_2\n",
"a_prod = arr_1 * arr_2\n",
"sqrt_a1 = arr_1 ** .5\n",
"arr_1_sum = arr_1.sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you want more serious benchmarks, take a look at [this](http://brilliantlywrong.blogspot.ru/2015/01/benchmarks-of-speed-numpy-vs-all.html)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"\n",
"There's also a bunch of pre-implemented operations including logarithms, trigonometry, vector/matrix products and aggregations."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"numpy.sum(a) = 15\n",
"numpy.mean(a) = 3.0\n",
"numpy.min(a) = 1\n",
"numpy.argmin(b) = 4\n",
"numpy.dot(a,b) = 35\n",
"numpy.unique(['male','male','female','female','male']) = ['female' 'male']\n"
]
}
],
"source": [
"a = np.array([1, 2, 3, 4, 5])\n",
"b = np.array([5, 4, 3, 2, 1])\n",
"print(\"numpy.sum(a) =\", np.sum(a))\n",
"print(\"numpy.mean(a) =\", np.mean(a))\n",
"print(\"numpy.min(a) =\", np.min(a))\n",
"print(\"numpy.argmin(b) =\", np.argmin(b)) # index of minimal element\n",
"# dot product. Also used for matrix/tensor multiplication\n",
"print(\"numpy.dot(a,b) =\", np.dot(a, b))\n",
"print(\n",
" \"numpy.unique(['male','male','female','female','male']) =\",\n",
" np.unique(['male', 'male', 'female', 'female', 'male']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is a lot more stuff. Check out a Numpy cheat sheet [here](https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Numpy_Python_Cheat_Sheet.pdf).\n",
"\n",
"The important part: all this functionality works with dataframes:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Max ticket price: 512.3292\n",
"\n",
"The guy who paid the most:\n",
" Survived 1\n",
"Pclass 1\n",
"Name Ward, Miss. Anna\n",
"Sex female\n",
"Age 35\n",
"SibSp 0\n",
"Parch 0\n",
"Ticket PC 17755\n",
"Fare 512.329\n",
"Cabin NaN\n",
"Embarked C\n",
"Name: 259, dtype: object\n"
]
}
],
"source": [
"print(\"Max ticket price: \", np.max(data[\"Fare\"]))\n",
"print(\"\\nThe guy who paid the most:\\n\", data.iloc[np.argmax(data[\"Fare\"])])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# your code: compute mean passenger age and the oldest guy on the ship\n",
"<YOUR CODE>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Boolean operations\n",
"a = [1 2 3 4 5]\n",
"b = [5 4 3 2 1]\n",
"a > 2 [False False True True True]\n",
"numpy.logical_not(a>2) = [ True True False False False]\n",
"numpy.logical_and(a>2,b>2) = [False False True False False]\n",
"numpy.logical_or(a>4,b<3) = [False False True True True]\n",
"\n",
" shortcuts\n",
"~(a > 2) = [ True True False False False]\n",
"(a > 2) & (b > 2) = [False False True False False]\n",
"(a > 2) | (b < 3) = [False False True True True]\n"
]
}
],
"source": [
"print(\"Boolean operations\")\n",
"\n",
"print('a =', a)\n",
"print('b =', b)\n",
"print(\"a > 2\", a > 2)\n",
"print(\"numpy.logical_not(a>2) =\", np.logical_not(a > 2))\n",
"print(\"numpy.logical_and(a>2,b>2) =\", np.logical_and(a > 2, b > 2))\n",
"print(\"numpy.logical_or(a>4,b<3) =\", np.logical_or(a > 2, b < 3))\n",
"\n",
"print()\n",
"\n",
"print(\"shortcuts\")\n",
"print(\"~(a > 2) =\", ~(a > 2)) # logical_not(a > 2)\n",
"print(\"(a > 2) & (b > 2) =\", (a > 2) & (b > 2)) # logical_and\n",
"print(\"(a > 2) | (b < 3) =\", (a > 2) | (b < 3)) # logical_or"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The final Numpy feature we'll need is indexing: selecting elements from an array. \n",
"Aside from Python indexes and slices (e.g. `a[1:4]`), Numpy also allows you to select several elements at once."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a = [ 0 1 4 9 16 25]\n",
"Select by element index\n",
"a[[1,2,5]] = [ 1 4 25]\n",
"\n",
"Select by boolean mask\n",
"a[a > 5] = [ 9 16 25]\n",
"(a % 2 == 0) = [ True False True False True False]\n",
"a[a % 2 == 0] = [ 0 4 16]\n",
"data[(data['Age'] < 18) & (data['Sex'] == 'male')] = (below)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Name</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>SibSp</th>\n",
" <th>Parch</th>\n",
" <th>Ticket</th>\n",
" <th>Fare</th>\n",
" <th>Cabin</th>\n",
" <th>Embarked</th>\n",
" </tr>\n",
" <tr>\n",
" <th>PassengerId</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Palsson, Master. Gosta Leonard</td>\n",
" <td>male</td>\n",
" <td>2.00</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>349909</td>\n",
" <td>21.0750</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Rice, Master. Eugene</td>\n",
" <td>male</td>\n",
" <td>2.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>382652</td>\n",
" <td>29.1250</td>\n",
" <td>NaN</td>\n",
" <td>Q</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Panula, Master. Juha Niilo</td>\n",
" <td>male</td>\n",
" <td>7.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>3101295</td>\n",
" <td>39.6875</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>60</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Goodwin, Master. William Frederick</td>\n",
" <td>male</td>\n",
" <td>11.00</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>CA 2144</td>\n",
" <td>46.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Skoog, Master. Harald</td>\n",
" <td>male</td>\n",
" <td>4.00</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>347088</td>\n",
" <td>27.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Caldwell, Master. Alden Gates</td>\n",
" <td>male</td>\n",
" <td>0.83</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>248738</td>\n",
" <td>29.0000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>87</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Ford, Mr. William Neal</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>W./C. 6608</td>\n",
" <td>34.3750</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>126</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Nicola-Yarred, Master. Elias</td>\n",
" <td>male</td>\n",
" <td>12.00</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2651</td>\n",
" <td>11.2417</td>\n",
" <td>NaN</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>139</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Osen, Mr. Olaf Elon</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>7534</td>\n",
" <td>9.2167</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>164</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Calic, Mr. Jovo</td>\n",
" <td>male</td>\n",
" <td>17.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>315093</td>\n",
" <td>8.6625</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>165</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Panula, Master. Eino Viljami</td>\n",
" <td>male</td>\n",
" <td>1.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>3101295</td>\n",
" <td>39.6875</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>166</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Goldsmith, Master. Frank John William \"Frankie\"</td>\n",
" <td>male</td>\n",
" <td>9.00</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>363291</td>\n",
" <td>20.5250</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>172</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Rice, Master. Arthur</td>\n",
" <td>male</td>\n",
" <td>4.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>382652</td>\n",
" <td>29.1250</td>\n",
" <td>NaN</td>\n",
" <td>Q</td>\n",
" </tr>\n",
" <tr>\n",
" <th>183</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Asplund, Master. Clarence Gustaf Hugo</td>\n",
" <td>male</td>\n",
" <td>9.00</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>347077</td>\n",
" <td>31.3875</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>184</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Becker, Master. Richard F</td>\n",
" <td>male</td>\n",
" <td>1.00</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>230136</td>\n",
" <td>39.0000</td>\n",
" <td>F4</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>194</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Navratil, Master. Michel M</td>\n",
" <td>male</td>\n",
" <td>3.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>230080</td>\n",
" <td>26.0000</td>\n",
" <td>F2</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>221</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Sunderland, Mr. Victor Francis</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>SOTON/OQ 392089</td>\n",
" <td>8.0500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>262</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Asplund, Master. Edvin Rojj Felix</td>\n",
" <td>male</td>\n",
" <td>3.00</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>347077</td>\n",
" <td>31.3875</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>267</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Panula, Mr. Ernesti Arvid</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>3101295</td>\n",
" <td>39.6875</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>279</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Rice, Master. Eric</td>\n",
" <td>male</td>\n",
" <td>7.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>382652</td>\n",
" <td>29.1250</td>\n",
" <td>NaN</td>\n",
" <td>Q</td>\n",
" </tr>\n",
" <tr>\n",
" <th>283</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>de Pelsmaeker, Mr. Alfons</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>345778</td>\n",
" <td>9.5000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>306</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Allison, Master. Hudson Trevor</td>\n",
" <td>male</td>\n",
" <td>0.92</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>113781</td>\n",
" <td>151.5500</td>\n",
" <td>C22 C26</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>334</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Vander Planke, Mr. Leo Edmondus</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>345764</td>\n",
" <td>18.0000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>341</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Navratil, Master. Edmond Roger</td>\n",
" <td>male</td>\n",
" <td>2.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>230080</td>\n",
" <td>26.0000</td>\n",
" <td>F2</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>349</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Coutts, Master. William Loch \"William\"</td>\n",
" <td>male</td>\n",
" <td>3.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>C.A. 37671</td>\n",
" <td>15.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>353</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Elias, Mr. Tannous</td>\n",
" <td>male</td>\n",
" <td>15.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2695</td>\n",
" <td>7.2292</td>\n",
" <td>NaN</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>387</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Goodwin, Master. Sidney Leonard</td>\n",
" <td>male</td>\n",
" <td>1.00</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>CA 2144</td>\n",
" <td>46.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>408</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Richards, Master. William Rowe</td>\n",
" <td>male</td>\n",
" <td>3.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>29106</td>\n",
" <td>18.7500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>434</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Kallio, Mr. Nikolai Erland</td>\n",
" <td>male</td>\n",
" <td>17.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>STON/O 2. 3101274</td>\n",
" <td>7.1250</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>446</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Dodge, Master. Washington</td>\n",
" <td>male</td>\n",
" <td>4.00</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>33638</td>\n",
" <td>81.8583</td>\n",
" <td>A34</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>481</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Goodwin, Master. Harold Victor</td>\n",
" <td>male</td>\n",
" <td>9.00</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>CA 2144</td>\n",
" <td>46.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>490</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Coutts, Master. Eden Leslie \"Neville\"</td>\n",
" <td>male</td>\n",
" <td>9.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>C.A. 37671</td>\n",
" <td>15.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>501</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Calic, Mr. Petar</td>\n",
" <td>male</td>\n",
" <td>17.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>315086</td>\n",
" <td>8.6625</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>533</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Elias, Mr. Joseph Jr</td>\n",
" <td>male</td>\n",
" <td>17.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2690</td>\n",
" <td>7.2292</td>\n",
" <td>NaN</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>550</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Davies, Master. John Morgan Jr</td>\n",
" <td>male</td>\n",
" <td>8.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>C.A. 33112</td>\n",
" <td>36.7500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>551</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Thayer, Mr. John Borland Jr</td>\n",
" <td>male</td>\n",
" <td>17.00</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>17421</td>\n",
" <td>110.8833</td>\n",
" <td>C70</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>575</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Rush, Mr. Alfred George John</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>A/4. 20589</td>\n",
" <td>8.0500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>684</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Goodwin, Mr. Charles Edward</td>\n",
" <td>male</td>\n",
" <td>14.00</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>CA 2144</td>\n",
" <td>46.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>687</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Panula, Mr. Jaako Arnold</td>\n",
" <td>male</td>\n",
" <td>14.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>3101295</td>\n",
" <td>39.6875</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>722</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Jensen, Mr. Svend Lauritz</td>\n",
" <td>male</td>\n",
" <td>17.00</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>350048</td>\n",
" <td>7.0542</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>732</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Hassan, Mr. Houssein G N</td>\n",
" <td>male</td>\n",
" <td>11.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2699</td>\n",
" <td>18.7875</td>\n",
" <td>NaN</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>747</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Abbott, Mr. Rossmore Edward</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>C.A. 2673</td>\n",
" <td>20.2500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>752</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Moor, Master. Meier</td>\n",
" <td>male</td>\n",
" <td>6.00</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>392096</td>\n",
" <td>12.4750</td>\n",
" <td>E121</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>756</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Hamalainen, Master. Viljo</td>\n",
" <td>male</td>\n",
" <td>0.67</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>250649</td>\n",
" <td>14.5000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>765</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Eklund, Mr. Hans Linus</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>347074</td>\n",
" <td>7.7750</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>788</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Rice, Master. George Hugh</td>\n",
" <td>male</td>\n",
" <td>8.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>382652</td>\n",
" <td>29.1250</td>\n",
" <td>NaN</td>\n",
" <td>Q</td>\n",
" </tr>\n",
" <tr>\n",
" <th>789</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Dean, Master. Bertram Vere</td>\n",
" <td>male</td>\n",
" <td>1.00</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>C.A. 2315</td>\n",
" <td>20.5750</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>792</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>Gaskell, Mr. Alfred</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>239865</td>\n",
" <td>26.0000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>803</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Carter, Master. William Thornton II</td>\n",
" <td>male</td>\n",
" <td>11.00</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>113760</td>\n",
" <td>120.0000</td>\n",
" <td>B96 B98</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>804</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Thomas, Master. Assad Alexander</td>\n",
" <td>male</td>\n",
" <td>0.42</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2625</td>\n",
" <td>8.5167</td>\n",
" <td>NaN</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>820</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Skoog, Master. Karl Thorsten</td>\n",
" <td>male</td>\n",
" <td>10.00</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>347088</td>\n",
" <td>27.9000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>825</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Panula, Master. Urho Abraham</td>\n",
" <td>male</td>\n",
" <td>2.00</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>3101295</td>\n",
" <td>39.6875</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>828</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Mallet, Master. Andre</td>\n",
" <td>male</td>\n",
" <td>1.00</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>S.C./PARIS 2079</td>\n",
" <td>37.0042</td>\n",
" <td>NaN</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>832</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>Richards, Master. George Sibley</td>\n",
" <td>male</td>\n",
" <td>0.83</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>29106</td>\n",
" <td>18.7500</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>842</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>Mudd, Mr. Thomas Charles</td>\n",
" <td>male</td>\n",
" <td>16.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>S.O./P.P. 3</td>\n",
" <td>10.5000</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>845</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Culumovic, Mr. Jeso</td>\n",
" <td>male</td>\n",
" <td>17.00</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>315090</td>\n",
" <td>8.6625</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>851</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Andersson, Master. Sigvard Harald Elias</td>\n",
" <td>male</td>\n",
" <td>4.00</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>347082</td>\n",
" <td>31.2750</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>870</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Johnson, Master. Harold Theodor</td>\n",
" <td>male</td>\n",
" <td>4.00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>347742</td>\n",
" <td>11.1333</td>\n",
" <td>NaN</td>\n",
" <td>S</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Survived Pclass \\\n",
"PassengerId \n",
"8 0 3 \n",
"17 0 3 \n",
"51 0 3 \n",
"60 0 3 \n",
"64 0 3 \n",
"79 1 2 \n",
"87 0 3 \n",
"126 1 3 \n",
"139 0 3 \n",
"164 0 3 \n",
"165 0 3 \n",
"166 1 3 \n",
"172 0 3 \n",
"183 0 3 \n",
"184 1 2 \n",
"194 1 2 \n",
"221 1 3 \n",
"262 1 3 \n",
"267 0 3 \n",
"279 0 3 \n",
"283 0 3 \n",
"306 1 1 \n",
"334 0 3 \n",
"341 1 2 \n",
"349 1 3 \n",
"353 0 3 \n",
"387 0 3 \n",
"408 1 2 \n",
"434 0 3 \n",
"446 1 1 \n",
"481 0 3 \n",
"490 1 3 \n",
"501 0 3 \n",
"533 0 3 \n",
"550 1 2 \n",
"551 1 1 \n",
"575 0 3 \n",
"684 0 3 \n",
"687 0 3 \n",
"722 0 3 \n",
"732 0 3 \n",
"747 0 3 \n",
"752 1 3 \n",
"756 1 2 \n",
"765 0 3 \n",
"788 0 3 \n",
"789 1 3 \n",
"792 0 2 \n",
"803 1 1 \n",
"804 1 3 \n",
"820 0 3 \n",
"825 0 3 \n",
"828 1 2 \n",
"832 1 2 \n",
"842 0 2 \n",
"845 0 3 \n",
"851 0 3 \n",
"870 1 3 \n",
"\n",
" Name Sex Age \\\n",
"PassengerId \n",
"8 Palsson, Master. Gosta Leonard male 2.00 \n",
"17 Rice, Master. Eugene male 2.00 \n",
"51 Panula, Master. Juha Niilo male 7.00 \n",
"60 Goodwin, Master. William Frederick male 11.00 \n",
"64 Skoog, Master. Harald male 4.00 \n",
"79 Caldwell, Master. Alden Gates male 0.83 \n",
"87 Ford, Mr. William Neal male 16.00 \n",
"126 Nicola-Yarred, Master. Elias male 12.00 \n",
"139 Osen, Mr. Olaf Elon male 16.00 \n",
"164 Calic, Mr. Jovo male 17.00 \n",
"165 Panula, Master. Eino Viljami male 1.00 \n",
"166 Goldsmith, Master. Frank John William \"Frankie\" male 9.00 \n",
"172 Rice, Master. Arthur male 4.00 \n",
"183 Asplund, Master. Clarence Gustaf Hugo male 9.00 \n",
"184 Becker, Master. Richard F male 1.00 \n",
"194 Navratil, Master. Michel M male 3.00 \n",
"221 Sunderland, Mr. Victor Francis male 16.00 \n",
"262 Asplund, Master. Edvin Rojj Felix male 3.00 \n",
"267 Panula, Mr. Ernesti Arvid male 16.00 \n",
"279 Rice, Master. Eric male 7.00 \n",
"283 de Pelsmaeker, Mr. Alfons male 16.00 \n",
"306 Allison, Master. Hudson Trevor male 0.92 \n",
"334 Vander Planke, Mr. Leo Edmondus male 16.00 \n",
"341 Navratil, Master. Edmond Roger male 2.00 \n",
"349 Coutts, Master. William Loch \"William\" male 3.00 \n",
"353 Elias, Mr. Tannous male 15.00 \n",
"387 Goodwin, Master. Sidney Leonard male 1.00 \n",
"408 Richards, Master. William Rowe male 3.00 \n",
"434 Kallio, Mr. Nikolai Erland male 17.00 \n",
"446 Dodge, Master. Washington male 4.00 \n",
"481 Goodwin, Master. Harold Victor male 9.00 \n",
"490 Coutts, Master. Eden Leslie \"Neville\" male 9.00 \n",
"501 Calic, Mr. Petar male 17.00 \n",
"533 Elias, Mr. Joseph Jr male 17.00 \n",
"550 Davies, Master. John Morgan Jr male 8.00 \n",
"551 Thayer, Mr. John Borland Jr male 17.00 \n",
"575 Rush, Mr. Alfred George John male 16.00 \n",
"684 Goodwin, Mr. Charles Edward male 14.00 \n",
"687 Panula, Mr. Jaako Arnold male 14.00 \n",
"722 Jensen, Mr. Svend Lauritz male 17.00 \n",
"732 Hassan, Mr. Houssein G N male 11.00 \n",
"747 Abbott, Mr. Rossmore Edward male 16.00 \n",
"752 Moor, Master. Meier male 6.00 \n",
"756 Hamalainen, Master. Viljo male 0.67 \n",
"765 Eklund, Mr. Hans Linus male 16.00 \n",
"788 Rice, Master. George Hugh male 8.00 \n",
"789 Dean, Master. Bertram Vere male 1.00 \n",
"792 Gaskell, Mr. Alfred male 16.00 \n",
"803 Carter, Master. William Thornton II male 11.00 \n",
"804 Thomas, Master. Assad Alexander male 0.42 \n",
"820 Skoog, Master. Karl Thorsten male 10.00 \n",
"825 Panula, Master. Urho Abraham male 2.00 \n",
"828 Mallet, Master. Andre male 1.00 \n",
"832 Richards, Master. George Sibley male 0.83 \n",
"842 Mudd, Mr. Thomas Charles male 16.00 \n",
"845 Culumovic, Mr. Jeso male 17.00 \n",
"851 Andersson, Master. Sigvard Harald Elias male 4.00 \n",
"870 Johnson, Master. Harold Theodor male 4.00 \n",
"\n",
" SibSp Parch Ticket Fare Cabin Embarked \n",
"PassengerId \n",
"8 3 1 349909 21.0750 NaN S \n",
"17 4 1 382652 29.1250 NaN Q \n",
"51 4 1 3101295 39.6875 NaN S \n",
"60 5 2 CA 2144 46.9000 NaN S \n",
"64 3 2 347088 27.9000 NaN S \n",
"79 0 2 248738 29.0000 NaN S \n",
"87 1 3 W./C. 6608 34.3750 NaN S \n",
"126 1 0 2651 11.2417 NaN C \n",
"139 0 0 7534 9.2167 NaN S \n",
"164 0 0 315093 8.6625 NaN S \n",
"165 4 1 3101295 39.6875 NaN S \n",
"166 0 2 363291 20.5250 NaN S \n",
"172 4 1 382652 29.1250 NaN Q \n",
"183 4 2 347077 31.3875 NaN S \n",
"184 2 1 230136 39.0000 F4 S \n",
"194 1 1 230080 26.0000 F2 S \n",
"221 0 0 SOTON/OQ 392089 8.0500 NaN S \n",
"262 4 2 347077 31.3875 NaN S \n",
"267 4 1 3101295 39.6875 NaN S \n",
"279 4 1 382652 29.1250 NaN Q \n",
"283 0 0 345778 9.5000 NaN S \n",
"306 1 2 113781 151.5500 C22 C26 S \n",
"334 2 0 345764 18.0000 NaN S \n",
"341 1 1 230080 26.0000 F2 S \n",
"349 1 1 C.A. 37671 15.9000 NaN S \n",
"353 1 1 2695 7.2292 NaN C \n",
"387 5 2 CA 2144 46.9000 NaN S \n",
"408 1 1 29106 18.7500 NaN S \n",
"434 0 0 STON/O 2. 3101274 7.1250 NaN S \n",
"446 0 2 33638 81.8583 A34 S \n",
"481 5 2 CA 2144 46.9000 NaN S \n",
"490 1 1 C.A. 37671 15.9000 NaN S \n",
"501 0 0 315086 8.6625 NaN S \n",
"533 1 1 2690 7.2292 NaN C \n",
"550 1 1 C.A. 33112 36.7500 NaN S \n",
"551 0 2 17421 110.8833 C70 C \n",
"575 0 0 A/4. 20589 8.0500 NaN S \n",
"684 5 2 CA 2144 46.9000 NaN S \n",
"687 4 1 3101295 39.6875 NaN S \n",
"722 1 0 350048 7.0542 NaN S \n",
"732 0 0 2699 18.7875 NaN C \n",
"747 1 1 C.A. 2673 20.2500 NaN S \n",
"752 0 1 392096 12.4750 E121 S \n",
"756 1 1 250649 14.5000 NaN S \n",
"765 0 0 347074 7.7750 NaN S \n",
"788 4 1 382652 29.1250 NaN Q \n",
"789 1 2 C.A. 2315 20.5750 NaN S \n",
"792 0 0 239865 26.0000 NaN S \n",
"803 1 2 113760 120.0000 B96 B98 S \n",
"804 0 1 2625 8.5167 NaN C \n",
"820 3 2 347088 27.9000 NaN S \n",
"825 4 1 3101295 39.6875 NaN S \n",
"828 0 2 S.C./PARIS 2079 37.0042 NaN C \n",
"832 1 1 29106 18.7500 NaN S \n",
"842 0 0 S.O./P.P. 3 10.5000 NaN S \n",
"845 0 0 315090 8.6625 NaN S \n",
"851 4 2 347082 31.2750 NaN S \n",
"870 1 1 347742 11.1333 NaN S "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = np.array([0, 1, 4, 9, 16, 25])\n",
"ix = np.array([1, 2, 5])\n",
"print(\"a =\", a)\n",
"print(\"Select by element index\")\n",
"print(\"a[[1,2,5]] =\", a[ix])\n",
"\n",
"print(\"\\nSelect by boolean mask\")\n",
"# select all elementts in a that are greater than 5\n",
"print(\"a[a > 5] =\", a[a > 5])\n",
"print(\"(a % 2 == 0) =\", a % 2 == 0) # True for even, False for odd\n",
"print(\"a[a % 2 == 0] =\", a[a % 2 == 0]) # select all elements in a that are even\n",
"\n",
"\n",
"# select male children\n",
"print(\"data[(data['Age'] < 18) & (data['Sex'] == 'male')] = (below)\")\n",
"data[(data['Age'] < 18) & (data['Sex'] == 'male')]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Your turn\n",
"\n",
"Use numpy and pandas to answer a few questions about data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# who on average paid more for their ticket, men or women?\n",
"\n",
"mean_fare_men = <YOUR CODE>\n",
"mean_fare_women = <YOUR CODE>\n",
"\n",
"print(mean_fare_men, mean_fare_women)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# who is more likely to survive: a child (<18 yo) or an adult?\n",
"\n",
"child_survival_rate = <YOUR CODE>\n",
"adult_survival_rate = <YOUR CODE>\n",
"\n",
"print(child_survival_rate, adult_survival_rate)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Part IV: plots and matplotlib\n",
"\n",
"Using Python to visualize the data is covered by yet another library: matplotlib.\n",
"\n",
"Just like Python itself, matplotlib has an awesome tendency of keeping simple things simple while still allowing you to write complicated stuff with convenience (e.g. super-detailed plots or custom animations)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f2fec9370f0>]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHUJJREFUeJzt3Xl4VeW5/vHvQ5gSxgRCGJIIMgoiUwKi1qFWRY5DnYpW\nnKDi1GN72orU/nrU2uPQ1lr7Oy1OIIgDIINSxyJqqdVKEuZRBoEkxBBIAiFzst/zR7YWLSEh2Ttr\nD/fnunJlZ2fF9ewLcrN89/O8y5xziIhI+GvldQEiIhIYCnQRkQihQBcRiRAKdBGRCKFAFxGJEAp0\nEZEIoUAXEYkQCnQRkQihQBcRiRCtW/Jk3bt3d3379m3JU4qIhL2srKwDzrnEho5r0UDv27cvmZmZ\nLXlKEZGwZ2Z7GnOcllxERCKEAl1EJEIo0EVEIoQCXUQkQijQRUQiRIOBbmYpZvaBmW0xs01m9iP/\n8w+YWa6ZrfV/TAx+uSIiUp/GtC3WAD91zq02s05Alpkt93/vCefc74JXnoiINFaDV+jOuTzn3Gr/\n4xJgC9An2IWJiESC8qpaHli2ieKyqqCf64TW0M2sLzAK+NT/1A/NbL2ZzTaz+Hp+ZpqZZZpZZkFB\nQbOKFREJJz6f4ycL1zL3k92syS4O+vkaHehm1hFYDPzYOXcYmAn0B0YCecDjx/o559wzzrk051xa\nYmKDk6siIhHjN+9u4+2NX/CLiadw3uAeQT9fowLdzNpQF+YvOeeWADjn8p1ztc45H/AsMDZ4ZYqI\nhJf5q/by1N92cv24VKae1a9FztmYLhcDZgFbnHO/P+r5XkcddgWwMfDliYiEn3/sOMD/e20jZw9K\n5MHLhlEXo8HXmC6XM4EbgA1mttb/3H3AdWY2EnDAbuC2oFQoIhJGtueXcPuLWfRP7Mifvj+K1jEt\nN+7TYKA75z4CjvXPy1uBL0dEJHwdOFLJLXMyaNc6hlk3p9GpfZsWPb8mRUVEAqCiupZbX8jkwJFK\nZt2URnJ8XIvX0KL7oYuIRCKfz/HTV9exNruYmdePZkRKV0/q0BW6iEgzPb58G2+uz2PGhCFMOLVX\nwz8QJAp0EZFmWJiZzZ8+2Ml1Y1OYdvbJntaiQBcRaaKPdx7gviUb+NbA7vzq8lNbrD2xPgp0EZEm\n2LH/CLfPy6Jf9w786frRtGnB9sT6eF+BiEiYOXikkilzMmjbuhWzb06ncwu3J9ZHXS4iIiegorqW\nafOyyD9cwfxpp5OS0PLtifVRoIuINJJzjumL1pO1p4g/Xz+aUanH3GTWM1pyERFppCeWf8aydfuY\nPmEwE4d7155YHwW6iEgjLM7K4Y/v72BSWgp3nNPf63KOSYEuItKAf+46yIwl6zmjfzd+fYX37Yn1\nUaCLiBzHroIj3DYvi9SEOGZePyYk2hPrE7qViYh4rLC0iilzMmjdynj+5rF0iQuN9sT6qMtFROQY\nKmtquW1eJvsOVfDKraeT2i102hProyt0EZFvcM4xY/EGMnYX8fg1IxhzUmi1J9ZHgS4i8g1PrtjO\n0jW5/OzCQVw6orfX5TSaAl1E5CivrcnlD+9t56rRydx13gCvyzkhCnQREb9VnxcyfdF6Tj85gUeu\nHB6y7Yn1UaCLiAC7D5Ry27xMkuNjeWryGNq2Dr94DL+KRUQCrLisrj0R4Plb0uka19bjippGbYsi\nEtWqanzcNi+LnKJyXrp1HCd16+B1SU2mQBeRqOWcY8aS9Xz6eSFPXjuS9L4JXpfULFpyEZGo9b/v\n72DJ6lz+6zuDuHxkH6/LaTYFuohEpdfX5vL48s+4clQf7j4/vNoT66NAF5Gok7WnkHsWrWdsvwQe\nuSr82hPro0AXkaiy52Apt76QRZ+usTw9eQztWsd4XVLAKNBFJGocKqvmljkZ+Jxj9s3pxHcIz/bE\n+ijQRSQqVNX4uP3FLLILy3h68hj6dQ/f9sT6qG1RRCKec45fLN3AJ7sO8sSkEYw7uZvXJQVFg1fo\nZpZiZh+Y2RYz22RmP/I/n2Bmy81su/9zeOwvKSJR588f7uTVrBzuPn8gV4xK9rqcoGnMkksN8FPn\n3CnA6cBdZjYUmAGscM4NBFb4vxYRCSlvrN/Hb9/dxmUjevNf3xnodTlB1WCgO+fynHOr/Y9LgC1A\nH+ByYK7/sLnAd4NVpIhIU6zeW8RPFq4j7aR4fnP1aRHTnlifE3pT1Mz6AqOAT4Ek51we1IU+0CPQ\nxYmINFV2YRm3zs2kZ+f2PH3DGNq3iZz2xPo0OtDNrCOwGPixc+7wCfzcNDPLNLPMgoKCptQoInJC\nDpXXtSdW1/qYfXM63Tq287qkFtGoQDezNtSF+UvOuSX+p/PNrJf/+72A/cf6WefcM865NOdcWmJi\nYiBqFhGpV3WtjztfymL3gVKeumEMA3p09LqkFtOYLhcDZgFbnHO/P+pby4Cb/I9vAl4PfHkiIo3n\nnOOXr23kHzsO8siVwzmjf3evS2pRjelDPxO4AdhgZmv9z90HPAosNLOpwF7gmuCUKCLSOE+v3MX8\njGzuOq8/16SleF1Oi2sw0J1zHwH1vTV8fmDLERFpmrc35PHo21u55LRe/PSCwV6X4wmN/otI2Fub\nXcyPF6xlVGpXfnfNCFq1iuz2xPoo0EUkrOUUlfGDuZn06NyOZ29Mi4r2xPpoLxcRCVuHK6qZMieD\nyppa5k8bR/coaU+sj67QRSQsVdf6uOul1ewqKOWpyWMY0KOT1yV5TlfoIhJ2nHPcv2wTf99+gMeu\nGs6ZA6KrPbE+ukIXkbDz3N8/5+VP93L7Of2ZlJ7qdTkhQ4EuImHl3U1f8PDbW5g4vCfTL4rO9sT6\nKNBFJGxsyDnEj+ev5bTkrvz+eyOjtj2xPgp0EQkL+4rLmTo3g4QObXkuytsT66NAF5GQd6Syhilz\nMiivquX5W9JJ7BTd7Yn1UZeLiIS0mlofP3x5Ndv3H2HOLekMSlJ7Yn10hS4iIcs5x6/e2MyH2wp4\n6PJT+dZAbcF9PAp0EQlZz/9jNy98sodpZ5/M98epPbEhCnQRCUnvbc7noTc3c9GwJGZMGOJ1OWFB\ngS4iIWdj7iHunr+G4X268IdJo9Se2EgKdBEJKXmH6toTu8a24bkb04htq/bExlKXi4iEjNLKGqbO\nyaS0spZFd4ynR+f2XpcUVhToIhISan2Ou19Zw7b8EmbdlMaQnp29LinsaMlFRELCQ29sZsXW/Txw\n2TDOHdzD63LCkgJdRDw39+PdzPl4N1PP6scNp5/kdTlhS4EuIp56f2s+D/5lE985JYn7Jp7idTlh\nTYEuIp7ZvO8w//nyGob27swfrxtJjNoTm0WBLiKeyD9cwdS5GXSObcOsm9KJa6sejeZSoItIiyur\nqmHq3AwOl1cz66Z0ktSeGBD6J1FEWlRde+JaNu87zKyb0hnaW+2JgaIrdBFpMc45Hn5rC+9tyef+\nS4dx3hC1JwaSrtBFpEX4fI7/eWsLsz76nJvP6MtNZ/T1uqSIo0AXkaCrqvFxz6J1vL52Hzef0Zf/\nvmSo1yVFJAW6iARVaWUNd7y0mpWfFTB9wmDuOKc/ZmpPDAYFuogETWFpFbfMyWBDTjGPXTWcSem6\nSUUwKdBFJChyisq4cfYqcovKefqGNC4YmuR1SRGvwS4XM5ttZvvNbONRzz1gZrlmttb/MTG4ZYpI\nONn2RQlXz/yEgpJK5k0dpzBvIY1pW5wDTDjG808450b6P94KbFkiEq4ydxdyzVMf43OOV28fz9h+\nCV6XFDUaDHTn3EqgsAVqEZEw997mfK5/7lO6d2zH4jvO0J7mLaw5g0U/NLP1/iWZ+PoOMrNpZpZp\nZpkFBQXNOJ2IhLKFmdnc9mIWg3t24tXbx5OSEOd1SVGnqYE+E+gPjATygMfrO9A594xzLs05l5aY\nmNjE04lIqHLOMfPDnUxftJ4z+nfjlVtPp1vHdl6XFZWa1OXinMv/8rGZPQu8EbCKRCRsHD39edmI\n3vzumhG0ba0dRbzSpEA3s17OuTz/l1cAG493vIhEnqoaH9MXreO1o6Y/W2k/c081GOhm9gpwLtDd\nzHKA+4FzzWwk4IDdwG1BrFFEQszR05/3XDSYO8/V9GcoaDDQnXPXHePpWUGoRUTCgKY/Q5cmRUWk\n0Y6e/nxq8hguHNbT65LkKAp0EWmUz/JLuHHWKkqrapg3dZwGhkKQAl1EGpS5u5ApczJo3yaGV28f\nr4GhEKVAF5HjWrElnztfWk2frrHMnTJWA0MhTIEuIvV6NTObGUs2MKx3Z56/OV0DQyFOgS4i/8Y5\nx9Mrd/Ho21v51sDuPDV5DB3aKS5Cnf6ERORrfL66Gzk/p+nPsKNAF5GvVNf6mL5oPUvX5Gr6Mwwp\n0EUEgLKqGu54cTV/0/Rn2FKgi4imPyOEAl0kyuUWl3PDrE81/RkBFOgiUUzTn5FFgS4SpbL2FDJl\nTibtWrfS9GeEUKCLRKEVW/K56+XV9O6i6c9IokAXiTKa/oxcCnSRKPHN6c+Zk8fQUdOfEUV/miJR\n4Ojpz0tH9OZxTX9GJAW6SITT9Gf0UKCLRDBNf0YXBbpIhCryT3+uzynm0SuHc+1YTX9GOgW6SATK\nLS7nxlmfkqPpz6iiQBeJMJr+jF4KdJEIcvT058LbxnNKL01/RhMFukiEeH9r3b0/e3WJ5QVNf0Yl\nBbpIBFiUlcO9i9dr+jPKKdBFwtzTf9vJI5r+FBToImHL53M88vYWnv27pj+ljgJdJAxp+lOORYEu\nEmbKqmq486XVfLhN05/ydQp0kTCi6U85ngYX3MxstpntN7ONRz2XYGbLzWy7/3N8cMsUkdzicq5+\n6mM25x1m5uQxCnP5N415B2UOMOEbz80AVjjnBgIr/F+LSJB8ll/C1TM/Zn9JJfOmjOUijfLLMTQY\n6M65lUDhN56+HJjrfzwX+G6A6xIRv6w9hVzz1CfU+hwLbxvPuJO7eV2ShKimrqEnOefyAJxzeWbW\nI4A1iYifpj/lRAS9adXMpplZppllFhQUBPt0IhFjUVYOt76QxaCkTiy6fbzCXBrU1EDPN7NeAP7P\n++s70Dn3jHMuzTmXlpiY2MTTiUSXp/+2k5+9uo7xJ3fj5VtP1yi/NEpTA30ZcJP/8U3A64EpRyS6\n+XyO/3lzM4+8vZVLR/Rm9s3pGuWXRmvwb4qZvQKcC3Q3sxzgfuBRYKGZTQX2AtcEs0iRaFBd6+Pe\nRetZoulPaaIGA905d1093zo/wLWIRC1Nf0og6P/lRDxWVFrFlLkZrMvW9Kc0jwJdxEP7isu5cfYq\n9haWMXPyGA0MSbMo0EU8snxzPvct3UBFdS3zpozVwJA0mwJdpIUdOFLJA8s28cb6PIb07MST145i\ncM9OXpclEUCBLtJCnHO8tjaXB/+ymbLKWn524SBuO6c/bWJ0UwoJDAW6SAvYV1zOL5Zu4INtBYxO\n7cpvrj6NAT10VS6BpUAXCSKfz/HSqr089vZWan2O+y8dyo3j+xKj/nIJAgW6SJDsKjjCjCUbWPV5\nId8a2J2Hrxiu/VgkqBToIgFWU+vjuY8+54nln9GudSt+e/VpXD0mWYNCEnQKdJEA2rzvMNMXr2Nj\n7mEuGpbEQ5efSo/O7b0uS6KEAl0kACpravnf93cw88OddI1ry8zrR3Px8F5elyVRRoEu0kxZe4q4\nd/F6duw/wlWjk/nlJafQNa6t12VJFFKgizRRaWUNv/vrNuZ8vJveXWKZO2Us5wzSnv/iHQW6SBP8\nfXsBP1+ygdzicm48/STumTBE+5aL5/Q3UOQEHCqr5tdvbubVrBxOTuzAwtvGk943weuyRAAFukij\nvbPxC375+kYKS6u489z+3H3+QNq3ifG6LJGvKNBFGrC/pIIHlm3irQ1fMLRXZ56/OZ1T+3TxuiyR\nf6NAF6mHc47Fq3N56I3NlFfXcs9Fg5l29snaTEtClgJd5Bhyisq4b+lGVn5WQNpJ8Tx61WkM6NHR\n67JEjkuBLnIUn88x7597eOydrRjwq8uHMXncSbpZs4QFBbqI386CI9y7aD2Ze4o4e1AiD19xKsnx\n2kxLwocCXaJeda2PZ1bu4skV24ltE8Pj14zgytF9tJmWhB0FukS1jbmHmL5oPZvzDjNxeE8evOxU\nEju187oskSZRoEtUqqiu5ckV23lm5S4SOrTlqcmjmXCqNtOS8KZAl6iTsbuQexetZ9eBUr6Xlswv\nJg6lS1wbr8sSaTYFukSNI5U1/OadrbzwyR6S42N5ceo4zhrY3euyRAJGgS5R4W+fFXDfkg3sO1TO\nLWf25WcXDqaDNtOSCKO/0RLRikqreOjNzSxZncuAHh1ZdPsZjDkp3uuyRIJCgS4RyTnH2xu/4L9f\n30hxWTX/+e0B/PDbA2jXWptpSeRSoEvE2X+4gl++vpF3N+UzvE8XXpgyjqG9O3tdlkjQKdAlYjjn\neDUrh1+/sZnKGh8/v3gIU8/qR2ttpiVRolmBbma7gRKgFqhxzqUFoiiRE5VdWMbPl2zgox0HGNsv\ngUevHM7JidpMS6JLIK7Qz3POHQjAf0fkhNX6HHM/3s1v391GTCvj1989le+PTdVmWhKVtOQiYWt7\nfgn3Ll7P6r3FnDs4kYevGE7vrrFelyXimeYGugP+amYOeNo598w3DzCzacA0gNTU1GaeTqRuM62n\nPtzJ/39/Bx3axfCHSSO5fGRvbaYlUa+5gX6mc26fmfUAlpvZVufcyqMP8If8MwBpaWmumeeTKLch\n5xD3LFrH1i9KuHREb+6/dCjdO2ozLRFoZqA75/b5P+83s6XAWGDl8X9K5MRVVNfyxHuf8ezKXSR2\nasezN6ZxwdAkr8sSCSlNDnQz6wC0cs6V+B9fCPwqYJWJ+P1z10F+vmQDnx8o5bqxKcy4+BS6xGoz\nLZFvas4VehKw1L9u2Rp42Tn3TkCqEgFKKqp59O2tvPTpXlIT4nj5B+M4Y4A20xKpT5MD3Tm3CxgR\nwFpEvvLB1v3ct3QD+Ycr+MFZ/fjJhYOIa6umLJHj0W+IhJTC0ip+9ZdNvLZ2HwN7dOTPd5zBqFRt\npiXSGAp0CQkV1bUsW7uPx97ZyuGKan50/kDuPK+/NtMSOQEKdPHUxtxDLMzMZumaXEoqahiR3IXH\nrh7HkJ7aTEvkRCnQpcUdKq9m2bp9LMjYy8bcw7Rt3YqLT+3JpPQUTu/XTWP7Ik2kQJcW4Zxj1eeF\nLMjI5q2NeVRU+xjSsxMPXjaMy0f2pmtcW69LFAl7CnQJqv0lFSxZncvCjGx2HSilY7vWXDk6mWvT\nUxjep4vG9UUCSIEuAVdT62Pl9gLmr8pmxdb91Poc6X3jufO8AUwc3lPthyJBot8sCZi9B8tYmJnN\noqwcvjhcQbcObfnBWf24Ji2FAT20N7lIsCnQpVkqqmv56+Z8FmTs5R87DtLK4OxBiTxw2VC+PSSJ\ntq11tyCRlqJAlybZ+sVhFmTUtRsWl1XTp2ssP7lgEFePSdae5CIeUaBLox2prOEv6/YxPyObddnF\ntI1pxYXDkpiUnsKZ/bur3VDEYwp0OS7nHKv3FjF/VTZvbsijrKqWQUkd+eUlQ7liVB8SOqjdUCRU\nKNDlmA4eqWTpmlzmZ2SzY/8ROrSN4bIRvZmUnsLIlK5qNxQJQQp0+Uqtz/HRjgMsyNjL8s35VNc6\nRqd25TdXncZ/nNaLDu3010UklOk3VMgpKuPVzBwWZeWQW1xOfFwbbhrfl0npKQxM6uR1eSLSSAr0\nKFVV4+O9LfnMz8jm79sLADhrQHfum3gK3xnaQ7scioQhBXqU2Z5fwoKMbJasyaWwtIreXdpz97cH\nck1aMsnxcV6XJyLNoECPAqWVNby5Po8Fmdlk7SmiTYxxwdAkvpeWwrcGJhKjdkORiKBAj1DOOdbl\nHGJBxl6Wrd1HaVUt/RM78IuJp3DF6D5079jO6xJFJMAU6BGmqLSKpWtyWZCRzbb8EmLbxHDJab24\ndmwKo1Pj1W4oEsEU6BHA53N8vPMgCzKzeXfjF1TV+hiR0pWHrxjOpSN60al9G69LFJEWoEAPY3mH\nylmUmcOCzGxyisrpEtuG749LZVJ6Cqf00i3cRKKNAj3MVNf6WLFlPwszs/lw2358Ds4c0I3pE4Zw\n4dAk2rdRu6FItFKgh4ldBUdYkJnN4qxcDhypJKlzO+48dwDfS0shtZvaDUVEgR7SyqtqeWtDHgsy\nslm1u5CYVsb5Q3pw7dgUzh6YSOsY7TUuIv+iQA8BFdW15BSVkV1Yzt7CMrILy9hbWMYnOw9SUllD\nv+4dmHHxEK4c3Ycendp7Xa6IhCgFeguo9TnyDpWTXVhOdmEZ2UVl/s91AV5QUvm149u1bkVKQhwX\nDEtiUloKY/slqN1QRBqkQA8A5xyFpVVfBXR2YdnXrrj3FZdT43NfHd/KoFeXWFISYjl3UCKpCXGk\nJMSRkhBLSnwciZ3aKcBF5IQp0BuprKrma0si2f7A/vJxWVXt147v1qEtyQlxnJbchUtO61UX2PF1\nod27ayxttP4tIgGmQPerrvWRV1xRF9jfWBLJKSzjYGnV146PaxvzVUCfMaCb//G/rrK1d7iItLRm\npY6ZTQCeBGKA55xzjwakqiBwzlFwpLIuqI+6st7r/zrvUDlHrYrQupXRu2vdssiFw5JI/jKw42NJ\nTYgjoUNbLYuISEhpcqCbWQzwJ+ACIAfIMLNlzrnNgSruRJVUVH8V0DlF/+oWyS6q+7qi2ve14xM7\ntSMlPpb0vvGkJPQhJT6O5IS6wO7Zub3aAkUkrDTnCn0ssMM5twvAzOYDlwNBC/SqGh+5xV9fx875\ncl27qIzisuqvHd+pXWuSE+Lon9iBcwclfrUkkpoQR3J8nKYqRSSiNCfQ+wDZR32dA4xrXjnH9scV\n23ll1V6+OFyBO2pZpG1MK/rEx5Lif/PxyzceU/3B3SW2jZZFRCRqNCfQj5WU7t8OMpsGTANITU1t\n0omSOrdjfP9/vfH4ZWAndWpPK92cQUQEaF6g5wApR32dDOz75kHOuWeAZwDS0tL+LfAbY1J6KpPS\nm/aPgYhItGjOu34ZwEAz62dmbYFrgWWBKUtERE5Uk6/QnXM1ZvZD4F3q2hZnO+c2BawyERE5Ic3q\nQ3fOvQW8FaBaRESkGdRoLSISIRToIiIRQoEuIhIhFOgiIhFCgS4iEiHMuSbN+jTtZGYFwJ4m/nh3\n4EAAywkHes3RQa85OjTnNZ/knEts6KAWDfTmMLNM51ya13W0JL3m6KDXHB1a4jVryUVEJEIo0EVE\nIkQ4BfozXhfgAb3m6KDXHB2C/prDZg1dRESOL5yu0EVE5DjCItDNbIKZbTOzHWY2w+t6gs3MZpvZ\nfjPb6HUtLcHMUszsAzPbYmabzOxHXtcUbGbW3sxWmdk6/2t+0OuaWoqZxZjZGjN7w+taWoKZ7Taz\nDWa21swyg3quUF9y8d+M+jOOuhk1cJ2XN6MONjM7GzgCvOCcO9XreoLNzHoBvZxzq82sE5AFfDfC\n/4wN6OCcO2JmbYCPgB855/7pcWlBZ2Y/AdKAzs65S7yuJ9jMbDeQ5pwLet99OFyhf3UzaudcFfDl\nzagjlnNuJVDodR0txTmX55xb7X9cAmyh7p61EcvVOeL/so3/I7SvrgLAzJKB/wCe87qWSBQOgX6s\nm1FH9C97NDOzvsAo4FNvKwk+/9LDWmA/sNw5F/GvGfgDMB3weV1IC3LAX80sy3+P5aAJh0Bv1M2o\nJfyZWUdgMfBj59xhr+sJNudcrXNuJHX34x1rZhG9vGZmlwD7nXNZXtfSws50zo0GLgbu8i+pBkU4\nBHqjbkYt4c2/jrwYeMk5t8TrelqSc64Y+BCY4HEpwXYmcJl/TXk+8G0ze9HbkoLPObfP/3k/sJS6\nZeSgCIdA182oI5z/DcJZwBbn3O+9rqclmFmimXX1P44FvgNs9baq4HLO/dw5l+yc60vd7/H7zrnJ\nHpcVVGbWwf9GP2bWAbgQCFr3WsgHunOuBvjyZtRbgIWRfjNqM3sF+AQYbGY5ZjbV65qC7EzgBuqu\n2Nb6PyZ6XVSQ9QI+MLP11F20LHfORUUbX5RJAj4ys3XAKuBN59w7wTpZyLctiohI44T8FbqIiDSO\nAl1EJEIo0EVEIoQCXUQkQijQRUQihAJdRCRCKNBFRCKEAl1EJEL8H8Ew9ivee4KpAAAAAElFTkSu\nQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2fee543518>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"# ^-- this \"magic\" tells all future matplotlib plots to be drawn inside notebook and not in a separate window.\n",
"\n",
"# line plot\n",
"plt.plot([0, 1, 2, 3, 4, 5], [0, 1, 4, 9, 16, 25])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2fec9032e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# scatter-plot\n",
"plt.scatter([0, 1, 2, 3, 4, 5], [0, 1, 4, 9, 16, 25])\n",
"\n",
"plt.show() # show the first plot and begin drawing next one"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f2fe8fcaf28>"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2fe9023048>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# draw a scatter plot with custom markers and colors\n",
"plt.scatter([1, 1, 2, 3, 4, 4.5], [3, 2, 2, 5, 15, 24],\n",
" c=[\"red\", \"blue\", \"orange\", \"green\", \"cyan\", \"gray\"], marker=\"x\")\n",
"\n",
"# without .show(), several plots will be drawn on top of one another\n",
"plt.plot([0, 1, 2, 3, 4, 5], [0, 1, 4, 9, 16, 25], c=\"black\")\n",
"\n",
"# adding more sugar\n",
"plt.title(\"Conspiracy theory proven!!!\")\n",
"plt.xlabel(\"Per capita alcohol consumption\")\n",
"plt.ylabel(\"# Layers in state of the art image classifier\")\n",
"\n",
"# fun with correlations: http://bit.ly/1FcNnWF"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD8CAYAAABXe05zAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAACtpJREFUeJzt21+IZnd9x/HPt9kUNVpsySg2yXYsiK0INmUQ20Bpo5S0\nEdObQgRFirA3/ROLILE3pXcpFLEXpbDE1IBpRGJCJbHWoIYgtGmzSdombqSSppom7SaINelFbfTb\ni53ANs5mniRz5tnvzOsFwzzPs2ef8z07s+89+5tzqrsDwBw/su4BAHhxhBtgGOEGGEa4AYYRboBh\nhBtgGOEGGEa4AYYRboBhjizxphdeeGFvbm4u8dYAB9KJEyee6u6NVbZdJNybm5u59957l3hrgAOp\nqv5t1W0tlQAMI9wAwwg3wDDCDTCMcAMMs9JVJVX1aJKnk3w/ybPdvbXkUACc3Yu5HPBXuvupxSYB\nYCWWSgCGWTXcneSLVXWiqo4tORAAL2zVpZLLuvvxqnpdkjur6uHuvvvMDbaDfixJjh49usdjsoTN\na+9Y274fve7Kte0bplvpjLu7H9/+fCrJbUnevsM2x7t7q7u3NjZWut0egJdg13BX1QVV9ZrnHif5\n1SQPLj0YADtbZank9Uluq6rntv/L7v7ColMBcFa7hru7H0nytn2YBYAVuBwQYBjhBhhGuAGGEW6A\nYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGG\nEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGEW6AYVYOd1WdV1X3\nV9XtSw4EwAt7MWfc1yQ5udQgAKxmpXBX1cVJrkxy/bLjALCbVc+4P57kI0l+sOAsAKxg13BX1buT\nnOruE7tsd6yq7q2qe5988sk9GxCA/2+VM+7Lkrynqh5N8ukkl1fVp56/UXcf7+6t7t7a2NjY4zEB\neM6u4e7uj3b3xd29meTqJF/u7vctPhkAO3IdN8AwR17Mxt19V5K7FpkEgJU44wYYRrgBhhFugGGE\nG2AY4QYYRrgBhhFugGGEG2AY4QYYRrgBhhFugGGEG2AY4QYYRrgBhhFugGGEG2AY4QYYRrgBhhFu\ngGGEG2AY4QYYRrgBhhFugGGEG2AY4QYYRrgBhhFugGGEG2AY4QYYRrgBhhFugGGEG2AY4QYYZtdw\nV9Urqurvq+ofq+qhqvqj/RgMgJ0dWWGb/0lyeXc/U1XnJ/lqVf11d//dwrMBsINdw93dneSZ7afn\nb3/0kkMBcHYrrXFX1XlV9UCSU0nu7O57lh0LgLNZZakk3f39JD9XVa9NcltVvbW7Hzxzm6o6luRY\nkhw9enTPB13a5rV3rG3fj1535dr2fdis6+vsa8xeelFXlXT3d5LcleSKHX7teHdvdffWxsbGHo0H\nwPOtclXJxvaZdqrqlUneleThpQcDYGerLJW8IcmNVXVeTof+M919+7JjAXA2q1xV8k9JLt2HWQBY\ngTsnAYYRboBhhBtgGOEGGEa4AYYRboBhhBtgGOEGGEa4AYYRboBhhBtgGOEGGEa4AYYRboBhhBtg\nGOEGGEa4AYYRboBhhBtgGOEGGEa4AYYRboBhhBtgGOEGGEa4AYYRboBhhBtgGOEGGEa4AYYRboBh\nhBtgGOEGGGbXcFfVJVX1lao6WVUPVdU1+zEYADs7ssI2zyb5cHffV1WvSXKiqu7s7q8tPBsAO9j1\njLu7n+ju+7YfP53kZJKLlh4MgJ29qDXuqtpMcmmSe5YYBoDdrbJUkiSpqlcn+WySD3X3d3f49WNJ\njiXJ0aNH92zAw2Dz2jvWPcK+O4zHvC7r+rN+9Lor17Lf5OAf80pn3FV1fk5H+6buvnWnbbr7eHdv\ndffWxsbGXs4IwBlWuaqkknwiycnu/tjyIwHwQlY5474syfuTXF5VD2x//PrCcwFwFruucXf3V5PU\nPswCwArcOQkwjHADDCPcAMMIN8Awwg0wjHADDCPcAMMIN8Awwg0wjHADDCPcAMMIN8Awwg0wjHAD\nDCPcAMMIN8Awwg0wjHADDCPcAMMIN8Awwg0wjHADDCPcAMMIN8Awwg0wjHADDCPcAMMIN8Awwg0w\njHADDCPcAMMIN8Awwg0wzK7hrqobqupUVT24HwMB8MJWOeP+ZJIrFp4DgBXtGu7uvjvJt/dhFgBW\ncGSv3qiqjiU5liRHjx59ye+zee0dezUSnDMO4/f1YTzm/bJnP5zs7uPdvdXdWxsbG3v1tgA8j6tK\nAIYRboBhVrkc8OYkf5vkzVX1WFV9cPmxADibXX842d3v3Y9BAFiNpRKAYYQbYBjhBhhGuAGGEW6A\nYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGG\nEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGEW6AYYQbYBjhBhhGuAGGWSncVXVFVX29qr5R\nVdcuPRQAZ7druKvqvCR/luTXkrwlyXur6i1LDwbAzlY54357km909yPd/b0kn05y1bJjAXA2q4T7\noiTfOuP5Y9uvAbAGR1bYpnZ4rX9oo6pjSY5tP32mqr7+Eme6MMlTL/H3TuWYD77DdrzJITzm+uOX\ndcw/teqGq4T7sSSXnPH84iSPP3+j7j6e5PiqOz6bqrq3u7de7vtM4pgPvsN2vIljXtIqSyX/kORN\nVfXGqvrRJFcn+dyyYwFwNruecXf3s1X1O0n+Jsl5SW7o7ocWnwyAHa2yVJLu/nySzy88y3Ne9nLL\nQI754Dtsx5s45sVU9w/9nBGAc5hb3gGGOWfCfdhuq6+qS6rqK1V1sqoeqqpr1j3Tfqmq86rq/qq6\nfd2z7Ieqem1V3VJVD29/vX9h3TMtrap+f/v7+sGqurmqXrHumfZaVd1QVaeq6sEzXvuJqrqzqv5l\n+/OPL7HvcyLch/S2+meTfLi7fzbJO5L89iE45udck+TkuofYR3+a5Avd/TNJ3pYDfuxVdVGS30uy\n1d1vzemLGq5e71SL+GSSK5732rVJvtTdb0rype3ne+6cCHcO4W313f1Ed9+3/fjpnP7LfODvSK2q\ni5NcmeT6dc+yH6rqx5L8UpJPJEl3f6+7v7PeqfbFkSSvrKojSV6VHe79mK67707y7ee9fFWSG7cf\n35jkN5bY97kS7kN9W31VbSa5NMk9651kX3w8yUeS/GDdg+yTn07yZJK/2F4eur6qLlj3UEvq7n9P\n8idJvpnkiST/1d1fXO9U++b13f1EcvrkLMnrltjJuRLulW6rP4iq6tVJPpvkQ9393XXPs6SqeneS\nU919Yt2z7KMjSX4+yZ9396VJ/jsL/ff5XLG9rntVkjcm+ckkF1TV+9Y71cFyroR7pdvqD5qqOj+n\no31Td9+67nn2wWVJ3lNVj+b0ctjlVfWp9Y60uMeSPNbdz/1v6pacDvlB9q4k/9rdT3b3/ya5Nckv\nrnmm/fKfVfWGJNn+fGqJnZwr4T50t9VXVeX0uufJ7v7YuufZD9390e6+uLs3c/pr/OXuPtBnYt39\nH0m+VVVv3n7pnUm+tsaR9sM3k7yjql61/X3+zhzwH8ie4XNJPrD9+ANJ/mqJnax05+TSDult9Zcl\neX+Sf66qB7Zf+4Ptu1Q5WH43yU3bJyWPJPmtNc+zqO6+p6puSXJfTl89dX8O4F2UVXVzkl9OcmFV\nPZbkD5Ncl+QzVfXBnP4H7DcX2bc7JwFmOVeWSgBYkXADDCPcAMMIN8Awwg0wjHADDCPcAMMIN8Aw\n/wfyAUtpkLVzwQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2fe8f573c8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(array([ 4., 7., 5., 3., 3.]),\n",
" array([ 0., 2., 4., 6., 8., 10.]),\n",
" <a list of 5 Patch objects>)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2fe8ed0be0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# histogram - showing data density\n",
"plt.hist([0, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10])\n",
"plt.show()\n",
"\n",
"plt.hist([0, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4,\n",
" 4, 5, 5, 5, 6, 7, 7, 8, 9, 10], bins=5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# plot a histogram of age and a histogram of ticket fares on separate plots\n",
"\n",
"<YOUR CODE>\n",
"\n",
"# bonus: use tab shift-tab to see if there is a way to draw a 2D histogram of age vs fare."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# make a scatter plot of passenger age vs ticket fare\n",
"\n",
"<YOUR CODE>\n",
"\n",
"# kudos if you add separate colors for men and women"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Extended [tutorial](https://matplotlib.org/2.0.2/users/pyplot_tutorial.html)\n",
"* A [cheat sheet](http://bit.ly/2koHxNF)\n",
"* Other libraries for more sophisticated stuff: [Plotly](https://plot.ly/python/) and [Bokeh](https://bokeh.pydata.org/en/latest/)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Part V (final): machine learning with scikit-learn\n",
"\n",
"<img src='https://imgs.xkcd.com/comics/machine_learning.png' width=320px>\n",
"\n",
"Scikit-learn is _the_ tool for simple machine learning pipelines. \n",
"\n",
"It's a single library that unites a whole bunch of models under the common interface:\n",
"* Create: `model = sklearn.whatever.ModelNameHere(parameters_if_any)`\n",
"* Train: `model.fit(X, y)`\n",
"* Predict: `model.predict(X_test)`\n",
"\n",
"It also contains utilities for feature extraction, quality estimation or cross-validation."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test accuracy: 0.66\n"
]
}
],
"source": [
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"features = data[[\"Fare\", \"SibSp\"]].copy()\n",
"answers = data[\"Survived\"]\n",
"\n",
"model = RandomForestClassifier(n_estimators=100)\n",
"model.fit(features[:-100], answers[:-100])\n",
"\n",
"test_predictions = model.predict(features[-100:])\n",
"print(\"Test accuracy:\", accuracy_score(answers[-100:], test_predictions))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Final quest: add more features to achieve accuracy of at least 0.80\n",
"\n",
"__Hint:__ for string features like \"Sex\" or \"Embarked\" you will have to compute some kind of numeric representation.\n",
"For example, 1 if male and 0 if female or vice versa \n",
"\n",
"__Hint II:__ you can use `model.feature_importances_` to get a hint on how much did it rely each of your features."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here are more resources for sklearn:\n",
"\n",
"* [Tutorials](http://scikit-learn.org/stable/tutorial/index.html)\n",
"* [Examples](http://scikit-learn.org/stable/auto_examples/index.html)\n",
"* [Cheat sheet](http://scikit-learn.org/stable/_static/ml_map.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"\n",
"Okay, here's what we've learned: to survive a shipwreck you need to become an underaged girl with parents on the ship. Be sure to use this helpful advice next time you find yourself in a shipwreck."
]
}
],
"metadata": {
"language_info": {
"name": "python",
"pygments_lexer": "ipython3"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
================================================
FILE: week01_intro/primer_python_for_ml/train.csv
================================================
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S
6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q
7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S
8,0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S
9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S
10,1,2,"Nasser, Mrs. Nicholas (Adele Achem)",female,14,1,0,237736,30.0708,,C
11,1,3,"Sandstrom, Miss. Marguerite Rut",female,4,1,1,PP 9549,16.7,G6,S
12,1,1,"Bonnell, Miss. Elizabeth",female,58,0,0,113783,26.55,C103,S
13,0,3,"Saundercock, Mr. William Henry",male,20,0,0,A/5. 2151,8.05,,S
14,0,3,"Andersson, Mr. Anders Johan",male,39,1,5,347082,31.275,,S
15,0,3,"Vestrom, Miss. Hulda Amanda Adolfina",female,14,0,0,350406,7.8542,,S
16,1,2,"Hewlett, Mrs. (Mary D Kingcome) ",female,55,0,0,248706,16,,S
17,0,3,"Rice, Master. Eugene",male,2,4,1,382652,29.125,,Q
18,1,2,"Williams, Mr. Charles Eugene",male,,0,0,244373,13,,S
19,0,3,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)",female,31,1,0,345763,18,,S
20,1,3,"Masselmani, Mrs. Fatima",female,,0,0,2649,7.225,,C
21,0,2,"Fynney, Mr. Joseph J",male,35,0,0,239865,26,,S
22,1,2,"Beesley, Mr. Lawrence",male,34,0,0,248698,13,D56,S
23,1,3,"McGowan, Miss. Anna ""Annie""",female,15,0,0,330923,8.0292,,Q
24,1,1,"Sloper, Mr. William Thompson",male,28,0,0,113788,35.5,A6,S
25,0,3,"Palsson, Miss. Torborg Danira",female,8,3,1,349909,21.075,,S
26,1,3,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)",female,38,1,5,347077,31.3875,,S
27,0,3,"Emir, Mr. Farred Chehab",male,,0,0,2631,7.225,,C
28,0,1,"Fortune, Mr. Charles Alexander",male,19,3,2,19950,263,C23 C25 C27,S
29,1,3,"O'Dwyer, Miss. Ellen ""Nellie""",female,,0,0,330959,7.8792,,Q
30,0,3,"Todoroff, Mr. Lalio",male,,0,0,349216,7.8958,,S
31,0,1,"Uruchurtu, Don. Manuel E",male,40,0,0,PC 17601,27.7208,,C
32,1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)",female,,1,0,PC 17569,146.5208,B78,C
33,1,3,"Glynn, Miss. Mary Agatha",female,,0,0,335677,7.75,,Q
34,0,2,"Wheadon, Mr. Edward H",male,66,0,0,C.A. 24579,10.5,,S
35,0,1,"Meyer, Mr. Edgar Joseph",male,28,1,0,PC 17604,82.1708,,C
36,0,1,"Holverson, Mr. Alexander Oskar",male,42,1,0,113789,52,,S
37,1,3,"Mamee, Mr. Hanna",male,,0,0,2677,7.2292,,C
38,0,3,"Cann, Mr. Ernest Charles",male,21,0,0,A./5. 2152,8.05,,S
39,0,3,"Vander Planke, Miss. Augusta Maria",female,18,2,0,345764,18,,S
40,1,3,"Nicola-Yarred, Miss. Jamila",female,14,1,0,2651,11.2417,,C
41,0,3,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)",female,40,1,0,7546,9.475,,S
42,0,2,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)",female,27,1,0,11668,21,,S
43,0,3,"Kraeff, Mr. Theodor",male,,0,0,349253,7.8958,,C
44,1,2,"Laroche, Miss. Simonne Marie Anne Andree",female,3,1,2,SC/Paris 2123,41.5792,,C
45,1,3,"Devaney, Miss. Margaret Delia",female,19,0,0,330958,7.8792,,Q
46,0,3,"Rogers, Mr. William John",male,,0,0,S.C./A.4. 23567,8.05,,S
47,0,3,"Lennon, Mr. Denis",male,,1,0,370371,15.5,,Q
48,1,3,"O'Driscoll, Miss. Bridget",female,,0,0,14311,7.75,,Q
49,0,3,"Samaan, Mr. Youssef",male,,2,0,2662,21.6792,,C
50,0,3,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)",female,18,1,0,349237,17.8,,S
51,0,3,"Panula, Master. Juha Niilo",male,7,4,1,3101295,39.6875,,S
52,0,3,"Nosworthy, Mr. Richard Cater",male,21,0,0,A/4. 39886,7.8,,S
53,1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)",female,49,1,0,PC 17572,76.7292,D33,C
54,1,2,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)",female,29,1,0,2926,26,,S
55,0,1,"Ostby, Mr. Engelhart Cornelius",male,65,0,1,113509,61.9792,B30,C
56,1,1,"Woolner, Mr. Hugh",male,,0,0,19947,35.5,C52,S
57,1,2,"Rugg, Miss. Emily",female,21,0,0,C.A. 31026,10.5,,S
58,0,3,"Novel, Mr. Mansouer",male,28.5,0,0,2697,7.2292,,C
59,1,2,"West, Miss. Constance Mirium",female,5,1,2,C.A. 34651,27.75,,S
60,0,3,"Goodwin, Master. William Frederick",male,11,5,2,CA 2144,46.9,,S
61,0,3,"Sirayanian, Mr. Orsen",male,22,0,0,2669,7.2292,,C
62,1,1,"Icard, Miss. Amelie",female,38,0,0,113572,80,B28,
63,0,1,"Harris, Mr. Henry Birkhardt",male,45,1,0,36973,83.475,C83,S
64,0,3,"Skoog, Master. Harald",male,4,3,2,347088,27.9,,S
65,0,1,"Stewart, Mr. Albert A",male,,0,0,PC 17605,27.7208,,C
66,1,3,"Moubarek, Master. Gerios",male,,1,1,2661,15.2458,,C
67,1,2,"Nye, Mrs. (Elizabeth Ramell)",female,29,0,0,C.A. 29395,10.5,F33,S
68,0,3,"Crease, Mr. Ernest James",male,19,0,0,S.P. 3464,8.1583,,S
69,1,3,"Andersson, Miss. Erna Alexandra",female,17,4,2,3101281,7.925,,S
70,0,3,"Kink, Mr. Vincenz",male,26,2,0,315151,8.6625,,S
71,0,2,"Jenkin, Mr. Stephen Curnow",male,32,0,0,C.A. 33111,10.5,,S
72,0,3,"Goodwin, Miss. Lillian Amy",female,16,5,2,CA 2144,46.9,,S
73,0,2,"Hood, Mr. Ambrose Jr",male,21,0,0,S.O.C. 14879,73.5,,S
74,0,3,"Chronopoulos, Mr. Apostolos",male,26,1,0,2680,14.4542,,C
75,1,3,"Bing, Mr. Lee",male,32,0,0,1601,56.4958,,S
76,0,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S
77,0,3,"Staneff, Mr. Ivan",male,,0,0,349208,7.8958,,S
78,0,3,"Moutal, Mr. Rahamin Haim",male,,0,0,374746,8.05,,S
79,1,2,"Caldwell, Master. Alden Gates",male,0.83,0,2,248738,29,,S
80,1,3,"Dowdell, Miss. Elizabeth",female,30,0,0,364516,12.475,,S
81,0,3,"Waelens, Mr. Achille",male,22,0,0,345767,9,,S
82,1,3,"Sheerlinck, Mr. Jan Baptist",male,29,0,0,345779,9.5,,S
83,1,3,"McDermott, Miss. Brigdet Delia",female,,0,0,330932,7.7875,,Q
84,0,1,"Carrau, Mr. Francisco M",male,28,0,0,113059,47.1,,S
85,1,2,"Ilett, Miss. Bertha",female,17,0,0,SO/C 14885,10.5,,S
86,1,3,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)",female,33,3,0,3101278,15.85,,S
87,0,3,"Ford, Mr. William Neal",male,16,1,3,W./C. 6608,34.375,,S
88,0,3,"Slocovski, Mr. Selman Francis",male,,0,0,SOTON/OQ 392086,8.05,,S
89,1,1,"Fortune, Miss. Mabel Helen",female,23,3,2,19950,263,C23 C25 C27,S
90,0,3,"Celotti, Mr. Francesco",male,24,0,0,343275,8.05,,S
91,0,3,"Christmann, Mr. Emil",male,29,0,0,343276,8.05,,S
92,0,3,"Andreasson, Mr. Paul Edvin",male,20,0,0,347466,7.8542,,S
93,0,1,"Chaffee, Mr. Herbert Fuller",male,46,1,0,W.E.P. 5734,61.175,E31,S
94,0,3,"Dean, Mr. Bertram Frank",male,26,1,2,C.A. 2315,20.575,,S
95,0,3,"Coxon, Mr. Daniel",male,59,0,0,364500,7.25,,S
96,0,3,"Shorney, Mr. Charles Joseph",male,,0,0,374910,8.05,,S
97,0,1,"Goldschmidt, Mr. George B",male,71,0,0,PC 17754,34.6542,A5,C
98,1,1,"Greenfield, Mr. William Bertram",male,23,0,1,PC 17759,63.3583,D10 D12,C
99,1,2,"Doling, Mrs. John T (Ada Julia Bone)",female,34,0,1,231919,23,,S
100,0,2,"Kantor, Mr. Sinai",male,34,1,0,244367,26,,S
101,0,3,"Petranec, Miss. Matilda",female,28,0,0,349245,7.8958,,S
102,0,3,"Petroff, Mr. Pastcho (""Pentcho"")",male,,0,0,349215,7.8958,,S
103,0,1,"White, Mr. Richard Frasar",male,21,0,1,35281,77.2875,D26,S
104,0,3,"Johansson, Mr. Gustaf Joel",male,33,0,0,7540,8.6542,,S
105,0,3,"Gustafsson, Mr. Anders Vilhelm",male,37,2,0,3101276,7.925,,S
106,0,3,"Mionoff, Mr. Stoytcho",male,28,0,0,349207,7.8958,,S
107,1,3,"Salkjelsvik, Miss. Anna Kristine",female,21,0,0,343120,7.65,,S
108,1,3,"Moss, Mr. Albert Johan",male,,0,0,312991,7.775,,S
109,0,3,"Rekic, Mr. Tido",male,38,0,0,349249,7.8958,,S
110,1,3,"Moran, Miss. Bertha",female,,1,0,371110,24.15,,Q
111,0,1,"Porter, Mr. Walter Chamberlain",male,47,0,0,110465,52,C110,S
112,0,3,"Zabour, Miss. Hileni",female,14.5,1,0,2665,14.4542,,C
113,0,3,"Barton, Mr. David John",male,22,0,0,324669,8.05,,S
114,0,3,"Jussila, Miss. Katriina",female,20,1,0,4136,9.825,,S
115,0,3,"Attalah, Miss. Malake",female,17,0,0,2627,14.4583,,C
116,0,3,"Pekoniemi, Mr. Edvard",male,21,0,0,STON/O 2. 3101294,7.925,,S
117,0,3,"Connors, Mr. Patrick",male,70.5,0,0,370369,7.75,,Q
118,0,2,"Turpin, Mr. William John Robert",male,29,1,0,11668,21,,S
119,0,1,"Baxter, Mr. Quigg Edmond",male,24,0,1,PC 17558,247.5208,B58 B60,C
120,0,3,"Andersson, Miss. Ellis Anna Maria",female,2,4,2,347082,31.275,,S
121,0,2,"Hickman, Mr. Stanley George",male,21,2,0,S.O.C. 14879,73.5,,S
122,0,3,"Moore, Mr. Leonard Charles",male,,0,0,A4. 54510,8.05,,S
123,0,2,"Nasser, Mr. Nicholas",male,32.5,1,0,237736,30.0708,,C
124,1,2,"Webber, Miss. Susan",female,32.5,0,0,27267,13,E101,S
125,0,1,"White, Mr. Percival Wayland",male,54,0,1,35281,77.2875,D26,S
126,1,3,"Nicola-Yarred, Master. Elias",male,12,1,0,2651,11.2417,,C
127,0,3,"McMahon, Mr. Martin",male,,0,0,370372,7.75,,Q
128,1,3,"Madsen, Mr. Fridtjof Arne",male,24,0,0,C 17369,7.1417,,S
129,1,3,"Peter, Miss. Anna",female,,1,1,2668,22.3583,F E69,C
130,0,3,"Ekstrom, Mr. Johan",male,45,0,0,347061,6.975,,S
131,0,3,"Drazenoic, Mr. Jozef",male,33,0,0,349241,7.8958,,C
132,0,3,"Coelho, Mr. Domingos Fernandeo",male,20,0,0,SOTON/O.Q. 3101307,7.05,,S
133,0,3,"Robins, Mrs. Alexander A (Grace Charity Laury)",female,47,1,0,A/5. 3337,14.5,,S
134,1,2,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)",female,29,1,0,228414,26,,S
135,0,2,"Sobey, Mr. Samuel James Hayden",male,25,0,0,C.A. 29178,13,,S
136,0,2,"Richard, Mr. Emile",male,23,0,0,SC/PARIS 2133,15.0458,,C
137,1,1,"Newsom, Miss. Helen Monypeny",female,19,0,2,11752,26.2833,D47,S
138,0,1,"Futrelle, Mr. Jacques Heath",male,37,1,0,113803,53.1,C123,S
139,0,3,"Osen, Mr. Olaf Elon",male,16,0,0,7534,9.2167,,S
140,0,1,"Giglio, Mr. Victor",male,24,0,0,PC 17593,79.2,B86,C
141,0,3,"Boulos, Mrs. Joseph (Sultana)",female,,0,2,2678,15.2458,,C
142,1,3,"Nysten, Miss. Anna Sofia",female,22,0,0,347081,7.75,,S
143,1,3,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)",female,24,1,0,STON/O2. 3101279,15.85,,S
144,0,3,"Burke, Mr. Jeremiah",male,19,0,0,365222,6.75,,Q
145,0,2,"Andrew, Mr. Edgardo Samuel",male,18,0,0,231945,11.5,,S
146,0,2,"Nicholls, Mr. Joseph Charles",male,19,1,1,C.A. 33112,36.75,,S
147,1,3,"Andersson, Mr. August Edvard (""Wennerstrom"")",male,27,0,0,350043,7.7958,,S
148,0,3,"Ford, Miss. Robina Maggie ""Ruby""",female,9,2,2,W./C. 6608,34.375,,S
149,0,2,"Navratil, Mr. Michel (""Louis M Hoffman"")",male,36.5,0,2,230080,26,F2,S
150,0,2,"Byles, Rev. Thomas Roussel Davids",male,42,0,0,244310,13,,S
151,0,2,"Bateman, Rev. Robert James",male,51,0,0,S.O.P. 1166,12.525,,S
152,1,1,"Pears, Mrs. Thomas (Edith Wearne)",female,22,1,0,113776,66.6,C2,S
153,0,3,"Meo, Mr. Alfonzo",male,55.5,0,0,A.5. 11206,8.05,,S
154,0,3,"van Billiard, Mr. Austin Blyler",male,40.5,0,2,A/5. 851,14.5,,S
155,0,3,"Olsen, Mr. Ole Martin",male,,0,0,Fa 265302,7.3125,,S
156,0,1,"Williams, Mr. Charles Duane",male,51,0,1,PC 17597,61.3792,,C
157,1,3,"Gilnagh, Miss. Katherine ""Katie""",female,16,0,0,35851,7.7333,,Q
158,0,3,"Corn, Mr. Harry",male,30,0,0,SOTON/OQ 392090,8.05,,S
159,0,3,"Smiljanic, Mr. Mile",male,,0,0,315037,8.6625,,S
160,0,3,"Sage, Master. Thomas Henry",male,,8,2,CA. 2343,69.55,,S
161,0,3,"Cribb, Mr. John Hatfield",male,44,0,1,371362,16.1,,S
162,1,2,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)",female,40,0,0,C.A. 33595,15.75,,S
163,0,3,"Bengtsson, Mr. John Viktor",male,26,0,0,347068,7.775,,S
164,0,3,"Calic, Mr. Jovo",male,17,0,0,315093,8.6625,,S
165,0,3,"Panula, Master. Eino Viljami",male,1,4,1,3101295,39.6875,,S
166,1,3,"Goldsmith, Master. Frank John William ""Frankie""",male,9,0,2,363291,20.525,,S
167,1,1,"Chibnall, Mrs. (Edith Martha Bowerman)",female,,0,1,113505,55,E33,S
168,0,3,"Skoog, Mrs. William (Anna Bernhardina Karlsson)",female,45,1,4,347088,27.9,,S
169,0,1,"Baumann, Mr. John D",male,,0,0,PC 17318,25.925,,S
170,0,3,"Ling, Mr. Lee",male,28,0,0,1601,56.4958,,S
171,0,1,"Van der hoef, Mr. Wyckoff",male,61,0,0,111240,33.5,B19,S
172,0,3,"Rice, Master. Arthur",male,4,4,1,382652,29.125,,Q
173,1,3,"Johnson, Miss. Eleanor Ileen",female,1,1,1,347742,11.1333,,S
174,0,3,"Sivola, Mr. Antti Wilhelm",male,21,0,0,STON/O 2. 3101280,7.925,,S
175,0,1,"Smith, Mr. James Clinch",male,56,0,0,17764,30.6958,A7,C
176,0,3,"Klasen, Mr. Klas Albin",male,18,1,1,350404,7.8542,,S
177,0,3,"Lefebre, Master. Henry Forbes",male,,3,1,4133,25.4667,,S
178,0,1,"Isham, Miss. Ann Elizabeth",female,50,0,0,PC 17595,28.7125,C49,C
179,0,2,"Hale, Mr. Reginald",male,30,0,0,250653,13,,S
180,0,3,"Leonard, Mr. Lionel",male,36,0,0,LINE,0,,S
181,0,3,"Sage, Miss. Constance Gladys",female,,8,2,CA. 2343,69.55,,S
182,0,2,"Pernot, Mr. Rene",male,,0,0,SC/PARIS 2131,15.05,,C
183,0,3,"Asplund, Master. Clarence Gustaf Hugo",male,9,4,2,347077,31.3875,,S
184,1,2,"Becker, Master. Richard F",male,1,2,1,230136,39,F4,S
185,1,3,"Kink-Heilmann, Miss. Luise Gretchen",female,4,0,2,315153,22.025,,S
186,0,1,"Rood, Mr. Hugh Roscoe",male,,0,0,113767,50,A32,S
187,1,3,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)",female,,1,0,370365,15.5,,Q
188,1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")",male,45,0,0,111428,26.55,,S
189,0,3,"Bourke, Mr. John",male,40,1,1,364849,15.5,,Q
190,0,3,"Turcin, Mr. Stjepan",male,36,0,0,349247,7.8958,,S
191,1,2,"Pinsky, Mrs. (Rosa)",female,32,0,0,234604,13,,S
192,0,2,"Carbines, Mr. William",male,19,0,0,28424,13,,S
193,1,3,"Andersen-Jensen, Miss. Carla Christine Nielsine",female,19,1,0,350046,7.8542,,S
194,1,2,"Navratil, Master. Michel M",male,3,1,1,230080,26,F2,S
195,1,1,"Brown, Mrs. James Joseph (Margaret Tobin)",female,44,0,0,PC 17610,27.7208,B4,C
196,1,1,"Lurette, Miss. Elise",female,58,0,0,PC 17569,146.5208,B80,C
197,0,3,"Mernagh, Mr. Robert",male,,0,0,368703,7.75,,Q
198,0,3,"Olsen, Mr. Karl Siegwart Andreas",male,42,0,1,4579,8.4042,,S
199,1,3,"Madigan, Miss. Margaret ""Maggie""",female,,0,0,370370,7.75,,Q
200,0,2,"Yrois, Miss. Henriette (""Mrs Harbeck"")",female,24,0,0,248747,13,,S
201,0,3,"Vande Walle, Mr. Nestor Cyriel",male,28,0,0,345770,9.5,,S
202,0,3,"Sage, Mr. Frederick",male,,8,2,CA. 2343,69.55,,S
203,0,3,"Johanson, Mr. Jakob Alfred",male,34,0,0,3101264,6.4958,,S
204,0,3,"Youseff, Mr. Gerious",male,45.5,0,0,2628,7.225,,C
205,1,3,"Cohen, Mr. Gurshon ""Gus""",male,18,0,0,A/5 3540,8.05,,S
206,0,3,"Strom, Miss. Telma Matilda",female,2,0,1,347054,10.4625,G6,S
207,0,3,"Backstrom, Mr. Karl Alfred",male,32,1,0,3101278,15.85,,S
208,1,3,"Albimona, Mr. Nassef Cassem",male,26,0,0,2699,18.7875,,C
209,1,3,"Carr, Miss. Helen ""Ellen""",female,16,0,0,367231,7.75,,Q
210,1,1,"Blank, Mr. Henry",male,40,0,0,112277,31,A31,C
211,0,3,"Al
gitextract_0vwfat_i/ ├── .gitignore ├── Amazon GPU howto.md ├── LICENSE.md ├── README.md ├── docker/ │ ├── Dockerfile │ ├── README.md │ ├── deeplearning.yaml │ └── run_jupyter.sh ├── setup_colab.sh ├── week01_intro/ │ ├── README.md │ ├── crossentropy_method.ipynb │ ├── deep_crossentropy_method.ipynb │ ├── pong.py │ ├── primer_python_for_ml/ │ │ ├── recap_ml.ipynb │ │ └── train.csv │ ├── project_starter_evolution_strategies.ipynb │ ├── seminar-es-task.ipynb │ └── seminar_gymnasium_interface.ipynb ├── week02_value_based/ │ ├── README.md │ ├── mdp.py │ └── seminar_vi.ipynb ├── week03_model_free/ │ ├── README.md │ └── homework.ipynb ├── week04_[recap]_deep_learning/ │ ├── README.md │ ├── mnist.py │ ├── notmnist.py │ ├── seminar_pytorch.ipynb │ └── seminar_tensorflow.ipynb ├── week04_approx_rl/ │ ├── README.md │ ├── dqn/ │ │ ├── __init__.py │ │ ├── analysis.py │ │ ├── atari_wrappers.py │ │ ├── logger.py │ │ ├── replay_buffer.py │ │ └── utils.py │ ├── homework_pytorch_debug.ipynb │ ├── homework_pytorch_main.ipynb │ ├── homework_tf.ipynb │ ├── requirements.txt │ ├── seminar_pytorch.ipynb │ ├── seminar_tf.ipynb │ └── test_td_loss/ │ └── compute_td_loss.py ├── week05_explore/ │ ├── README.md │ ├── q_learning_agent.py │ ├── replay_buffer.py │ └── week5.ipynb ├── week06_policy_based/ │ ├── README.md │ ├── a2c-optional.ipynb │ ├── atari_wrappers.py │ ├── env_batch.py │ ├── reinforce_pytorch.ipynb │ ├── reinforce_tensorflow.ipynb │ └── runners.py ├── week07_[recap]_rnn/ │ ├── README.md │ ├── arxiv_data.csv │ ├── mtg_card_names.txt │ ├── names │ ├── seminar_pytorch.ipynb │ └── seminar_tf.ipynb ├── week07_seq2seq/ │ ├── README.md │ ├── basic_model_tf.py │ ├── basic_model_torch.py │ ├── bonus_pytorch.ipynb │ ├── he-pron-wiktionary.txt │ ├── main_dataset.txt │ ├── practice_tf.ipynb │ ├── practice_torch.ipynb │ └── voc.py ├── week08_pomdp/ │ ├── README.md │ ├── atari_util.py │ ├── env_pool.py │ ├── practice_pytorch.ipynb │ └── practice_tensorflow.ipynb ├── week09_policy_II/ │ ├── README.md │ ├── mujoco_wrappers.py │ ├── ppo.ipynb │ ├── seminar_TRPO_pytorch.ipynb │ ├── seminar_TRPO_tensorflow.ipynb │ ├── td3_and_sac/ │ │ ├── hw-continuous-control_pytorch.ipynb │ │ └── logger.py │ └── test_ppo/ │ ├── actions.npy │ ├── advantages.npy │ ├── log_probs.npy │ ├── observations.npy │ ├── policy │ ├── resets.npy │ ├── rewards.npy │ ├── state.npy │ ├── value_targets.npy │ └── values.npy ├── week10_planning/ │ ├── README.md │ └── seminar_MCTS.ipynb ├── xvfb ├── yet_another_week/ │ ├── README.md │ └── _resource/ │ ├── README.md │ ├── a3c_scheme.odp │ ├── conv_salary_architecture.odp │ ├── dqn_arch.odp │ ├── exp_replay.odp │ ├── nnet_arch.odp │ ├── pomdp_arch.odp │ ├── qlearning_scheme.odp │ ├── qlearning_scheme.pgm │ └── target_net.odp └── youtube_dl_lectures.sh
SYMBOL INDEX (210 symbols across 22 files)
FILE: week01_intro/pong.py
function make_pong (line 9) | def make_pong():
class PreprocessAtari (line 14) | class PreprocessAtari(Wrapper):
method __init__ (line 15) | def __init__(self, env, height=42, width=42,
method reset (line 24) | def reset(self):
method step (line 30) | def step(self, action):
method update_buffer (line 38) | def update_buffer(self, img):
method preproc_image (line 42) | def preproc_image(self, img):
FILE: week02_value_based/mdp.py
class MDP (line 15) | class MDP:
method __init__ (line 16) | def __init__(self, transition_probs, rewards, initial_state=None, seed...
method get_all_states (line 59) | def get_all_states(self):
method get_possible_actions (line 63) | def get_possible_actions(self, state):
method is_terminal (line 67) | def is_terminal(self, state):
method get_next_states (line 71) | def get_next_states(self, state, action):
method get_transition_prob (line 76) | def get_transition_prob(self, state, action, next_state):
method get_reward (line 80) | def get_reward(self, state, action, next_state):
method reset (line 85) | def reset(self):
method step (line 99) | def step(self, action):
method render (line 108) | def render(self):
method _check_param_consistency (line 111) | def _check_param_consistency(self, transition_probs, rewards):
class FrozenLakeEnv (line 140) | class FrozenLakeEnv(MDP):
method __init__ (line 185) | def __init__(self, desc=None, map_name="4x4", slip_chance=0.2, seed=No...
method render (line 246) | def render(self):
function plot_graph (line 252) | def plot_graph(mdp, s_node_size='1,5',
function plot_graph_with_state_values (line 324) | def plot_graph_with_state_values(mdp, state_values):
function get_optimal_action_for_plot (line 333) | def get_optimal_action_for_plot(mdp, state_values, state, get_action_val...
function plot_graph_optimal_strategy_and_state_values (line 343) | def plot_graph_optimal_strategy_and_state_values(mdp, state_values, get_...
FILE: week04_[recap]_deep_learning/mnist.py
function load_dataset (line 8) | def load_dataset():
FILE: week04_[recap]_deep_learning/notmnist.py
function load_notmnist (line 10) | def load_notmnist(path='./notMNIST_small', letters='ABCDEFGHIJ',
FILE: week04_approx_rl/dqn/analysis.py
function play_and_log_episode (line 7) | def play_and_log_episode(env, agent, t_max=10000):
FILE: week04_approx_rl/dqn/atari_wrappers.py
class FireResetEnv (line 6) | class FireResetEnv(Wrapper):
method __init__ (line 7) | def __init__(self, env):
method reset (line 13) | def reset(self, **kwargs):
class EpisodicLifeEnv (line 24) | class EpisodicLifeEnv(Wrapper):
method __init__ (line 25) | def __init__(self, env):
method step (line 33) | def step(self, action):
method reset (line 47) | def reset(self, **kwargs):
FILE: week04_approx_rl/dqn/logger.py
class Logger (line 5) | class Logger:
method __init__ (line 6) | def __init__(self, use_tensorboard=True, log_dir='runs'):
method log_loss (line 23) | def log_loss(self, loss, step):
method log_grad_norm (line 29) | def log_grad_norm(self, grad_norm, step):
method log_mean_reward (line 35) | def log_mean_reward(self, mean_reward, step):
method log_initial_state_v (line 41) | def log_initial_state_v(self, initial_v, step):
method plot (line 47) | def plot(self):
method close (line 78) | def close(self):
FILE: week04_approx_rl/dqn/replay_buffer.py
class ReplayBuffer (line 7) | class ReplayBuffer(object):
method __init__ (line 8) | def __init__(self, size):
method __len__ (line 20) | def __len__(self):
method add (line 23) | def add(self, obs_t, action, reward, obs_tp1, done):
method _encode_sample (line 32) | def _encode_sample(self, idxes):
method sample (line 50) | def sample(self, batch_size):
class LazyFramesVectorReplayBuffer (line 74) | class LazyFramesVectorReplayBuffer(ReplayBuffer):
method _encode_sample (line 94) | def _encode_sample(self, idxes):
FILE: week04_approx_rl/dqn/utils.py
function is_enough_ram (line 4) | def is_enough_ram(min_available_gb=0.1):
function linear_decay (line 9) | def linear_decay(
FILE: week04_approx_rl/test_td_loss/compute_td_loss.py
class ComputeTdLossProtocol (line 6) | class ComputeTdLossProtocol(Protocol):
method __call__ (line 11) | def __call__(
class MockAgent (line 25) | class MockAgent(nn.Module):
method __init__ (line 31) | def __init__(self, output_q_values: torch.Tensor):
method forward (line 37) | def forward(self, state):
function test_is_done_is_used (line 42) | def test_is_done_is_used(compute_td_loss: ComputeTdLossProtocol):
function test_compute_td_loss_vanilla (line 81) | def test_compute_td_loss_vanilla(compute_td_loss: ComputeTdLossProtocol):
function test_compute_td_loss_double (line 145) | def test_compute_td_loss_double(compute_td_loss: ComputeTdLossProtocol):
FILE: week05_explore/q_learning_agent.py
class QLearningAgent (line 7) | class QLearningAgent:
method __init__ (line 8) | def __init__(self, alpha, epsilon, discount, get_legal_actions):
method get_qvalue (line 35) | def get_qvalue(self, state, action):
method set_qvalue (line 39) | def set_qvalue(self, state, action, value):
method get_value (line 43) | def get_value(self, state):
method update (line 58) | def update(self, state, action, reward, next_state, done):
method get_best_action (line 73) | def get_best_action(self, state):
method get_action (line 87) | def get_action(self, state):
FILE: week05_explore/replay_buffer.py
class ReplayBuffer (line 7) | class ReplayBuffer(object):
method __init__ (line 8) | def __init__(self, size):
method __len__ (line 20) | def __len__(self):
method add (line 23) | def add(self, obs_t, action, reward, obs_tp1, done):
method _encode_sample (line 32) | def _encode_sample(self, idxes):
method sample (line 50) | def sample(self, batch_size):
FILE: week06_policy_based/atari_wrappers.py
class EpisodicLife (line 18) | class EpisodicLife(Wrapper):
method __init__ (line 21) | def __init__(self, env):
method step (line 26) | def step(self, action):
method reset (line 36) | def reset(self, **kwargs):
class FireReset (line 47) | class FireReset(Wrapper):
method __init__ (line 54) | def __init__(self, env):
method step (line 68) | def step(self, action):
method reset (line 71) | def reset(self, **kwargs):
class StartWithRandomActions (line 82) | class StartWithRandomActions(Wrapper):
method __init__ (line 86) | def __init__(self, env, max_random_actions=30):
method step (line 91) | def step(self, action):
method reset (line 96) | def reset(self, **kwargs):
class ImagePreprocessing (line 108) | class ImagePreprocessing(ObservationWrapper):
method __init__ (line 111) | def __init__(self, env, height=84, width=84, grayscale=True):
method observation (line 133) | def observation(self, observation):
class MaxBetweenFrames (line 141) | class MaxBetweenFrames(ObservationWrapper):
method __init__ (line 144) | def __init__(self, env):
method observation (line 150) | def observation(self, observation):
method reset (line 155) | def reset(self, **kwargs):
class QueueFrames (line 160) | class QueueFrames(ObservationWrapper):
method __init__ (line 163) | def __init__(self, env, nframes, concat=False):
method observation (line 176) | def observation(self, observation):
method reset (line 184) | def reset(self, **kwargs):
class SkipFrames (line 191) | class SkipFrames(Wrapper):
method __init__ (line 194) | def __init__(self, env, nskip=4):
method step (line 200) | def step(self, action):
method reset (line 209) | def reset(self, **kwargs):
class ClipReward (line 213) | class ClipReward(RewardWrapper):
method reward (line 216) | def reward(self, reward):
class SwapImageAxes (line 220) | class SwapImageAxes(ObservationWrapper):
method __init__ (line 225) | def __init__(self, env):
method observation (line 235) | def observation(self, observation):
class SummariesBase (line 239) | class SummariesBase(Wrapper):
method __init__ (line 242) | def __init__(self, env, prefix=None, running_mean_size=100, step_var=N...
method should_write_summaries (line 256) | def should_write_summaries(self):
method add_summaries (line 260) | def add_summaries(self):
method step (line 282) | def step(self, action):
method reset (line 310) | def reset(self, **kwargs):
class TensorboardSummaries (line 317) | class TensorboardSummaries(SummariesBase):
method __init__ (line 320) | def __init__(self, env, prefix=None, running_mean_size=100, step_var=N...
method add_summary (line 324) | def add_summary(self, name, value):
class NumpySummaries (line 331) | class NumpySummaries(SummariesBase):
method get_values (line 336) | def get_values(cls, name):
method clear (line 340) | def clear(cls):
method __init__ (line 343) | def __init__(self, env, prefix=None, running_mean_size=100, step_var=N...
method add_summary (line 346) | def add_summary(self, name, value):
function get_summaries_class (line 350) | def get_summaries_class(summaries):
class _thunk (line 364) | class _thunk:
method __init__ (line 365) | def __init__(self, i, env_id, **kwargs):
method __call__ (line 370) | def __call__(self):
function nature_dqn_env (line 379) | def nature_dqn_env(env_id, nenvs=None, seed=None, summaries="Numpy", cli...
FILE: week06_policy_based/env_batch.py
class SpaceBatch (line 9) | class SpaceBatch(Space):
method __init__ (line 10) | def __init__(self, spaces):
method sample (line 37) | def sample(self):
method __getattr__ (line 40) | def __getattr__(self, attr):
class EnvBatch (line 44) | class EnvBatch(Env):
method __init__ (line 45) | def __init__(self, make_env, nenvs=None):
method _get_make_env_functions (line 53) | def _get_make_env_functions(self, make_env, nenvs):
method nenvs (line 66) | def nenvs(self):
method envs (line 70) | def envs(self):
method _check_actions (line 73) | def _check_actions(self, actions):
method step (line 80) | def step(self, actions):
method reset (line 100) | def reset(self, **kwargs):
class SingleEnvBatch (line 109) | class SingleEnvBatch(Wrapper, EnvBatch):
method __init__ (line 110) | def __init__(self, env):
method nenvs (line 116) | def nenvs(self):
method envs (line 120) | def envs(self):
method step (line 123) | def step(self, actions):
method reset (line 136) | def reset(self, **kwargs):
function worker (line 141) | def worker(parent_connection, worker_connection, make_env_function, send...
class ParallelEnvBatch (line 165) | class ParallelEnvBatch(EnvBatch):
method __init__ (line 170) | def __init__(self, make_env, nenvs=None, seeds=None):
method nenvs (line 207) | def nenvs(self):
method step (line 210) | def step(self, actions):
method reset (line 224) | def reset(self, **kwargs):
method close (line 233) | def close(self):
method render (line 242) | def render(self):
FILE: week06_policy_based/runners.py
class EnvRunner (line 6) | class EnvRunner:
method __init__ (line 9) | def __init__(self, env, policy, nsteps, transforms=None, step_var=None):
method nenvs (line 18) | def nenvs(self):
method reset (line 22) | def reset(self, **kwargs):
method add_summary (line 27) | def add_summary(self, name, val):
method get_next (line 32) | def get_next(self):
FILE: week07_seq2seq/basic_model_tf.py
class BasicTranslationModel (line 14) | class BasicTranslationModel:
method __init__ (line 15) | def __init__(self, name, inp_voc, out_voc,
method encode (line 41) | def encode(self, inp, **flags):
method decode (line 58) | def decode(self, prev_state, prev_tokens, **flags):
method symbolic_score (line 76) | def symbolic_score(self, inp, out, eps=1e-30, **flags):
method symbolic_translate (line 113) | def symbolic_translate(
function initialize_uninitialized (line 178) | def initialize_uninitialized(sess=None):
function infer_length (line 198) | def infer_length(seq, eos_ix, time_major=False, dtype=tf.int32):
function infer_mask (line 212) | def infer_mask(seq, eos_ix, time_major=False, dtype=tf.float32):
function select_values_over_last_axis (line 227) | def select_values_over_last_axis(values, indices):
FILE: week07_seq2seq/basic_model_torch.py
class BasicTranslationModel (line 10) | class BasicTranslationModel(nn.Module):
method __init__ (line 11) | def __init__(self, inp_voc, out_voc,
method encode (line 24) | def encode(self, inp, **flags):
method decode (line 41) | def decode(self, prev_state, prev_tokens, **flags):
method forward (line 56) | def forward(self, inp, out, eps=1e-30, **flags):
method translate (line 84) | def translate(self, inp, greedy=False, max_len=None, eps=1e-30, **flags):
function infer_mask (line 132) | def infer_mask(
function infer_length (line 157) | def infer_length(
function to_one_hot (line 174) | def to_one_hot(y, n_dims=None):
FILE: week07_seq2seq/voc.py
class Vocab (line 4) | class Vocab:
method __init__ (line 5) | def __init__(self, tokens, bos="__BOS__", eos="__EOS__", sep=''):
method __len__ (line 19) | def __len__(self):
method from_lines (line 23) | def from_lines(lines, bos="__BOS__", eos="__EOS__", sep=''):
method tokenize (line 31) | def tokenize(self, string):
method to_matrix (line 37) | def to_matrix(self, lines, max_len=None):
method to_lines (line 56) | def to_lines(self, matrix, crop=True):
FILE: week08_pomdp/atari_util.py
class PreprocessAtari (line 7) | class PreprocessAtari(Wrapper):
method __init__ (line 8) | def __init__(self, env, height=42, width=42, color=False,
method reset (line 28) | def reset(self, **kwargs):
method step (line 35) | def step(self, action):
method update_buffer (line 44) | def update_buffer(self, img):
method preproc_image (line 55) | def preproc_image(self, img):
FILE: week08_pomdp/env_pool.py
class EnvPool (line 11) | class EnvPool(object):
method __init__ (line 12) | def __init__(self, agent, make_env, n_parallel_games=1):
method interact (line 37) | def interact(self, n_steps=100, verbose=False):
FILE: week09_policy_II/mujoco_wrappers.py
class RunningMeanVar (line 7) | class RunningMeanVar:
method __init__ (line 17) | def __init__(self, eps=1e-4, shape=()):
method update (line 22) | def update(self, batch):
method update_from_moments (line 32) | def update_from_moments(self, batch_mean, batch_var, batch_count):
function update_mean_var_count_from_moments (line 38) | def update_mean_var_count_from_moments(mean, var, count,
class Normalize (line 54) | class Normalize(gym.Wrapper):
method __init__ (line 61) | def __init__(self, env, obs=True, ret=True,
method observation (line 73) | def observation(self, obs):
method step (line 85) | def step(self, action):
method reset (line 96) | def reset(self, **kwargs):
FILE: week09_policy_II/td3_and_sac/logger.py
class TensorboardSummaries (line 8) | class TensorboardSummaries(gym.Wrapper):
method __init__ (line 11) | def __init__(self, env, prefix=None, running_mean_size=100, step_var=N...
method should_write_summaries (line 26) | def should_write_summaries(self):
method add_summaries (line 30) | def add_summaries(self):
method step (line 59) | def step(self, action):
method reset (line 87) | def reset(self, **kwargs):
Copy disabled (too large)
Download .json
Condensed preview — 105 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (18,218K chars).
[
{
"path": ".gitignore",
"chars": 791,
"preview": "# node and NPM\nnpm-debug.log\nnode_modules\n..bfg-report\n\n# swap files\n*~\n*.swp\n\n\n\nenv.sh\n# Byte-compiled / optimized / DL"
},
{
"path": "Amazon GPU howto.md",
"chars": 920,
"preview": "**Warning: this guide has not been updated since we migrated away from Theano/Lasagne, which happened a long time ago.**"
},
{
"path": "LICENSE.md",
"chars": 1210,
"preview": "This is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, c"
},
{
"path": "README.md",
"chars": 6851,
"preview": "# Practical_RL\n\nAn open course on reinforcement learning in the wild.\nTaught on-campus at [HSE](https://cs.hse.ru) and ["
},
{
"path": "docker/Dockerfile",
"chars": 2011,
"preview": "ARG device\nARG username=\"jovyan\"\n\nFROM ubuntu:24.04 AS base-cpu\n\nFROM nvidia/cuda:12.9.1-base-ubuntu24.04 AS base-gpu\n\nF"
},
{
"path": "docker/README.md",
"chars": 2337,
"preview": "To simplify installation process, you can deploy a container (~virtual machine) with all dependencies pre-installed.\n\n_t"
},
{
"path": "docker/deeplearning.yaml",
"chars": 489,
"preview": "name: deeplearning\nchannels:\n - defaults\ndependencies:\n - graphviz\n - python-graphviz\n - ipykernel\n - keras\n - num"
},
{
"path": "docker/run_jupyter.sh",
"chars": 63,
"preview": "#!/usr/bin/env bash\njupyter notebook --no-browser --ip 0.0.0.0\n"
},
{
"path": "setup_colab.sh",
"chars": 540,
"preview": "#!/usr/bin/env bash\n\napt-get -qq update\napt-get -qq install -y xvfb\nwget -q https://raw.githubusercontent.com/yandexdata"
},
{
"path": "week01_intro/README.md",
"chars": 2670,
"preview": "## Materials:\n* [__Lecture slides__](https://yadi.sk/i/-EUHXUXOTC5t9Q)\n* __Russian:__\n * Intro to RL - [video](https://"
},
{
"path": "week01_intro/crossentropy_method.ipynb",
"chars": 17789,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"7XGyc-FCG35I\"\n },\n \"sou"
},
{
"path": "week01_intro/deep_crossentropy_method.ipynb",
"chars": 21009,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"I_i1q1TWG9zH\"\n },\n \"sou"
},
{
"path": "week01_intro/pong.py",
"chars": 1689,
"preview": "\"\"\"Auxilary files for those who wanted to solve breakout with CEM or policy gradient\"\"\"\nimport numpy as np\nimport gym\nfr"
},
{
"path": "week01_intro/primer_python_for_ml/recap_ml.ipynb",
"chars": 125184,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<center>\\n\",\n \"A crash course in"
},
{
"path": "week01_intro/primer_python_for_ml/train.csv",
"chars": 61194,
"preview": "PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked\r\n1,0,3,\"Braund, Mr. Owen Harris\",male,22"
},
{
"path": "week01_intro/project_starter_evolution_strategies.ipynb",
"chars": 5572,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Project :: Evolution Strategies"
},
{
"path": "week01_intro/seminar-es-task.ipynb",
"chars": 86165,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Evolution Strategies\\n\",\n \"\\n"
},
{
"path": "week01_intro/seminar_gymnasium_interface.ipynb",
"chars": 7954,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": "
},
{
"path": "week02_value_based/README.md",
"chars": 1228,
"preview": "## Materials\n* [__Lecture slides__](https://docs.google.com/presentation/d/1dyTsV4MfLb006VHMQvrMTEvSMjsN4B4ymoiWl-HrqVs)"
},
{
"path": "week02_value_based/mdp.py",
"chars": 15141,
"preview": "# most of this code was politely stolen from https://github.com/berkeleydeeprlcourse/homework/\n# all credit goes to http"
},
{
"path": "week02_value_based/seminar_vi.ipynb",
"chars": 48213,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Markov decision process\\n\",\n "
},
{
"path": "week03_model_free/README.md",
"chars": 1678,
"preview": "#### __Lecture slides__ - [here](https://yadi.sk/i/9bPN0pxsR1-zIA)\n### Materials\n* Russian materials:\n - Lecture - [vi"
},
{
"path": "week03_model_free/homework.ipynb",
"chars": 1767659,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [\n {\n \"nam"
},
{
"path": "week04_[recap]_deep_learning/README.md",
"chars": 3084,
"preview": "__Note:__ This week's materials cover the basics of neural nets and deep learning and teach you how to use auto-diff fra"
},
{
"path": "week04_[recap]_deep_learning/mnist.py",
"chars": 2505,
"preview": "import sys\nimport os\nimport numpy as np\n\n__doc__ = \"\"\"taken from https://github.com/Lasagne/Lasagne/blob/master/examples"
},
{
"path": "week04_[recap]_deep_learning/notmnist.py",
"chars": 1778,
"preview": "import os\nfrom glob import glob\n\nimport numpy as np\nfrom imageio import imread\nfrom skimage.transform import resize\nfrom"
},
{
"path": "week04_[recap]_deep_learning/seminar_pytorch.ipynb",
"chars": 130852,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Hello, PyTorch\\n\",\n \"\\n\",\n "
},
{
"path": "week04_[recap]_deep_learning/seminar_tensorflow.ipynb",
"chars": 24965,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Down the rabbit hole with Tensorf"
},
{
"path": "week04_approx_rl/README.md",
"chars": 4649,
"preview": "## Materials\n* [__slides__](https://github.com/yandexdataschool/Practical_RL/files/15286337/ysda_practical_rl_lecture_04"
},
{
"path": "week04_approx_rl/dqn/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "week04_approx_rl/dqn/analysis.py",
"chars": 1221,
"preview": "from __future__ import annotations\n\nfrom collections.abc import Reversible\nimport numpy as np\n\n\ndef play_and_log_episode"
},
{
"path": "week04_approx_rl/dqn/atari_wrappers.py",
"chars": 2593,
"preview": "# taken from stable_baselines3.\n\nfrom gymnasium import Wrapper\n\n\nclass FireResetEnv(Wrapper):\n def __init__(self, env"
},
{
"path": "week04_approx_rl/dqn/logger.py",
"chars": 2615,
"preview": "import matplotlib.pyplot as plt\nfrom torch.utils.tensorboard import SummaryWriter\nimport numpy as np\n\nclass Logger:\n "
},
{
"path": "week04_approx_rl/dqn/replay_buffer.py",
"chars": 4296,
"preview": "# This code is shamelessly stolen from\n# https://github.com/openai/baselines/blob/master/baselines/deepq/replay_buffer.p"
},
{
"path": "week04_approx_rl/dqn/utils.py",
"chars": 410,
"preview": "import psutil # type: ignore\n\n\ndef is_enough_ram(min_available_gb=0.1):\n mem = psutil.virtual_memory()\n return me"
},
{
"path": "week04_approx_rl/homework_pytorch_debug.ipynb",
"chars": 29993,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"SqZ2EwnTZdC8\"\n },\n \"source\": [\n \"# Deep"
},
{
"path": "week04_approx_rl/homework_pytorch_main.ipynb",
"chars": 70693,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"1NDjJiqysoT-\"\n },\n \"source\": [\n \"# Deep"
},
{
"path": "week04_approx_rl/homework_tf.ipynb",
"chars": 43684,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Deep Q-Network implementation\\n\","
},
{
"path": "week04_approx_rl/requirements.txt",
"chars": 162,
"preview": "gymnasium[atari,accept-rom-license,classic-control]\nale_py\nipython\nipywidgets\nnotebook\nmatplotlib\nmoviepy\nnumpy\nopencv-p"
},
{
"path": "week04_approx_rl/seminar_pytorch.ipynb",
"chars": 17019,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"kr_aKWMGEmh-\"\n },\n \"sou"
},
{
"path": "week04_approx_rl/seminar_tf.ipynb",
"chars": 14838,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Approximate q-learning\\n\",\n \"\\"
},
{
"path": "week04_approx_rl/test_td_loss/compute_td_loss.py",
"chars": 6202,
"preview": "import torch\nimport torch.nn as nn\nfrom typing import Protocol\n\n\nclass ComputeTdLossProtocol(Protocol):\n \"\"\"\n An P"
},
{
"path": "week05_explore/README.md",
"chars": 2184,
"preview": "[](https://colab.research.google.com/github/ya"
},
{
"path": "week05_explore/q_learning_agent.py",
"chars": 3889,
"preview": "from collections import defaultdict\nimport random\nimport math\nimport numpy as np\n\n\nclass QLearningAgent:\n def __init_"
},
{
"path": "week05_explore/replay_buffer.py",
"chars": 2433,
"preview": "# This code is shamelessly stolen from\n# https://github.com/openai/baselines/blob/master/baselines/deepq/replay_buffer.p"
},
{
"path": "week05_explore/week5.ipynb",
"chars": 550524,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 98,\n \"metadata\": {\n \"scrolled\": true\n },\n \"outp"
},
{
"path": "week06_policy_based/README.md",
"chars": 2020,
"preview": "## Materials\n* [Slides](https://yadi.sk/i/keSzKSgA2oYuwQ)\n* Video lecture by D. Silver - [video](https://www.youtube.com"
},
{
"path": "week06_policy_based/a2c-optional.ipynb",
"chars": 16551,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {\n \"id\": \"o4vBVdNx2"
},
{
"path": "week06_policy_based/atari_wrappers.py",
"chars": 13919,
"preview": "\"\"\" Environment wrappers. \"\"\"\nfrom collections import defaultdict, deque\n\nimport cv2\nimport gymnasium as gym\nimport nump"
},
{
"path": "week06_policy_based/env_batch.py",
"chars": 8090,
"preview": "# pylint: skip-file\nfrom multiprocessing import Pipe, Process\n\nimport numpy as np\nfrom gymnasium import Env, Wrapper\nfro"
},
{
"path": "week06_policy_based/reinforce_pytorch.ipynb",
"chars": 14883,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# REINFORCE in PyTorch\\n\",\n \"\\n\""
},
{
"path": "week06_policy_based/reinforce_tensorflow.ipynb",
"chars": 13753,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# REINFORCE in TensorFlow (3 pts)\\n"
},
{
"path": "week06_policy_based/runners.py",
"chars": 2534,
"preview": "from collections import defaultdict\n\nimport numpy as np\n\n\nclass EnvRunner:\n \"\"\"Reinforcement learning runner in an en"
},
{
"path": "week07_[recap]_rnn/README.md",
"chars": 1385,
"preview": "## Materials\n* [Slides](https://yadi.sk/i/-Iqdhg483GDyoN)\n* CS231 lecture on RNNs - [video](https://www.youtube.com/watc"
},
{
"path": "week07_[recap]_rnn/arxiv_data.csv",
"chars": 5909080,
"preview": "num_id,arxiv_id,publish_date,title,authors,pdf_link,journal_reference,comments,primary_categories,abstract0,1603.03827v1"
},
{
"path": "week07_[recap]_rnn/mtg_card_names.txt",
"chars": 645304,
"preview": "[1G] Instant: Moonmist\n[3B] Creature, Spirit: Accursed Spirit\n[2G] Creature, Human Advisor: Elder of Laurels\n[1R] Sorcer"
},
{
"path": "week07_[recap]_rnn/names",
"chars": 55869,
"preview": "Abagael\nAbagail\nAbbe\nAbbey\nAbbi\nAbbie\nAbby\nAbigael\nAbigail\nAbigale\nAbra\nAcacia\nAda\nAdah\nAdaline\nAdara\nAddie\nAddis\nAdel\nA"
},
{
"path": "week07_[recap]_rnn/seminar_pytorch.ipynb",
"chars": 20841,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Generating names with recurrent"
},
{
"path": "week07_[recap]_rnn/seminar_tf.ipynb",
"chars": 17940,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Generating names with recurrent"
},
{
"path": "week07_seq2seq/README.md",
"chars": 2144,
"preview": "## Materials\n* [Slides](https://yadi.sk/i/2oUkKL8m3UFFe8)\n* Our [lecture](https://yadi.sk/i/hmjUfKht3UNCSq) & [seminar]("
},
{
"path": "week07_seq2seq/basic_model_tf.py",
"chars": 9656,
"preview": "import tensorflow as tf\nimport keras.layers as L\n\n# This code implements a single-GRU seq2seq model. You will have to im"
},
{
"path": "week07_seq2seq/basic_model_torch.py",
"chars": 7322,
"preview": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n# Note: unlike official PyTorch tutorial, this model"
},
{
"path": "week07_seq2seq/bonus_pytorch.ipynb",
"chars": 6582,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Week8 bonus descriptions\\n\",\n "
},
{
"path": "week07_seq2seq/he-pron-wiktionary.txt",
"chars": 115452,
"preview": "אֵב\tev\nאַבָּא\taba\nאָבֹב\tavov\nאֲבַגְתָא\tavagta\nאָבַד\tavad\nאָבֵד\taved\nאִבֵּד\tibed\nאֲבֵדָה\taveda\nאֲבַדּוֹן\tavadon\nאָבְדָּן\t"
},
{
"path": "week07_seq2seq/main_dataset.txt",
"chars": 6049757,
"preview": "!\tמשתמש:צלף/!\n!\tסימן קריאה\n!!\t!!\n!!\tתבנית:!!\n$9.99\t$9.99\n'\tתבנית:'\n'Abd al-Ilah\tעבד אל-אילה\n'Abd as-Sattar Qasm\tעבד-אל ס"
},
{
"path": "week07_seq2seq/practice_tf.ipynb",
"chars": 37759,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": "
},
{
"path": "week07_seq2seq/practice_torch.ipynb",
"chars": 33863,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Reinforcement Learning for seq2s"
},
{
"path": "week07_seq2seq/voc.py",
"chars": 2581,
"preview": "import numpy as np\n\n\nclass Vocab:\n def __init__(self, tokens, bos=\"__BOS__\", eos=\"__EOS__\", sep=''):\n \"\"\"\n "
},
{
"path": "week08_pomdp/README.md",
"chars": 1852,
"preview": "# Materials\n[lecture slides](https://yadi.sk/i/3-4q71hhwtFxuw)\n\n_Links on all articles mentioned during the lecture coul"
},
{
"path": "week08_pomdp/atari_util.py",
"chars": 2297,
"preview": "import cv2\nimport numpy as np\nfrom gymnasium import Wrapper\nfrom gymnasium.spaces import Box\n\n\nclass PreprocessAtari(Wra"
},
{
"path": "week08_pomdp/env_pool.py",
"chars": 4497,
"preview": "\"\"\"\nA thin wrapper for Farama gymnasium environments that maintains a set of parallel games and has a method to generate"
},
{
"path": "week08_pomdp/practice_pytorch.ipynb",
"chars": 43234,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": []"
},
{
"path": "week08_pomdp/practice_tensorflow.ipynb",
"chars": 46175,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Deep Kung-Fu with advantage act"
},
{
"path": "week09_policy_II/README.md",
"chars": 2193,
"preview": "* [__slides #1 (trpo)__](https://docs.google.com/presentation/d/15Z_AVBsO9VuOSZ5uY-Q4by3tHKiRSENchhAKHhCxIOc/present?tok"
},
{
"path": "week09_policy_II/mujoco_wrappers.py",
"chars": 3760,
"preview": "\"\"\" MuJoCo env wrappers. \"\"\"\n# Adapted from https://github.com/openai/baselines\nimport gymnasium as gym\nimport numpy as "
},
{
"path": "week09_policy_II/ppo.ipynb",
"chars": 33062,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {\n \"colab\": {\n \"base_uri\": \""
},
{
"path": "week09_policy_II/seminar_TRPO_pytorch.ipynb",
"chars": 26904,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": "
},
{
"path": "week09_policy_II/seminar_TRPO_tensorflow.ipynb",
"chars": 24889,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": "
},
{
"path": "week09_policy_II/td3_and_sac/hw-continuous-control_pytorch.ipynb",
"chars": 41050,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": "
},
{
"path": "week09_policy_II/td3_and_sac/logger.py",
"chars": 3238,
"preview": "from collections import deque\n\nimport gymnasium as gym\nimport numpy as np\nfrom tensorboardX import SummaryWriter\n\n\nclass"
},
{
"path": "week10_planning/README.md",
"chars": 2000,
"preview": "## Assignments\n\nJust as usual, start with `seminar_MCTS.ipynb`\n[;__ __[multi-agent 101](https://yadi.sk/i/XrFg"
},
{
"path": "yet_another_week/_resource/README.md",
"chars": 80,
"preview": "This is a utility folder to store images and other resources used in notebooks.\n"
},
{
"path": "yet_another_week/_resource/qlearning_scheme.pgm",
"chars": 1234263,
"preview": "P2\n640 480 255\n255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 \n255 255 255 255 255 255 255 255 "
},
{
"path": "youtube_dl_lectures.sh",
"chars": 3929,
"preview": "#!/usr/bin/env bash\n\n# This script uses https://github.com/rg3/youtube-dl/ to download __ENGLISH__\n# lecture materials i"
}
]
// ... and 18 more files (download for full content)
About this extraction
This page contains the full source code of the yandexdataschool/Practical_RL GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 105 files (16.8 MB), approximately 4.4M tokens, and a symbol index with 210 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.