Copy disabled (too large)
Download .txt
Showing preview only (23,790K chars total). Download the full file to get everything.
Repository: jessicayung/machine-learning-nd
Branch: master
Commit: 441aecafb136
Files: 147
Total size: 22.7 MB
Directory structure:
gitextract_wrwg0zgp/
├── .gitignore
├── .ipynb_checkpoints/
│ └── Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb
├── README.md
├── lesson-notes/
│ ├── .ipynb_checkpoints/
│ │ ├── Fast, Scalable Deep Learning - Alan Mosca-checkpoint.ipynb
│ │ └── Healthcare - Christopher Thompson 1 Oct 2016-checkpoint.ipynb
│ ├── 0-intro/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb
│ │ └── Getting Started - From Artificial Intelligence to Machine Learning.ipynb
│ ├── 1-model-evaluation-and-validation/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 1.3.1 Evaluation Metrics-checkpoint.ipynb
│ │ │ └── 1.3.2 Validation-checkpoint.ipynb
│ │ ├── 1.3.1 Evaluation Metrics.ipynb
│ │ ├── 1.3.2 Validation.ipynb
│ │ └── 1.4 Managing Error and Complexity.ipynb
│ ├── 2-supervised-learning/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 2.4.1 Kernel Methods and Support Vector Machines-checkpoint.ipynb
│ │ │ ├── 2.5 Instance-based Learning-checkpoint.ipynb
│ │ │ ├── 2.6.2 Bayesian Learning-checkpoint.ipynb
│ │ │ └── 2.6.4 Bayes NLP project-checkpoint.ipynb
│ │ ├── 2.1.2 Regression and Classification.ipynb
│ │ ├── 2.1.4 More Regressions.ipynb
│ │ ├── 2.2 Decision Trees.ipynb
│ │ ├── 2.3 Neural Networks.ipynb
│ │ ├── 2.4.1 Kernel Methods and Support Vector Machines.ipynb
│ │ ├── 2.5 Instance-based Learning.ipynb
│ │ ├── 2.6.2 Bayesian Learning.ipynb
│ │ ├── 2.6.4 Bayes NLP project.ipynb
│ │ └── README.md
│ ├── 3-unsupervised-learning/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 3.1.3 More Clustering-checkpoint.ipynb
│ │ │ ├── 3.2.2 Feature Selection-checkpoint.ipynb
│ │ │ ├── 3.3.1 PCA-checkpoint.ipynb
│ │ │ ├── Feature Transformation-checkpoint.ipynb
│ │ │ ├── More Clustering-checkpoint.ipynb
│ │ │ └── Untitled-checkpoint.ipynb
│ │ ├── 3.1.3 More Clustering.ipynb
│ │ ├── 3.2.2 Feature Selection.ipynb
│ │ ├── 3.3.1 PCA.ipynb
│ │ └── README.md
│ ├── 4-reinforcement-learning/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 4.1.1 Markov Decision Processes-checkpoint.ipynb
│ │ │ └── 4.1.2 Reinforcement Learning-checkpoint.ipynb
│ │ ├── 4.1.1 Markov Decision Processes.ipynb
│ │ ├── 4.1.2 Reinforcement Learning.ipynb
│ │ └── README.md
│ ├── 5-ml-for-trading/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── 0. Course Outline-checkpoint.ipynb
│ │ └── 0. Course Outline.ipynb
│ └── Healthcare - Christopher Thompson 1 Oct 2016.ipynb
├── p0-titanic-survival-exploration/
│ ├── .ipynb_checkpoints/
│ │ └── titanic_survival_exploration-checkpoint.ipynb
│ ├── README.md
│ ├── report.html
│ ├── titanic_data.csv
│ ├── titanic_survival_exploration.ipynb
│ └── titanic_visualizations.py
├── p1-boston-housing/
│ ├── .ipynb_checkpoints/
│ │ └── boston_housing-checkpoint.ipynb
│ ├── README.md
│ ├── boston_housing.ipynb
│ ├── housing.csv
│ ├── report.html
│ └── visuals.py
├── p2-student-intervention/
│ ├── .ipynb_checkpoints/
│ │ ├── student_intervention-Copy1-checkpoint.ipynb
│ │ ├── student_intervention-checkpoint.ipynb
│ │ ├── student_intervention1-checkpoint.ipynb
│ │ └── student_intervention_py2.7-checkpoint.ipynb
│ ├── README.md
│ ├── archive/
│ │ ├── student_intervention-Copy1.ipynb
│ │ ├── student_intervention1.ipynb
│ │ └── student_intervention_py2.7.ipynb
│ ├── report.html
│ ├── student-data.csv
│ └── student_intervention.ipynb
├── p3-creating-customer-segments/
│ ├── .ipynb_checkpoints/
│ │ └── customer_segments-checkpoint.ipynb
│ ├── README.md
│ ├── archive/
│ │ └── customer_segments_python2.7.ipynb
│ ├── customer_segments.ipynb
│ ├── customers.csv
│ ├── renders.py
│ ├── renders_py3.py
│ └── report.html
├── p4-smartcab/
│ ├── .ipynb_checkpoints/
│ │ ├── Smartcab Report-Copy1-checkpoint.ipynb
│ │ ├── Smartcab Report-Copy2-checkpoint.ipynb
│ │ ├── Smartcab Report-checkpoint.ipynb
│ │ └── smartcab-report-checkpoint.ipynb
│ ├── README.md
│ ├── old-versions-of-reports/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── Smartcab Report-Copy1-checkpoint.ipynb
│ │ ├── Smartcab Report-Copy1.ipynb
│ │ └── Smartcab Report-Copy2.ipynb
│ ├── smartcab/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── environment.py
│ │ ├── planner.py
│ │ ├── qtable.js
│ │ ├── report.html
│ │ ├── simulator.py
│ │ └── trial-data/
│ │ ├── data.js
│ │ ├── trial1.js
│ │ ├── trial10.js
│ │ ├── trial2.js
│ │ ├── trial3.js
│ │ ├── trial4.js
│ │ ├── trial5.js
│ │ ├── trial6.js
│ │ ├── trial7.js
│ │ ├── trial8.js
│ │ └── trial9.js
│ ├── smartcab-report.ipynb
│ ├── smartcab_parameter_search.csv
│ └── smartcab_params_summary.csv
└── p5-capstone/
├── .ipynb_checkpoints/
│ ├── 2-analysis-code-py2-checkpoint.ipynb
│ ├── 2-analysis-code-py3-checkpoint.ipynb
│ ├── 3-methodology-results-conclusion-code-py2-Copy1-checkpoint.ipynb
│ ├── 3-methodology-results-conclusion-code-py2-checkpoint.ipynb
│ ├── 3-methodology-results-conclusion-code-py3-checkpoint.ipynb
│ ├── Discarded Notes-checkpoint.ipynb
│ ├── delete-checkpoint.ipynb
│ ├── lse-list-checkpoint.ipynb
│ ├── p5.1-definition-checkpoint.ipynb
│ ├── p5.2-4-code-checkpoint.ipynb
│ ├── p5.2-4-report-checkpoint.ipynb
│ └── p5.5-conclusion-checkpoint.ipynb
├── 2-analysis-code-py2.ipynb
├── 2-analysis-code-py2.ipynb.bak
├── 2-analysis-code-py3.ipynb
├── 3-methodology-results-conclusion-code-py2.ipynb
├── 3-methodology-results-conclusion-code-py3.ipynb
├── README.md
├── archive/
│ ├── .ipynb_checkpoints/
│ │ └── Discarded Notes-checkpoint.ipynb
│ ├── Discarded Notes.ipynb
│ ├── III. Methodology - Code-Copy1.ipynb
│ ├── lse-list.ipynb
│ ├── ml-for-trading/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 2. Computational Investment-checkpoint.ipynb
│ │ │ └── 3. ML for Trading Algorithms-checkpoint.ipynb
│ │ ├── 2. Computational Investment.ipynb
│ │ └── 3. ML for Trading Algorithms.ipynb
│ ├── p5.2-4-code.ipynb
│ ├── report-drafts/
│ │ ├── p5.1-definition.ipynb
│ │ ├── p5.2-4-report.ipynb
│ │ └── p5.5-conclusion.ipynb
│ ├── robot_motion_planning/
│ │ ├── maze.py
│ │ ├── robot.py
│ │ ├── showmaze.py
│ │ ├── test_maze_01.txt
│ │ ├── test_maze_02.txt
│ │ ├── test_maze_03.txt
│ │ └── tester.py
│ └── udacity-materials/
│ └── project_report_template.md
├── ftse100-figures.csv
├── ftse100-list.csv
├── google-finance-py2.py
├── google-finance-scraper.py
├── list-of-all-securities-ex-debt.csv
└── report.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
code/
*.zip
================================================
FILE: .ipynb_checkpoints/Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb
================================================
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: README.md
================================================
# machine-learning-nd
Udacity's Machine Learning Nanodegree project files and notes.
This repository contains project files and lecture notes for [Udacity's Machine Learning Engineer Nanodegree program](https://www.udacity.com/course/machine-learning-engineer-nanodegree--nd009) which I started working on in September 2016.
The Machine Learning Engineer Nanodegree is an online certification. It involves
1. Courses in supervised learning, unsupervised learning and reinforcement learning and
2. Six projects (p0-p5 in this directory).
Courses include lecture videos, quizzes and programming problems. These courses were developed by Georgia Tech, Udacity, Google and Kaggle.
This directory includes lecture notes (`lesson_notes`) and project code (`p0` to `p5`).
See also: [My notes for Udacity's Data Analyst Nanodegree](https://www.udacity.com/course/data-analyst-nanodegree--nd002?v=a).
## Program Outline:
0) Exploratory Project: Titanic Survival Exploration
1. Model Evaluation and Validation
- Project 1: Predicting Boston Housing Prices
2. Supervised Learning
- Project 2: Building a Student Intervention System (Predicting whether or not students will fail so schools can intervene to help them graduate)
3. Unsupervised Learning
- Project 3: Creating Customer Segments (Segmenting customers based on spending in different categories)
4. Reinforcement Learning
- Project 4: Train a Smartcab to Drive (Implement Q-learning algorithm)
5. Machine Learning Specialisation of Choice
================================================
FILE: lesson-notes/.ipynb_checkpoints/Fast, Scalable Deep Learning - Alan Mosca-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fast, Scalable Deep Learning\n",
"- Alan Mosca\n",
"(PhD in Deep Learning and Ensembles)\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/.ipynb_checkpoints/Healthcare - Christopher Thompson 1 Oct 2016-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Christopher Thompson: Applications of ML in Healthcare and Pharma\n",
"\n",
"Microbiologist at Imperial (Postdoc)\n",
"\n",
"1. Diagnosis DTs\n",
"2. Imaging analysis MRI X ray Pathology 40 images per needle biopsy hours per processs\n",
"3. Brug Discovery\n",
" - nwe uses for existing drugs\n",
" - combine 4 drgus into single therapy -> pill or injection -> 5 concentrations\n",
" - fastest route? HUH HOW\n",
" - off-target drug actions (IBS tuberculosis antibiotics) -> more DA, hmm\n",
"4. Patient surveillance\n",
"5. Personalised medicine or therapy\n",
" - data sources\n",
" - electronic health records: structured and unstructured (clinician notes), BoW no cancer vs cancer\n",
" - epidem behaviour\n",
" - dna (cookbook) -> rna (recipe) -> protein (meal)\n",
" - rna as a market of prostate cancer mestasisis (moving)\n",
" - diagnosis only by biopsy\n",
" - survival rates vary by local vs distance\n",
" - gen model predict P(metastasis), log loss -> penalises wrong confident preds a lot\n",
" - vs current can only test if cancer has mestatisised\n",
" - used anova, pca\n",
" - F stat (take with max f stat) -> filter for genes that are diff in metastasis vs normal\n",
" - NOTE dataset is live: what is classified as local might go to metastetic eventually. but no otehr way back.\n",
" - features RNA 20k + 20 clinical features, 500 patients.\n",
" - Gleason score :) 2 - 10 :( -> 0.3\n",
" - RNA -> 0.7\n",
" - Filter down to 20 genes\n",
" -> Probablity in the next X years. makes sens.\n",
"\n",
"\n",
"23me? - > what's that angelo\n",
"\n",
"gaddaga? oh so if you see they have BLAH they won't hire them.\n",
"- esp if attach location and ethnicity to data\n",
"$39bn per year US health institute\n",
"\n",
"OCR get capture?\n",
"\n",
"H l 7\n",
"Electronic health records: there are 10 competing formats.\n",
"\n",
"Nature vs nurture -> DNA modification, molecular tagging\n",
"\n",
"Alzheimers depends on Epigenetics likely.\n",
"Combo of epigenetic and genetic\n",
"\n",
"\n",
"Climate patterns\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Baxter\n",
"Myo\n",
"Thync\n",
"\n"
]
}
],
"metadata": {
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/0-intro/.ipynb_checkpoints/Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Getting Started - From Artificial Intelligence to Machine Learning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Artificial Intelligence: Problems and Characteristics\n",
"\n",
"Machine Learning: Artificial Intelligence x Data Science\n",
"\n",
"AI -> Cognitive Systems (thinking like humans) vs Machine Learning\n",
"\n",
"#### Conundrums in AI:\n",
"1. Intelligent agents have limited resources (computational speed, memory) -> But many problems are computationally intractable.\n",
"2. Computation is local, but problems have global constraints.\n",
"3. Logic is deductive, but many problems are not (they are abductive or inductive).\n",
"4. The world is dynamic, but knowledge is limited. AI agent always begins with what it knows -> How does it address new problems?\n",
"5. Problem solving, reasoning and learning are complex, but explanation and justification are even more complex.\n",
"\n",
"#### Characteristics of AI Problems:\n",
"1. Knowledge often arrives incrementally.\n",
"2. Problems exhibit recurring patterns.\n",
"3. Problems have multiple levels of granularity.\n",
"4. Many problems are computationally intractable.\n",
"5. The world is dynamic, but knowledge of the world is static.\n",
"6. The world is open-ended, but knowledge is limited.\n",
"\n",
"(From [Knowledge-Based AI](https://www.udacity.com/course/knowledge-based-ai-cognitive-systems--ud409?_ga=1.192741295.463903328.1463823313))\n",
"\n",
"#### AI As Uncertainty Management\n",
"AI = what to do when you don't know what to do\n",
"\n",
"Reasons for uncertainty:\n",
"- Sensor limits\n",
"- Adversaries\n",
"- Stochastic environments (rolling dice)\n",
"- Laziness (Can compute what situation is but too lazy to do it)\n",
"- Ignorance (Could know something but just don't care)\n",
"\n",
"(From uDacity Sebastian Thrun)\n",
"\n",
"e.g.: Watson (answering Jeopardy questions)\n",
"\n",
"Process:\n",
"- Read clue (understand natural language sentences)\n",
"- Search through knowledge base\n",
"- Decide on answer\n",
"- Phrase answer\n",
"\n",
"Specifics:\n",
"- Know of the potential answers (e.g. Michael Phelps, Hey Jude) and know information pertaining to the potential answers\n",
"- Understand the statement: Interpret words in context. May need to interpret puns.\n",
"- Know the format of the answer\n",
"\n",
"Core **deliberation processes**:\n",
"1. Reasoning (read and generate natural language sentences)\n",
"2. Learning (make decisions and see if those decisions are correct or not -> Change)\n",
"3. Memory (Store knowledge and what we learn)\n",
"\n",
"[img](images/intro-1.png)\n",
"\n",
"#### Four schools of thought of AI\n",
"[Four quadrants (schools of thought) of AI](images/intro-2.png)\n",
"\n",
"Thinking vs acting,\n",
"Optimally vs like humans.\n",
"\n",
"Knowledge-based AI: interested in agents that think like humans.\n",
"Examples:\n",
"[Examples of applications in each school of thought of AI](images/intro-3.png)\n",
"\n",
"E.g. autonomous vehicle: acts (and thinks?) optimally.\n",
"\n",
"Patterns of knowledge-based data: AI behaviour \n",
"\n",
"[Categorising four examples](images/intro-4.png)\n",
"\n",
"### Bayes' Rule\n",
"\n",
"$$P(A|B) = \\frac{P(B|A)*P(A)}{P(B)}$$\n",
"\n",
"$$ Posterior = \\frac{Likelihood x Prior}{Marginal likelihood}$$\n",
"\n",
"Likelihood: If we knew the cause (A), what would be the probability of the evidence we just observed? But to correct for the inversion, we need to multiply by the prior.\n",
"\n",
"$$P(B) = \\sum_aP(B|A=a)P(A=a)$$\n",
"\n",
"(Total probability)\n",
"\n",
"#### Bayes Network\n",
"[Bayes Network](images/intro-5.png)\n",
"\n",
"Number of parameters in this Bayes Network: 3. P(A), P(B|A), P(B| not A).\n",
"\n",
"Data is a lot about discerning unseen cause of the data that we can see.\n",
"\n",
"## Data Science\n",
"\n",
"[What is a data scientist?](images/intro-ds1.png)\n",
"\n",
"'Substantive Expertise':\n",
"- Know which questions to ask\n",
"- Can interpret the data well\n",
"- Understands structure of the data\n",
"\n",
"But data scientists often work in teams so they can complement each other's strengths and weaknesses.\n",
"\n",
"[Data Science Process](images/intro-ds2.png)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Machine Learning\n",
"\n",
"What is ML?\n",
"\n",
"Philosophy of ML:\n",
"- Theoretical (Michael) vs Practical (Charles)\n",
"\n",
"\n",
"Theoretical: ML is computational statistics that is about proving theorems.\n",
"Practical: ML is the broader notion of building computational artifacts that learn over time based on experience. Applied stats.\n",
"\n",
"(They are hilarious.)\n",
"\n",
"Supervised learning:\n",
"- Taking labelled datasets, gleaning info from it so you can label new datasets.\n",
"- Function approximation\n",
"- Approximate function induction\n",
"-> Make assumptions about the world, e.g. well-behaved function that fits that data that is generalises.\n",
"\n",
"Supervised learning is about **inductive bias**. Specifics -> Generalities.\n",
"\n",
"Vs deduction: Generalities -> Specifics.\n",
"\n",
"### Induction, deduction and abduction\n",
"\n",
"[ida](images/intro-ida.png)\n",
"\n",
"Deduction: Given the rule and the cause, deduce the effect. (Proof-preserving)\n",
"\n",
"[d](images/intro-d.png)\n",
"\n",
"Induction: Given a cause and an effect, induce a rule. (Correctness not guaranteed.)\n",
"\n",
"[i](images/intro-i.png)\n",
"\n",
"Abduction: Given a rule and an effect, abduce a cause. (Correctness not guaranteed.)\n",
"\n",
"[a](images/intro-a.png)\n",
"\n",
"ML is about **inducing a rule**. The rule doesn't have to be causal - correlations are useful too.\n",
"\n",
"E.g. apply abductively to figure out where insider trading has occurred."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Unsupervised Learning\n",
"\n",
"**Description or summarisation** (vs supervised learning -> Approximation).\n",
"Just have input, no given labels. Derive structure from input.\n",
"\n",
"Differences with supervised learning:\n",
"- All ways of dividing up the world are in a way equally good (absent other signals telling you something is goood or not good).\n",
"- Unsupervised is helpful in supervised -> Can help\n",
"\n",
"[unsup](images/intro-unsup.png)\n",
"\n",
"## Reinforcement Learning\n",
"\n",
"Learning from delayed reward vs supervised learning 'here's what you should do'.\n",
"\n",
"E.g. Playing tic-tac-toe -> lost -> learn which moves were important (bad).\n",
"\n",
"Reinforcement learn is in a sense harder than supervised learning because you're not told what to do.\n",
"Like playing a game without knowing any of the rules but being told once in a while that you've won or you've lost.\n",
"\n",
"## Comparison of three parts of ML\n",
"\n",
"Supervised: Labels. \n",
"Unsupervised: Don't know if one cluster is better than another.\n",
"-> But there is an assumed set of labels because you're clustering.\n",
"\n",
"- In many cases you can formulate these problems as some sort of optimisation.\n",
" - SL: Labels data well\n",
" - RL: Behaviour scores well\n",
" - UL: Cluster scores well\n",
"\n",
"One view:\n",
"Compsci hink in terms of algorithms, theorems vs ML data being central. Or the two being co-equal.\n",
"\n"
]
}
],
"metadata": {
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/0-intro/Getting Started - From Artificial Intelligence to Machine Learning.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Getting Started - From Artificial Intelligence to Machine Learning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Artificial Intelligence: Problems and Characteristics\n",
"\n",
"Machine Learning: Artificial Intelligence x Data Science\n",
"\n",
"AI -> Cognitive Systems (thinking like humans) vs Machine Learning\n",
"\n",
"#### Conundrums in AI:\n",
"1. Intelligent agents have limited resources (computational speed, memory) -> But many problems are computationally intractable.\n",
"2. Computation is local, but problems have global constraints.\n",
"3. Logic is deductive, but many problems are not (they are abductive or inductive).\n",
"4. The world is dynamic, but knowledge is limited. AI agent always begins with what it knows -> How does it address new problems?\n",
"5. Problem solving, reasoning and learning are complex, but explanation and justification are even more complex.\n",
"\n",
"#### Characteristics of AI Problems:\n",
"1. Knowledge often arrives incrementally.\n",
"2. Problems exhibit recurring patterns.\n",
"3. Problems have multiple levels of granularity.\n",
"4. Many problems are computationally intractable.\n",
"5. The world is dynamic, but knowledge of the world is static.\n",
"6. The world is open-ended, but knowledge is limited.\n",
"\n",
"(From [Knowledge-Based AI](https://www.udacity.com/course/knowledge-based-ai-cognitive-systems--ud409?_ga=1.192741295.463903328.1463823313))\n",
"\n",
"#### AI As Uncertainty Management\n",
"AI = what to do when you don't know what to do\n",
"\n",
"Reasons for uncertainty:\n",
"- Sensor limits\n",
"- Adversaries\n",
"- Stochastic environments (rolling dice)\n",
"- Laziness (Can compute what situation is but too lazy to do it)\n",
"- Ignorance (Could know something but just don't care)\n",
"\n",
"(From uDacity Sebastian Thrun)\n",
"\n",
"e.g.: Watson (answering Jeopardy questions)\n",
"\n",
"Process:\n",
"- Read clue (understand natural language sentences)\n",
"- Search through knowledge base\n",
"- Decide on answer\n",
"- Phrase answer\n",
"\n",
"Specifics:\n",
"- Know of the potential answers (e.g. Michael Phelps, Hey Jude) and know information pertaining to the potential answers\n",
"- Understand the statement: Interpret words in context. May need to interpret puns.\n",
"- Know the format of the answer\n",
"\n",
"Core **deliberation processes**:\n",
"1. Reasoning (read and generate natural language sentences)\n",
"2. Learning (make decisions and see if those decisions are correct or not -> Change)\n",
"3. Memory (Store knowledge and what we learn)\n",
"\n",
"[img](images/intro-1.png)\n",
"\n",
"#### Four schools of thought of AI\n",
"[Four quadrants (schools of thought) of AI](images/intro-2.png)\n",
"\n",
"Thinking vs acting,\n",
"Optimally vs like humans.\n",
"\n",
"Knowledge-based AI: interested in agents that think like humans.\n",
"Examples:\n",
"[Examples of applications in each school of thought of AI](images/intro-3.png)\n",
"\n",
"E.g. autonomous vehicle: acts (and thinks?) optimally.\n",
"\n",
"Patterns of knowledge-based data: AI behaviour \n",
"\n",
"[Categorising four examples](images/intro-4.png)\n",
"\n",
"### Bayes' Rule\n",
"\n",
"$$P(A|B) = \\frac{P(B|A)*P(A)}{P(B)}$$\n",
"\n",
"$$ Posterior = \\frac{Likelihood x Prior}{Marginal likelihood}$$\n",
"\n",
"Likelihood: If we knew the cause (A), what would be the probability of the evidence we just observed? But to correct for the inversion, we need to multiply by the prior.\n",
"\n",
"$$P(B) = \\sum_aP(B|A=a)P(A=a)$$\n",
"\n",
"(Total probability)\n",
"\n",
"#### Bayes Network\n",
"[Bayes Network](images/intro-5.png)\n",
"\n",
"Number of parameters in this Bayes Network: 3. P(A), P(B|A), P(B| not A).\n",
"\n",
"Data is a lot about discerning unseen cause of the data that we can see.\n",
"\n",
"## Data Science\n",
"\n",
"[What is a data scientist?](images/intro-ds1.png)\n",
"\n",
"'Substantive Expertise':\n",
"- Know which questions to ask\n",
"- Can interpret the data well\n",
"- Understands structure of the data\n",
"\n",
"But data scientists often work in teams so they can complement each other's strengths and weaknesses.\n",
"\n",
"[Data Science Process](images/intro-ds2.png)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Machine Learning\n",
"\n",
"What is ML?\n",
"\n",
"Philosophy of ML:\n",
"- Theoretical (Michael) vs Practical (Charles)\n",
"\n",
"\n",
"Theoretical: ML is computational statistics that is about proving theorems.\n",
"Practical: ML is the broader notion of building computational artifacts that learn over time based on experience. Applied stats.\n",
"\n",
"(They are hilarious.)\n",
"\n",
"Supervised learning:\n",
"- Taking labelled datasets, gleaning info from it so you can label new datasets.\n",
"- Function approximation\n",
"- Approximate function induction\n",
"-> Make assumptions about the world, e.g. well-behaved function that fits that data that is generalises.\n",
"\n",
"Supervised learning is about **inductive bias**. Specifics -> Generalities.\n",
"\n",
"Vs deduction: Generalities -> Specifics.\n",
"\n",
"### Induction, deduction and abduction\n",
"\n",
"[ida](images/intro-ida.png)\n",
"\n",
"Deduction: Given the rule and the cause, deduce the effect. (Proof-preserving)\n",
"\n",
"[d](images/intro-d.png)\n",
"\n",
"Induction: Given a cause and an effect, induce a rule. (Correctness not guaranteed.)\n",
"\n",
"[i](images/intro-i.png)\n",
"\n",
"Abduction: Given a rule and an effect, abduce a cause. (Correctness not guaranteed.)\n",
"\n",
"[a](images/intro-a.png)\n",
"\n",
"ML is about **inducing a rule**. The rule doesn't have to be causal - correlations are useful too.\n",
"\n",
"E.g. apply abductively to figure out where insider trading has occurred."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Unsupervised Learning\n",
"\n",
"**Description or summarisation** (vs supervised learning -> Approximation).\n",
"Just have input, no given labels. Derive structure from input.\n",
"\n",
"Differences with supervised learning:\n",
"- All ways of dividing up the world are in a way equally good (absent other signals telling you something is goood or not good).\n",
"- Unsupervised is helpful in supervised -> Can help\n",
"\n",
"[unsup](images/intro-unsup.png)\n",
"\n",
"## Reinforcement Learning\n",
"\n",
"Learning from delayed reward vs supervised learning 'here's what you should do'.\n",
"\n",
"E.g. Playing tic-tac-toe -> lost -> learn which moves were important (bad).\n",
"\n",
"Reinforcement learn is in a sense harder than supervised learning because you're not told what to do.\n",
"Like playing a game without knowing any of the rules but being told once in a while that you've won or you've lost.\n",
"\n",
"## Comparison of three parts of ML\n",
"\n",
"Supervised: Labels. \n",
"Unsupervised: Don't know if one cluster is better than another.\n",
"-> But there is an assumed set of labels because you're clustering.\n",
"\n",
"- In many cases you can formulate these problems as some sort of optimisation.\n",
" - SL: Labels data well\n",
" - RL: Behaviour scores well\n",
" - UL: Cluster scores well\n",
"\n",
"One view:\n",
"Compsci hink in terms of algorithms, theorems vs ML data being central. Or the two being co-equal.\n",
"\n"
]
}
],
"metadata": {
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/1-model-evaluation-and-validation/.ipynb_checkpoints/1.3.1 Evaluation Metrics-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training and Testing\n",
"\n",
"Benefits of testing: \n",
"- Gives estimate of performance on an independent dataset\n",
"- Serves as a check on overfitting\n",
"\n",
"## Train/Test Split in sklearn\n",
"\n",
"Look for cross-validation"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((150, 4), (150,))"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"from sklearn import cross_validation\n",
"from sklearn import datasets\n",
"from sklearn import svm\n",
"\n",
"iris = datasets.load_iris()\n",
"iris.data.shape, iris.target.shape"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test \\\n",
" = cross_validation.train_test_split(iris.data, iris.target, test_size=0.4, random_state=0)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((90, 4), (90,))"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train.shape, y_train.shape"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((60, 4), (60,))"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_test.shape, y_test.shape"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.96666666666666667"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)\n",
"clf.score(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evaluation Metrics\n",
"\n",
"\n",
"### 1. Accuracy \n",
"Accuracy = (no. of items in a class labelled correctly / all items in that class)\n",
"\n",
"Shortcomings:\n",
"- Not ideal for skewed cases (very few Persons of Interest -> Denominator 'All items in that class' is small.)\n",
"- May want to err on side of guessing innocent (or guilty, depending on consequences of labelling) -> i.e. asymmetries favouring different types of error.\n",
"\n",
"## Confusion Matrix\n",
"\n",
"[Confusion Matrix](images/14-01.png)\n",
"\n",
"Note: Tuning parameters can move the boundaries.\n",
"\n",
"[Decision Tree Confusion Matrix](images/14-02.png)\n",
"\n",
"[7x7 Confusion Matrix](images/14-03.png)\n",
"\n",
"### Recall: P(alg identifies as A | is A)\n",
"(rows for true in rows, predicted in cols)\n",
"- is like 'lacer' backwards which is similar to 'liar', and the opposite of a lie is the truth, so the denominator is the true values.\n",
"- recall: finding X. i.e. P(finding X | ...)\n",
"- Recall = TP/(TP + FN)\n",
"\n",
"### Precision: P(is A | alg identifies as A)\n",
"- (columns for true in rows, prediction in cols)\n",
"Starts with 'pre', so denominator is predicted.\n",
"- Precision = TP/(TP + FP)\n",
"\n",
"### True positives, false positives, false negatives\n",
"\n",
"## F1 Score\n",
"The harmonic mean of precision and recall.\n",
"\n",
"$$F_1 = 2 * \\frac{precision * recall}{precision + recall}$$\n"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"# Precision vs Recall\n",
"\n",
"# As with the previous exercises, let's look at the performance of a couple of classifiers\n",
"# on the familiar Titanic dataset. Add a train/test split, then store the results in the\n",
"# dictionary provided.\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"# Load the dataset\n",
"X = pd.read_csv('titanic_data.csv')\n",
"\n",
"X = X._get_numeric_data()\n",
"y = X['Survived']\n",
"del X['Age'], X['Survived']\n",
"\n",
"\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.metrics import recall_score as recall\n",
"from sklearn.metrics import precision_score as precision\n",
"from sklearn.naive_bayes import GaussianNB\n",
"\n",
"# TODO: split the data into training and testing sets,\n",
"# using the standard settings for train_test_split.\n",
"# Then, train and test the classifiers with your newly split data instead of X and y.\n",
"\n",
"from sklearn.cross_validation import train_test_split\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y)\n",
"\n",
"\n",
"results = {\n",
" \"Naive Bayes Recall\": 0,\n",
" \"Naive Bayes Precision\": 0,\n",
" \"Decision Tree Recall\": 0,\n",
" \"Decision Tree Precision\": 0\n",
"}\n",
"\n",
"clf = DecisionTreeClassifier()\n",
"clf.fit(X_train, y_train)\n",
"print \"Decision Tree recall: {:.2f} and precision: {:.2f}\".format(recall(clf.predict(X_test),y_test),precision(clf.predict(X),y))\n",
"\n",
"results[\"Decision Tree Recall\"] = recall(clf.predict(X_test),y_test)\n",
"results[\"Decision Tree Precision\"] = precision(clf.predict(X_test),y_test)\n",
"\n",
"clf = GaussianNB()\n",
"clf.fit(X_train, y_train)\n",
"print \"GaussianNB recall: {:.2f} and precision: {:.2f}\".format(recall(clf.predict(X_test),y_test),precision(clf.predict(X),y))\n",
"\n",
"results[\"Naive Bayes Recall\"] = recall(clf.predict(X_test),y_test)\n",
"results[\"Naive Bayes Precision\"] = precision(clf.predict(X_test),y_test)\n",
"\n",
"\"\"\"\n",
"Decision Tree recall: 0.48 and precision: 0.53\n",
"GaussianNB recall: 0.69 and precision: 0.48\n",
"\n",
"\"\"\""
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/1-model-evaluation-and-validation/.ipynb_checkpoints/1.3.2 Validation-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Validation\n",
"\n",
"(Insert Train/Test split etc info from Evaluation Metrics notebook)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Where you use Training vs Testing data\n",
"\n",
"1. Train/test split.\n",
"2. Feature transform e.g. PCA fit then PCA transform.\n",
" - PCA fit on training features\n",
" - PCA transform on training features\n",
" - PCA transform on test features (usually after training SVC) -> Represent test data with principle components found in training data.\n",
"3. Classifier e.g. SVM fit then SVM predict.\n",
" - SVC fit on training features\n",
" - SVC predict on test features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross-Validation\n",
"\n",
"**Problems with splitting data into training & testing data**:\n",
"- Want to maximise size of both training and test sets, but there's a tradeoff.\n",
"\n",
"### K-fold cross-validation process:\n",
"1. Partition dataset into k bins.\n",
"2. Run k separate learning experiments.\n",
" - Pick test set\n",
" - Train\n",
" - Test on testing set\n",
"3. Average test results from these k experiments.\n",
"\n",
"Pick Train/Test or e.g. 10-fold CV based on priorities, which can be\n",
"- Min training time (train/test)\n",
"- Min run time (unclear but may as well do CV)\n",
"- Max accuracy (CV)\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'time' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-1-bd23e9b27a8c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcross_validation\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mKFold\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mkf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKFold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#length of dataset, no. of folds\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtrain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_indices\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mkf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'time' is not defined"
]
}
],
"source": [
"from sklearn.cross_validation import KFold\n",
"\n",
"t0 = time()\n",
"kf = KFold(len(data), 2) #length of dataset, no. of folds\n",
"for train_indices, test_indices in kf:\n",
" # Make training and testing datasets\n",
" features_train = [word_data[ii] for ii in train_indices]\n",
" features_test = [word_data[ii] for ii in test_indices]\n",
" authors_train = [authors[ii] for ii in train_indices]\n",
" authors_test = [authors[ii] for ii in test_indices]\n",
"\n",
"# Debugging\n",
"print(\"train_indices: \", train_indices)\n",
"print(\"authors_train: \", authors_train)\n",
"print(\"authours_test: \"authors_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note \n",
"**sklearn k-fold CV just splits data into equal-sized partitions - it doesn't shuffle the data.**\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross-Validation for Parameter Tuning\n",
"\n",
"### GridSearchCV\n",
"- Systematically works through multiple combinations of parameter tunes, cross-validating as it goes to determine which tune gives the best performance."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}\n",
"svr = svm.SVC()\n",
"clf = grid_search.GridSearchCV(svr, parameters)\n",
"clf.fit(iris.data, iris.target)\n",
"\n",
"print(\"Optimal parameter combination found: \", clf.best_params_)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.cross_validation import train_test_split\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Help on function train_test_split in module sklearn.cross_validation:\n",
"\n",
"train_test_split(*arrays, **options)\n",
" Split arrays or matrices into random train and test subsets\n",
" \n",
" Quick utility that wraps input validation and\n",
" ``next(iter(ShuffleSplit(n_samples)))`` and application to input\n",
" data into a single call for splitting (and optionally subsampling)\n",
" data in a oneliner.\n",
" \n",
" Read more in the :ref:`User Guide <cross_validation>`.\n",
" \n",
" Parameters\n",
" ----------\n",
" *arrays : sequence of indexables with same length / shape[0]\n",
" \n",
" allowed inputs are lists, numpy arrays, scipy-sparse\n",
" matrices or pandas dataframes.\n",
" \n",
" .. versionadded:: 0.16\n",
" preserves input type instead of always casting to numpy array.\n",
" \n",
" test_size : float, int, or None (default is None)\n",
" If float, should be between 0.0 and 1.0 and represent the\n",
" proportion of the dataset to include in the test split. If\n",
" int, represents the absolute number of test samples. If None,\n",
" the value is automatically set to the complement of the train size.\n",
" If train size is also None, test size is set to 0.25.\n",
" \n",
" train_size : float, int, or None (default is None)\n",
" If float, should be between 0.0 and 1.0 and represent the\n",
" proportion of the dataset to include in the train split. If\n",
" int, represents the absolute number of train samples. If None,\n",
" the value is automatically set to the complement of the test size.\n",
" \n",
" random_state : int or RandomState\n",
" Pseudo-random number generator state used for random sampling.\n",
" \n",
" stratify : array-like or None (default is None)\n",
" If not None, data is split in a stratified fashion, using this as\n",
" the labels array.\n",
" \n",
" .. versionadded:: 0.17\n",
" *stratify* splitting\n",
" \n",
" Returns\n",
" -------\n",
" splitting : list, length = 2 * len(arrays),\n",
" List containing train-test split of inputs.\n",
" \n",
" .. versionadded:: 0.16\n",
" Output type is the same as the input type.\n",
" \n",
" Examples\n",
" --------\n",
" >>> import numpy as np\n",
" >>> from sklearn.cross_validation import train_test_split\n",
" >>> X, y = np.arange(10).reshape((5, 2)), range(5)\n",
" >>> X\n",
" array([[0, 1],\n",
" [2, 3],\n",
" [4, 5],\n",
" [6, 7],\n",
" [8, 9]])\n",
" >>> list(y)\n",
" [0, 1, 2, 3, 4]\n",
" \n",
" >>> X_train, X_test, y_train, y_test = train_test_split(\n",
" ... X, y, test_size=0.33, random_state=42)\n",
" ...\n",
" >>> X_train\n",
" array([[4, 5],\n",
" [0, 1],\n",
" [6, 7]])\n",
" >>> y_train\n",
" [2, 0, 3]\n",
" >>> X_test\n",
" array([[2, 3],\n",
" [8, 9]])\n",
" >>> y_test\n",
" [1, 4]\n",
"\n"
]
}
],
"source": [
"help(train_test_split)"
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/1-model-evaluation-and-validation/1.3.1 Evaluation Metrics.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training and Testing\n",
"\n",
"Benefits of testing: \n",
"- Gives estimate of performance on an independent dataset\n",
"- Serves as a check on overfitting\n",
"\n",
"## Train/Test Split in sklearn\n",
"\n",
"Look for cross-validation"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((150, 4), (150,))"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"from sklearn import cross_validation\n",
"from sklearn import datasets\n",
"from sklearn import svm\n",
"\n",
"iris = datasets.load_iris()\n",
"iris.data.shape, iris.target.shape"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test \\\n",
" = cross_validation.train_test_split(iris.data, iris.target, test_size=0.4, random_state=0)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((90, 4), (90,))"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train.shape, y_train.shape"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((60, 4), (60,))"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_test.shape, y_test.shape"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.96666666666666667"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)\n",
"clf.score(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evaluation Metrics\n",
"\n",
"\n",
"### 1. Accuracy \n",
"Accuracy = (no. of items in a class labelled correctly / all items in that class)\n",
"\n",
"Shortcomings:\n",
"- Not ideal for skewed cases (very few Persons of Interest -> Denominator 'All items in that class' is small.)\n",
"- May want to err on side of guessing innocent (or guilty, depending on consequences of labelling) -> i.e. asymmetries favouring different types of error.\n",
"\n",
"## Confusion Matrix\n",
"\n",
"[Confusion Matrix](images/14-01.png)\n",
"\n",
"Note: Tuning parameters can move the boundaries.\n",
"\n",
"[Decision Tree Confusion Matrix](images/14-02.png)\n",
"\n",
"[7x7 Confusion Matrix](images/14-03.png)\n",
"\n",
"### Recall: P(alg identifies as A | is A)\n",
"(rows for true in rows, predicted in cols)\n",
"- is like 'lacer' backwards which is similar to 'liar', and the opposite of a lie is the truth, so the denominator is the true values.\n",
"- recall: finding X. i.e. P(finding X | ...)\n",
"- Recall = TP/(TP + FN)\n",
"\n",
"### Precision: P(is A | alg identifies as A)\n",
"- (columns for true in rows, prediction in cols)\n",
"Starts with 'pre', so denominator is predicted.\n",
"- Precision = TP/(TP + FP)\n",
"\n",
"### True positives, false positives, false negatives\n",
"\n",
"## F1 Score\n",
"The harmonic mean of precision and recall.\n",
"\n",
"$$F_1 = 2 * \\frac{precision * recall}{precision + recall}$$\n"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"# Precision vs Recall\n",
"\n",
"# As with the previous exercises, let's look at the performance of a couple of classifiers\n",
"# on the familiar Titanic dataset. Add a train/test split, then store the results in the\n",
"# dictionary provided.\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"# Load the dataset\n",
"X = pd.read_csv('titanic_data.csv')\n",
"\n",
"X = X._get_numeric_data()\n",
"y = X['Survived']\n",
"del X['Age'], X['Survived']\n",
"\n",
"\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.metrics import recall_score as recall\n",
"from sklearn.metrics import precision_score as precision\n",
"from sklearn.naive_bayes import GaussianNB\n",
"\n",
"# TODO: split the data into training and testing sets,\n",
"# using the standard settings for train_test_split.\n",
"# Then, train and test the classifiers with your newly split data instead of X and y.\n",
"\n",
"from sklearn.cross_validation import train_test_split\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y)\n",
"\n",
"\n",
"results = {\n",
" \"Naive Bayes Recall\": 0,\n",
" \"Naive Bayes Precision\": 0,\n",
" \"Decision Tree Recall\": 0,\n",
" \"Decision Tree Precision\": 0\n",
"}\n",
"\n",
"clf = DecisionTreeClassifier()\n",
"clf.fit(X_train, y_train)\n",
"print \"Decision Tree recall: {:.2f} and precision: {:.2f}\".format(recall(clf.predict(X_test),y_test),precision(clf.predict(X),y))\n",
"\n",
"results[\"Decision Tree Recall\"] = recall(clf.predict(X_test),y_test)\n",
"results[\"Decision Tree Precision\"] = precision(clf.predict(X_test),y_test)\n",
"\n",
"clf = GaussianNB()\n",
"clf.fit(X_train, y_train)\n",
"print \"GaussianNB recall: {:.2f} and precision: {:.2f}\".format(recall(clf.predict(X_test),y_test),precision(clf.predict(X),y))\n",
"\n",
"results[\"Naive Bayes Recall\"] = recall(clf.predict(X_test),y_test)\n",
"results[\"Naive Bayes Precision\"] = precision(clf.predict(X_test),y_test)\n",
"\n",
"\"\"\"\n",
"Decision Tree recall: 0.48 and precision: 0.53\n",
"GaussianNB recall: 0.69 and precision: 0.48\n",
"\n",
"\"\"\""
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/1-model-evaluation-and-validation/1.3.2 Validation.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Validation\n",
"\n",
"(Insert Train/Test split etc info from Evaluation Metrics notebook)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Where you use Training vs Testing data\n",
"\n",
"1. Train/test split.\n",
"2. Feature transform e.g. PCA fit then PCA transform.\n",
" - PCA fit on training features\n",
" - PCA transform on training features\n",
" - PCA transform on test features (usually after training SVC) -> Represent test data with principle components found in training data.\n",
"3. Classifier e.g. SVM fit then SVM predict.\n",
" - SVC fit on training features\n",
" - SVC predict on test features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross-Validation\n",
"\n",
"**Problems with splitting data into training & testing data**:\n",
"- Want to maximise size of both training and test sets, but there's a tradeoff.\n",
"\n",
"### K-fold cross-validation process:\n",
"1. Partition dataset into k bins.\n",
"2. Run k separate learning experiments.\n",
" - Pick test set\n",
" - Train\n",
" - Test on testing set\n",
"3. Average test results from these k experiments.\n",
"\n",
"Pick Train/Test or e.g. 10-fold CV based on priorities, which can be\n",
"- Min training time (train/test)\n",
"- Min run time (unclear but may as well do CV)\n",
"- Max accuracy (CV)\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'time' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-1-bd23e9b27a8c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcross_validation\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mKFold\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mkf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKFold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#length of dataset, no. of folds\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtrain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_indices\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mkf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'time' is not defined"
]
}
],
"source": [
"from sklearn.cross_validation import KFold\n",
"\n",
"t0 = time()\n",
"kf = KFold(len(data), 2) #length of dataset, no. of folds\n",
"for train_indices, test_indices in kf:\n",
" # Make training and testing datasets\n",
" features_train = [word_data[ii] for ii in train_indices]\n",
" features_test = [word_data[ii] for ii in test_indices]\n",
" authors_train = [authors[ii] for ii in train_indices]\n",
" authors_test = [authors[ii] for ii in test_indices]\n",
"\n",
"# Debugging\n",
"print(\"train_indices: \", train_indices)\n",
"print(\"authors_train: \", authors_train)\n",
"print(\"authours_test: \"authors_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note \n",
"**sklearn k-fold CV just splits data into equal-sized partitions - it doesn't shuffle the data.**\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross-Validation for Parameter Tuning\n",
"\n",
"### GridSearchCV\n",
"- Systematically works through multiple combinations of parameter tunes, cross-validating as it goes to determine which tune gives the best performance."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}\n",
"svr = svm.SVC()\n",
"clf = grid_search.GridSearchCV(svr, parameters)\n",
"clf.fit(iris.data, iris.target)\n",
"\n",
"print(\"Optimal parameter combination found: \", clf.best_params_)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.cross_validation import train_test_split\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Help on function train_test_split in module sklearn.cross_validation:\n",
"\n",
"train_test_split(*arrays, **options)\n",
" Split arrays or matrices into random train and test subsets\n",
" \n",
" Quick utility that wraps input validation and\n",
" ``next(iter(ShuffleSplit(n_samples)))`` and application to input\n",
" data into a single call for splitting (and optionally subsampling)\n",
" data in a oneliner.\n",
" \n",
" Read more in the :ref:`User Guide <cross_validation>`.\n",
" \n",
" Parameters\n",
" ----------\n",
" *arrays : sequence of indexables with same length / shape[0]\n",
" \n",
" allowed inputs are lists, numpy arrays, scipy-sparse\n",
" matrices or pandas dataframes.\n",
" \n",
" .. versionadded:: 0.16\n",
" preserves input type instead of always casting to numpy array.\n",
" \n",
" test_size : float, int, or None (default is None)\n",
" If float, should be between 0.0 and 1.0 and represent the\n",
" proportion of the dataset to include in the test split. If\n",
" int, represents the absolute number of test samples. If None,\n",
" the value is automatically set to the complement of the train size.\n",
" If train size is also None, test size is set to 0.25.\n",
" \n",
" train_size : float, int, or None (default is None)\n",
" If float, should be between 0.0 and 1.0 and represent the\n",
" proportion of the dataset to include in the train split. If\n",
" int, represents the absolute number of train samples. If None,\n",
" the value is automatically set to the complement of the test size.\n",
" \n",
" random_state : int or RandomState\n",
" Pseudo-random number generator state used for random sampling.\n",
" \n",
" stratify : array-like or None (default is None)\n",
" If not None, data is split in a stratified fashion, using this as\n",
" the labels array.\n",
" \n",
" .. versionadded:: 0.17\n",
" *stratify* splitting\n",
" \n",
" Returns\n",
" -------\n",
" splitting : list, length = 2 * len(arrays),\n",
" List containing train-test split of inputs.\n",
" \n",
" .. versionadded:: 0.16\n",
" Output type is the same as the input type.\n",
" \n",
" Examples\n",
" --------\n",
" >>> import numpy as np\n",
" >>> from sklearn.cross_validation import train_test_split\n",
" >>> X, y = np.arange(10).reshape((5, 2)), range(5)\n",
" >>> X\n",
" array([[0, 1],\n",
" [2, 3],\n",
" [4, 5],\n",
" [6, 7],\n",
" [8, 9]])\n",
" >>> list(y)\n",
" [0, 1, 2, 3, 4]\n",
" \n",
" >>> X_train, X_test, y_train, y_test = train_test_split(\n",
" ... X, y, test_size=0.33, random_state=42)\n",
" ...\n",
" >>> X_train\n",
" array([[4, 5],\n",
" [0, 1],\n",
" [6, 7]])\n",
" >>> y_train\n",
" [2, 0, 3]\n",
" >>> X_test\n",
" array([[2, 3],\n",
" [8, 9]])\n",
" >>> y_test\n",
" [1, 4]\n",
"\n"
]
}
],
"source": [
"help(train_test_split)"
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/1-model-evaluation-and-validation/1.4 Managing Error and Complexity.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. Causes of Error\n",
"\n",
"Two main causes of error: Bias and Variance\n",
"\n",
"**Bias** due to a model being unable to represent the complexity of the underlying data and \n",
"\n",
"**Variance** due to a model being overly sensitive to the limited data it has been trained on. \n",
"\n",
"## Bias\n",
"Error due to Bias - Accuracy and Underfitting\n",
"Bias occurs when a model has enough data but is not complex enough to capture the underlying relationships. As a result, the model consistently and systematically misrepresents the data, leading to low accuracy in prediction. This is known as underfitting.\n",
"\n",
"Simply put, bias occurs when we have an inadequate model. An example might be when we have objects that are classified by color and shape, for example easter eggs, but our model can only partition and classify objects by color. It would therefore consistently mislabel future objects--for example labeling rainbows as easter eggs because they are colorful.\n",
"\n",
"Another example would be continuous data that is polynomial in nature, with a model that can only represent linear relationships. In this case it does not matter how much data we feed the model because it cannot represent the underlying relationship. To overcome error from bias, we need a more complex model.\n",
"\n",
"## Variance\n",
"Error due to Variance - Precision and Overfitting\n",
"When training a model, we typically use a limited number of samples from a larger population. If we repeatedly train a model with randomly selected subsets of data, we would expect its predictons to be different based on the specific examples given to it. Here variance is a measure of how much the predictions vary for any given test sample.\n",
"\n",
"Some variance is normal, but too much variance indicates that the model is unable to generalize its predictions to the larger population. High sensitivity to the training set is also known as overfitting, and generally occurs when either the model is too complex or when we do not have enough data to support it.\n",
"\n",
"We can typically reduce the variability of a model's predictions and increase precision by training on more data. If more data is unavailable, we can also control variance by limiting our model's complexity.\n",
"\n",
"## Improving the Validity of a Model\n",
"There is a trade-off in the value of simplicity or complexity of a model given a fixed set of data. If it is too simple, our model cannot learn about the data and misrepresents the data. However if our model is too complex, we need more data to learn the underlying relationship. Otherwise it is very common for a model to infer relationships that might not actually exist in the data.\n",
"\n",
"The key is to find the sweet spot that minimizes bias and variance by finding the right level of model complexity. Of course with more data any model can improve, and different models may be optimal.\n",
"\n",
"To learn more about bias and variance, we recommend this essay by Scott Fortmann-Roe.\n",
"\n",
"In addition to the subset of data chosen for training, what features you use from a given dataset can also greatly affect the bias and variance of your model.\n",
"\n",
"## Bias-variance dilemma and no. of features\n",
"High bias: Pays little attention to data, oversimplified\n",
"- High error on training set\n",
"- Low r^2, large SSE\n",
"High variance: Pays too much attention to data (does not generalise well), overfits.\n",
"- Much higher error on test set than on training data\n",
"\n",
"E.g. \n",
"- few features used (if you have access to lots more) -> high bias.\n",
"- Carefully minimised SSE (used lots of features, tuned parameters) -> High variance\n",
"\n",
"Want min number of features (simplicity) to achieve good accuracy (goodness of fit)\n",
"- Few features, large r^2, low SSE.\n",
"\n",
"[overfit regression](images/p1-4-1-1.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. Curse of Dimensionality\n",
"As the number of **features or dimensions grows**, the amount of **data** we need to **generalise accurately** grows **exponentially**.\n",
"\n",
"e.g. KNN: distance or similarity function that assumes veerything is equally relevant, you'll have to see a lot of data before it washes itself away.\n",
"\n",
"e.g. 10 points uniformly distributed across a line segment. Each point owns a uniform part of the line segment. (// KNN)\n",
"-> Move from a line segment to a 2D space. Each `x` still represents 1/10th of the space, but now it represents a bigger space. The farthest point that the first `x` is representing has a much larger distance. \n",
"-> Q: How to make it such that each `x` has the same farthest-point-'diameter'? -> many more `x`s, e.g. 100.\n",
"\n",
"Think of it as points covering a space. If you want to cover the same amount of hyperspace...\n",
"More features -> more volume to fill."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. Learning Curves\n",
"\n",
"A **Learning Curve** is: a graph that compares the performance of a model on training and testing data over a varying number of training instances.\n",
"\n",
"- Should generally see performance improve as the number of training points increases.\n",
"\n",
"- By separating training and testing sets and graphing performance on each separately, we can get a better idea of how well the model can generalize to unseen data.\n",
"\n",
"A learning curve allows us to **verify when a model has learned as much as it can about the data**. When this occurs, the performance on both training and testing sets plateau and there is a consistent gap between the two error rates.\n",
"\n",
"### Bias\n",
"When the training and testing errors converge and are quite high this usually means \n",
"-> the model is biased. \n",
"- No matter how much data we feed it, the model cannot represent the underlying relationship and therefore has systematic high errors.\n",
"\n",
"### Variance\n",
"When there is a large gap between the training and testing error this generally means \n",
"-> the model suffers from high variance. \n",
"- Unlike a biased model, models that suffer from variance generally require more data to improve. \n",
"- We can also limit variance by simplifying the model to represent only the most important features of the data.\n",
"\n",
"## Ideal Learning Curve\n",
"The ultimate goal for a model is one that **has good performance that generalizes well to unseen data**. In this case, both the **testing and training curves converge at similar values**. \n",
"- The smaller the gap between the training and testing sets, the better our model generalizes. \n",
"- The better the performance on the testing set, the better our model performs.\n",
"\n",
"## Model Complexity\n",
"The visual technique of graphing performance is not limited to learning. With most models, we can change the complexity by changing the inputs or parameters.\n",
"\n",
"A **model complexity graph** looks at training and testing curves as the model's complexity varies. The most common trend is that **as a model increases (in complexity), bias will fall off and variance will rise.**\n",
"\n",
"Scikit-learn provides a tool for validation curves which can be used to monitor model complexity by varying the parameters of a model. We'll explore the specifics of how these parameters affect complexity in the next course on supervised learning.\n",
"\n",
"### Learning Curves and Model Complexity\n",
"So what is the relationship between learning curves and model complexity?\n",
"\n",
"If we were to take the learning curves of the same machine learning algorithm with the same fixed set of data, but create several graphs at different levels of model complexity, all the learning curve graphs would fit together into a 3D model complexity graph.\n",
"\n",
"If we took the final testing and training errors for each model complexity and visualized them along the complexity of the model we would be able to see how well the model performs as the model complexity increases.\n",
"\n",
"## Practical use of Model Complexity\n",
"Knowing that **we can identify issues with bias and variance by analyzing a model complexity graph**, we now have a visual tool to help identify ways to optimize our models.\n",
"\n",
"This will be one of the core tools we use in the upcoming project.\n",
"\n",
"In the final section, we will introduce cross validation and grid search, which will give us a concrete, systematic way of searching through different levels of complexity to find the optimal model that complexity and learning curves give us a holistic understanding of."
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/2-supervised-learning/.ipynb_checkpoints/2.4.1 Kernel Methods and Support Vector Machines-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Support Vector Machines\n",
"\n",
"(SVM 1)\n",
"\n",
"Drawing it in the middle gives a biggest 'demilitarised' zone.\n",
"Intuition:\n",
"* There might bu other minuses near the minunes we can see that we risk chopping off if a line gets too close to the current minuses.\n",
"* This data is just a sample from the population. // NN algorithms. Lines very close to e.g. the pluses -> believing training data too much. Overfitting.\n",
"* Middle line is **consistent with the data but commits least to it.**\n",
"* Interesting because it's not a complex overfit. They're all just lines.\n",
"\n",
"Hyperplanes:\n",
"$$y = w^Tx+b$$\n",
"* y represents the classification label\n",
"* w representns parameters for our plane\n",
"* b moves it out of the origin\n",
"\n",
"Taking some new point, projecting it onto the line, looking at the value you get when you project it.\n",
"\n",
"Value is positive if you are in the class, negative if you're not.\n",
"\n",
"Decision boundary being as far away from the data as possible without being inconsistent with it.\n",
"\n",
"Hyperplane equation at the decision boundary (neither positive nor negative output) is $w^Tx + b = 0$. \n",
"\n",
"What are the equations of the grey lines?\n",
"* We know labels are {-1, +1}. Line that brushes up against positive example: want it s.t. the output of the line is +1 on the first point that it encounters.\n",
"* $w^Tx+b=1$ for top grey line. Similarly, $w^T+b=-1$ for bottom grey line.\n",
"\n",
"(img)\n",
"\n",
"Need to maximise distance between two grey lines. The lines are parallel to one another. Choose one point on each grey line such that the line between them is perpendicular to the parallel lines.\n",
"\n",
"* Point on positive line: $w^Tx_1+b=1$\n",
"* Point on negative line: $w^Tx_2+b-1$\n",
"* Subtract to get line $w^T(x_1-x_2)=2\n",
"* Divide both sides by the length of w: \n",
"$$\\frac{w_t}{||w||}(x_1-x_2)=\\frac{2}{||w||}$$\n",
"\n",
"LHS: $x_1-x_2$ is projected onto the normalised vector (unit length, some direction). This is callled the **margin**.\n",
"\n",
"w represents a vector perpendicular to the line (eqn of a plane)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we want to maximise $\\frac{2}{||w||}$ while classifying everything correctly. Let's turn the condition into a mathematical expression.\n",
"\n",
"That is,\n",
"$$y_i(w^Tx_i + b) \\geq 1 \\forall i$$.\n",
"\n",
"* Q: Why geq 1 as opposed to geq 0?\n",
"\n",
"* Solve equivalent problem (LHS):\n",
"$$\\min \\frac{1}{2}||w||^2$$\n",
"\n",
"This is easier because it's a quadratic programming problem and people know how to solvo those in straightforward ways. They always have a unique solution.\n",
"\n",
"Transform into quadratic programming form:\n",
"$$\\max W(\\alpha) = \\sum_i \\alpha_i - \\frac{1}{2}\\sum_{i,j}\\alpha_i\\alpha_j y_iy_jx_i^Tx_j$$\n",
"s.t. $\\alpha_i \\geq 0, \\sum_i \\alpha_i y_i = 0$.\n",
"\n",
"Properties\n",
"* Once you find $\\alpha$, you can recover w: $w=\\sum_i\\alpha_iy_ix_i$.\n",
"* You can also recover b from having w.\n",
"* It turns out that those $\\alpha_i$s are mostly zero. -> Only a few x-s matter. Cause some datapoints don't factor into (don't matter for) w. -> Can find all of support you need in some vectors with the non-zero $\\alpha_i$s. -> **machine that only needs a few support vectors**.\n",
"* Which vectors matter (will be part of the support vectors)? (Those closer to the line)\n",
"\n",
"* Similarities to Nearest Neighbours cause only local points matter. Like KNN except you've already done the work to figure out which ones you need and which ones you can throw away. -> Like instance-based learning but it's not completely lazy. (?)\n",
"\n",
"Dot product of $x_i^Tx_j$ -> Length of the projection. Measure of similarity (of direction) -> If they point in opposite directions it'll be a negative, if orthogonal it'll be 0, if in same direction it'll be positive and bigger.\n",
"* Eqn: Find all pairs of points, figure out which ones matter, and think about how they relate to one another wrt their output labels wrt how similar they are.\n",
"\n",
"## Supposing not linearly separable\n",
"\n",
"* If have **outlier or intruder**: Can tradeoff: Maximise margin Makes the minimal set of errors while maximising the margin if you were allowed to flip a few points from pos to neg or vv.\n",
"* 'Linearly married': minuses in a ring around the pluses. **Transform datapoints**.\n",
" - e.g. $\\Phi(q) = <q_1^2, q_2^2, \\sqrt2 q_1q_2>$\n",
" - $\\Phi(x)^T\\Phi(y) = (x_1y_1+x_2y_2)^2 = (x^T y)^2$ (dot product, circle)\n",
" - Different notion of similarity: Now whether or not you fall in a circle vs direction. Distance in different spaces.\n",
" - Chose this form but doesn't require that you do this transformation. Can still simply compute the dot product.\n",
" - This is the **kernel trick**.\n",
" - Turns out for any function that you use, there is some transformation into some higher dimensional space that happens to represent your kernel.\n",
" \n",
"### Kernel Trick\n",
"- The kernel is the function itself. e.g. $k = (x^Ty)^2$\n",
"$$\\max W(\\alpha) = \\sum_i \\alpha_i - \\frac{1}{2}\\sum_{i,j}\\alpha_i\\alpha_j y_iy_jk(x_i,x_j)$$\n",
"\n",
"\n",
"Kernel is mech by which we **measure of similarity** , mech by which we **inject domain knowledge** into the SVM algorithm. Just like KNN.\n",
"\n",
"And in higher dimensional space, your points are linearly separable.\n",
"\n",
"**Common kernels**\n",
"* Polynomial kernel $k = (x^Ty+c)^p$ -> Like polynomial regression.\n",
"* $k = e^{\\frac{-||x-y||^2}{2\\sigma^2}}$. If on top of each other, similarity is 1. If very distant, k close to 1. It's symmetric. Like a Gaussian with some width.\n",
"* $k = tanh(\\betax^Ty + \\theta)$ -> Like a sigmoid.\n",
"\n",
"**Good kernels**: Captures your domain knowledge, your notion of similarity.\n",
"\n",
"**Requirements: Mercer Condition**: it acts like a distance. Positive semidefinite (well-behaved).\n",
"- In practice stuff often works even if it doesn't satisfy the Mercer Condition so it's que merciful.\n",
"\n",
"#### Applications\n",
"x, y can be discrete variables as long as you have some notion of similarity than you can define that returns a number. You can think about strings, graphs, images."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusion\n",
"- Margins and relation to genelatisation and overfitting\n",
"- Want to max margin\n",
"- Optimisation problem for finding linear separator that has max margin (quadratic programming)\n",
"- Support vectors: SVM is as lazy as necessary\n",
"- Kernel trick (transformations for non-linearly-separable data)\n",
"\n",
"General alg q: What are the levers we have for expressing domain knowledge? "
]
}
],
"metadata": {
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
================================================
FILE: lesson-notes/2-supervised-learning/.ipynb_checkpoints/2.5 Instance-based Learning-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Instance-Based Learning\n",
"*Nonparametric Models*\n",
"\n",
"**Prev SL tasks**: Given a bunch of data (x,y) and we would learn some functions, e.g a line, to represent them. And then we'd effectively throw the data away when we're making our predictions.\n",
"\n",
"New model **Version 1**:\n",
"Instead, put all data (x,y) in a database. Then when we want to predict y for x, we look it up as **f(x) = lookup(x).\n",
"\n",
"- Remembers \n",
" - But no generalisation :( \n",
" - Overfitting problems, sensitive to noise\n",
" - If same x has multiple ys, will return all of them.\n",
"- It's fast: No 'wasted time' doing learning\n",
"\n",
"e.g. housing prices example. -> **K Nearest Neighbours**\n",
"Parameters:\n",
"- Number of nearest neighbours\n",
"- Some notion of distance. \n",
" - Note: Distance might be straight-line distance, driving distance, may need to take into account that crossing a highway in Atlanta is metaphorically a BIG distance.\n",
" - Some measure of similarity\n",
"\n",
"Free parameters"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n16793MM8wq+bmZk2ERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERAB\nERABERABERABERABERABERABERABERABERABERABERABEehsAl2dbb6sF4GWEdBno2VopVgEREAE\nREAEREAEREAEREAEREAEREAEREAEREAEREAEzo3A6bnVpIpEoEMIyAnWISfqkpup6/CSn2A1TwRE\nQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREoEBATusCCkUugoAccxdB/XLWqWvpcp5XtUoE\nREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKB9CMi53D7nomMtkVOvY0/duRqu6+Rccasy\nERABERABERABERABERABERABERABERABERABERABERABEaibgJzIdaN7PwrK8fd+nOdqrdR1UI2Q\n8kVABERABERABERABERABERABERABERABERABERABERABETgchCQA/lynMe6WyHHYN3oOrKgzndH\nnjYZLQIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAItJyDHccsRt0cFchi2x3lohRU6\nt62gKp0iIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIi8P4QkNP4Ep5rOREvx0nVebwc\n51GtEAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREIF2JyCncbufoSr2ybFYBVCbZuu8\ntemJkVkiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIi8J4RkMO4w064HI2dccJ0njrj\nPMlKERABERABERABERABERABERABERABERABERABERABERABEXjfCchh3OZXgByP7XuCdG7a99zI\nMhEQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQgeoE5CyuzujcJeSEPHfkFSvU+aiI\nR5kiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIdSkDO4jY5cXJIXvyJ0Dm4+HOQ\nZoHOSxoVpYmACIiACIiACIiACIiACIiACIiACIiACIiACIiACIhAZxGQU7I9z5fOywWeFznBLga+\nuGfnLlbZWUlSBERABERABERABERABERABERABERABERABERABERABESgPQjIAZr9PIhVdlZNkZTz\nrSkYMyt5n3m/z23PfIFIUAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQARE4L0m8D47S9/n\ntp/rRS+nXetxvw+M34c2tv5KUQ0iIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiUJ3A\n++BIfR/aWP1Mt0hCjr0WgYXay8b2srWndWdemkVABERABERABERABERABERABERABERABERABERA\nBERABETgYghcNsfqZWvPxVwViVrl9EsAacJhpzPtdPubcAqlQgREQAREQAREQAREQAREQAREQARE\nQAREQAREQAREQAREQAQuFYFOd7R2uv1tdTHJGdi809GpLDvV7uadOWkSAREQAREQAREQAREQAREQ\nAREQAREQAREQAREQAREQAREQgfeLQKc6XDvV7ra6uuQcbPx0dBLDTrK18TNzfhrE9fxYqyYREAER\nEAEREAEREAEREAEREAEREAEREAEREAEREAERkJOwNddAJ3HtJFtbc7Ya0CrHVv3wOoFdJ9hY6xm4\njG2qlYHkRUAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAE2ovAZXRYdkKbOsHG9rpSYY2c\nbbWfknZn1u72BeKdYmewV6EIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAINJtApzg4\n293Odrev2ddNQ/rkpMuOr11ZtaNd7WhT9jMtSREQAREQAREQAREQAREQAREQAREQAREQAREQAREQ\nAREQARFoHwLt6PxsR5t4xtrVrva5mmCJHHnZTke7cWoHe9rBhmxnT1IiIAIiIAIiIAIiIAIiIAIi\nIAIiIAIiIAIiIAIiIAIiIAIicDkJtINDtB1siM9uu9kT29YWcTn5Kp+GduNzUfZcVL2Vz45yRUAE\nREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEkgQuykF6UfUm2x+O282eYNeFh3L8lT8F\n7cLmvO047/rKn4HsOZ1oc/bWSVIEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKCdCHSi\n4/G8bT7v+spdH+1iRzn7LiRdjrWz2NuByXnZcF71nKWcntJu9qRbqVQREAEREAEREAEREAEREAER\nEAEREAEREAEREAEREAEREAERqJ1Auzkrz8ue86qn0hlpBxsq2XeueXLIleK+aB6trr/V+ktpFo8u\nqt6iBYqJgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQGcQuChnZqvrbbX+amf3ouuv\nZt+55ctx51FfNIdW1t9K3fGFel71xHUqLgIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIi\nIALvE4HzcnK2sp5W6s5yLVx0/VlsbKmMnHpmF8mgVXW3Si8vxlbqbvbF3km2Nrvt0icCIiACIiAC\nIiACIiACIiACIiACIiACIiACIiACIiACItAYgU5yJLbS1lbpbpXeLGf9IuvOYl9LZd5nB9pFtb1V\n9bZCbyt0Zr2gL7LurDZKTgREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAQqEbhIR2Qr\n6m6FTvJrld5K5+Yi661mV0vz31cn3EW1u9n1NlNfM3VVumjPq55KNihPBERABERABERABERABERA\nBERABERABERABERABERABERABNqJwHk5SJtZTzN18Vw0W1/W83tR9Wa1r+ly76Oz7iLa3Mw6m6Wr\nWXqSF2Wr9CbraYfj96mt7cBbNoiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIhATOB9cuy1\nqq3N0tssPTy/zdQVXy+V4hdRZyV7Wpr3vjm4zru9zayvGbqaoSNckM3UFXTWGraDDbXaLHkREAER\nEAEREAEREAEREAEREAEREAEREAEREAEREAEREIHLQaAdnIrNtKEZupqhI1wdzdQVdFYKz7u+Sra0\nNO99cbCddzubVV8z9LSLjkoXcjNsrKRfeSIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIg\nAiLQLgRa7Yhshv520cFz1gxbajn3511fLbY1RfZ9cMyddxubUV+jOi66fPLibNSepL52PX5f2tmu\n/GWXCIiACIiACIiACIiACIiACIiACIiACIiACIiACIjA5SZw6R13+dPX7HY2qu+iyxNLozbU+sk4\n7/pqta8h+cvu0DrP9jWjrkZ0XFTZcAE2Un/QUU94UfXWY6vKiIAIiIAIiIAIiIAIiIAIiIAIiIAI\niIAIiIAIiIAIiIAIXA4CF+VAbEa9jei4qLLhqmmk/qAja3iedWW1qSlyl9m5dl5ta0Y99eo473Lh\noqu33lC+XNgqveXqU7oIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAInBeBVjkcG9Vb\nb/nzLhefp3rrjnVkiZ9XPVlsaZrMZXXInVe7Gq2n3vL1lKunDC+0esslL9Jm6UnqbdZxu9vXrHZK\njwiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAi8zwTa3eHXLPvq1VNPuXrK8Bqst1y4fhst\nH/RUC8+rnmp2NC3/MjrFzqtNjdRTb9lay9UqzwurnjLxBdlo+VhXWrzV+tPqVJoIiIAIiIAIiIAI\niIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIVCLQaidio/rrKV9rmVrlA896y7F8I2VD/VnC86oniy0N\ny1w2Z9t5tKfROmot327y4aKr1a5QLi1spq40/UoTAREQAREQAREQAREQAREQAREQAREQAREQAREQ\nAREQAREQgXYh0ExnY726ai3XbvLJc1mrfcnyWY7Po44sdjQsc9kcc61uTyP6ay3bSvlW6k67KGut\nL01H1rTzrCurTZITAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQARHobALn6RxstK5ay9ci\nX4ssz3ir5eOrqta64rJZ4q3Wn8WGpshcFmfaebSj3jpqLVeLfDvIxhdiLfbE5crFm62vXD1KFwER\nEAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREIFmE2i2Q7FefbWUawdZnoda7IjPW73lYh3V\n4udRRzUbGsq/DA64VrehEf21lG2FbCt0hguuFt2hTAgbKRt01BNeVL312KoyIiACIiACIiACIiAC\nIiACIiACIiACIiACIiACIiACIiAC50vgohx/jdRba9la5LPKZpXj2WyVbPJKqaWeZNksx63Wn8WG\numUug8OslW2oV3et5bLKZ5HLIsMLJqtcrbLhYqxFfyhTKWy2vkp1KU8EREAEREAEREAEREAEREAE\nREAEREAEREAEREAEREAEREAE6iHQbMdhPfpqKZNVNotcFhkyzSoX+Ncq32i5UL5SWK9NlXSeW16n\nO91aaX+9umspl1U2i1wWGV5YWeSyyMQXaa3yzSob66k13ojNtdYleREQAREQAREQAREQAREQAREQ\nAREQAREQAREQAREQAREQgfYkcFGOvkbqrbVsFvksMjyDWeSyyGTVFa6arDqDfAjrLRfKVwpbqbtS\nvQ3ndaqTrNV216s/a7lmymXR1SwZXnBZdCUvzHrKJHWE42bqCjoVioAIiIAIiIAIiIAIiIAIiIAI\niIAIiIAIiIAIiIAIiIAIiEAjBJrpLKxHV9YyWeTOU4bMs9RXi1zyPGbVnyyX9bjV+rPakVmuU51t\nrbS7Ht21lMki2wyZZujghZRFT7jgapENZWqtIy5Xb7xeO+utT+VEQAREQAREQAREQAREQAREQARE\nQAREQAREQAREQAREQATal8B5O/jqra+WcllkmyHTDB28MrLoCVdQLbKNlAllq4X12FNNZ0vzO9FR\n1kqb69GdtUwWuWoy1fJ5sVSTaTQ/XJDV9AS5ENYqH8rFYTN0xPoUFwEREAEREAEREAEREAEREAER\nEAEREAEREAEREAEREAEREIFmEWiGo7BWHVnlq8k1mk+G56EjnKtqdQW5OKynTFy+UryVuivVW1de\nJzrcWmFzPTprKVNNtt3zeXFVszFcgFnlgnwtuuMytcTrsakW/ZIVAREQAREQAREQAREQAREQAREQ\nAREQAREQAREQAREQARG4PARa7eyrR3/WMlnkqsm0e358pVWzNZYN8XrKhLLlwlboLFdXw+md5Dhr\npa216s4qn0WukkylPJ78SvmV8qqVzZKfVYZy3KrZ46XK/220fHnNrc/pZNtbT0c1iIAIiIAIiIAI\n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
gitextract_wrwg0zgp/
├── .gitignore
├── .ipynb_checkpoints/
│ └── Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb
├── README.md
├── lesson-notes/
│ ├── .ipynb_checkpoints/
│ │ ├── Fast, Scalable Deep Learning - Alan Mosca-checkpoint.ipynb
│ │ └── Healthcare - Christopher Thompson 1 Oct 2016-checkpoint.ipynb
│ ├── 0-intro/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb
│ │ └── Getting Started - From Artificial Intelligence to Machine Learning.ipynb
│ ├── 1-model-evaluation-and-validation/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 1.3.1 Evaluation Metrics-checkpoint.ipynb
│ │ │ └── 1.3.2 Validation-checkpoint.ipynb
│ │ ├── 1.3.1 Evaluation Metrics.ipynb
│ │ ├── 1.3.2 Validation.ipynb
│ │ └── 1.4 Managing Error and Complexity.ipynb
│ ├── 2-supervised-learning/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 2.4.1 Kernel Methods and Support Vector Machines-checkpoint.ipynb
│ │ │ ├── 2.5 Instance-based Learning-checkpoint.ipynb
│ │ │ ├── 2.6.2 Bayesian Learning-checkpoint.ipynb
│ │ │ └── 2.6.4 Bayes NLP project-checkpoint.ipynb
│ │ ├── 2.1.2 Regression and Classification.ipynb
│ │ ├── 2.1.4 More Regressions.ipynb
│ │ ├── 2.2 Decision Trees.ipynb
│ │ ├── 2.3 Neural Networks.ipynb
│ │ ├── 2.4.1 Kernel Methods and Support Vector Machines.ipynb
│ │ ├── 2.5 Instance-based Learning.ipynb
│ │ ├── 2.6.2 Bayesian Learning.ipynb
│ │ ├── 2.6.4 Bayes NLP project.ipynb
│ │ └── README.md
│ ├── 3-unsupervised-learning/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 3.1.3 More Clustering-checkpoint.ipynb
│ │ │ ├── 3.2.2 Feature Selection-checkpoint.ipynb
│ │ │ ├── 3.3.1 PCA-checkpoint.ipynb
│ │ │ ├── Feature Transformation-checkpoint.ipynb
│ │ │ ├── More Clustering-checkpoint.ipynb
│ │ │ └── Untitled-checkpoint.ipynb
│ │ ├── 3.1.3 More Clustering.ipynb
│ │ ├── 3.2.2 Feature Selection.ipynb
│ │ ├── 3.3.1 PCA.ipynb
│ │ └── README.md
│ ├── 4-reinforcement-learning/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 4.1.1 Markov Decision Processes-checkpoint.ipynb
│ │ │ └── 4.1.2 Reinforcement Learning-checkpoint.ipynb
│ │ ├── 4.1.1 Markov Decision Processes.ipynb
│ │ ├── 4.1.2 Reinforcement Learning.ipynb
│ │ └── README.md
│ ├── 5-ml-for-trading/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── 0. Course Outline-checkpoint.ipynb
│ │ └── 0. Course Outline.ipynb
│ └── Healthcare - Christopher Thompson 1 Oct 2016.ipynb
├── p0-titanic-survival-exploration/
│ ├── .ipynb_checkpoints/
│ │ └── titanic_survival_exploration-checkpoint.ipynb
│ ├── README.md
│ ├── report.html
│ ├── titanic_data.csv
│ ├── titanic_survival_exploration.ipynb
│ └── titanic_visualizations.py
├── p1-boston-housing/
│ ├── .ipynb_checkpoints/
│ │ └── boston_housing-checkpoint.ipynb
│ ├── README.md
│ ├── boston_housing.ipynb
│ ├── housing.csv
│ ├── report.html
│ └── visuals.py
├── p2-student-intervention/
│ ├── .ipynb_checkpoints/
│ │ ├── student_intervention-Copy1-checkpoint.ipynb
│ │ ├── student_intervention-checkpoint.ipynb
│ │ ├── student_intervention1-checkpoint.ipynb
│ │ └── student_intervention_py2.7-checkpoint.ipynb
│ ├── README.md
│ ├── archive/
│ │ ├── student_intervention-Copy1.ipynb
│ │ ├── student_intervention1.ipynb
│ │ └── student_intervention_py2.7.ipynb
│ ├── report.html
│ ├── student-data.csv
│ └── student_intervention.ipynb
├── p3-creating-customer-segments/
│ ├── .ipynb_checkpoints/
│ │ └── customer_segments-checkpoint.ipynb
│ ├── README.md
│ ├── archive/
│ │ └── customer_segments_python2.7.ipynb
│ ├── customer_segments.ipynb
│ ├── customers.csv
│ ├── renders.py
│ ├── renders_py3.py
│ └── report.html
├── p4-smartcab/
│ ├── .ipynb_checkpoints/
│ │ ├── Smartcab Report-Copy1-checkpoint.ipynb
│ │ ├── Smartcab Report-Copy2-checkpoint.ipynb
│ │ ├── Smartcab Report-checkpoint.ipynb
│ │ └── smartcab-report-checkpoint.ipynb
│ ├── README.md
│ ├── old-versions-of-reports/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── Smartcab Report-Copy1-checkpoint.ipynb
│ │ ├── Smartcab Report-Copy1.ipynb
│ │ └── Smartcab Report-Copy2.ipynb
│ ├── smartcab/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── environment.py
│ │ ├── planner.py
│ │ ├── qtable.js
│ │ ├── report.html
│ │ ├── simulator.py
│ │ └── trial-data/
│ │ ├── data.js
│ │ ├── trial1.js
│ │ ├── trial10.js
│ │ ├── trial2.js
│ │ ├── trial3.js
│ │ ├── trial4.js
│ │ ├── trial5.js
│ │ ├── trial6.js
│ │ ├── trial7.js
│ │ ├── trial8.js
│ │ └── trial9.js
│ ├── smartcab-report.ipynb
│ ├── smartcab_parameter_search.csv
│ └── smartcab_params_summary.csv
└── p5-capstone/
├── .ipynb_checkpoints/
│ ├── 2-analysis-code-py2-checkpoint.ipynb
│ ├── 2-analysis-code-py3-checkpoint.ipynb
│ ├── 3-methodology-results-conclusion-code-py2-Copy1-checkpoint.ipynb
│ ├── 3-methodology-results-conclusion-code-py2-checkpoint.ipynb
│ ├── 3-methodology-results-conclusion-code-py3-checkpoint.ipynb
│ ├── Discarded Notes-checkpoint.ipynb
│ ├── delete-checkpoint.ipynb
│ ├── lse-list-checkpoint.ipynb
│ ├── p5.1-definition-checkpoint.ipynb
│ ├── p5.2-4-code-checkpoint.ipynb
│ ├── p5.2-4-report-checkpoint.ipynb
│ └── p5.5-conclusion-checkpoint.ipynb
├── 2-analysis-code-py2.ipynb
├── 2-analysis-code-py2.ipynb.bak
├── 2-analysis-code-py3.ipynb
├── 3-methodology-results-conclusion-code-py2.ipynb
├── 3-methodology-results-conclusion-code-py3.ipynb
├── README.md
├── archive/
│ ├── .ipynb_checkpoints/
│ │ └── Discarded Notes-checkpoint.ipynb
│ ├── Discarded Notes.ipynb
│ ├── III. Methodology - Code-Copy1.ipynb
│ ├── lse-list.ipynb
│ ├── ml-for-trading/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 2. Computational Investment-checkpoint.ipynb
│ │ │ └── 3. ML for Trading Algorithms-checkpoint.ipynb
│ │ ├── 2. Computational Investment.ipynb
│ │ └── 3. ML for Trading Algorithms.ipynb
│ ├── p5.2-4-code.ipynb
│ ├── report-drafts/
│ │ ├── p5.1-definition.ipynb
│ │ ├── p5.2-4-report.ipynb
│ │ └── p5.5-conclusion.ipynb
│ ├── robot_motion_planning/
│ │ ├── maze.py
│ │ ├── robot.py
│ │ ├── showmaze.py
│ │ ├── test_maze_01.txt
│ │ ├── test_maze_02.txt
│ │ ├── test_maze_03.txt
│ │ └── tester.py
│ └── udacity-materials/
│ └── project_report_template.md
├── ftse100-figures.csv
├── ftse100-list.csv
├── google-finance-py2.py
├── google-finance-scraper.py
├── list-of-all-securities-ex-debt.csv
└── report.md
SYMBOL INDEX (68 symbols across 12 files)
FILE: p0-titanic-survival-exploration/titanic_visualizations.py
function filter_data (line 5) | def filter_data(data, condition):
function survival_stats (line 44) | def survival_stats(data, outcomes, key, filters = []):
FILE: p1-boston-housing/visuals.py
function ModelLearning (line 14) | def ModelLearning(X, y):
function ModelComplexity (line 66) | def ModelComplexity(X, y):
function PredictTrials (line 104) | def PredictTrials(X, y, fitter, data):
FILE: p3-creating-customer-segments/renders.py
function pca_results (line 7) | def pca_results(good_data, pca):
function cluster_results (line 42) | def cluster_results(reduced_data, preds, centers, pca_samples):
function channel_results (line 76) | def channel_results(reduced_data, outliers, pca_samples):
FILE: p3-creating-customer-segments/renders_py3.py
function pca_results (line 7) | def pca_results(good_data, pca):
function cluster_results (line 42) | def cluster_results(reduced_data, preds, centers, pca_samples):
function channel_results (line 76) | def channel_results(reduced_data, outliers, pca_samples):
FILE: p4-smartcab/smartcab/agent.py
class LearningAgent (line 7) | class LearningAgent(Agent):
method __init__ (line 10) | def __init__(self, env):
method get_q (line 25) | def get_q(self, state, action):
method learn_q (line 29) | def learn_q(self, state, action, reward, state2):
method reset (line 39) | def reset(self, destination=None):
method choose_action (line 45) | def choose_action(self, state):
method update (line 71) | def update(self, t):
function run (line 120) | def run():
FILE: p4-smartcab/smartcab/environment.py
class TrafficLight (line 7) | class TrafficLight(object):
method __init__ (line 12) | def __init__(self, state=None, period=None):
method reset (line 17) | def reset(self):
method update (line 20) | def update(self, t):
class Environment (line 25) | class Environment(object):
method __init__ (line 33) | def __init__(self, num_dummies=3):
method create_agent (line 70) | def create_agent(self, agent_class, *args, **kwargs):
method set_primary_agent (line 75) | def set_primary_agent(self, agent, enforce_deadline=False):
method reset (line 79) | def reset(self):
method step (line 111) | def step(self):
method sense (line 139) | def sense(self, agent):
method get_deadline (line 167) | def get_deadline(self, agent):
method act (line 170) | def act(self, agent, action):
method compute_dist (line 229) | def compute_dist(self, a, b):
class Agent (line 233) | class Agent(object):
method __init__ (line 236) | def __init__(self, env):
method reset (line 242) | def reset(self, destination=None):
method update (line 245) | def update(self, t):
method get_state (line 248) | def get_state(self):
method get_next_waypoint (line 251) | def get_next_waypoint(self):
class DummyAgent (line 255) | class DummyAgent(Agent):
method __init__ (line 258) | def __init__(self, env):
method update (line 263) | def update(self, t):
FILE: p4-smartcab/smartcab/planner.py
class RoutePlanner (line 3) | class RoutePlanner(object):
method __init__ (line 6) | def __init__(self, env, agent):
method route_to (line 11) | def route_to(self, destination=None):
method next_waypoint (line 15) | def next_waypoint(self):
FILE: p4-smartcab/smartcab/simulator.py
class Simulator (line 6) | class Simulator(object):
method __init__ (line 24) | def __init__(self, env, size=None, update_delay=1.0, display=True):
method run (line 62) | def run(self, n_trials=1):
method render (line 108) | def render(self):
method pause (line 159) | def pause(self):
FILE: p5-capstone/archive/robot_motion_planning/maze.py
class Maze (line 3) | class Maze(object):
method __init__ (line 4) | def __init__(self, filename):
method is_permissible (line 59) | def is_permissible(self, cell, direction):
method dist_to_wall (line 74) | def dist_to_wall(self, cell, direction):
FILE: p5-capstone/archive/robot_motion_planning/robot.py
class Robot (line 3) | class Robot(object):
method __init__ (line 4) | def __init__(self, maze_dim):
method next_move (line 16) | def next_move(self, sensors):
FILE: p5-capstone/google-finance-py2.py
function append_page_figures (line 17) | def append_page_figures(url):
function convert_date (line 51) | def convert_date(date):
function number_of_pages (line 56) | def number_of_pages():
function assemble_stock_query (line 63) | def assemble_stock_query(start):
function write_to_file (line 75) | def write_to_file(data, filename, header=None):
FILE: p5-capstone/google-finance-scraper.py
function append_page_figures (line 17) | def append_page_figures(url):
function convert_date (line 52) | def convert_date(date):
function number_of_pages (line 57) | def number_of_pages():
function assemble_stock_query (line 64) | def assemble_stock_query(start):
function write_to_file (line 76) | def write_to_file(data, filename, header=None):
Copy disabled (too large)
Download .json
Condensed preview — 147 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (24,615K chars).
[
{
"path": ".gitignore",
"chars": 13,
"preview": "code/\n\n*.zip\n"
},
{
"path": ".ipynb_checkpoints/Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb",
"chars": 72,
"preview": "{\n \"cells\": [],\n \"metadata\": {},\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
},
{
"path": "README.md",
"chars": 1502,
"preview": "# machine-learning-nd\n\nUdacity's Machine Learning Nanodegree project files and notes.\n\nThis repository contains project "
},
{
"path": "lesson-notes/.ipynb_checkpoints/Fast, Scalable Deep Learning - Alan Mosca-checkpoint.ipynb",
"chars": 645,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Fast, Scalable Deep Learning\\n\",\n"
},
{
"path": "lesson-notes/.ipynb_checkpoints/Healthcare - Christopher Thompson 1 Oct 2016-checkpoint.ipynb",
"chars": 3002,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Christopher Thompson: Applicati"
},
{
"path": "lesson-notes/0-intro/.ipynb_checkpoints/Getting Started - From Artificial Intelligence to Machine Learning-checkpoint.ipynb",
"chars": 8564,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Getting Started - From Artificial"
},
{
"path": "lesson-notes/0-intro/Getting Started - From Artificial Intelligence to Machine Learning.ipynb",
"chars": 8564,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Getting Started - From Artificial"
},
{
"path": "lesson-notes/1-model-evaluation-and-validation/.ipynb_checkpoints/1.3.1 Evaluation Metrics-checkpoint.ipynb",
"chars": 6835,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Training and Testing\\n\",\n \"\\n\""
},
{
"path": "lesson-notes/1-model-evaluation-and-validation/.ipynb_checkpoints/1.3.2 Validation-checkpoint.ipynb",
"chars": 9500,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Validation\\n\",\n \"\\n\",\n \"(In"
},
{
"path": "lesson-notes/1-model-evaluation-and-validation/1.3.1 Evaluation Metrics.ipynb",
"chars": 6835,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Training and Testing\\n\",\n \"\\n\""
},
{
"path": "lesson-notes/1-model-evaluation-and-validation/1.3.2 Validation.ipynb",
"chars": 9500,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Validation\\n\",\n \"\\n\",\n \"(In"
},
{
"path": "lesson-notes/1-model-evaluation-and-validation/1.4 Managing Error and Complexity.ipynb",
"chars": 9626,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 1. Causes of Error\\n\",\n \"\\n\",\n"
},
{
"path": "lesson-notes/2-supervised-learning/.ipynb_checkpoints/2.4.1 Kernel Methods and Support Vector Machines-checkpoint.ipynb",
"chars": 7776,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Support Vector Machines\\n\",\n \""
},
{
"path": "lesson-notes/2-supervised-learning/.ipynb_checkpoints/2.5 Instance-based Learning-checkpoint.ipynb",
"chars": 429134,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Instance-Based Learning\\n\",\n \""
},
{
"path": "lesson-notes/2-supervised-learning/.ipynb_checkpoints/2.6.2 Bayesian Learning-checkpoint.ipynb",
"chars": 3790,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Bayesian Learning\\n\",\n \"\\n\",\n "
},
{
"path": "lesson-notes/2-supervised-learning/.ipynb_checkpoints/2.6.4 Bayes NLP project-checkpoint.ipynb",
"chars": 2481,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {\n \"collapsed\": true\n },\n \"o"
},
{
"path": "lesson-notes/2-supervised-learning/2.1.2 Regression and Classification.ipynb",
"chars": 4969,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Regression and Classification\\n\","
},
{
"path": "lesson-notes/2-supervised-learning/2.1.4 More Regressions.ipynb",
"chars": 8229,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"\\n\",\n \"Using data to build a mod"
},
{
"path": "lesson-notes/2-supervised-learning/2.2 Decision Trees.ipynb",
"chars": 8969,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Supervised Learning\\n\",\n \"\\n\","
},
{
"path": "lesson-notes/2-supervised-learning/2.3 Neural Networks.ipynb",
"chars": 28216,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Neural Networks\\n\",\n \"\\n\",\n "
},
{
"path": "lesson-notes/2-supervised-learning/2.4.1 Kernel Methods and Support Vector Machines.ipynb",
"chars": 7776,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Support Vector Machines\\n\",\n \""
},
{
"path": "lesson-notes/2-supervised-learning/2.5 Instance-based Learning.ipynb",
"chars": 429134,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Instance-Based Learning\\n\",\n \""
},
{
"path": "lesson-notes/2-supervised-learning/2.6.2 Bayesian Learning.ipynb",
"chars": 3790,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Bayesian Learning\\n\",\n \"\\n\",\n "
},
{
"path": "lesson-notes/2-supervised-learning/2.6.4 Bayes NLP project.ipynb",
"chars": 2481,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {\n \"collapsed\": true\n },\n \"o"
},
{
"path": "lesson-notes/2-supervised-learning/README.md",
"chars": 221,
"preview": "# 2 Supervised Learning\n\nLessons in this module:\n1. Supervised Learning Tasks\n2. Decision Trees\n3. Artificial Neural Net"
},
{
"path": "lesson-notes/3-unsupervised-learning/.ipynb_checkpoints/3.1.3 More Clustering-checkpoint.ipynb",
"chars": 5072,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Clustering\\n\",\n \"\\n\",\n \"Eac"
},
{
"path": "lesson-notes/3-unsupervised-learning/.ipynb_checkpoints/3.2.2 Feature Selection-checkpoint.ipynb",
"chars": 17291,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Feature Selection\\n\",\n \"Minima"
},
{
"path": "lesson-notes/3-unsupervised-learning/.ipynb_checkpoints/3.3.1 PCA-checkpoint.ipynb",
"chars": 7233,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# PCA: Principal Component Analysis"
},
{
"path": "lesson-notes/3-unsupervised-learning/.ipynb_checkpoints/Feature Transformation-checkpoint.ipynb",
"chars": 72,
"preview": "{\n \"cells\": [],\n \"metadata\": {},\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
},
{
"path": "lesson-notes/3-unsupervised-learning/.ipynb_checkpoints/More Clustering-checkpoint.ipynb",
"chars": 3627,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Clustering\\n\",\n \"\\n\",\n \"Eac"
},
{
"path": "lesson-notes/3-unsupervised-learning/.ipynb_checkpoints/Untitled-checkpoint.ipynb",
"chars": 72,
"preview": "{\n \"cells\": [],\n \"metadata\": {},\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
},
{
"path": "lesson-notes/3-unsupervised-learning/3.1.3 More Clustering.ipynb",
"chars": 5072,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Clustering\\n\",\n \"\\n\",\n \"Eac"
},
{
"path": "lesson-notes/3-unsupervised-learning/3.2.2 Feature Selection.ipynb",
"chars": 17291,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Feature Selection\\n\",\n \"Minima"
},
{
"path": "lesson-notes/3-unsupervised-learning/3.3.1 PCA.ipynb",
"chars": 7233,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# PCA: Principal Component Analysis"
},
{
"path": "lesson-notes/3-unsupervised-learning/README.md",
"chars": 506,
"preview": "# 3 Unsupervised Learning\n\n## Foci\n1. How unsupervised learning fills in the model-building gap in the ML workflow\n2. Ho"
},
{
"path": "lesson-notes/4-reinforcement-learning/.ipynb_checkpoints/4.1.1 Markov Decision Processes-checkpoint.ipynb",
"chars": 11548,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Decision Making and Reinforcemen"
},
{
"path": "lesson-notes/4-reinforcement-learning/.ipynb_checkpoints/4.1.2 Reinforcement Learning-checkpoint.ipynb",
"chars": 10149,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Reinforcement Learning\\n\",\n \"\\"
},
{
"path": "lesson-notes/4-reinforcement-learning/4.1.1 Markov Decision Processes.ipynb",
"chars": 11548,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Decision Making and Reinforcemen"
},
{
"path": "lesson-notes/4-reinforcement-learning/4.1.2 Reinforcement Learning.ipynb",
"chars": 10149,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Reinforcement Learning\\n\",\n \"\\"
},
{
"path": "lesson-notes/4-reinforcement-learning/README.md",
"chars": 484,
"preview": "# Reinforcement Learning\nTeaching system to prioritise by giving it corresponding rewards and punishments\n\n## Foci\n1. Ho"
},
{
"path": "lesson-notes/5-ml-for-trading/.ipynb_checkpoints/0. Course Outline-checkpoint.ipynb",
"chars": 72,
"preview": "{\n \"cells\": [],\n \"metadata\": {},\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
},
{
"path": "lesson-notes/5-ml-for-trading/0. Course Outline.ipynb",
"chars": 1122,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning for Trading: Cou"
},
{
"path": "lesson-notes/Healthcare - Christopher Thompson 1 Oct 2016.ipynb",
"chars": 3002,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Christopher Thompson: Applicati"
},
{
"path": "p0-titanic-survival-exploration/.ipynb_checkpoints/titanic_survival_exploration-checkpoint.ipynb",
"chars": 282887,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p0-titanic-survival-exploration/README.md",
"chars": 1951,
"preview": "# Project 0: Introduction and Fundamentals\n## Titanic Survival Exploration\n\n### Install\n\nThis project requires **Python "
},
{
"path": "p0-titanic-survival-exploration/report.html",
"chars": 548125,
"preview": "<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\" />\n<title>titanic_survival_exploration</title>\n\n<script src=\"https://"
},
{
"path": "p0-titanic-survival-exploration/titanic_data.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": "p0-titanic-survival-exploration/titanic_survival_exploration.ipynb",
"chars": 282887,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p0-titanic-survival-exploration/titanic_visualizations.py",
"chars": 5425,
"preview": "import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\ndef filter_data(data, condition):\n \"\"\"\n Re"
},
{
"path": "p1-boston-housing/.ipynb_checkpoints/boston_housing-checkpoint.ipynb",
"chars": 168912,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p1-boston-housing/README.md",
"chars": 1768,
"preview": "# Project 1: Model Evaluation & Validation\n## Predicting Boston Housing Prices\n\n### Install\n\nThis project requires **Pyt"
},
{
"path": "p1-boston-housing/boston_housing.ipynb",
"chars": 168912,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p1-boston-housing/housing.csv",
"chars": 12435,
"preview": "RM,LSTAT,PTRATIO,MEDV\n6.575,4.98,15.3,504000.0\n6.421,9.14,17.8,453600.0\n7.185,4.03,17.8,728700.0\n6.998,2.94,18.7,701400."
},
{
"path": "p1-boston-housing/report.html",
"chars": 441251,
"preview": "<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\" />\n<title>boston_housing</title>\n\n<script src=\"https://cdnjs.cloudfla"
},
{
"path": "p1-boston-housing/visuals.py",
"chars": 4878,
"preview": "###########################################\n# Suppress matplotlib user warnings\n# Necessary for newer version of matplot"
},
{
"path": "p2-student-intervention/.ipynb_checkpoints/student_intervention-Copy1-checkpoint.ipynb",
"chars": 62246,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p2-student-intervention/.ipynb_checkpoints/student_intervention-checkpoint.ipynb",
"chars": 61548,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p2-student-intervention/.ipynb_checkpoints/student_intervention1-checkpoint.ipynb",
"chars": 61681,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p2-student-intervention/.ipynb_checkpoints/student_intervention_py2.7-checkpoint.ipynb",
"chars": 36810,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p2-student-intervention/README.md",
"chars": 4063,
"preview": "# Project 2: Supervised Learning\n## Building a Student Intervention System\n\n### Install\n\nThis project requires **Python "
},
{
"path": "p2-student-intervention/archive/student_intervention-Copy1.ipynb",
"chars": 62246,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p2-student-intervention/archive/student_intervention1.ipynb",
"chars": 52893,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p2-student-intervention/archive/student_intervention_py2.7.ipynb",
"chars": 36810,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p2-student-intervention/report.html",
"chars": 339492,
"preview": "<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\" />\n<title>student_intervention</title>\n\n<script src=\"https://cdnjs.cl"
},
{
"path": "p2-student-intervention/student-data.csv",
"chars": 40294,
"preview": "school,sex,age,address,famsize,Pstatus,Medu,Fedu,Mjob,Fjob,reason,guardian,traveltime,studytime,failures,schoolsup,famsu"
},
{
"path": "p2-student-intervention/student_intervention.ipynb",
"chars": 61548,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p3-creating-customer-segments/.ipynb_checkpoints/customer_segments-checkpoint.ipynb",
"chars": 745744,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p3-creating-customer-segments/README.md",
"chars": 1554,
"preview": "# Project 3: Unsupervised Learning\n## Creating Customer Segments\n\n### Install\n\nThis project requires **Python 2.7** and "
},
{
"path": "p3-creating-customer-segments/archive/customer_segments_python2.7.ipynb",
"chars": 35269,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p3-creating-customer-segments/customer_segments.ipynb",
"chars": 745744,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Machine Learning Engineer Nanodeg"
},
{
"path": "p3-creating-customer-segments/customers.csv",
"chars": 14582,
"preview": "Channel,Region,Fresh,Milk,Grocery,Frozen,Detergents_Paper,Delicatessen\n2,3,12669,9656,7561,214,2674,1338\n2,3,7057,9810,9"
},
{
"path": "p3-creating-customer-segments/renders.py",
"chars": 4133,
"preview": "import matplotlib.pyplot as plt\nimport matplotlib.cm as cm\nimport pandas as pd\nimport numpy as np\nfrom sklearn.decomposi"
},
{
"path": "p3-creating-customer-segments/renders_py3.py",
"chars": 4134,
"preview": "import matplotlib.pyplot as plt\nimport matplotlib.cm as cm\nimport pandas as pd\nimport numpy as np\nfrom sklearn.decomposi"
},
{
"path": "p3-creating-customer-segments/report.html",
"chars": 1000777,
"preview": "<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\" />\n<title>customer_segments</title>\n\n<script src=\"https://cdnjs.cloud"
},
{
"path": "p4-smartcab/.ipynb_checkpoints/Smartcab Report-Copy1-checkpoint.ipynb",
"chars": 273968,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Outline\\n\",\n \"You will \\n\",\n "
},
{
"path": "p4-smartcab/.ipynb_checkpoints/Smartcab Report-Copy2-checkpoint.ipynb",
"chars": 307889,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# P4 Smartcab \"\n ]\n },\n {\n \"c"
},
{
"path": "p4-smartcab/.ipynb_checkpoints/Smartcab Report-checkpoint.ipynb",
"chars": 278145,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# P4 Smartcab \"\n ]\n },\n {\n \"c"
},
{
"path": "p4-smartcab/.ipynb_checkpoints/smartcab-report-checkpoint.ipynb",
"chars": 310077,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# P4 Smartcab \"\n ]\n },\n {\n \"c"
},
{
"path": "p4-smartcab/README.md",
"chars": 1004,
"preview": "# Project 4: Reinforcement Learning\n## Train a Smartcab How to Drive\n\n### Install\n\nThis project requires **Python 2.7** "
},
{
"path": "p4-smartcab/old-versions-of-reports/.ipynb_checkpoints/Smartcab Report-Copy1-checkpoint.ipynb",
"chars": 275023,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Outline\\n\",\n \"You will \\n\",\n "
},
{
"path": "p4-smartcab/old-versions-of-reports/Smartcab Report-Copy1.ipynb",
"chars": 275023,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Outline\\n\",\n \"You will \\n\",\n "
},
{
"path": "p4-smartcab/old-versions-of-reports/Smartcab Report-Copy2.ipynb",
"chars": 307889,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# P4 Smartcab \"\n ]\n },\n {\n \"c"
},
{
"path": "p4-smartcab/smartcab/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "p4-smartcab/smartcab/agent.py",
"chars": 6517,
"preview": "import random\nfrom environment import Agent, Environment\nfrom planner import RoutePlanner\nfrom simulator import Simulato"
},
{
"path": "p4-smartcab/smartcab/environment.py",
"chars": 12224,
"preview": "import time\nimport random\nfrom collections import OrderedDict\n\nfrom simulator import Simulator\n\nclass TrafficLight(objec"
},
{
"path": "p4-smartcab/smartcab/planner.py",
"chars": 1628,
"preview": "import random\n\nclass RoutePlanner(object):\n \"\"\"Silly route planner that is meant for a perpendicular grid network.\"\"\""
},
{
"path": "p4-smartcab/smartcab/qtable.js",
"chars": 5044,
"preview": "Q - table: {\n \"(['green', None, None, None, 'forward'], 'right')\": -0.4931163522466796,\n \"(['green', None, 'right'"
},
{
"path": "p4-smartcab/smartcab/report.html",
"chars": 509394,
"preview": "<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\" />\n<title>smartcab-report</title>\n\n<script src=\"https://cdnjs.cloudfl"
},
{
"path": "p4-smartcab/smartcab/simulator.py",
"chars": 8676,
"preview": "import os\nimport time\nimport random\nimport importlib\n\nclass Simulator(object):\n \"\"\"Simulates agents in a dynamic smar"
},
{
"path": "p4-smartcab/smartcab/trial-data/data.js",
"chars": 27367,
"preview": "# Sample console output\nSimulator.run(): Trial 0\nEnvironment.reset(): Trial set up with start = (6, 5), destination = (7"
},
{
"path": "p4-smartcab/smartcab/trial-data/trial1.js",
"chars": 54465,
"preview": "2016-09-19 19:19:58.238 python[48521:16906622] 19:19:58.238 WARNING: 140: This application, or a library it uses, is us"
},
{
"path": "p4-smartcab/smartcab/trial-data/trial10.js",
"chars": 903188,
"preview": "\n((python2.7)) jessica@Bourbaki:~/Dropbox/data-science/ml-nd/smartcab$ python smartcab/agent.py \nSimulator.run(): Trial "
},
{
"path": "p4-smartcab/smartcab/trial-data/trial2.js",
"chars": 1010964,
"preview": "self.epsilon = 0.1\nself.alpha = 0.2\nself.gamma = 0.9\nself.actions = [None, 'forward', 'left', 'right']\nself.q = {}\nself."
},
{
"path": "p4-smartcab/smartcab/trial-data/trial3.js",
"chars": 971009,
"preview": "self.epsilon = 0.1\nself.alpha = 0.5 # Alpha is the learning rate\nself.gamma = 0.5 # gamma is the value of future reward."
},
{
"path": "p4-smartcab/smartcab/trial-data/trial4.js",
"chars": 991604,
"preview": "self.epsilon = 0.1\nself.alpha = 0.7 # Alpha is the learning rate\nself.gamma = 0.4 # gamma is the value of future reward."
},
{
"path": "p4-smartcab/smartcab/trial-data/trial5.js",
"chars": 930301,
"preview": "self.epsilon = 0.1\nself.alpha = 0.2 # Alpha is the learning rate\nself.gamma = 0.5 # gamma is the value of future reward."
},
{
"path": "p4-smartcab/smartcab/trial-data/trial6.js",
"chars": 945381,
"preview": "self.epsilon = 0.1\nself.alpha = 0.3 # Alpha is the learning rate\nself.gamma = 0.5 # gamma is the value of future reward."
},
{
"path": "p4-smartcab/smartcab/trial-data/trial7.js",
"chars": 725710,
"preview": "self.epsilon = 0.1\nself.alpha = 0.3 # Alpha is the learning rate\nself.gamma = 0.5 # gamma is the value of future reward."
},
{
"path": "p4-smartcab/smartcab/trial-data/trial8.js",
"chars": 821566,
"preview": "Simulator.run(): Trial 0\nEnvironment.reset(): Trial set up with start = (1, 1), destination = (5, 1), deadline = 20\nRout"
},
{
"path": "p4-smartcab/smartcab/trial-data/trial9.js",
"chars": 939340,
"preview": "((python2.7)) jessica@Bourbaki:~/Dropbox/data-science/ml-nd/smartcab$ python smartcab/agent.py \nSimulator.run(): Trial 0"
},
{
"path": "p4-smartcab/smartcab-report.ipynb",
"chars": 310077,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# P4 Smartcab \"\n ]\n },\n {\n \"c"
},
{
"path": "p4-smartcab/smartcab_parameter_search.csv",
"chars": 128996,
"preview": "epsilon, gamma, alpha, defaultq, successes, avg_buffer, avg_penalties\n0.2, 0.5, '1.0/t', 0.0, 88,0.52269751082251081, 1."
},
{
"path": "p4-smartcab/smartcab_params_summary.csv",
"chars": 2425,
"preview": "epsilon,gamma,alpha,defaultq,successes,avg_buffer,avg_penalties\n0.20\t0.50\t'1.0/t'\t0.0\t87.78\t0.5179\t1.0810\n0.10\t0.50\t'1.0"
},
{
"path": "p5-capstone/.ipynb_checkpoints/2-analysis-code-py2-checkpoint.ipynb",
"chars": 181048,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# II. Analysis - Code\"\n ]\n },\n "
},
{
"path": "p5-capstone/.ipynb_checkpoints/2-analysis-code-py3-checkpoint.ipynb",
"chars": 183988,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# II. Analysis - Code\"\n ]\n },\n "
},
{
"path": "p5-capstone/.ipynb_checkpoints/3-methodology-results-conclusion-code-py2-Copy1-checkpoint.ipynb",
"chars": 607215,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# III. Methodology: Code\"\n ]\n },"
},
{
"path": "p5-capstone/.ipynb_checkpoints/3-methodology-results-conclusion-code-py2-checkpoint.ipynb",
"chars": 113865,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# III. Methodology: Code\"\n ]\n },"
},
{
"path": "p5-capstone/.ipynb_checkpoints/3-methodology-results-conclusion-code-py3-checkpoint.ipynb",
"chars": 606394,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# III. Methodology: Code\"\n ]\n },"
},
{
"path": "p5-capstone/.ipynb_checkpoints/Discarded Notes-checkpoint.ipynb",
"chars": 2454,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Discarded Notes\\n\",\n \"\\n\",\n "
},
{
"path": "p5-capstone/.ipynb_checkpoints/delete-checkpoint.ipynb",
"chars": 72,
"preview": "{\n \"cells\": [],\n \"metadata\": {},\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
},
{
"path": "p5-capstone/.ipynb_checkpoints/lse-list-checkpoint.ipynb",
"chars": 89502,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# LSE list\"\n ]\n },\n {\n \"cell_"
},
{
"path": "p5-capstone/.ipynb_checkpoints/p5.1-definition-checkpoint.ipynb",
"chars": 10001,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## I. Definition\\n\",\n \"_(approx."
},
{
"path": "p5-capstone/.ipynb_checkpoints/p5.2-4-code-checkpoint.ipynb",
"chars": 235330,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Analysis, Methodology, Results\"\n "
},
{
"path": "p5-capstone/.ipynb_checkpoints/p5.2-4-report-checkpoint.ipynb",
"chars": 40384,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# II. Analysis\\n\",\n \"\\n\",\n \"#"
},
{
"path": "p5-capstone/.ipynb_checkpoints/p5.5-conclusion-checkpoint.ipynb",
"chars": 7500,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# V. Conclusion\"\n ]\n },\n {\n \""
},
{
"path": "p5-capstone/2-analysis-code-py2.ipynb",
"chars": 181048,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# II. Analysis - Code\"\n ]\n },\n "
},
{
"path": "p5-capstone/2-analysis-code-py2.ipynb.bak",
"chars": 183988,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# II. Analysis - Code\"\n ]\n },\n "
},
{
"path": "p5-capstone/2-analysis-code-py3.ipynb",
"chars": 183988,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# II. Analysis - Code\"\n ]\n },\n "
},
{
"path": "p5-capstone/3-methodology-results-conclusion-code-py2.ipynb",
"chars": 606062,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# III. Methodology: Code\"\n ]\n },"
},
{
"path": "p5-capstone/3-methodology-results-conclusion-code-py3.ipynb",
"chars": 606394,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# III. Methodology: Code\"\n ]\n },"
},
{
"path": "p5-capstone/README.md",
"chars": 1739,
"preview": "# MLND Capstone Project\n\n### Machine Learning for Trading - an Exploratory Study\nTopic: Predicting Daily Adjusted Close "
},
{
"path": "p5-capstone/archive/.ipynb_checkpoints/Discarded Notes-checkpoint.ipynb",
"chars": 4726,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Discarded Notes\\n\",\n \"\\n\",\n "
},
{
"path": "p5-capstone/archive/Discarded Notes.ipynb",
"chars": 8392,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"(1) Engineer dataset semi from scra"
},
{
"path": "p5-capstone/archive/III. Methodology - Code-Copy1.ipynb",
"chars": 523211,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# III. Methodology: Code\"\n ]\n },"
},
{
"path": "p5-capstone/archive/lse-list.ipynb",
"chars": 90235,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# LSE list\"\n ]\n },\n {\n \"cell_"
},
{
"path": "p5-capstone/archive/ml-for-trading/.ipynb_checkpoints/2. Computational Investment-checkpoint.ipynb",
"chars": 4887,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Computational Investment\\n\",\n "
},
{
"path": "p5-capstone/archive/ml-for-trading/.ipynb_checkpoints/3. ML for Trading Algorithms-checkpoint.ipynb",
"chars": 2666,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 03-01 \\n\",\n \"\\n\",\n \"### Pre"
},
{
"path": "p5-capstone/archive/ml-for-trading/2. Computational Investment.ipynb",
"chars": 4887,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Computational Investment\\n\",\n "
},
{
"path": "p5-capstone/archive/ml-for-trading/3. ML for Trading Algorithms.ipynb",
"chars": 2666,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 03-01 \\n\",\n \"\\n\",\n \"### Pre"
},
{
"path": "p5-capstone/archive/p5.2-4-code.ipynb",
"chars": 229452,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Analysis, Methodology, Results\"\n "
},
{
"path": "p5-capstone/archive/report-drafts/p5.1-definition.ipynb",
"chars": 9457,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# I. Definition\"\n ]\n },\n {\n \""
},
{
"path": "p5-capstone/archive/report-drafts/p5.2-4-report.ipynb",
"chars": 40961,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# II. Analysis\\n\",\n \"\\n\",\n \"#"
},
{
"path": "p5-capstone/archive/report-drafts/p5.5-conclusion.ipynb",
"chars": 7061,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# V. Conclusion\"\n ]\n },\n {\n \""
},
{
"path": "p5-capstone/archive/robot_motion_planning/maze.py",
"chars": 3833,
"preview": "import numpy as np\n\nclass Maze(object):\n def __init__(self, filename):\n '''\n Maze objects have two main"
},
{
"path": "p5-capstone/archive/robot_motion_planning/robot.py",
"chars": 1721,
"preview": "import numpy as np\n\nclass Robot(object):\n def __init__(self, maze_dim):\n '''\n Use the initialization fu"
},
{
"path": "p5-capstone/archive/robot_motion_planning/showmaze.py",
"chars": 1960,
"preview": "from maze import Maze\nimport turtle\nimport sys\n\nif __name__ == '__main__':\n '''\n This function uses Python's turtl"
},
{
"path": "p5-capstone/archive/robot_motion_planning/test_maze_01.txt",
"chars": 345,
"preview": "12\n1,5,7,5,5,5,7,5,7,5,5,6\n3,5,14,3,7,5,15,4,9,5,7,12\n11,6,10,10,9,7,13,6,3,5,13,4\n10,9,13,12,3,13,5,12,9,5,7,6\n9,5,6,3,"
},
{
"path": "p5-capstone/archive/robot_motion_planning/test_maze_02.txt",
"chars": 490,
"preview": "14\n1,5,5,7,7,5,5,6,3,6,3,5,5,6\n3,5,6,10,9,5,5,15,14,11,14,3,7,14\n11,6,11,14,1,7,6,10,10,10,11,12,8,10\n10,9,12,10,3,12,11"
},
{
"path": "p5-capstone/archive/robot_motion_planning/test_maze_03.txt",
"chars": 652,
"preview": "16\n1,5,5,6,3,7,5,5,5,5,7,5,5,5,5,6\n3,5,6,10,10,9,6,3,5,5,13,7,5,5,6,10\n11,6,11,15,15,5,14,8,2,3,5,13,5,6,10,10\n10,10,10,"
},
{
"path": "p5-capstone/archive/robot_motion_planning/tester.py",
"chars": 4725,
"preview": "from maze import Maze\nfrom robot import Robot\nimport sys\n\n# global dictionaries for robot movement and sensing\ndir_senso"
},
{
"path": "p5-capstone/archive/udacity-materials/project_report_template.md",
"chars": 11565,
"preview": "# Capstone Project\n## Machine Learning Engineer Nanodegree\nJoe Udacity \nDecember 31st, 2050\n\n## I. Definition\n_(approx."
},
{
"path": "p5-capstone/ftse100-figures.csv",
"chars": 326192,
"preview": "Date,Open,High,Low,Close\n2016-09-09,6858.7,6862.38,6762.3,6776.95\n2016-09-08,6846.58,6889.64,6819.82,6858.7\n2016-09-07,6"
},
{
"path": "p5-capstone/ftse100-list.csv",
"chars": 3351,
"preview": "ticker,name,premium_code,free_code\r\nADN,Aberdeen Asset Management,,GOOG/LON_ADN\r\nADM,Admiral Group,EOD/ADM,GOOG/LON_ADM\r"
},
{
"path": "p5-capstone/google-finance-py2.py",
"chars": 3417,
"preview": "\"\"\"\nScrape FTSE100 Historical Prices from Google Finance\n\nAuthor: Jessica Yung\nSeptember 2016\n\"\"\"\n\nfrom bs4 import Beaut"
},
{
"path": "p5-capstone/google-finance-scraper.py",
"chars": 3434,
"preview": "\"\"\"\nScrape FTSE100 Historical Prices from Google Finance\n\nAuthor: Jessica Yung\nSeptember 2016\n\"\"\"\n\nfrom bs4 import Beaut"
},
{
"path": "p5-capstone/list-of-all-securities-ex-debt.csv",
"chars": 776913,
"preview": "Security Start Date,Company Name,Country of Incorporation,LSE Market,FCA Listing Category,ISIN,Security Name,TIDM,Mkt Ca"
},
{
"path": "p5-capstone/report.md",
"chars": 47611,
"preview": "# Predicting Daily Adjusted Close Stock Prices\n### Machine Learning in Trading: An Exploratory Study\n\nJessica Yung, Octo"
}
]
About this extraction
This page contains the full source code of the jessicayung/machine-learning-nd GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 147 files (22.7 MB), approximately 5.9M tokens, and a symbol index with 68 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.