From f3cb4318fb51e9267d4d0fb8098afe27ccbe2348 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 3 Jul 2021 19:39:41 +0900 Subject: [PATCH 01/37] ADD : translate 1-1 --- .../1-intro-to-ML/translations/README.ko.md | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 1-Introduction/1-intro-to-ML/translations/README.ko.md diff --git a/1-Introduction/1-intro-to-ML/translations/README.ko.md b/1-Introduction/1-intro-to-ML/translations/README.ko.md new file mode 100644 index 0000000000..4696fc6755 --- /dev/null +++ b/1-Introduction/1-intro-to-ML/translations/README.ko.md @@ -0,0 +1,108 @@ +# 머신러닝 소개 + +[![ML, AI, deep learning - What's the difference?](https://img.youtube.com/vi/lTd9RSxS9ZE/0.jpg)](https://youtu.be/lTd9RSxS9ZE "ML, AI, deep learning - What's the difference?") + +> 🎥 머신러닝, AI 그리고 딥러닝의 차이를 설명하는 영상을 보려면 위 이미지를 클릭합니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/1/) + +### 소개 + +입문자를 위한 classical 머신러닝 코스에 오신 것을 환영합니다! 이 토픽에 완벽하게 새로 접해보거나, 한 분야에 완벽해지고 싶어하는 ML 실무자도 저희와 함께하게 되면 좋습니다! ML 연구를 위한 친숙한 시작점을 만들고 싶고, 당신의 [feedback](https://github.com/microsoft/ML-For-Beginners/discussions)을 평가, 응답하고 반영하겠습니다. + +[![Introduction to ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Introduction to ML") + +> 🎥 동영상을 보려면 위 이미지 클릭: MIT의 John Guttag가 머신러닝을 소개합니다. +### 머신러닝 시작하기 + +이 커리큘럼을 시작하기 전, 컴퓨터를 세팅하고 노트북을 로컬에서 실행할 수 있게 준비해야 합니다. + +- **이 영상으로 컴퓨터 세팅하기**. [set of videos](https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6)에서 컴퓨터를 세팅하는 방법에 대하여 자세히 알아봅니다. +- **Python 배우기**. 이 코스에서 사용할 데이터 사이언티스트에게 유용한 프로그래밍 언어인 [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-15963-cxa)에 대한 기본적인 이해를 해야 좋습니다. +- **Node.js 와 JavaScript 배우기**. 이 코스에서 웹앱을 빌드할 때 몇 번 JavaScript를 사용하므로, [node](https://nodejs.org) 와 [npm](https://www.npmjs.com/)을 설치해야 합니다, Python 과 JavaScript를 개발하며 모두 쓸 수 있는 [Visual Studio Code](https://code.visualstudio.com/)도 있습니다. +- **GitHub 계정 만들기**. [GitHub](https://github.com)에서 찾았으므로, 이미 계정이 있을 수 있습니다, 혹시 없다면, 계정을 만든 뒤에 이 커리큘럼을 포크해서 직접 쓸 수 있습니다. (star 주셔도 됩니다 😊) +- **Scikit-learn 찾아보기**. 이 강의에서 참조하고 있는 ML 라이브러리 셋인 [Scikit-learn]([https://scikit-learn.org/stable/user_guide.html)을 숙지합니다. + +### 머신러닝은 무엇인가요? + +'머신러닝'은 최근 가장 인기있고 자주 언급되는 용어입니다. 어떤 분야든 기술에 어느 정도 익숙해지면 이러한 용어를 한 번즈음 들어본 적이 있었을 것입니다, 그러나, 머신러닝의 구조는 대부분의 사람들에겐 미스테리입니다. 머신러닝 입문자에겐 주제가 때때로 숨막힐 수 있습니다, 그래서 머신러닝이 실제로 어떤 지 이해하고, 실제 적용된 예시로, 단계별 학습을 진행하는 것이 중요합니다. + +![ml hype curve](../images/hype.png) + +> Google Trends는 '머신러닝' 용어의 최근 'hype curve'로 보여줍니다 + +우리는 매우 신비한 우주에 살고 있습니다. Stephen Hawking, Albert Einstein과 같은 위대한 과학자들은 주변 세계의 신비를 밝혀낼 의미있는 정보를 찾는 데 일생을 바쳤습니다. 이건 사람의 학습 조건입니다: 아이는 자라면서 해마다 새로운 것을 배우고 세계 구조를 발견합니다. + +어린이의 뇌와 센스는 주변의 사실을 인식하고 점차 숨겨진 생활 패턴을 학습하여 학습된 패턴을 식별할 논리 규칙을 만드는 데 도움을 줍니다. 뇌의 논리 프로세스는 사람을 가장 정교한 생명체로 만듭니다. 숨겨진 패턴을 발견하고 개선하여 지속해서 학습하면 평생 발전할 수 있습니다. 이런 학습 능력과 진화력은 [brain plasticity](https://www.simplypsychology.org/brain-plasticity.html)로 불리는 컨셉과 관련있습니다. 표면적으로, 뇌의 학습 과정과 머신러닝의 개념 사이에 motivational similarities를 그릴 수 있습니다. + +[human brain](https://www.livescience.com/29365-human-brain.html)은 실제 세계에서 사물을 인식하고, 인식된 정보를 처리하며, 합리적인 결정과, 상황에 따른 행동을 합니다. 이걸 지능적으로 행동한다고 합니다. 기계에 지능적인 행동 복사본를 프로그래밍할 때, 인공 지능 (AI)라고 부릅니다. + +용어가 햇갈릴 수 있지만, 머신러닝(ML)은 중요한 인공 지능의 서브넷입니다. **ML은 특수한 알고리즘을 써서 의미있는 정보를 찾고 인식한 데이터에서 숨겨진 패턴을 찾아 합리적으로 판단할 프로세스를 확실하게 수행하는 것에 관심있습니다**. + +![AI, ML, deep learning, data science](../images/ai-ml-ds.png) + +> AI, ML, 딥러닝, 그리고 데이터 사이언티스트 간의 관계를 보여주는 다이어그램. [this graphic](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)에서 영감을 받은 [Jen Looper](https://twitter.com/jenlooper)의 인포그래픽 + +## 이 코스에서 배우는 것 + +이 커리큘럼에서, 입문자가 반드시 알아야 할 머신러닝의 핵심적인 개념만 다룰 것입니다. 많은 학생들이 기초를 배우기 위해 사용하는 훌륭한 라이브러리인, Scikit-learn으로 'classical machine learning'이라고 부르는 것을 다룹니다. 인공 지능 또는 딥러닝의 대략적인 개념을 이해하려면, 머신러닝에 대한 강력한 기초 지식이 꼭 필요하므로, 여기에서 제공하고자 합니다. + +이 코스에서 다음 사항을 배웁니다: + +- 머신러닝의 핵심 컨셉 +- ML 의 역사 +- ML 과 공정성 +- regression ML 기술 +- classification ML 기술 +- clustering ML 기술 +- natural language processing ML 기술 +- time series forecasting ML 기술 +- 강화 학습 +- real-world 애플리케이션 for ML + +## 다루지 않는 것 + +- 딥러닝 +- 신경망 +- AI + +더 좋은 학습 환경을 만들기 위해서, 신경망, '딥러닝' - many-layered model-building using neural networks - 과 AI의 복잡도를 피할 것이며, 다른 커리큘럼에서 논의할 것입니다. 또한 더 큰 필드에 초점을 맞추기 위하여 향후 데이터 사이언스 커리큘럼을 제공할 예정입니다. +## 왜 머신러닝을 배우나요? + +시스템 관점에서 보는 머신러닝은, 지능적인 결정하도록 데이터에서 숨겨진 패턴을 학습할 수 있는 자동화 시스템 생성으로 정의합니다. + +동기 부여는 뇌가 다른 세계에서 보는 데이터를 기반으로 특정한 무언가들을 학습하는 방식에서 살짝 영감을 받았습니다. + +✅ 비지니스에서 머신러닝 전략 대신 하드-코딩된 룰-베이스 엔진을 만드려는 이유를 잠시 생각해봅시다. + +### 머신러닝의 애플리케이션 + +머신러닝의 애플리케이션은 이제 거의 모든 곳에서, 스마트 폰, 연결된 기기, 그리고 다른 시스템에 의하여 생성된 주변의 흐르는 데이터만큼 어디에나 존재합니다. 첨단 머신러닝 알고리즘의 큰 잠재력을 고려한, 연구원들은 긍정적인 결과로 multi-dimensional과 multi-disciplinary적인 실-생활 문제를 해결하는 능력을 찾고 있습니다. + +**다양한 방식으로 머신러닝을 사용할 수 있습니다**: + +- 환자의 병력이나 보고서를 기반으로 질병 가능성을 예측합니다. +- 날씨 데이터로 계절 이벤트를 예측합니다. +- 문장의 감정을 이해합니다. +- 가짜 뉴스를 감지하고 선동을 막습니다. + +금융, 경제학, 지구 과학, 우주 탐험, 생물 공학, 인지 과학, 그리고 인문학까지 머신러닝을 적용하여 힘들고, 데이터 처리가 버거운 이슈를 해결했습니다. + +머신러닝은 실제-환경이거나 생성된 데이터에서 의미를 찾아 패턴-발견하는 프로세스를 자동화합니다. 비즈니스, 건강과 금용 애플리케이션에서 높은 가치가 있다고 증명되었습니다. + +가까운 미래에, 머신러닝의 기본을 이해하는 건 광범위한 선택으로 인하여 모든 분야의 사람들에게 필수적으로 다가올 것 입니다. + +--- +## 🚀 도전 + +종이에 그리거나, [Excalidraw](https://excalidraw.com/)처럼 온라인 앱을 이용하여 AI, ML, 딥러닝, 그리고 데이터 사이언스의 차이를 이해합시다. 각 기술들이 잘 해결할 수 있는 문제에 대해 아이디어를 합쳐보세요. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/2/) + +## 리뷰 & 자기주도 학습 + +클라우드에서 ML 알고리즘을 어떻게 사용하는 지 자세히 알아보려면, [Learning Path](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-15963-cxa)를 따릅니다. + +## 과제 + +[Get up and running](../assignment.md) From 5904d83af409625dda3ea6693b31e20fd0572dc4 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 3 Jul 2021 22:23:24 +0900 Subject: [PATCH 02/37] ADD : translate 1-2 --- .../2-history-of-ML/translations/README.ko.md | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 1-Introduction/2-history-of-ML/translations/README.ko.md diff --git a/1-Introduction/2-history-of-ML/translations/README.ko.md b/1-Introduction/2-history-of-ML/translations/README.ko.md new file mode 100644 index 0000000000..42621d4569 --- /dev/null +++ b/1-Introduction/2-history-of-ML/translations/README.ko.md @@ -0,0 +1,118 @@ +# 머신러닝의 역사 + +![Summary of History of machine learning in a sketchnote](../../../sketchnotes/ml-history.png) +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/3/) + +이 강의에서, 머신러닝과 인공 지능의 역사에서 주요 마일스톤을 살펴보려 합니다. + +인공 지능, AI의 역사는 머신러닝의 역사와 서로 엮여 있으며, ML을 받쳐주는 알고리즘과 계산 기술이 AI의 개발에 기여했습니다. 독특한 탐구 영역으로 이런 분야는 1950년에 구체적으로 시작했지만, 중요한 [algorithmical, statistical, mathematical, computational and technical discoveries](https://wikipedia.org/wiki/Timeline_of_machine_learning)로 이 시대를 오버랩했다고 생각하는 게 유용합니다. 실제로, 사람들은 [hundreds of years](https://wikipedia.org/wiki/History_of_artificial_intelligence)동안 이 질문을 생각해왔습니다: 이 아티클은 'thinking machine'라는 개념의 역사적 지적 토대에 대하여 이야기 합니다. + +## 주목할 발견 + +- 1763, 1812 [Bayes Theorem](https://wikipedia.org/wiki/Bayes%27_theorem)과 전임자. 이 정리와 적용은 사전지식 기반으로 이벤트가 발생할 확률을 설명할 추론의 기초가 됩니다. +- 1805 [Least Square Theory](https://wikipedia.org/wiki/Least_squares) by 프랑스 수학자 Adrien-Marie Legendre. Regression 단위에서 배울 이 이론은, 데이터 피팅에 도움이 됩니다. +- 1913 러시아 수학자 Andrey Markov의 이름에서 유래된 [Markov Chains](https://wikipedia.org/wiki/Markov_chain)는 이전 상태를 기반으로 가능한 이벤트의 시퀀스를 설명하는 데 사용됩니다. +- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron)은 미국 심리학자 Frank Rosenblatt이 개발한 linear classifier의 한 타입으로 딥러닝 발전을 뒷받칩니다. +- 1967 [Nearest Neighbor](https://wikipedia.org/wiki/Nearest_neighbor)는 원래 경로를 맵핑하기 위한 알고리즘입니다. ML context에서 패턴을 감지할 때 사용합니다. +- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation)은 [feedforward neural networks](https://wikipedia.org/wiki/Feedforward_neural_network)를 학습할 때 사용합니다. +- 1982 [Recurrent Neural Networks](https://wikipedia.org/wiki/Recurrent_neural_network)는 시간 그래프를 생성하는 feedforward neural networks에서 파생한 인공 신경망입니다. + +✅ 조금 조사해보세요. ML과 AI의 역사에서 중요한 다른 날짜는 언제인가요? + +## 1950: 생각하는 기계 + +20세기의 최고 과학자로 [by the public in 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century)에 선택된, Alan Turing은, 'machine that can think.'라는 개념의 기반을 구축하는 데에 기여한 것으로 평가되고 있습니다. +NLP 강의에서 살필 [Turing Test](https://www.bbc.com/news/technology-18475646)를 만들어서 부분적으로 이 개념에 대한 경험적인 반대하는 사람들과 대립했습니다. + +## 1956: Dartmouth 여름 연구 프로젝트 + +"The Dartmouth Summer Research Project on artificial intelligence was a seminal event for artificial intelligence as a field," ([source](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth))에서 "인공 지능"이라는 용어가 만들어졌습니다. + +> 학습의 모든 측면이나 지능의 다른 기능은 원칙적으로 정확하게 서술할 수 있어서 이를 따라 할 기계를 만들 수 있습니다. + +수석 연구원인, 수학 교수 John McCarthy는, "to proceed on the basis of the conjecture that every aspect of learning or any other feature of intelligence can in principle be so precisely described that a machine can be made to simulate it."이라고 희망했습니다. 참가한 사람들 중에서는 Marvin Minsky도 있었습니다. + +이 워크숍은 "the rise of symbolic methods, systems focussed on limited domains (early expert systems), and deductive systems versus inductive systems." ([source](https://wikipedia.org/wiki/Dartmouth_workshop))을 포함해서 여러 토론을 시작하고 장려한 것으로 평가됩니다. + +## 1956 - 1974: "The golden years" + +1950년대부터 70년대 중순까지 AI로 많은 문제를 해결할 수 있다고 믿은 낙관주의가 커졌습니다. 1967년 Marvin Minsky는 "Within a generation ... the problem of creating 'artificial intelligence' will substantially be solved." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall)이라고 자신있게 말했습니다. + +natural language processing 연구가 발전하고, 검색이 개선되어 더 강력해졌으며, 단순한 언어 지침으로 간단한 작업을 완료하는 'micro-worlds'라는 개념이 생겼습니다. + +정부 지원을 받으며 연구했으며, 계산과 알고리즘이 발전하면서, 지능적 기계의 프로토 타입이 만들어졌습니다. 이런 기계 중에 일부는 아래와 같습니다: + +* [Shakey the robot](https://wikipedia.org/wiki/Shakey_the_robot), '지능적'으로 작업하는 방법을 조종하고 결정할 수 있습니다. + + ![Shakey, an intelligent robot](../images/shakey.jpg) + > Shakey in 1972 + +* 초기 'chatterbot'인, Eliza는, 사람들과 이야기하고 원시적 '치료사' 역할을 할 수 있었습니다. NLP 강의에서 Eliza에 대하여 자세히 알아봅시다. + + ![Eliza, a bot](../images/eliza.png) + > A version of Eliza, a chatbot + +* "Blocks world"는 블록을 쌓고 분류할 수 있는 마이크로-월드의 예시이며, 결정하는 기계를 가르칠 실험을 테스트할 수 있었습니다. [SHRDLU](https://wikipedia.org/wiki/SHRDLU)와 같은 라이브러리로 만들어진 발명은 language processing를 발전시키는 데 도움이 되었습니다. + + [![blocks world with SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world with SHRDLU") + + > 🎥 영상을 보려면 이미지 클릭: Blocks world with SHRDLU + +## 1974 - 1980: "AI Winter" + +1970년 중순에, '인공 기계'를 만드는 복잡도가 과소 평가되면서, 주어진 컴퓨터 파워를 고려해보니, 그 약속은 과장된 것이 분명해졌습니다. 자금이 고갈되고 현장에 대한 자신감도 느려졌습니다. 신뢰에 영향을 준 이슈는 아래에 있습니다: + +- **제한**. 컴퓨터 성능이 너무 제한되었습니다. +- **결합 파열**. 훈련에 필요한 파라미터의 양이 컴퓨터 성능, 기능과 별개로 컴퓨터의 요청에 따라 늘어났습니다. +- **데이터 부족**. 알고리즘을 테스트, 개발, 그리고 개선할 수 없게 데이터가 부족했습니다. +- **올바른 질문인가요?**. 질문받은 그 질문에 바로 물었습니다. 연구원들은 그 접근 방식에 비판했습니다: + - 튜링 테스트는 "programming a digital computer may make it appear to understand language but could not produce real understanding." ([source](https://plato.stanford.edu/entries/chinese-room/))하다고 가정한, 'chinese room theory'의 다른 아이디어에 의해 의문이 생겼습니다. + - "치료사" ELIZA와 같은 인공 지능을 사회에 도입하며 윤리에 도전했습니다. + +동 시간대에, 다양한 AI 학교가 형성되기 시작했습니다. ["scruffy" vs. "neat AI"](https://wikipedia.org/wiki/Neats_and_scruffies) 사이에 이분법이 확립되었습니다. _Scruffy_ 연구실은 원하는 결과를 얻을 때까지 몇 시간 동안 프로그램을 트윅했습니다. _Neat_ 연구실은 논리와 공식적 문제를 해결하는 데에 초점을 맞추었습니다. ELIZA와 SHRDLU는 잘 알려진 _scruffy_ 시스템입니다. 1980년대에, ML 시스템을 재현할 수 있어야 된다는 요구사항이 생겼고, _neat_ 방식이 더 결과를 설명할 수 있어서 점차 선두를 차지했습니다. + +## 1980s 전문가 시스템 + +이 분야가 성장하며, 비즈니스에 대한 이점이 명확해졌고, 1980년대에 '전문가 시스템'이 확산되었습니다. "Expert systems were among the first truly successful forms of artificial intelligence (AI) software." ([source](https://wikipedia.org/wiki/Expert_system)). + +이 시스템의 타입은, 실제로 비즈니스 요구사항을 정의하는 룰 엔진과 새로운 사실 추론하는 룰 시스템을 활용한 추론 엔진으로 부분적 구성된 _hybrid_ 입니다. + +이런 시대에도 neural networks에 대한 관심이 늘어났습니다. + +## 1987 - 1993: AI 'Chill' + +전문화된 전문가 시스템 하드웨어의 확산은 너무나도 고차원되는 불운한 결과를 가져왔습니다. 개인용 컴퓨터의 부상은 크고, 전문화된, 중앙화 시스템과 경쟁했습니다. 컴퓨팅의 민주화가 시작되었고, 결국 현대의 빅 데이터 폭발을 위한 길을 열었습니다. + +## 1993 - 2011 + +이 시대에는 ML과 AI가 과거 데이터와 컴퓨터 파워 부족으로 인해 발생했던 문제 중 일부 해결할 수 있는 새로운 시대가 열렸습니다. 데이터의 양은 급격히 늘어나기 시작했고, 2007년에 스마트폰이 나오면서 좋든 나쁘든 더 넓게 사용할 수 있게 되었습니다. 컴퓨터 파워는 크게 확장되었고, 알고리즘도 함께 발전했습니다. 과거 자유롭던 시대에서 진정한 규율로 이 분야는 성숙해지기 시작했습니다. + +## 현재 + +오늘 날, 머신러닝과 AI는 인생의 대부분에 영향을 미칩니다. 이 시대에는 이러한 알고리즘이 인간의 인생에 미치는 위험과 잠재적인 영향에 대한 주의깊은 이해도가 요구됩니다. Microsoft의 Brad Smith가 언급합니다 "Information technology raises issues that go to the heart of fundamental human-rights protections like privacy and freedom of expression. These issues heighten responsibility for tech companies that create these products. In our view, they also call for thoughtful government regulation and for the development of norms around acceptable uses" ([source](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)). + +미래가 어떻게 변할지 알 수 없지만, 컴퓨터 시스템과 이를 실행하는 소프트웨어와 알고리즘을 이해하는 것은 중요합니다. 이 커리큘럼으로 더 잘 이해하고 스스로 결정할 수 있게 되기를 바랍니다. + +[![The history of deep learning](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "The history of deep learning") +> 🎥 영상 보려면 위 이미지 클릭: Yann LeCun이 강의에서 딥러닝의 역사를 이야기 합니다. + +--- +## 🚀 도전 + +역사적인 순간에 사람들 뒤에서 한 가지를 집중적으로 파고 있는 자를 자세히 알아보세요. 매력있는 캐릭터가 있으며, 문화가 사라진 곳에서는 과학적인 발견을 하지 못합니다. 당신은 어떤 발견을 해보았나요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/4/) + +## 검토 & 자기주도 학습 + +보고 들을 수 있는 항목은 아래와 같습니다: + +[This podcast where Amy Boyd discusses the evolution of AI](http://runasradio.com/Shows/Show/739) + +[![The history of AI by Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "The history of AI by Amy Boyd") + +## 과제 + +[Create a timeline](../assignment.md) From 7bd2e9e7bc91df63a17fe36e90a5591cd64d5924 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 4 Jul 2021 15:35:50 +0900 Subject: [PATCH 03/37] ADD : translate 1-3 --- .../3-fairness/translations/README.ko.md | 214 ++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 1-Introduction/3-fairness/translations/README.ko.md diff --git a/1-Introduction/3-fairness/translations/README.ko.md b/1-Introduction/3-fairness/translations/README.ko.md new file mode 100644 index 0000000000..3fb434f806 --- /dev/null +++ b/1-Introduction/3-fairness/translations/README.ko.md @@ -0,0 +1,214 @@ +# 머신러닝의 공정성 + +![Summary of Fairness in Machine Learning in a sketchnote](../../../sketchnotes/ml-fairness.png) +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/5/) + +## 소개 + +이 커리큘럼에서, 머신러닝이 우리의 생활에 어떻게 영향을 미칠 수 있는 지 알아보겠습니다. 지금도, 시스템과 모델은 건강 관리 진단 또는 사기 탐지와 같이 일상의 의사-결정 작업에 관여하고 있습니다. 따라서 모두에게 공정한 결과를 주기 위해서는 모델이 잘 작동하는게 중요합니다. + +모델을 구축할 때 사용하는 데이터에 인종, 성별, 정치적 관점, 종교와 같이 특정 인구 통계가 부족하거나 불균형하게 나타내는 경우, 어떤 일이 발생할 지 상상해봅시다. 모델의 결과가 일부 인구 통계에 유리하도록 해석하는 경우는 어떨까요? 애플리케이션의 결과는 어떨까요? + +이 강의에서, 아래 내용을 합니다: + +- 머신러닝에서 공정성의 중요도에 대한 인식을 높입니다. +- 공정성-관련 피해에 대하여 알아봅니다. +- 불공정성 평가와 완화에 대하여 알아봅니다. + +## 전제 조건 + +전제 조건으로, "Responsible AI Principles" 학습 과정을 수강하고 주제에 대한 영상을 시청합니다: + +[Learning Path](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-15963-cxa)를 따라서 Responsible AI에 대하여 더 자세히 알아보세요 + +[![Microsoft's Approach to Responsible AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI") + +> 🎥 영상을 보려면 이미지 클릭: Microsoft's Approach to Responsible AI + +## 데이터와 알고리즘의 불공정성 + +> "If you torture the data long enough, it will confess to anything" - Ronald Coase + +이 소리는 극단적이지만, 결론을 돕기 위하여 데이터를 조작할 수 있다는 건 사실입니다. 의도치않게 발생할 수 있습니다. 사람으로서, 모두 편견을 가지고 있고, 데이터에 편향적일 때 의식하는 것은 어렵습니다. + +AI와 머신러닝의 공정성을 보장하는 건 계속 복잡한 사회기술적 도전 과제로 남고 있습니다. 순수하게 사화나 기술 관점에서 다룰 수 없다고 의미합니다. + +### 공정성-관련 피해 + +불공정이란 무엇일까요? "Unfairness"은 인종, 성별, 나이, 또는 장애 등급으로 정의된 인구 그룹에 대한 부정적인 영향 혹은 "harms"를 포함합니다. + +공정성-관련된 주요 피해는 다음처럼 분류할 수 있습니다: + +- **할당**, 예를 들자면 성별이나 인종이 다른 사람들보다 선호되는 경우 +- **서비스 품질**. 복잡할 때 한 특정 시나리오에 맞춰 데이터를 훈련하면, 서비스 성능이 낮아집니다. +- **고정관념**. 지정된 그룹을 사전에 할당한 속성에 넘깁니다. +- **명예훼손**. 무언가 누군가 부당한 비판하고 라벨링합니다. +- **과도- 또는 과소- 평가**. 아이디어는 특정 공언에서 그룹을 볼 수 없으며, 같이 피해를 입히는 서비스 혹은 기능을 꾸준히 홍보합니다. + +이 예시를 보겠습니다. + +### 할당 + +대출 심사하는 가상의 시스템을 생각해보세요. 이 시스템은 백인 남성을 다른 그룹보다 더 선택하는 경향이 있습니다. 결과적으로, 특정 지원자는 대출이 미뤄집니다. + +또 다른 예시로는 후보를 뽑기 위해 대기업에서 개발한 실험적 채용 도구입니다. 모델을 사용하여 다른 단어를 선호하도록 훈련하며 하나의 성별을 특정할 수 있는 도구입니다. 이력서에 "women’s rugby team" 같은 단어가 포함되면 패널티가 주어졌습니다. + +✅ 이런 실제 사례를 찾기 위하여 약간 조사해보세요 + +### 서비스 품질 + +연구원들은 여러가지 상용 성별 분류기에서 피부가 하얀 남성 이미지와 다르게 피부가 어두운 여성 이미지에서 오류 비율이 더 높다는 것을 발견했습니다. [Reference](https://www.media.mit.edu/publications/gender-shades-intersectional-accuracy-disparities-in-commercial-gender-classification/) + +또 다른 이면에는 피부가 어두운 사람을 잘 인식하지 못하는 비누 디스펜서도 있습니다. [Reference](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) + + +### 고정관념 + +기계 번역에서 성별에 대한 고정관념이 발견되었습니다. “he is a nurse and she is a doctor”라고 터키어로 번역할 때, 문제가 발생했습니다. 터키어는 3인칭을 전달하면서 "o"가 하나인 성별을 가지리지 않지만, 터키어에서 영어로 다시 문장을 번역해보면 “she is a nurse and he is a doctor”라는 고정관념과 부정확하게 반환됩니다. + +![translation to Turkish](../images/gender-bias-translate-en-tr.png) + +![translation back to English](../images/gender-bias-translate-tr-en.png) + +### 명예훼손 + +이미지 라벨링 기술은 어두운-피부 사람의 이미지를 고릴라로 잘 못 분류했습니다. 잘 못 라벨링된 현상은 denigrate Black people된 오랜 역사를 라벨링하며 적용했으며 시스템이 실수했을 때 해롭습니다. + +[![AI: Ain't I a Woman?](https://img.youtube.com/vi/QxuyfWoVV98/0.jpg)](https://www.youtube.com/watch?v=QxuyfWoVV98 "AI, Ain't I a Woman?") +> 🎥 영상을 보려면 이미지 클릭: AI, Ain't I a Woman - a performance showing the harm caused by racist denigration by AI + +### 과도- 또는 과소- 평가 + +왜곡된 이미지 검색 결과가 이러한 피해의 올바른 예시가 됩니다. 공학, 또는 CEO와 같이, 여자보다 남자가 높거나 비슷한 비율의 직업 이미지를 검색할 때 특정 성별에 대하여 더 치우친 결과를 보여 줍니다. + +![Bing CEO search](../images/ceos.png) +> This search on Bing for 'CEO' produces pretty inclusive results + +5가지의 주요 피해 타입은 mutually exclusive적이지 않으며, 하나의 시스템이 여러 타입의 피해를 나타낼 수 있습니다. 또한, 각 사례들은 심각성이 다릅니다. 예를 들자면, 누군가 범죄자로 부적절하게 노출하는 것은 이미지를 잘못 보여주는 것보다 더 심한 피해입니다. 그러나, 중요한 점은, 상대적으로 심하지 않은 피해도 사람들이 소외감을 느끼거나 피하게 만들 수 있고 쌓인 영향은 꽤 부담이 될 수 있다는 점입니다. + +✅ **토론**: 몇 가지 예시를 다시 보고 다른 피해가 발생했는지 확인해봅시다. + +| | Allocation | Quality of service | Stereotyping | Denigration | Over- or under- representation | +| ----------------------- | :--------: | :----------------: | :----------: | :---------: | :----------------------------: | +| Automated hiring system | x | x | x | | x | +| Machine translation | | | | | | +| Photo labeling | | | | | | + + +## 불공정성 감지 + +주어진 시스템이 부당하게 동작하는 것은 여러 이유가 존재합니다. 사회 편견을, 예시로 들자면, 훈련에 사용한 데이터셋에 영향을 줄 수 있습니다. 예를 들자면, 채용 불공정성은 이전 데이터에 과하게 의존하여 더욱 악화되었을 가능성이 있습니다. 10년 넘게 회사에 제출된 이력서에서 패턴을 사용했으므로, 이 모델은 대부분의 이력서가 기술업의 과거 지배력을 반영했던 남자가 냈기 때문에 남자가 자격이 있다고 판단했습니다. + +특정 그룹의 사람에 대한 적절하지 못한 데이터가 불공정의 이유가 될 수 있습니다. 예를 들자면, 이미지 분류기는 데이터에서 더 어두운 피부 톤를 underrepresented 했으므로 어두운-피부 사람 이미지에 대해 오류 비율이 더 높습니다. + +개발하면서 잘 못된 가정을 하면 불공정성을 발생합니다. 예를 들자면, 사람들의 얼굴 이미지를 기반으로 범죄를 저지를 것 같은 사람을 예측하기 위한 얼굴 분석 시스템은 올바르지 못한 가정으로 이어질 수 있습니다. 이는 잘 못 분류된 사람들에게 큰 피해를 줄 수 있습니다. + +## 모델 이해하고 공정성 구축하기 + +공정성의 많은 측면은 정량 공정성 지표에 보이지 않고, 공정성을 보장하기 위하여 시스템에서 편향성을 완전히 제거할 수 없지만, 여전히 공정성 문제를 최대한 파악하고 완화할 책임은 있습니다. + +머신러닝 모델을 작업할 때, interpretability를 보장하고 불공정성을 평가하며 완화하여 모델을 이해하는 것이 중요합니다. + +대출 선택 예시로 케이스를 분리하고 예측에 대한 각 영향 수준을 파악해보겠습니다. + +## 평가 방식 + +1. **피해 (와 이익) 식별하기**. 첫 단계는 피해와 이익을 식별하는 것입니다. 행동과 결정이 잠재적 고객과 비지니스에 어떻게 영향을 미칠 지 생각해봅니다. + +1. **영향받는 그룹 식별하기**. 어떤 종류의 피해나 이익을 발생할 수 있는지 파악했다면, 영향을 받을 수 있는 그룹을 식별합니다. 그룹은 성별, 인종, 또는 사회 집단으로 정의되나요? + +1. **공정성 지표 정의하기**. 마지막으로, 지표를 정의하여 상황을 개선할 작업에서 특정할 무언가를 가집니다. + +### 피해 (와 이익) 식별하기 + +대출과 관련한 피해와 이익은 어떤 것일까요? false negatives와 false positive 시나리오로 생각해보세요: + +**False negatives** (거절, but Y=1) - 이 케이스와 같은 경우, 대출금을 상환할 수 있는 신청자가 거절됩니다. 자격있는 신청자에게 대출이 보류되기 때문에 불리한 이벤트입니다. + +**False positives** (승인, but Y=0) - 이 케이스와 같은 경우, 신청자는 대출을 받지만 상환하지 못합니다. 결론적으로, 신청자의 케이스는 향후 대출에 영향을 미칠 수 있는 채권 추심으로 넘어갑니다. + +### 영향 받는 그룹 식별 + +다음 단계는 영향을 받을 것 같은 그룹을 정의하는 것입니다. 예를 들자면, 신용카드를 신청하는 케이스인 경우, 모델은 여자가 가계 재산을 공유하는 배우자에 비해서 매우 낮은 신용도를 받아야 한다고 결정할 수 있습니다. 성별에 의해서, 정의된 전체 인구 통계가 영향 받습니다. + +### 공정성 지표 정의 + +피해와 영향받는 그룹을 식별했습니다, 이 케이스와 같은 경우에는, 성별로 표기됩니다. 이제, 정량화된 원인으로 지표를 세분화합니다. 예시로, 아래 데이터를 사용하면, false positive 비율은 여자의 비율이 가장 크고 남자의 비율이 가장 낮으며, false negatives에서는 반대됩니다. + +✅ Clustering에 대한 향후 강의에서는, 이 'confusion matrix'을 코드로 어떻게 작성하는 지 봅시다 + +| | False positive rate | False negative rate | count | +| ---------- | ------------------- | ------------------- | ----- | +| Women | 0.37 | 0.27 | 54032 | +| Men | 0.31 | 0.35 | 28620 | +| Non-binary | 0.33 | 0.31 | 1266 | + + +이 테이블은 몇 가지를 알려줍니다. 먼저, 데이터에 non-binary people이 비교적 적다는 것을 알 수 있습니다. 이 데이터는 왜곡되었으므로, 이런 숫자를 해석하는 것은 조심해야 합니다. + +이러한 케이스는, 3개의 그룹과 2개의 지표가 존재합니다. 시스템이 대출 신청자와 함께 소비자 그룹에 어떤 영향을 미치는지 알아볼 때는, 충분할 수 있지만, 더 많은 수의 그룹을 정의하려는 경우, 더 작은 요약 셋으로 추출할 수 있습니다. 이를 위해서, 각 false negative와 false positive의 가장 큰 차이 또는 최소 비율과 같은, 지표를 더 추가할 수 있습니다. + +✅ Stop and Think: 대출 신청에 영향을 받을 수 있는 다른 그룹이 있을까요? + +## 불공정성 완화 + +불공정성 완화하려면, 모델을 탐색해서 다양하게 완화된 모델을 만들고 가장 공정한 모델을 선택하기 위하여 정확성과 공정성 사이 트레이드오프해서 비교합니다. + +입문 강의에서는 post-processing 및 reductions approach과 같은 알고리즘 불공정성 완화에 대한, 세부적인 사항에 대해 깊게 설명하지 않지만, 여기에서 시도할 수 있는 도구가 있습니다. + +### Fairlearn + +[Fairlearn](https://fairlearn.github.io/)은 시스템의 공정성을 평가하고 불공정성을 완화할 수있는 오픈소스 Python 패키지입니다. + +이 도구는 모델의 예측이 다른 그룹에 미치는 영향을 평가하며 돕고, 공정성과 성능 지표를 사용하여 여러 모델을 비교할 수 있으며, binary classification과 regression의 불공정성을 완화하는 알고리즘 셋을 제공할 수 있습니다. + +- Fairlearn's [GitHub](https://github.com/fairlearn/fairlearn/)를 확인하고 다양한 컴포넌트를 어떻게 쓰는 지 알아보기. + +- [user guide](https://fairlearn.github.io/main/user_guide/index.html), [examples](https://fairlearn.github.io/main/auto_examples/index.html) 탐색해보기. + +- [sample notebooks](https://github.com/fairlearn/fairlearn/tree/master/notebooks) 시도해보기. + +- Azure Machine Learning에서 머신러닝 모델의 [how to enable fairness assessments](https://docs.microsoft.com/azure/machine-learning/how-to-machine-learning-fairness-aml?WT.mc_id=academic-15963-cxa) 알아보기. + +- Azure Machine Learning에서 더 공정한 평가 시나리오에 대하여 [sample notebooks](https://github.com/Azure/MachineLearningNotebooks/tree/master/contrib/fairness) 확인해보기. + +--- +## 🚀 도전 + +편견이 처음부터 들어오는 것을 막으려면, 이렇게 해야 합니다: + +- 시스템을 작동하는 사람들 사이 다양한 배경과 관점을 가집니다 +- 사회의 다양성을 반영하는 데이터 셋에 투자합니다 +- 편향적일 때에 더 좋은 방법을 개발합니다 + +모델을 구축하고 사용하면서 불공정한 실-생활 시나리오를 생각해보세요. 어떻게 고려해야 하나요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/6/) + +## 검토 & 자기주도 학습 + +이 강의에서, 머신러닝의 공정성과 불공정성 개념에 대한 몇 가지 기본사항을 배웠습니다. + +워크숍을 보고 토픽에 대하여 깊게 알아봅니다: + +- YouTube: Fairness-related harms in AI systems: Examples, assessment, and mitigation by Hanna Wallach and Miro Dudik [Fairness-related harms in AI systems: Examples, assessment, and mitigation - YouTube](https://www.youtube.com/watch?v=1RptHwfkx_k) + +또한, 읽어봅시다: + +- Microsoft의 RAI 리소스 센터: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoft의 FATE research 그룹: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +Fairlearn toolkit 탐색합니다 + +[Fairlearn](https://fairlearn.org/) + +공정성을 보장하기 위한 Azure Machine Learning 도구에 대해 읽어봅시다 + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-15963-cxa) + +## 과제 + +[Explore Fairlearn](../assignment.md) From 0d6163f8b1f9125661ed748943c246a92b4c0723 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Mon, 5 Jul 2021 22:19:45 +0900 Subject: [PATCH 04/37] ADD : translate 1-4 --- .../translations/README.ko.md | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 1-Introduction/4-techniques-of-ML/translations/README.ko.md diff --git a/1-Introduction/4-techniques-of-ML/translations/README.ko.md b/1-Introduction/4-techniques-of-ML/translations/README.ko.md new file mode 100644 index 0000000000..db5170bddf --- /dev/null +++ b/1-Introduction/4-techniques-of-ML/translations/README.ko.md @@ -0,0 +1,110 @@ +# 머신러닝의 기술 + +머신러닝 모델과 이를 사용하는 데이터를 구축, 사용, 그리고 관리하는 프로세스는 많은 타 개발 워크플로우와 매우 다른 프로세스입니다. 이 강의에서, 프로세스를 이해하고, 알아야 할 주요 기술을 간단히 설명합니다: + +- 머신러닝을 받쳐주는 프로세스를 고수준에서 이해합니다. +- 'models', 'predictions', 그리고 'training data'와 같은 기초 개념을 탐색합니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/7/) + +## 소개 + +고수준에서, 머신러닝 (ML) 프로세스를 만드는 기술은 여러 단계로 구성됩니다: + +1. **질문 결정하기**. 대부분 ML 프로세스는 간단 조건 프로그램 또는 룰-베이스 엔진으로 대답할 수 없는 질문을 하는 것으로 시작합니다. 이 질문은 가끔 데이터 셋을 기반으로 한 예측을 중심으로 진행됩니다. +2. **데이터 수집 및 준비하기**. 질문에 대답하려면, 데이터가 필요합니다. 데이터의 품질과, 때때로, 양에 따라 초기 질문에 잘 대답할 수 있는 지 결정됩니다. 데이터 시각화는 이 측면에서 중요합니다. 이 단계에서 데이터를 훈련과 테스트 그룹으로 분할하여 모델을 구축하는 게 포함됩니다. +3. **학습 방식 선택하기**. 질문과 데이터의 특성에 따라, 데이터를 가장 잘 반영하고 정확한 예측을 할 수 있게 훈련하는 방법을 선택해야 합니다. 특정 전문 지식과, 지속적으로, 많은 실험이 필요한 ML 프로세스의 일부분입니다. +4. **모델 학습하기**. 학습 데이터로, 다양한 알고리즘을 사용하여 데이터의 패턴을 인식하게 모델을 학습시킵니다. 모델을 더 좋게 만들기 위하여 데이터의 특정 부분을 타 부분보다 먼저 하도록 조정할 수 있도록 내부 가중치를 활용할 수 있습니다. +5. **모델 평가하기**. 수집한 셋에서 이전에 본 적 없는 데이터 (테스트 데이터)로 모델의 성능을 확인합니다. +6. **파라미터 튜닝하기**. 모델의 성능을 기반해서, 모델 학습으로 알고리즘의 동작을 컨트롤하는 다른 파라미터, 또는 변수를, 사용해서 프로세스를 다시 실행할 수 있습니다. +7. **예측하기**. 모델의 정확성을 새로운 입력으로 테스트합니다. + +## 물어볼 질문하기 + +컴퓨터는 데이터에서 숨겨진 패턴 찾는 것을 잘합니다. 유틸리티는 조건-기반 룰 엔진을 만들어서 쉽게 답할 수 없는 도메인에 대해 질문하는 연구원에게 매우 도움이 됩니다. 예를 들어서, actuarial 작업이 주어지면, 데이터 사이언티스트는 흡연자와 비흡연자의 사망률에 대하여 수작업 룰을 작성할 수 있습니다. + +많은 다른 변수가 방정식에 포함되면, ML 모델이 과거 건강기록을 기반으로 미래 사망률을 예측하는 데에 효율적이라고 검증할 수 있습니다. 유쾌한 예시로 위도, 경도, 기후 변화, proximity to the ocean, 제트 기류의 패턴을 포함한 데이터 기반으로 주어진 위치에서 4월의 날씨를 예측하는 것입니다. + +✅ 날씨 모델에 대한 [slide deck](https://www2.cisl.ucar.edu/sites/default/files/0900%20June%2024%20Haupt_0.pdf)은 날씨 분석에서 ML을 사용한 역사적 관점을 제공합니다. + +## 작업 사전-구축하기 + +모델을 만들기 전에, 완료해야 할 몇가지 작업이 더 있습니다. 질문을 테스트하고 모델 예측을 기반으로 가설 구성하려면, 여러 요소를 식별하고 구성해야 합니다. + +### 데이터 + +어떠한 종류의 질문을 대답하려면, 올바른 타입의 데이터가 필요합니다. 이 포인트에서 필요한 두 가지가 있습니다: + +- **데이터 수집**. 데이터 분석의 공정도를 설명한 이전 강의를 기억하고, 데이터를 조심히 수집합니다. 데이터의 출처와, 내재적 편견을 알고, 출처를 문서화합니다. +- **데이터 준비**. 데이터 준비 프로세스는 여러 단계가 있습니다. 데이터가 다양한 소스에서 제공되는 경우에는 정렬하고 노멀라이즈해야 할 수 있습니다. ([Clustering](../../../5-Clustering/1-Visualize/README.md)과 같이) 문자열을 숫자로 바꾸는 방식처럼 다양한 방식을 통하여 데이터의 품질과 양을 향상시킬 수 있습니다. ([Classification](../../../4-Classification/1-Introduction/README.md)과 같이) 원본 기반으로, 새로운 데이터를 생성할 수 있습니다. ([Web App](../../3-Web-App/README.md) 강의 이전처럼) 데이터를 정리하고 변경할 수 있습니다. 마지막으로, 훈련하는 기술에 따라서, 무작위로 섞어야 할 수 있습니다. + +✅ 데이터를 수집하고 처리하면, 그 모양이 의도한 질문을 해결할 수 있는 지 잠시 봅니다. [Clustering](../../5-Clustering/1-Visualize/README.md) 강의에서 본 것처럼, 데이터가 주어진 작업에서 잘 수행하지 못할 수 있습니다! + +### feature 변수 선택하기 + +[feature](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection)는 데이터의 측정할 수 있는 속성입니다. 많은 데이터셋에서 'date' 'size' 또는 'color' 같은 컬럼 제목으로 표현합니다. 일반적인 코드에서 `y`로 나타내는 feature 변수는, 데이터에 물어보려는 질문에 대한 정답을 나타냅니다: 12월에, 어떤 **색상**의 호박이 가장 쌀까요? San Francisco에서, 부동산 **가격**이 가장 좋은 동네는 어디일까요? + +🎓 **Feature Selection과 Feature Extraction** 모델을 만들 때 선택할 변수를 어떻게 알 수 있을까요? 가장 성능이 좋은 모델에 올바른 변수를 선택하기 위하여 Feature Selection 또는 Feature Extraction 프로세스를 거치게 됩니다. 그러나, 같은 내용이 아닙니다: "Feature extraction creates new features from functions of the original features, whereas feature selection returns a subset of the features." ([source](https://wikipedia.org/wiki/Feature_selection)) + +### 데이터 시각화하기 + +데이터 사이언티스트의 툴킷에서 중요한 측면은 Seaborn 또는 MatPlotLib과 같이 여러가지 뛰어난 라이브러리로 데이터 시각화하는 파워입니다. 데이터를 시각화로 보여주면 숨겨진 correlations를 찾아서 활용할 수 있습니다. ([Classification](../../../4-Classification/2-Classifiers-1/README.md)에서 발견한대로) 시각화는 편향적이거나 균형적이지 않은 데이터를 찾는 데 도움이 될 수 있습니다. + +### 데이터셋 나누기 + +훈련하기 전, 데이터를 잘 나타낼 크기로 2개 이상의 데이터 셋을 나눌 필요가 있습니다. + +- **학습**. 데이터셋의 파트는 모델을 학습할 때 적당합니다. 이 셋은 본 데이터셋의 대부분을 차지합니다. +- **테스트**. 테스트 데이터셋은 독립적인 데이터의 그룹이지만, 미리 만들어진 모델의 성능을 확인할 때에, 가끔 본 데이터에서도 수집됩니다. +- **검증**. 검증 셋은 모델을 개선하며 모델의 hyperparameters, 또는 architecture를 튜닝할 때, 사용하는 작은 독립된 예시 그룹입니다. ([Time Series Forecasting](../../7-TimeSeries/1-Introduction/README.md)에서 언급하듯) 데이터의 크기와 질문에 따라서 세번째 셋을 만들 이유가 없습니다. + +## 모델 구축하기 + +훈련하고 있는 데이터를 사용하여, **학습**할 다양한 알고리즘으로, 모델 또는, 데이터의 통계적 표현을 만드는 게 목표입니다. 모델을 학습하면서 데이터에 노출되면 발견, 검증, 그리고 승인하거나 거부되는 perceived patterns에 대하여 가설을 세울 수 있습니다. + +### 학습 방식 결정하기 + +질문과 데이터의 특성에 따라서, 어떻게 학습할 지 선택합니다. [Scikit-learn's documentation](https://scikit-learn.org/stable/user_guide.html)을 - 이 코스에서 - 단계별로 보면 모델이 학습하는 많은 방식을 찾을 수 있습니다. 숙련도에 따라서, 최고의 모델을 만들기 위하여 다른 방식을 해볼 수 있습니다. 데이터 사이언티스트가 볼 수 없는 데이터를 주고 정확도, 편향적, 품질-저하 이슈를 점검해서, 현재 작업에 가장 적당한 학습 방식을 선택하여 모델의 성능을 평가하는 프로세스를 거치게 될 예정입니다. + +### 모델 학습하기 + +훈련 데이터로 감싸면, 모델을 만들 'fit'이 준비 되었습니다. 많은 ML 라이브러리에서 'model.fit' 코드를 찾을 수 있습니다. - 이 순간에 값의 배열 (보통 'X')과 feature 변수 (보통 'y')로 데이터를 보내게 됩니다. + +### 모델 평가하기 + +훈련 프로세스가 완료되면 (큰 모델을 훈련하기 위해서 많이 반복하거나 'epochs'가 요구), 테스트 데이터로 모델의 성능을 측정해서 품질을 평가할 수 있습니다. 데이터는 모델이 이전에 분석하지 않았던 본 데이터의 서브셋입니다. 모델의 품질에 대한 지표 테이블을 출력할 수 있습니다. + +🎓 **모델 피팅** + +머신러닝의 컨텍스트에서, 모델 피팅은 친근하지 않은 데이터를 분석하려고 시도하는 순간에 모델 기본 기능의 정확도를 보입니다. + +🎓 **Underfitting** 과 **overfitting**은 모델 핏이 충분하지 않거나 너무 많을 때, 모델의 품질이 낮아지는 일반적인 이슈입니다. 이러한 이유는 모델이 훈련 데이터와 너무 근접하게 얼라인되거나 너무 느슨하게 얼라인된 예측을 합니다. overfit 모델은 데이터의 디테일과 노이즈를 너무 잘 배웠기에 훈련 데이터로 너무나 잘 예측합니다. underfit 모델은 훈련 데이터 또는 아직 볼 수 없던 데이터를 잘 분석할 수 없으므로 정확하지 않습니다. + +![overfitting model](../images/overfitting.png) +> Infographic by [Jen Looper](https://twitter.com/jenlooper) + +## 파라미터 튜닝 + +초반 훈련이 마무리 될 때, 모델의 품질을 살펴보고 'hyperparameters'를 트윅해서 개선하는 것을 고려합니다. [in the documentation](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-15963-cxa) 프로세스에 대하여 알아봅니다. + +## 예측 + +완전히 새 데이터로 모델의 정확도를 테스트할 수 있는 순간입니다. 프로덕션에서 모델을 쓰기 위해서 웹 어셋을 만들며, '적용한' ML 세팅에, 프로세스는 변수를 설정하고 추론하거나, 평가하고자 사용자 입력(예를 들면, 버튼 입력)을 수집해 모델로 보낼 수 있습니다. + +이 강의에서는, 'full stack' ML 엔지니어가 되기 위하여 여행을 떠나는 과정이며, 이 단계에 - 데이터 사이언티스트의 모든 제스쳐가 있으며 준비, 빌드, 테스트, 평가와 예측 방식을 보게 됩니다. + +--- + +## 🚀 도전 + +ML 실무자의 단계를 반영한 플로우를 그려보세요. 프로세스에서 지금 어디에 있는 지 보이나요? 어려운 내용을 예상할 수 있나요? 어떤게 쉬울까요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/8/) + +## 검토 & 자기주도 학습 + +일상 업무를 이야기하는 데이터 사이언티스트 인터뷰를 온라인으로 검색합니다. 여기 [one](https://www.youtube.com/watch?v=Z3IjgbbCEfs) 있습니다. + +## 과제 + +[Interview a data scientist](../assignment.md) From 5f9edc369b5e7c833449d0b764b51979ce8c34a5 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Wed, 7 Jul 2021 20:51:28 +0900 Subject: [PATCH 05/37] ADD : translate 2-1 --- .../1-Tools/translations/README.ko.md | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 2-Regression/1-Tools/translations/README.ko.md diff --git a/2-Regression/1-Tools/translations/README.ko.md b/2-Regression/1-Tools/translations/README.ko.md new file mode 100644 index 0000000000..204da91435 --- /dev/null +++ b/2-Regression/1-Tools/translations/README.ko.md @@ -0,0 +1,210 @@ +# Regression 모델을 위한 Python과 Scikit-learn 시작하기 + +![Summary of regressions in a sketchnote](../../../sketchnotes/ml-regression.png) + +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/9/) + +## 소개 + +4개의 강의에서, regression 모델을 어떻게 만드는 지에 대하여 탐험합니다. 무엇인지 곧 이야기할 것 입니다. 하지만 모든 것을 하기 전에, 프로세스를 시작할 때 올바른 도구가 있는 지 확인합니다! + +이 강의에서는, 이와 같은 내용을 배웁니다: + +- 로컬 머신러닝 작업을 위해서 컴퓨터를 구성합니다. +- Jupyter notebooks으로 작업합니다. +- 설치 과정을 포함해서, Scikit-learn 사용합니다. +- 직접 연습해보며 linear regression을 알아봅니다. + +## 설치하고 구성하기 + +[![Using Python with Visual Studio Code](https://img.youtube.com/vi/7EXd4_ttIuw/0.jpg)](https://youtu.be/7EXd4_ttIuw "Using Python with Visual Studio Code") + +> 🎥 영상 보려면 이미지 클릭: using Python within VS Code. + +1. **Python 설치하기**. [Python](https://www.python.org/downloads/)이 컴퓨터에 설치되었는 지 확인합니다. 많은 데이터 사이언스와 머신러닝 작업에서 Python을 사용하게 됩니다. 대부분 컴퓨터 시스템은 이미 Python 애플리케이션을 미리 포함하고 있습니다. 사용자가 설치를 쉽게하는, 유용한 [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-15963-cxa)이 존재합니다. + + 그러나, 일부 Python만 사용하면, 소프트웨어의 하나의 버전만 요구하지만, 다른 건 다른 버전을 요구합니다. 이런 이유로, [virtual environment](https://docs.python.org/3/library/venv.html)에서 작업하는 것이 유용합니다. + +2. **Visual Studio Code 설치하기**. 컴퓨터에 Visual Studio Code가 설치되어 있는 지 확인합니다. 기본 설치로 [install Visual Studio Code](https://code.visualstudio.com/)를 따라합니다. Visual Studio Code에서 Python을 사용하므로 Python 개발을 위한 [configure Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-15963-cxa)를 살펴봅니다. + + > 이 [Learn modules](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-15963-cxa)의 모음을 통하여 Python에 익숙해집시다. + +3. [these instructions](https://scikit-learn.org/stable/install.html)에 따라서, **Scikit-learn 설치하기**. Python 3을 사용하는 지 확인할 필요가 있습니다. 가상 환경으로 사용하는 것을 추천합니다. 참고로, M1 Mac에서 라이브러리를 설치하려면, 링크된 페이지에서 특별한 설치 방법을 따라합시다. + +1. **Jupyter Notebook 설치하기**. [install the Jupyter package](https://pypi.org/project/jupyter/)가 필요합니다. + + +## ML 작성 환경 + +**notebooks**으로 Python 코드를 개발하고 머신러닝 모델도 만드려고 합니다. 이 타입 파일은 데이터 사이언티스트의 일반적인 도구이고, 접미사 또는 확장자 `.ipynb`로 찾을 수 있습니다. + +노트북은 개발자가 코드를 작성하고 노트를 추가하며 코드 사이에 문서를 작성할 수 있는 대화형 환경으로서 실험적이거나 연구-중심 프로젝트에 매우 도움이 됩니다. + +### 연습 - notebook으로 작업하기 + +이 폴더에서, _notebook.ipynb_ 파일을 찾을 수 있습니다. + +1. Visual Studio Code에서 _notebook.ipynb_ 엽니다. + + Jupyter 서버는 Python 3+ 이상에서 시작됩니다. 코드 조각에서, `run` 할 수 있는 노트북 영역을 찾습니다. 재생 버튼처럼 보이는 아이콘을 선택해서, 코드 블록을 실핼할 수 있습니다. + +1. `md` 아이콘을 선택하고 markdown을 살짝 추가합니다, 그리고 **# Welcome to your notebook** 텍스트를 넣습니다. + + 다음으로, 약간의 Python 코드를 추가합니다. + +1. 코드 블록에서 **print("hello notebook'")** 입력합니다. +1. 코드를 실행하려면 화살표를 선택합니다. + + 출력된 구문이 보여야 합니다: + + ```output + hello notebook + ``` + +![VS Code with a notebook open](../images/notebook.png) + +코드에 주석을 넣어서 노트북이 자체적으로 문서화 할 수 있게 할 수 있습니다. + +✅ 웹 개발자의 작업 환경이 데이터 사이언티스트와 어떻게 다른 지 잠시 알아보세요. + +## Scikit-learn으로 시작하고 실행하기 + +이제 로컬 환경에 Python이 설정되었고, 그리고 Jupyter notebooks에 익숙해진 상태에서, Scikit-learn (`science`에서는 `sci`로 발음)도 익숙하게 하겠습니다. Scikit-learn은 ML 작업을 돕는 [extensive API](https://scikit-learn.org/stable/modules/classes.html#api-ref)가 제공됩니다. + +[website](https://scikit-learn.org/stable/getting_started.html)에 따르면, "Scikit-learn is an open source machine learning library that supports supervised and unsupervised learning. It also provides various tools for model fitting, data preprocessing, model selection and evaluation, and many other utilities." 라고 언급되고 있습니다. + +이 코스에서, Scikit-learn과 다른 도구를 사용하여 머신러닝 모델을 만들면서 'traditional machine learning' 작업이 진행됩니다. 곧 다가올 'AI for Beginners' 커리큘럼에서 더 잘 커버될 것이기 때문에, 신경망과 딥러닝은 제외했습니다. + +Scikit-learn 사용하면 올바르게 모델을 만들고 사용하기 위해 평가할 수 있습니다. 주로 숫자 데이터에 포커스를 맞추고 학습 도구로 사용하기 위한 여러 ready-made 데이터셋이 포함됩니다. 또 학생들이 시도해볼 수 있도록 사전-제작된 모델을 포함합니다. 패키징된 데이터를 불러오고 기초 데이터와 Scikit-learn이 같이 있는 estimator first ML 모델로 프로세스를 찾아봅니다. + +## 연습 - 첫 Scikit-learn notebook + +> 이 튜토리얼은 Scikit-learn 웹사이트에 있는 [linear regression example](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)에서 영감 받았습니다. + +이 강의에서 관련있는 _notebook.ipynb_ 파일에서, 'trash can' 아이콘을 누르면 모든 셀이 지워집니다. + +이 세션에서, 학습 목적의 Scikit-learn에서 만든 작은 당뇨 데이터셋으로 다룹니다. 당뇨 환자를 위한 치료 방법을 테스트하고 싶다고 생각해보세요. 머신러닝 모델은 변수 조합을 기반으로, 어떤 환자가 더 잘 치료될 지 결정할 때 도울 수 있습니다. 매우 기초적인 regression 모델도, 시각화하면, 이론적인 임상 시험을 구성하는 데에 도움이 될 변수 정보를 보여줄 수 있습니다. + +✅ Regression 방식에는 많은 타입이 있고, 어떤 것을 선택하는 지에 따라 다릅니다. 만약 주어진 나이의 사람이 클 수 있는 키에 대하여 예측하려고, **numeric value**를 구할 때, linear regression을 사용합니다. 만약 어떤 타입의 요리를 비건으로 분류해야 하는 지 알고 싶다면, logistic regression으로 **category assignment**을 찾습니다. logistic regression은 나중에 자세히 알아봅시다. 데이터에 대하여 물어볼 수 있는 몇 가지 질문과, 이 방식 중 어느 것이 적당한 지 생각해봅니다. + +작업을 시작하겠습니다. + +### 라이브러리 Import + +작업을 하기 위하여 일부 라이브러리를 import 합니다: + +- **matplotlib**. 유용한 [graphing tool](https://matplotlib.org/)이며 line plot을 만들 때 사용합니다. +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html)는 Python애서 숫자를 핸들링할 때 유용한 라이브러리입니다. +- **sklearn**. Scikit-learn 라이브러리 입니다. + +작업을 도움받으려면 라이브러리를 Import 합니다. + +1. 다음 코드를 타이핑해서 imports를 추가합니다: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + `matplottlib`, `numpy`를 가져오고 `sklearn` 에서 `datasets`, `linear_model`과 `model_selection`을 가져옵니다. `model_selection`은 데이터를 학습하고 테스트 셋으로 나누기 위하여 사용합니다. + +### 당뇨 데이터셋 + +빌트-인된 [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset)은 당뇨에 대한 442개의 데이터 샘플이 있고, 10개의 feature 변수가 있으며, 그 일부는 아래와 같습니다: + +age: age in years +bmi: body mass index +bp: average blood pressure +s1 tc: T-Cells (a type of white blood cells) + +✅ 이 데이터셋에는 당뇨를 연구할 때 중요한 feature 변수인 '성' 컨셉이 포함되어 있습니다. 많은 의학 데이터셋에는 binary classification의 타입이 포함됩니다. 이처럼 categorizations이 치료에서 인구의 특정 파트를 제외할 수 있는 방법에 대하여 조금 고민해보세요. + +이제, X 와 y 데이터를 불러옵니다. + +> 🎓 다시 언급하지만, 지도 학습이며, 이름이 붙은 'y' 타겟이 필요합니다. + +새로운 코드 셀에서, `load_diabetes()`를 호출하여 당뇨 데이터셋을 불러옵니다. 입력 `return_X_y=True`는 `X`를 data matrix, `y`를 regression 타겟으로 나타냅니다. + + +1. data matrix와 첫 요소의 모양을 보여주는 출력 명령을 몇 개 추가합니다: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + 응답하는 것은, tuple 입니다. 할 일은 tuple의 두 첫번째 값을 `X` 와 `y`에 각자 할당하는 것입니다. [about tuples](https://wikipedia.org/wiki/Tuple)을 봅시다. + + 데이터에 10개 요소의 배열로 이루어진 442개의 아이템이 보입니다: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ 데이터와 regression 타겟의 관계를 잠시 생각해보세요. Linear regression은 feature X와 타겟 변수 y 사이 관계를 예측합니다. 문서에서 당뇨 데이터셋의 [target](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset)을 찾을 수 있나요? 타겟이 고려하면, 데이터셋은 무엇을 보여주나요? + +2. 다음은, numpy의 `newaxis` 함수로 새로운 배열을 통해 플롯할 데이터셋의 일부를 선택합니다. 결정한 패턴에 맞춰서, 데이터의 값 사이에 라인을 생성하기 위하여 linear regression을 사용합니다. + + ```python + X = X[:, np.newaxis, 2] + ``` + + ✅ 언제나, 모양 확인 차 데이터를 출력할 수 있습니다. + +3. 이제 데이터를 그릴 준비가 되었으므로, 머신이 데이터셋의 숫자 사이에서 논리적으로 판단하며 나누는 것을 도와주고 있는 지 확인할 수 있습니다. 그러면, 데이터 (X) 와 타겟 (y)를 테스트와 훈련 셋으로 나눌 필요가 있습니다. Scikit-learn에서는 간단한 방식이 존재합니다; 주어진 포인트에서 테스트 데이터를 나눌 수 있습니다. + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. 이제 모델을 훈련할 준비가 되었습니다! linear regression 모델을 부르고 `model.fit()` 사용하여 X 와 y 훈련 셋으로 훈련합니다: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()`은 TensorFlow 처럼 많은 ML 라이브러리에서 볼 수 있는 함수입니다 + +5. 그러면, `predict()` 함수를 사용하여, 테스트 데이터로 prediction을 만듭니다. 데이터 그룹 사이에 라인을 그릴 때 사용합니다 + + ```python + y_pred = model.predict(X_test) + ``` + +6. 이제 plot으로 데이터를 나타낼 시간입니다. Matplotlib은 이 작업에서 매우 유용한 도구입니다. 모든 X 와 y 테스트 데이터의 scatterplot (산점도)를 만들고, prediction을 사용해서 모델의 데이터 그룹 사이, 가장 적절한 장소에 라인을 그립니다. + + ```python + plt.scatter(X_test, y_test, color='black') + plt.plot(X_test, y_pred, color='blue', linewidth=3) + plt.show() + ``` + + ![a scatterplot showing datapoints around diabetes](.././images/scatterplot.png) + + ✅ 여기에 어떤 일이 생기는 지 생각합니다. 직선은 많은 데이터의 점을 지나지만, 무엇을 하고있나요? 라인으로 보이지 않는 데이터 포인트가 plot y 축으로 연관해서, 새롭게 맞출 지 예측하는 방식을 알 수 있을까요? 모델의 실제 사용 사례를 말 해봅니다. + +축하드립니다. 첫 linear regression 모델을 만들고, 이를 통해서 prediction도 만들어서, plot에 보이게 했습니다! + +--- +## 🚀 도전 + +이 데이터셋은 다른 변수를 Plot 합니다. 힌트: 이 라인을 수정합니다: `X = X[:, np.newaxis, 2]`. 이 데이터셋의 타겟이 주어질 때, 질병으로 당뇨가 진행되면 어떤 것을 탐색할 수 있나요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/10/) + +## 검토 & 자기주도 학습 + +이 튜토리얼에서, univariate 또는 multiple linear regression이 아닌 simple linear regression으로 작업했습니다. 방식의 차이를 읽어보거나, [this video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef)를 봅니다. + +regression의 개념에 대하여 더 읽고 기술로 답변할 수 있는 질문의 종류에 대하여 생각해봅니다. [tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-15963-cxa)로 깊게 이해합니다. + +## 과제 + +[A different dataset](../assignment.md) From a6c37e69e370285fe7d0efbcf9b16e2f3af64b94 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 10 Jul 2021 16:09:11 +0900 Subject: [PATCH 06/37] ADD : translate 2-2 --- 2-Regression/2-Data/translations/README.ko.md | 201 ++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 2-Regression/2-Data/translations/README.ko.md diff --git a/2-Regression/2-Data/translations/README.ko.md b/2-Regression/2-Data/translations/README.ko.md new file mode 100644 index 0000000000..dde1301431 --- /dev/null +++ b/2-Regression/2-Data/translations/README.ko.md @@ -0,0 +1,201 @@ +# Scikit-learn 사용한 regression 모델 만들기: 데이터 준비와 시각화 + +> ![Data visualization infographic](.././images/data-visualization.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/11/) + +## 소개 + +이제 Scikit-learn으로 머신러닝 모델을 만들기 시작할 때 필요한 도구를 세팅했으므로, 데이터에 대한 질문을 할 준비가 되었습니다. 데이터로 작업하고 ML 솔루션을 적용하려면, 데이터셋의 잠재력을 잘 분석하기 위하여 올바른 질문 방식을 이해하는 것이 매우 중요합니다. + +이 강의에서, 다음을 배웁니다: + +- 모델-제작 위한 데이터 준비하는 방식. +- 데이터 시각화 위한 Matplotlib 사용하는 방식. + +## 데이터에 올바른 질문하기 + +답변이 필요한 질문에 따라서 활용할 ML 알고리즘의 타입이 결정됩니다. 그리고 받는 답변의 퀄리티는 데이터의 성격에 크게 의존됩니다. + +이 강의에서 제공되는 [data](../data/US-pumpkins.csv)를 보세요. VS Code에서 .csv 파일을 열 수 있습니다. 빠르게 흝어보면 공백과 문자열과 숫자 데이터가 섞여진 것을 보여줍니다. 'Package'라고 불리는 이상한 열에 'sacks', 'bins'과 다른 값 사이에 섞인 데이터가 있습니다. 사실은, 조금 엉성합니다. + +실제로, ML 모델을 바로 꺼내 만들면서 완벽하게 사용할 준비가 된 데이터셋을 주는 건 매우 평범하지 않습니다. 이 강의에서는, 표준 Python 라이브러리로 원본 데이터셋을 준비하는 과정을 배우게 됩니다. 데이터 시각화하는 다양한 기술을 배웁니다. + +## 케이스 스터디: 'the pumpkin market' + +이 폴더에서는 호박 시장에 대한 데이터 1757 라인이 도시별로 분류된 [US-pumpkins.csv](../../data/US-pumpkins.csv) 라고 불리는 최상위 `data` 폴더에서 .csv 파일을 찾을 수 있습니다. United States Department of Agriculture가 배포한 [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)에서 원본 데이터를 추출했습니다. + +### 데이터 준비하기 + +이 데이터는 공개 도메인에 존재합니다. USDA 웹사이트에서, 도시별로, 많은 여러개 파일을 내려받을 수 있습니다. 너무 많이 분리된 파일들을 피하기 위해서, 모든 도시 데이터를 한 개의 스프레드 시트에 연결했으므로, 미리 데이터를 조금 _준비_ 했습니다. 다음으로, 데이터를 가까이 봅니다. + +### 호박 데이터 - 이른 결론 + +데이터에서 어떤 것을 눈치챘나요? 이해할 문자열, 숫자, 공백과 이상한 값이 섞여있다는 것을 이미 봤습니다. + +Regression 기술을 사용해서, 데이터에 물어볼 수 있는 질문인가요? "Predict the price of a pumpkin for sale during a given month"는 어떤가요. 데이터를 다시보면, 작업에 필요한 데이터 구조를 만들기 위하여 조금 바꿀 점이 있습니다. + +## 연습 - 호박 데이터 분석하기 + +호박 데이터를 분석하고 준비하며, 데이터를 구성할 때 매우 유용한 도구인, [Pandas](https://pandas.pydata.org/) (`Python Data Analysis`의 약자)를 사용해봅시다. + +### 먼저, 누락된 날짜를 확인합니다. + +먼저 누락된 데이터들을 확인하는 단계가 필요합니다: + +1. 날짜를 월 포맷으로 변환합니다 (US 날짜라서 `MM/DD/YYYY` 포맷). +2. month를 새로운 열로 추출합니다. + +visual Studio Code에서 _notebook.ipynb_ 파일을 열고 새로운 Pandas 데아터프레임에 spreadsheet를 가져옵니다. + +1. 처음 5개 행을 보기 위하여 `head()` 함수를 사용합니다. + + ```python + import pandas as pd + pumpkins = pd.read_csv('../../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ 마지막 5개 행을 보려면 어떤 함수를 사용하나요? + +1. 지금 데이터프레임에 누락된 데이터가 있다면 확인합니다: + + ```python + pumpkins.isnull().sum() + ``` + + 누락된 데이터이지만, 당장 앞에 있는 작업에는 중요하지 않을 수 있습니다. + +1. 데이터프레임 작업을 더 쉽게 하려면, `drop()`으로, 여러 열을 지우고, 필요한 행만 둡니다. + + ```python + new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1) + ``` + +### 두번째로, 호박의 평균 가격을 결정합니다. + +주어진 달에 호박의 평균 가격을 결정하는 방식에 대하여 생각합니다. 이 작업을 하기 위하여 어떤 열을 선택할까요? 힌트: 3개의 열이 필요합니다. + +솔루션: `Low Price`와 `High Price` 열의 평균으로 새로운 가격 열을 채우고, 이 달만 보여주기 위해 날짜 열을 변환합니다. 다행히, 확인해보니, 누락된 날짜나 가격 데이터가 없습니다. + +1. 평균을 계산하려면, 해당 코드를 추가합니다: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ `print(month)`로 확인하려는 데이터를 마음껏 출력해보세요. + +2. 이제, 새로 만든 Pandas 데이터프레임으로 변환한 데이터를 복사해보세요: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + 데이터프레임을 출력해보면 새로운 regression 모델을 만들 수 있는 깨끗하고, 단정한 데이터셋이 보여집니다. + +### 하지만 기다려주세요! 여기 무언가 있습니다 + +`Package` 열을 보면, 호박이 많이 다양한 구성으로 팔린 것을 볼 수 있습니다. 일부는 '1 1/9 bushel' 단위로 팔고, '1/2 bushel' 단위로 팔고, 호박 단위, 파운드 단위, 그리고 다양한 넓이의 큰 박스에도 넣어서 팔고 있습니다. + +> 호박은 일정한 무게로 이루어지기 꽤 어려운 것 같습니다. + +원본 데이터를 파다보면, 모든 항목에 인치, 박스 당, 또는 'each'로 이루어져서 `Unit of Sale`이 'EACH' 또는 'PER BIN'이라는 사실은 흥미롭습니다. 호박은 일정하게 무게를 달기가 매우 어려워서, `Package` 열에 'bushel' 문자열이 있는 호박만 선택해서 필터링하겟습니다. + +1. 파일 상단, 처음 .csv import 하단에 필터를 추가합니다: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + 지금 데이터를 출력해보면, bushel 호박 포함한 대략 415개의 행만 가져올 수 있습니다. + +### 하지만 기다려주세요! 하나 더 있습니다 + +bushel 수량이 행마다 다른 것을 알았나요? bushel 단위로 가격을 보여줄 수 있도록 가격을 노말라이즈해야 되므로, 수학으로 일반화해야 합니다. + +1. new_pumpkins 데이터프레임을 만드는 블록 뒤에 이 라인들을 추가합니다: + + ```python + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) + + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) + ``` + +✅ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308)에 따르면, bushel의 무게는 볼륨 측정이므로, 농산물 타입에 따릅니다. "A bushel of tomatoes, for example, is supposed to weigh 56 pounds... Leaves and greens take up more space with less weight, so a bushel of spinach is only 20 pounds." 모든 게 정말 복잡합니다! bushel에서 파운드로 변환하면서 신경쓰지 말고, bushel로 가격을 정합니다. 호박 bushels의 모든 연구는, 데이터의 특성을 이해하는 게 매우 중요하다는 것을 보여줍니다. + +지금, bushel 측정을 기반으로 가격을 분석하는 게 가능해졌습니다. 만약 한 번 데이터를 출력하면, 표준화된 상태로 볼 수 있습니다. + +✅ half-bushel로 파는 게 매우 비싸다는 사실을 파악했나요? 왜 그런 지 알 수 있나요? 힌트: 작은 호박은 큰 호박보다 비쌉니다, 큰 hollow 파이 호박 하나가 차지하는 빈 공간을 생각해보면, bushel 당 더 많습니다. + +## 시각화 전략 + +데이터 사이언티스트 룰의 일부는 작업하고 있는 데이터의 품질과 특성을 증명하는 것입니다. 데이터의 다양한 측면을 보여주는, 흥미로운 시각화, 또는 plots, 그래프 그리고 차트를 만드는 경우가 자주 있습니다. 이렇게, 다른 방식으로 밝히기 힘든 관계와 간격을 시각적으로 표현할 수 있습니다. + +시각화는 데이터에 가장 적합한 머신러닝 기술의 결정을 돕습니다. 라인을 따라가는 것처럼 보이는 scatterplot을(산점도) 예시로, 데이터가 linear regression 연습에 좋은 후보군이라는 것을 나타냅니다. + +Jupyter notebooks에서 잘 작동하는 데이터 시각화 라이브러리는 (이전 강의에서 보았던) [Matplotlib](https://matplotlib.org/)입니다. + +> [these tutorials](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-15963-cxa)에서 데이터 시각화 연습을 더 해보세요. + +## 연습 - Matplotlib으로 실험하기 + +직전에 만든 새로운 데이터프레임을 출력하려면 기초 plot을 만듭시다. 기초 라인 plot은 어떻게 보여주나요? + +1. 파일의 상단에, Pandas import 밑에서 Matplotlib을 Import 합니다: + + ```python + import matplotlib.pyplot as plt + ``` + +1. 전체 노트북을 다시 실행해서 새로 고칩니다. +1. 노트북의 하단에, 데이터를 박스로 plot할 셀을 추가합니다: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![A scatterplot showing price to month relationship](.././images/scatterplot.png) + + 쓸모있는 plot인가요? 어떤 것에 놀랬나요? + + 주어진 달에 대하여 점의 발산은 데이터에 보여질 뿐이므로 특별히 유용하지 않습니다. + +### 유용하게 만들기 + +차트에서 유용한 데이터를 보여지게 하려면, 데이터를 어떻게든지 그룹으로 묶어야 합니다. y축이 달을 나타내면서 데이터의 분포를 나타내는 데이터로 plot을 만들어 보겠습니다. + +1. 그룹화된 바 차트를 만들기 위한 셀을 추가합니다: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![A bar chart showing price to month relationship](.././images/barchart.png) + + 조금 더 유용한 데이터 시각화힙니다! 호박 가격이 가장 높았을 때는 9월과 10월로 보여집니다. 기대하던 목표에 부합하나요? 왜 그렇게 생각하나요? + +--- + +## 🚀 도전 + +Matplotlib에서 제공하는 다양한 시각화 타입을 찾아보세요. regression 문제에 가장 적당한 타입은 무엇인가요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/12/) + +## 검토 & 자기주도 학습 + +데이터 시각화하는 많은 방식을 찾아보세요. 사용할 수 있는 다양한 라이브러리 목록을 만들고 2D visualizations vs. 3D visualizations 예시처럼, 주어진 작업의 타입에 적당한 라이브러리를 확인합니다. 어떤 것을 찾았나요? + +## 과제 + +[Exploring visualization](../assignment.md) From 84ff17299f120d5042f8d3355dc4f696c21789a0 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 11 Jul 2021 23:28:45 +0900 Subject: [PATCH 07/37] ADD : translate 2-3 --- .../3-Linear/translations/README.ko.md | 339 ++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 2-Regression/3-Linear/translations/README.ko.md diff --git a/2-Regression/3-Linear/translations/README.ko.md b/2-Regression/3-Linear/translations/README.ko.md new file mode 100644 index 0000000000..bbfe09a0bf --- /dev/null +++ b/2-Regression/3-Linear/translations/README.ko.md @@ -0,0 +1,339 @@ +# Scikit-learn을 사용한 regression 모델 만들기: regression 2가지 방식 + +![Linear vs polynomial regression infographic](.././images/linear-polynomial.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/13/) + +### 소개 + +지금까지 이 강의에서 사용할 호박 가격 데이터셋에서 모은 샘플 데이터로 regression이 무엇인지 찾아보았습니다. Matplotlib을 사용하여 시각화했습니다. + +이제 ML의 regression에 대하여 더 깊게 파고 들 준비가 되었습니다. 이 강의에서, 2가지 타입의 regression에 대해 배웁니다: 이 기술의 기반이 되는 수학의 일부와 함께, _basic linear regression_ 과 _polynomial regression_. + + +> 이 커리큘럼 대부분에 걸쳐서, 수학에 대한 최소한의 지식을 가정하고, 다른 필드에서 온 학생들이 수학에 접근할 수 있도록 노력하므로, 이해를 돕기 위하여 노트, 🧮 callouts, 다이어그램과 기타 학습 도구를 찾아보세요. + +### 필요한 조건 + +지금즈음 조사하고 있던 호박 데이터의 구조에 익숙해집니다. 이 강의의 _notebook.ipynb_ 파일에서 preloaded와 pre-cleaned된 것을 찾을 수 있습니다. 파일에서, 호박 가격은 새로운 데이터프레임에서 bushel per로 보여집니다. Visual Studio Code의 커널에서 이 노트북을 실행할 수 있는 지 확인합니다. + +### 준비하기 + +참고하자면, 이러한 질문을 물어보기 위해서 이 데이터를 불러오고 있습니다. + +- 호박을 사기 좋은 시간은 언제인가요? +- 작은 호박 케이스의 가격은 얼마인가요? +- half-bushel 바구니 또는 1 1/9 bushel 박스로 사야 하나요? + +이 데이터로 계속 파봅시다. + +이전 강의에서, Pandas 데이터프레임을 만들고 원본 데이터셋의 일부를 채웠으며, bushel로 가격을 표준화했습니다. 그렇게 했지만, 가을에만 400개의 데이터 포인트를 모을 수 있었습니다. + +이 강의에 첨부된 notebook에서 미리 불러온 데이터를 봅시다. 데이터를 미리 불러오고 초기 scatterplot(산점도)이 월 데이터를 보여주도록 차트로 만듭니다. 더 정리하면 데이터의 특성에 대하여 조금 더 자세히 알 수 있습니다. + +## Linear regression 라인 + +1 강의에서 배웠던 것처럼, linear regression 연습의 목표는 라인을 그릴 수 있어야 합니다: + +- **변수 관계 보이기**. 변수 사이 관게 보이기 +- **예상하기**. 새로운 데이터 포인트가 라인과 관련해서 어디에 있는지 정확하게 예측합니다. + +이런 타입의 선을 그리는 것은 **Least-Squares Regression** 의 전형적입니다. 'least-squares'이라는 말은 regression 라인을 두른 모든 데이터 포인트가 제곱된 다음에 더하는 것을 의미합니다. 이상적으로, 적은 수의 오류, 또는 `least-squares`를 원하기 때문에, 최종 합계는 가능한 작아야 합니다. + +모든 데이터 포인트에서 누적 거리가 가장 짧은 라인을 모델링하기 원합니다. 방향보다 크기에 관심있어서 항을 더하기 전에 제곱합니다. + +> **🧮 Show me the math** +> +> _line of best fit_ 이라고 불리는 이 선은, [an equation](https://en.wikipedia.org/wiki/Simple_linear_regression)으로 표현할 수 있습니다: +> +> ``` +> Y = a + bX +> ``` +> +> `X` 는 '독립(설명) 변수'입니다. `Y`는 '종속 변수'입니다. 라인의 기울기는 `b`이고 `a`는 y-절편이며, `X = 0`일 떄 `Y`의 값을 나타냅니다. +> +>![calculate the slope](../images/slope.png) +> +> 우선, 기울기 `b`를 구합니다. Infographic by [Jen Looper](https://twitter.com/jenlooper) +> +> 즉, 호박의 원본 질문을 참조해봅니다 : "predict the price of a pumpkin per bushel by month", `X`는 가격을 나타내고 `Y`는 판매한 달을 나타냅니다. +> +>![complete the equation](../images/calculation.png) +> +> Y의 값을 구합니다. 만약 4달러 정도 준다면, 4월만 가능합니다! Infographic by [Jen Looper](https://twitter.com/jenlooper) +> +> 라인을 구하는 수학은 절편, 또는 `X = 0`일 때 `Y`가 위치한 곳에 따라, 달라지는 라인의 기울기를 볼 수 있어야 합니다. +> +> [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) 웹사이트에서 값을 구하는 방식을 지켜볼 수 있습니다. 그리고 [this Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html)를 찾아가서 숫자 값이 라인에 어떤 영향을 주는 지 볼 수 있습니다. + +## 상관 관계 + +이해할 하나의 용어는 주어진 X와 Y 변수 사이의 **Correlation Coefficient**입니다. scatterplot(산점도)를 사용해서, 이 계수를 빠르게 시각화할 수 있습니다. 데이터 포인트를 깔끔한 라인으로 흩어 둔 plot은 상관 관계가 높지만, 데이터 포인트가 X와 Y 사이 어디에나 흩어진 plot은 상관 관계가 낮습니다. + +좋은 linear regression 모델은 regression 라인과 같이 Least-Squares Regression 방식을 사용하여 (0 보다 1에 가까운) 높은 상관 계수를 가집니다. + +✅ 이 강위에서 같이 주는 노트북을 실행하고 City to Price의 scatterplot (산점도)를 봅니다. scatterplot (산점도)의 시각적 해석에 따르면, 호박 판매를 도시와 가격에 연관지으면 데이터가 높거나 낮은 상관 관계를 보이는 것 같나요? + + +## Regression를 위한 데이터 준비하기 + +지금부터 연습에 기반한 수학을 이해했으므로, Regression 모델을 만들어서 호박 가격이 괜찮은 호박 패키지를 예측할 수 있는 지 봅니다. holiday pumpkin patch를 위해서 호박을 사는 사람은 이 정보로 패치용 호박 패키지를 최적으로 사고 싶습니다. + +Scikit-learn을 사용할 예정이기 때문에, (할 수 있지만) 손으로 직접 할 필요가 없습니다. 수업 노트북의 주 데이터-처리 블록에서, Scikit-learn의 라이브러리를 추가하여 모든 문자열 데이터를 숫자로 자동 변환합니다: + +```python +from sklearn.preprocessing import LabelEncoder + +new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform) +new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform) +``` + +new_pumpkins 데이터프레임을 보면, 모든 문자열은 이제 숫자로 보입니다. 직접 읽기는 힘들지만 Scikit-learn은 더욱 더 이해하기 쉽습니다! +지금부터 regression에 잘 맞는 데이터에 대하여 (scatterplot(산점도) 지켜보는 것 말고도) 교육적인 결정을 할 수 있습니다. + +잠재적으로 좋은 예측 모델을 만드려면 데이터의 두 포인트 사이 좋은 상관 관계를 찾아야 합니다. 도시와 가격 사이에는 약한 상관 관계만 있다는, 사실이 밝혀졌습니다: + +```python +print(new_pumpkins['City'].corr(new_pumpkins['Price'])) +0.32363971816089226 +``` + +하지만 패키지와 가격 사이에는 조금 더 큰 상관 관계가 있습니다. 이해가 되나요? 일반적으로, 농산물 박스가 클수록, 가격도 높습니다. + +```python +print(new_pumpkins['Package'].corr(new_pumpkins['Price'])) +0.6061712937226021 +``` + +데이터에 물어보기 좋은 질문은 이렇습니다: 'What price can I expect of a given pumpkin package?' + +regression 모델을 만들어봅니다 + +## linear 모델 만들기 + +모델을 만들기 전에, 데이터를 다시 정리합니다. Null 데이터를 드랍하고 데이터가 어떻게 보이는 지 다시 확인합니다. + +```python +new_pumpkins.dropna(inplace=True) +new_pumpkins.info() +``` + +그러면, 최소 셋에서 새로운 데이터프레임을 만들고 출력합니다: + +```python +new_columns = ['Package', 'Price'] +lin_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns') + +lin_pumpkins +``` + +```output + Package Price +70 0 13.636364 +71 0 16.363636 +72 0 16.363636 +73 0 15.454545 +74 0 13.636364 +... ... ... +1738 2 30.000000 +1739 2 28.750000 +1740 2 25.750000 +1741 2 24.000000 +1742 2 24.000000 +415 rows × 2 columns +``` + +1. 이제 X와 Y 좌표 데이터를 대입합니다: + + ```python + X = lin_pumpkins.values[:, :1] + y = lin_pumpkins.values[:, 1:2] + ``` +✅ 어떤 일이 생기나요? [Python slice notation](https://stackoverflow.com/questions/509211/understanding-slice-notation/509295#509295)으로 `X` 와 `y`를 채울 배열을 생성합니다. + +2. 다음으로, regression model-building 루틴을 시작합니다: + + ```python + from sklearn.linear_model import LinearRegression + from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error + from sklearn.model_selection import train_test_split + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + lin_reg = LinearRegression() + lin_reg.fit(X_train,y_train) + + pred = lin_reg.predict(X_test) + + accuracy_score = lin_reg.score(X_train,y_train) + print('Model Accuracy: ', accuracy_score) + ``` + + 상관 관계가 좋지 못해서, 만들어진 모델은 딱히 정확하지 않습니다. + + ```output + Model Accuracy: 0.3315342327998987 + ``` + +3. 프로세스에서 그려진 라인을 시각화할 수 있습니다: + + ```python + plt.scatter(X_test, y_test, color='black') + plt.plot(X_test, pred, color='blue', linewidth=3) + + plt.xlabel('Package') + plt.ylabel('Price') + + plt.show() + ``` + ![A scatterplot showing package to price relationship](.././images/linear.png) + +4. 가상의 Variety에 대하여 모델을 테스트합니다: + + ```python + lin_reg.predict( np.array([ [2.75] ]) ) + ``` + + 전설적 Variety의 반품된 가격입니다: + + ```output + array([[33.15655975]]) + ``` + +regression 라인의 로직이 사실이라면, 숫자는 의미가 있습니다. + +🎃 축하드립니다. 방금 전에 몇 호박 종의 가격 예측하는 모델을 만들었습니다. holiday pumpkin patch는 아릅답습니다. 하지만 더 좋은 모델을 만들 수 있습니다! + +## Polynomial regression + +linear regression의 또 다른 타입은 polynomial regression 입니다. 때때로 변수 사이 linear 관계가 있지만 - 호박 볼륨이 클수록, 가격이 높아지는 - 이런 관계를 평면 또는 직선으로 그릴 수 없습니다. + +✅ polynomial regression을 사용할 수 있는 데이터의 [some more examples](https://online.stat.psu.edu/stat501/lesson/9/9.8)입니다. + +이전 plot에서 다양성과 가격 사이 관계를 봅니다. scatterplot(산점도)이 반드시 직선으로 분석되어야 하는 것처럼 보이나요? 아마 아닐겁니다. 이 케이스에서, polynomial regression을 시도할 수 있습니다. + +✅ Polynomials는 하나 또는 더 많은 변수와 계수로 이루어 질 수 있는 수학적 표현식입니다. + +Polynomial regression은 nonlinear 데이터에 더 맞는 곡선을 만듭니다. + +1. 원본 호박 데이터의 세그먼트로 채워진 데이터프레임을 다시 만듭니다: + + ```python + new_columns = ['Variety', 'Package', 'City', 'Month', 'Price'] + poly_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns') + + poly_pumpkins + ``` + +데이터프레임의 데이터 사이 상관 관계를 시각화하는 좋은 방식은 'coolwarm' 차트에 보여주는 것입니다: + +2. 인수 값으로 `coolwarm`을 `Background_gradient()` 메소드에 사용합니다: + + ```python + corr = poly_pumpkins.corr() + corr.style.background_gradient(cmap='coolwarm') + ``` + 이 코드로 heatmap을 만듭니다: + ![A heatmap showing data correlation](.././images/heatmap.png) + +이 차트를 보고 있으면, 패키지와 가격 사이 좋은 상관 관계를 시각화할 수 있습니다. 그래서 이전의 모델보다 약간 좋게 만들 수 있어야 합니다. + +### 파이프라인 만들기 + +Scikit-learn에는 polynomial regression 모델을 만들 때 도움을 받을 수 있는 API가 포함되어 있습니다 - the `make_pipeline` [API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline). 추정량의 체인인 'pipeline'이 만들어집니다. 이 케이스는, 파이프라인에 polynomial features, 또는 nonlinear 경로를 만들 예측이 포함됩니다. + +1. X 와 y 열을 작성합니다: + + ```python + X=poly_pumpkins.iloc[:,3:4].values + y=poly_pumpkins.iloc[:,4:5].values + ``` + +2. `make_pipeline()` 메소드를 불러서 파이프라인을 만듭니다: + + ```python + from sklearn.preprocessing import PolynomialFeatures + from sklearn.pipeline import make_pipeline + + pipeline = make_pipeline(PolynomialFeatures(4), LinearRegression()) + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + pipeline.fit(np.array(X_train), y_train) + + y_pred=pipeline.predict(X_test) + ``` + +### 시퀀스 만들기 + +이 지점에서, 파이프라인이 시퀀스를 만들 수 있도록 _sorted_ 데이터로 새로운 데이터프레임을 만들 필요가 있습니다. + +해당 코드를 추가합니다: + + ```python + df = pd.DataFrame({'x': X_test[:,0], 'y': y_pred[:,0]}) + df.sort_values(by='x',inplace = True) + points = pd.DataFrame(df).to_numpy() + + plt.plot(points[:, 0], points[:, 1],color="blue", linewidth=3) + plt.xlabel('Package') + plt.ylabel('Price') + plt.scatter(X,y, color="black") + plt.show() + ``` + +`pd.DataFrame`을 불러서 새로운 데이터프레임을 만듭니다. 그러면 `sort_values()`도 불러서 값을 정렬합니다. 마지막으로 polynomial plot을 만듭니다: + +![A polynomial plot showing package to price relationship](.././images/polynomial.png) + +데이터에 더 맞는 곡선을 볼 수 있습니다. + +모델의 정확도를 확인합시다: + + ```python + accuracy_score = pipeline.score(X_train,y_train) + print('Model Accuracy: ', accuracy_score) + ``` + + 그리고 짠! + + ```output + Model Accuracy: 0.8537946517073784 + ``` + +더 좋습니다! 가격을 예측해봅시다: + +### 예측하기 + +새로운 값을 넣고 예측할 수 있나요? + +`predict()`를 불러서 예측합니다: + + ```python + pipeline.predict( np.array([ [2.75] ]) ) + ``` + + 이렇게 예측됩니다: + + ```output + array([[46.34509342]]) + ``` + +주어진 plot에서, 의미가 있습니다! 그리고, 이전보다 모델이 더 좋아졌다면, 같은 데이터를 보고, 더 비싼 호박을 위한 예산이 필요합니다! + +🏆 좋습니다! 이 강의에서 두가지 regression 모델을 만들었습니다. regression의 마지막 섹션에서, 카테고리를 결정하기 위한 logistic regression에 대하여 배우게 됩니다. + +--- +## 🚀 도전 + +노트북에서 다른 변수를 테스트하면서 상관 관계가 모델 정확도에 어떻게 대응되는 지 봅니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/14/) + +## 검토 & 자기주도 학습 + +이 강의에서 Linear Regression에 대하여 배웠습니다. Regression의 다른 중요 타입이 있습니다. Stepwise, Ridge, Lasso 와 Elasticnet 기술에 대하여 읽어봅니다. 더 배우기 위해서 공부하기 좋은 코스는 [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)입니다. + +## 과제 + +[Build a Model](../assignment.md) \ No newline at end of file From ce35400ddb67b87f57a6c5828589d53197546ee2 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 11 Jul 2021 23:56:02 +0900 Subject: [PATCH 08/37] ADD : translate 1 --- 1-Introduction/README.ko.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 1-Introduction/README.ko.md diff --git a/1-Introduction/README.ko.md b/1-Introduction/README.ko.md new file mode 100644 index 0000000000..1bbdbb3861 --- /dev/null +++ b/1-Introduction/README.ko.md @@ -0,0 +1,23 @@ +# 머신러닝 소개하기 + +커리큘럼의 이 섹션에서, 머신러닝 필드의 기초가 될 기본 개념, 의미, 역사와 연구자가 이용하는 기술을 배울 예정입니다. 새로운 ML의 세계로 같이 모험을 떠납시다! + +![globe](images/globe.jpg) +> Photo by Bill Oxford on Unsplash + +### 강의 + +1. [머신러닝 소개하기](1-intro-to-ML/translations/README.ko.md) +1. [머신러닝과 AI의 역사](2-history-of-ML/translations/README.ko.md) +1. [공정성과 머신러닝](3-fairness/translations/README.ko.md) +1. [머신러닝의 기술](4-techniques-of-ML/translations/README.ko.md) + +### 크레딧 + +"Introduction to Machine Learning" was written with ♥️ by a team of folks including [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) and [Jen Looper](https://twitter.com/jenlooper) + +"The History of Machine Learning" was written with ♥️ by [Jen Looper](https://twitter.com/jenlooper) and [Amy Boyd](https://twitter.com/AmyKateNicho) + +"Fairness and Machine Learning" was written with ♥️ by [Tomomi Imura](https://twitter.com/girliemac) + +"Techniques of Machine Learning" was written with ♥️ by [Jen Looper](https://twitter.com/jenlooper) and [Chris Noring](https://twitter.com/softchris) \ No newline at end of file From 9d8056041288365a0ccfca37cd83fe6fc09b6160 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Mon, 12 Jul 2021 20:38:36 +0900 Subject: [PATCH 09/37] ADD : translate 2 --- 2-Regression/README.ko.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 2-Regression/README.ko.md diff --git a/2-Regression/README.ko.md b/2-Regression/README.ko.md new file mode 100644 index 0000000000..74012847dd --- /dev/null +++ b/2-Regression/README.ko.md @@ -0,0 +1,35 @@ +# 머신러닝을 위한 Regression 모델 + +## 지역 토픽: 북미의 호박 가격을 위한 Regression 모델 🎃 + +북미에서, Halloween을 위해서 호박을 소름돋게 무서운 얼굴로 조각하는 경우가 자주 있습니다. 매혹적인 채소에 대하여 찾아봅시다! + +![jack-o-lanterns](./images/jack-o-lanterns.jpg) +> Photo by Beth Teutschmann on Unsplash + +## 무엇을 배우나요 + +이 섹션의 강의는 머신러닝의 컨텍스트에서 regression 타입을 다루게 됩니다. Regression 모델은 변수 사이 _relationship_ 을 결정하도록 도울 수 있습니다. 모델의 타입은 길이, 온도, 또는 나이와 같은 값을 예측할 수 있으므로, 데이터 포인트를 분석하는 순간 변수 사이의 관계를 알 수 있습니다. + +이 강의의 시리즈에서, linear와 logistic regression 간의 다른 점을 찾을 수 있고, 둘 중 하나를 언제 사용해야 될 지 알 수 있습니다. + +이 강의의 그룹에서, 데이터 사이언티스트를 위한 일반적 환경의, 노트북을 관리할 Visual Studio code 구성을 포함해서, 머신러닝 작업을 시작하도록 맞춥니다. 머신러닝을 위한 라이브러리인, Scikit-learn을 찾고, 이 챕터의 Regression 모델에 초점을 맞추어, 첫 모델을 만들 예정입니다. + +> Regression 모델을 작업할 때 배울 수 있는 유용한 low-code 도구가 있습니다. [Azure ML for this task](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-15963-cxa)를 시도해보세요. + +### Lessons + +1. [무역의 도구](1-Tools/translations/README.ko.md) +2. [데이터 관리](2-Data/translations/README.ko.md) +3. [Linear와 polynomial regression](3-Linear/translations/README.ko.md) +4. [Logistic regression](4-Logistic/translations/README.ko.md) + +--- +### 크레딧 + +"ML with regression" was written with ♥️ by [Jen Looper](https://twitter.com/jenlooper) + +♥️ Quiz contributors include: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) and [Ornella Altunyan](https://twitter.com/ornelladotcom) + +호박 데이터셋은 [this project on Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices)에서 제안되었고 데이터는 United States Department of Agriculture에서 배포한 [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)에 기반합니다. 분포를 정규화하기 위하여 다양성을 기반으로 색상을 주변에 몇 포인트 더 했습니다. 데이터는 공개 도메인에 존재합니다. + From f68a74d4e1b2e01ebf10169b4c7a5d7d8428cad5 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Wed, 14 Jul 2021 22:04:47 +0900 Subject: [PATCH 10/37] ADD : translate 2-4 --- .../4-Logistic/translations/README.ko.md | 302 ++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 2-Regression/4-Logistic/translations/README.ko.md diff --git a/2-Regression/4-Logistic/translations/README.ko.md b/2-Regression/4-Logistic/translations/README.ko.md new file mode 100644 index 0000000000..bf52689cd8 --- /dev/null +++ b/2-Regression/4-Logistic/translations/README.ko.md @@ -0,0 +1,302 @@ +# 카테고리 예측하는 Logistic regression + +![Logistic vs. linear regression infographic](.././images/logistic-linear.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/15/) + +## 소개 + +기초 _classic_ ML 기술의 하나인, Regression에 대한 마지막 강의에서, Logistic Regression를 보겠습니다. 기술을 사용하면 binary categories를 예측하는 패턴을 찾습니다. 사탕 초콜릿인가요? 질병이 전염되나요? 고객이 제품을 선택하나요? + +이 강의에서, 다음을 배웁니다: + +- 데이터 시각화를 위한 새로운 라이브러리 +- logistic regression 기술 + +✅ [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-15963-cxa)애서 regression의 타입에 대하여 깊게 이해해봅니다. + +## 필요 조건 + +호박 데이터로 작업했고, 지금부터 작업할 수 있는 하나의 binary category: `Color`가 있다는 것을 알기에 충분히 익숙해졌습니다. + +logistic regression 모델을 만들어서 몇가지 변수가 주어졌을 때, _호박의 (오렌지 🎃 또는 화이트 👻)색을 예측해봅니다_. + +> regression에 대하여 강의를 그룹으로 묶어서 binary classification에 관련된 대화를 하는 이유는 뭘까요? logistic regression은 linear-기반이지만, [really a classification method](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression)이므로, 단지 언어적으로 편리해서 가능합니다. 다음 강의 그룹에서 데이터를 분류하는 다른 방식에 대하여 배워봅니다. + +## 질문 정의하기 + +목적을 위하여, 바이너리로 표현합니다: 'Orange' 또는 'Not Orange'. 데이터셋에 'striped' 카테고리도 있지만 인스턴스가 약간 있으므로, 사용하지 않을 예정입니다. 데이터셋에서 null 값을 지우면 없어질겁니다. + +> 🎃 재미있는 사실은, 하얀 호박을 'ghost' 호박으로 부르고 있습니다. 조각내기 쉽지 않기 때문에, 오랜지만큼 인기가 없지만 멋집니다! + +## logistic regression 대하여 + +Logistic regression는 일부 중요한 점에서, 이전에 배운, linear regression과 차이가 있습니다. + +### Binary classification + +Logistic regression은 linear regression와 동일한 features를 제공하지 않습니다. 이전은 binary category ("orange or not orange")에 대한 예측을 해주는 데에 비해 후자를 예시로 들어보면, 호박의 태생과 수확 시기에 따라 _가격이 얼마나 오르는 지_ 연속 값을 예측할 수 있습니다. + +![Pumpkin classification Model](.././images/pumpkin-classifier.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### 다른 classifications + +다항 분포와 순서수를 포함한, 다른 타입의 logistic regression이 있습니다: + +- **다항분포**, 하나보다 더 많은 카테고리를 포함합니다. - "Orange, White, and Striped". +- **순서수**, 정렬된 카테고리가 포함되며, 유한한 숫자 크기 (mini,sm,med,lg,xl,xxl)로 정렬된 호박과 같이, 결과를 논리적으로 정렬하고 싶을 때 유용합니다. + +![Multinomial vs ordinal regression](.././images/multinomial-ordinal.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### 여전한 linear + +Regression의 타입은 모두 'category predictions'이지만, 종속 변수 (color)와 다른 독립 변수 (the rest of the dataset, like city name and size) 사이 깔끔한 linear relationship이 있을 때 잘 작동합니다. 변수를 나눌 선형성이 있는 지에 대한 아이디어를 찾는 게 좋습니다. + +### 변수에 상관 관계가 없습니다 + +linear regression이 많은 상관 변수에서 어떻게 작동하는지 기억나시나요? Logistic regression은 - 변수를 정렬할 필요가 없는 반대 입장입니다. 조금 약한 correlations로 데이터가 작용합니다. + +### 깔끔한 데이터가 많이 필요합니다 + +Logistic regression은 많은 데이터로 정확한 결과를 줍니다; 작은 데이터셋은 최적화된 작업이 아니므로, 유념합시다. + +✅ logistic regression에 적당한 데이터의 타입에 대해 생각합니다. + +## 연습 - tidy the data + +먼저, 데이터를 조금 정리하면서, null 값을 드랍하고 일부 열만 선택합니다: + +1. 다음 코드를 추가합니다: + + ```python + from sklearn.preprocessing import LabelEncoder + + new_columns = ['Color','Origin','Item Size','Variety','City Name','Package'] + + new_pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1) + + new_pumpkins.dropna(inplace=True) + + new_pumpkins = new_pumpkins.apply(LabelEncoder().fit_transform) + ``` + + 항상 새로운 데이터프레임을 살짝 볼 수 있습니다: + + ```python + new_pumpkins.info + ``` + +### 시각화 - side-by-side 그리드 + +호박 데이터가 있는 [starter notebook](.././notebook.ipynb)을 다시 불러오고 `Color` 포함한, 몇 변수를 데이터셋에 컨테이너화하려고 정리했습니다. 다른 라이브러리를 사용해서 노트북에서 데이터프레임을 시각화해봅니다: [Seaborn](https://seaborn.pydata.org/index.html)은, 이전에 썻던 Matplotlib을 기반으로 만들어졌습니다. + +Seaborn은 데이터를 시각화하는 깔끔한 방식들을 제공합니다. 예시로, side-by-side 그리드의 각 포인트에 대한 데이터의 분포를 비교할 수 있습니다. + +1. 호박 데이터 `new_pumpkins`를 사용해서, `PairGrid`를 인스턴스화하고, `map()`을 불러서 그리드를 만듭니다: + + ```python + import seaborn as sns + + g = sns.PairGrid(new_pumpkins) + g.map(sns.scatterplot) + ``` + + ![A grid of visualized data](../images/grid.png) + + 데이터를 side-by-side로 지켜보면, 다른 열과 어떻게 관계가 이루어지는 지 볼 수 있습니다. + + ✅ scatterplot 그리드가 주어지면, 흥미있는 탐구를 구상할 수 있나요? + +### swarm plot 사용하기 + +색상은 binary category (Orange or Not)이므로, 'categorical data'라고 부르고 '시각화에는 더 [specialized approach](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar)'가 필요합니다. 카테고리와 다른 변수 관계를 시각화하는 다른 방식도 있습니다. + +Seaborn plots을 side-by-side로 변수를 시각화할 수 있습니다. + +1. 값의 분포를 보여주기 위해서 'swarm' plot을 시도합니다: + + ```python + sns.swarmplot(x="Color", y="Item Size", data=new_pumpkins) + ``` + + ![A swarm of visualized data](../images/swarm.png) + +### Violin plot + +'violin' 타입 plot은 두개 카테고리의 데이터 배포하는 방식을 쉽게 시각화할 수 있어서 유용합니다. Violin plots은 분포가 더 'smoothly'하게 출력하기 때문에 더 작은 데이터셋에서 작동하지 않습니다. + +1. 파라미터 `x=Color`, `kind="violin"` 와 `catplot()`을 호출합니다: + + ```python + sns.catplot(x="Color", y="Item Size", + kind="violin", data=new_pumpkins) + ``` + + ![a violin type chart](../images/violin.png) + + ✅ 다른 변수를 사용해서, plot과 다른 Seaborn plots을 만들어봅니다. + +이제부터 색상의 binary categories와 큰 사이즈의 그룹 사이 관계에 대한 아이디어를 낼 수 있으므로, 주어진 호박의 가능한 색상을 결정하기 위해서 logistic regression를 찾아봅니다. + +> **🧮 Show Me The Math** +> +> linear regression이 값에 도달하기 위해서 자주 ordinary least squares을 사용하는 방식이 생각날까요? Logistic regression은 [sigmoid functions](https://wikipedia.org/wiki/Sigmoid_function)으로 'maximum likelihood' 컨셉에 의존합니다. plot의 'Sigmoid Function'은 'S' 모양으로 보이기도 합니다. 값을 가져와서 0과 1 사이 맵핑합니다. 이 곡선을 'logistic curve'라고 부릅니다. 공식은 이와 같습니다: +> +> ![logistic function](../images/sigmoid.png) +> +> 시그모이드의 중간 지점은 x의 0 포인트에서 자기자신이며, L은 곡선의 최대 값, 그리고 k는 곡선의 기울기입니다. 만약 함수의 결과가 0.5보다 크면, 질문 레이블에서 binary choice의 클래스 '1'이 할당됩니다. 만약 아니면, '0'으로 분류됩니다. + +## 모델 만들기 + +binary classification을 찾는 모델을 만드는 건 Scikit-learn에서 놀랍도록 간단합니다. + +1. classification 모델을 사용하고 싶은 변수를 선택하고 `train_test_split()`을 불러서 훈련과 테스트할 셋으로 나눕니다: + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Origin','Item Size','Variety','City Name','Package'] + + X = new_pumpkins[Selected_features] + y = new_pumpkins['Color'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + ``` + +1. 이제부터 훈련된 데이터로 `fit()`을 불러서, 모델을 훈련하고, 결과를 출력할 수 있습니다: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + + 모델의 스코어보드를 봅니다. 데이터의 100개 행만 있다는 것을 고려하면, 나쁘지 않습니다 + + ```output + precision recall f1-score support + + 0 0.85 0.95 0.90 166 + 1 0.38 0.15 0.22 33 + + accuracy 0.82 199 + macro avg 0.62 0.55 0.56 199 + weighted avg 0.77 0.82 0.78 199 + + Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 1 0 0 1 0 0 0 1 0] + ``` + +## confusion matrix으로 더 좋게 이해하기 + +이 아이템을 출력해서 스코어보드 리포트 [terms](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report)를 얻을 수 있지만, 모델의 성능을 이해하는 순간 도와주는 [confusion matrix](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix)를 사용하여 모델을 쉽게 이해할 수 있게 됩니다. + +> 🎓 '[confusion matrix](https://wikipedia.org/wiki/Confusion_matrix)' (또는 'error matrix')는 모델의 true 대 false 로 긍정 및 부정을 나타내서, 예측의 정확도를 측정하는 테이블입니다. + +1. `confusin_matrix()` 불러서, confusion metrics를 사용합니다: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + 모델의 confusion matrix를 봅니다: + + ```output + array([[162, 4], + [ 33, 0]]) + ``` + +어떤 일이 생기나요? 모델이 2개의 binary categories 인, 'pumpkin' 카테고리와 'not-a-pumpkin' 카테고리 사이에 아이템을 분류하도록 질문받았다고 가정합니다. + +- 만약 모델이 무언가를 호박으로 예측하고 실제로 'pumpkin' 카테고리에 있다면 true positive라고 부르며, 좌측 상단의 숫자로 보여집니다. +- 만약 모델이 무언가를 호박으로 예측하지 않았는데 실제 'pumpkin' 카테고리에 있다면 false positive라고 부르며, 우측 상단의 숫자로 보여집니다. +- 만약 모델이 무언가를 호박으로 예측하지만 실제로 'not-a-pumpkin' 카테고리에 있다면 false negative라고 부르며, 좌측 하단의 숫자로 보여집니다. +- 만약 모델이 무언가를 호박으로 예측하지 않았고 'not-a-pumpkin' 카테고리에 있다면 true negative라고 부르며, 우측 하단의 숫자로 보여집니다. + +![Confusion Matrix](../images/confusion-matrix.png) + +> Infographic by [Jen Looper](https://twitter.com/jenlooper) + +예상한 것처럼 true positives와 true negatives는 큰 숫자를 가지고 false positives와 false negatives은 낮은 숫자을 가지는 게 더 좋습니다, 모델의 성능이 더 좋다는 것을 의미합니다. + +✅ Q: confusion matrix에 따르면, 모델은 어떻게 되나요? A: 나쁘지 않습니다; true positives의 많은 숫자뿐만 아니라 몇 false negatives도 있습니다. + +confusion matrix TP/TN 과 FP/FN의 맵핑으로 미리 본 용어에 대하여 다시 봅니다: + +🎓 정밀도: TP/(TP + FN) 검색된 인스턴스 중 관련된 인스턴스의 비율 (예시. 잘 라벨링된 라벨) + +🎓 재현율: TP/(TP + FP) 라벨링이 잘 되었는 지 상관없이, 검색한 관련된 인스턴스의 비율 + +🎓 f1-score: (2 * precision * recall)/(precision + recall) 정밀도와 재현율의 가중치 평균은, 최고 1과 최저 0 + +🎓 Support: 검색된 각 라벨의 발생 수 + +🎓 정확도: (TP + TN)/(TP + TN + FP + FN) 샘플에서 정확한 예측이 이루어진 라벨의 백분율 + +🎓 Macro Avg: 라벨 불균형을 고려하지 않고, 각 라벨의 가중치가 없는 평균 지표를 계산합니다. + +🎓 Weighted Avg: (각 라벨의 true 인스턴스 수) 지원에 따라 가중치를 할당해서 라벨 불균형을 고려해보고, 각 라벨의 평균 지표를 계산합니다. + +✅ 만약 모델이 false negatives의 숫자를 줄어들게 하려면 어떤 지표를 봐야할 지 생각할 수 있나요? + +## 모델의 ROC 곡선 시각화 + +나쁜 모델은 아닙니다; 정확도가 80% 범위라서 이상적으로 주어진 변수의 셋에서 호박의 색을 예측할 때 사용할 수 있습니다. + +'ROC' 스코어라는 것을 보려면 더 시각화해봅니다: + +```python +from sklearn.metrics import roc_curve, roc_auc_score + +y_scores = model.predict_proba(X_test) +# calculate ROC curve +fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) +sns.lineplot([0, 1], [0, 1]) +sns.lineplot(fpr, tpr) +``` + +Seaborn을 다시 사용해서, 모델의 [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) 또는 ROC를 plot합니다. ROC 곡선은 classifier의 아웃풋을 true 대 false positives 관점에서 보려고 수시로 사용됩니다. "ROC curves typically feature true positive rate on the Y axis, and false positive rate on the X axis." 따라서, 곡선의 경사도와 중간 포인트 라인과 곡선 사이 공간이 중요합니다; 라인 위로 빠르게 지나는 곡선을 원합니다. 이 케이스에서, 시작해야 할 false positives가 있고, 라인이 적당하게 계속 이어집니다: + +![ROC](.././images/ROC.png) + +마지막으로, Scikit-learn의 [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score)를 사용해서 실제 'Area Under the Curve' (AUC)를 계산합니다: + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +결과는 `0.6976998904709748`입니다. AUC 범위가 0부터 1까지 주어지면, 100% 예측하는 정확한 모델의 AUC가 1이므로, 큰 스코어를 원하게 됩니다. 이 케이스는, 모델이 _의외로 좋습니다_. + +classifications에 대한 이후 강의에서, 모델의 스코어를 개선하기 위하여 반복하는 방식을 배울 예정입니다. 하지만 지금은, 축하합니다! regression 강의를 완료했습니다! + +--- +## 🚀 도전 + +logistic regression과 관련해서 풀어야할 내용이 더 있습니다! 하지만 배우기 좋은 방식은 실험입니다. 이런 분석에 적당한 데이터셋을 찾아서 모델을 만듭니다. 무엇을 배우나요? 팁: 흥미로운 데이터셋으로 [Kaggle](https://kaggle.com)에서 시도해보세요. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/16/) + +## 검토 & 자기주도 학습 + +logistic regression을 사용하는 약간의 실용적 사용에 대한 [this paper from Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf)의 처음 몇 페이지를 읽어봅니다. 연구했던 regression 작업 중에서 하나 또는 그 외 타입에 적당한 작업을 생각해봅니다. 어떤게 더 잘 작동하나요? + +## 과제 + +[Retrying this regression](../assignment.md) From 30d7697c52fc95516660f5c96b1fed532c443dd5 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Wed, 14 Jul 2021 22:05:55 +0900 Subject: [PATCH 11/37] ADD : translate 3 --- 3-Web-App/README.ko.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 3-Web-App/README.ko.md diff --git a/3-Web-App/README.ko.md b/3-Web-App/README.ko.md new file mode 100644 index 0000000000..ab069d3925 --- /dev/null +++ b/3-Web-App/README.ko.md @@ -0,0 +1,22 @@ +# ML 모델을 사용하여 web app 만들기 + +커리큘럼의 이 섹션에서, ML이 적용된 주제를 소개할 예정입니다: Scikit-learn 모델을 웹 애플리케이션에서 예측할 때 사용할 수 있는 파일로 저장해봅니다. 모델을 저장하고, Flask에 있는 웹 앱에서 어덯게 사용하는 지도 배웁니다. 먼저 UFO 목격 제보에 관련된 일부 데이터로 모델을 만듭니다! 그러면, 위도와 경도 값으로 몇 초 입력해서 UFO가 보고된 나라를 예측할 수 있는 웹 앱을 만들게 됩니다. + +![UFO Parking](images/ufo.jpg) + +Photo by Michael Herren on Unsplash + + +## 강의 + +1. [Build a Web App](1-Web-App/translations/README.ko.md) + +## 크레딧 + +"Build a Web App" was written with ♥️ by [Jen Looper](https://twitter.com/jenlooper). + +♥️ The quizzes were written by Rohan Raj. + +데이터셋은 [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings)에서 가져왔습니다. + +웹 앱 구조는 [this article](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4)과 Abhinav Sagar의 [this repo](https://github.com/abhinavsagar/machine-learning-deployment)에서 부분적으로 제안되었습니다. \ No newline at end of file From 01b279942e4f397ff321b6cbc6a5cc47e170dfb2 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Fri, 16 Jul 2021 22:59:49 +0900 Subject: [PATCH 12/37] ADD : translate 3-1 --- 3-Web-App/1-Web-App/translations/README.ko.md | 348 ++++++++++++++++++ 1 file changed, 348 insertions(+) create mode 100644 3-Web-App/1-Web-App/translations/README.ko.md diff --git a/3-Web-App/1-Web-App/translations/README.ko.md b/3-Web-App/1-Web-App/translations/README.ko.md new file mode 100644 index 0000000000..b0572a2570 --- /dev/null +++ b/3-Web-App/1-Web-App/translations/README.ko.md @@ -0,0 +1,348 @@ +# ML 모델 사용하여 Web App 만들기 + +이 강의에서, 이 세상에 없었던 데이터셋에 대하여 ML 모델을 훈련할 예정입니다: _UFO sightings over the past century_, sourced from [NUFORC's database](https://www.nuforc.org). + +다음을 배우게 됩니다: + +- 훈련된 모델을 'pickle'하는 방식 +- Flask 앱에서 모델을 사용하는 방식 + +계속 노트북으로 데이터를 정리하고 모델을 훈련하지만, 웹 앱에서 'in the wild' 모델을 사용하면 단계를 넘어서 발전할 수 있습니다. + +이러면, Flask로 웹 앱을 만들어야 합니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/17/) + +## 앱 만들기 + +머신러닝 모델로 웹 앱을 만드는 여러 방식이 존재합니다. 웹 구조는 모델을 훈련하는 방식에 영향을 줄 수 있습니다. 데이터 사이언스 그룹이 앱에서 사용하고 싶은 훈련된 모델을 가지고 비지니스에서 일한다고 상상해봅니다. + +### 고려할 사항 + +많은 질문들을 물어볼 필요가 있습니다: + +- **웹 앱 혹은 모바일 앱인가요?** 만약 모바일 앱을 만들거나 IoT 컨텍스트에서 모델을 사용해야 되는 경우, [TensorFlow Lite](https://www.tensorflow.org/lite/)로 Android 또는 iOS 앱에서 모델을 사용할 수 있습니다. +- **모델은 어디에 있나요**? 클라우드 또는 로컬 중 어디인가요? +- **오프라인 지원**. 앱이 오프라인으로 동작하나요? +- **모델을 훈련시킬 때 사용하는 기술은 무엇인가요?** 선택된 기술은 사용할 도구에 영향을 줄 수 있습니다. + - **Tensor flow 사용**. 만약 TensorFlow로 모델을 훈련한다면, 예시로, 에코 시스템은 [TensorFlow.js](https://www.tensorflow.org/js/)로 웹 앱에서 사용할 TensorFlow 모델을 변환해주는 기능을 제공합니다. + - **PyTorch 사용**. 만약 [PyTorch](https://pytorch.org/) 같은 라이브러리로 모델을 만들면, [Onnx Runtime](https://www.onnxruntime.ai/)으로 할 수 있는 JavaScript 웹 앱에서 사용하기 위한 [ONNX](https://onnx.ai/) (Open Neural Network Exchange) 포맷으로 내보낼 옵션이 존재합니다. 이 옵션은 Scikit-learn-trained 모델로 이후 강의에서 알아볼 예정입니다. + - **Lobe.ai 또는 Azure Custom vision 사용**. 만약 [Lobe.ai](https://lobe.ai/) 또는 [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-15963-cxa) 같은 ML SaaS (Software as a Service) 시스템으로 모델을 훈련하게 된다면, 이 소프트웨어 타입은 온라인 애플리케이션이 클라우드에서 쿼리된 bespoke API를 만드는 것도 포함해서 많은 플랫폼의 모델들을 내보낼 방식을 제공합니다. + +또 웹 브라우저에서 모델로만 훈련할 수 있는 모든 Flask 웹 앱을 만들 수 있습니다. JavaScript 컨텍스트에서 TensorFlow.js로 마무리 지을 수 있습니다. + +목적을 위해서, Python-기반의 노트북으로 작성했기 때문에, 노트북에서 훈련된 모델을 Python-제작한 웹 앱에서 읽을 수 있는 포맷으로 내보낼 때 필요한 단계를 알아봅니다. + +## 도구 + +작업에서, 2가지 도구가 필요합니다: Flask 와 Pickle은, 둘 다 Python에서 작동합니다. + +✅ [Flask](https://palletsprojects.com/p/flask/)는 무엇일까요? 작성자가 'micro-framework'로 정의한, Flask는 Python으로 웹 프레임워크의 기본적인 기능과 웹 페이지를 만드는 템플릿 엔진을 제공합니다. [this Learn module](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-15963-cxa)을 보고 Flask로 만드는 것을 연습합니다. + +✅ [Pickle](https://docs.python.org/3/library/pickle.html)은 무엇일까요? Pickle 🥒은 Python 객체 구조를 serializes와 de-serializes하는 Python 모듈입니다. 모델을 'pickle'하게 되면, 웹에서 쓰기 위해서 serialize 또는 flatten합니다. 주의합시다: pickle은 원래 안전하지 않아서, 파일을 'un-pickle'한다고 나오면 조심합니다. pickled 파일은 접미사 `.pkl`로 있습니다. + +## 연습 - 데이터 정리하기 + +[NUFORC](https://nuforc.org) (The National UFO Reporting Center)에서 모아둔, 80,000 UFO 목격 데이터를 이 강의에서 사용합니다. 데이터에 UFO 목격 관련한 몇 흥미로운 설명이 있습니다, 예시로 들어봅니다: + +- **긴 예시 설명**. "A man emerges from a beam of light that shines on a grassy field at night and he runs towards the Texas Instruments parking lot". +- **짧은 예시 설명**. "the lights chased us". + +[ufos.csv](./data/ufos.csv) 스프레드시트에는 목격된 `city`, `state` 와 `country`, 오브젝트의 `shape` 와 `latitude` 및 `longitude` 열이 포함되어 있습니다. + +강의에 있는 빈 [notebook](../notebook.ipynb)에서 진행합니다: + +1. 이전 강의에서 했던 것처럼 `pandas`, `matplotlib`, 와 `numpy`를 import하고 ufos 스프레드시트도 import합니다. 샘플 데이터셋을 볼 수 있습니다: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('../data/ufos.csv') + ufos.head() + ``` + +1. ufos 데이터를 새로운 제목의 작은 데이터프레임으로 변환합니다. `Country` 필드가 유니크 값인지 확인합니다. + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. 지금부터, 모든 null 값을 드랍하고 1-60초 사이 목격만 가져와서 처리할 데이터의 수량을 줄일 수 있습니다: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Scikit-learn의 `LabelEncoder` 라이브러리를 Import해서 국가의 텍스트 값을 숫자로 변환합니다: + + ✅ LabelEncoder는 데이터를 알파벳 순서로 인코드합니다. + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + 데이터는 이렇게 보일 것입니다: + + ```output + Seconds Country Latitude Longitude + 2 20.0 3 53.200000 -2.916667 + 3 20.0 4 28.978333 -96.645833 + 14 30.0 4 35.823889 -80.253611 + 23 60.0 4 45.582778 -122.352222 + 24 3.0 3 51.783333 -0.783333 + ``` + +## 연습 - 모델 만들기 + +지금부터 데이터를 훈련하고 테스트할 그룹으로 나누어서 모델을 훈련할 준비가 되었습니다. + +1. X 백터로 훈련할 3가지 features를 선택하면, y 백터는 `Country`로 됩니다. `Seconds`, `Latitude` 와 `Longitude`를 입력하면 국가 id로 반환되기를 원합니다. + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Seconds','Latitude','Longitude'] + + X = ufos[Selected_features] + y = ufos['Country'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + ``` + +1. logistic regression을 사용해서 모델을 훈련합니다: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +당연하게, `Country` 와 `Latitude/Longitude`가 상관 관계있어서, 정확도 **(around 95%)** 가 나쁘지 않습니다. + +만든 모델은 `Latitude` 와 `Longitude`에서 `Country`를 알 수 있어야 하므로 매우 혁신적이지 않지만, 정리하면서, 뽑은 원본 데이터에서 훈련을 해보고 웹 앱에서 모델을 쓰기에 좋은 연습입니다. + +## 연습 - 모델 'pickle'하기 + +모델을 _pickle_ 할 시간이 되었습니다! 코드 몇 줄로 할 수 있습니다. _pickled_ 되면, pickled 모델을 불러와서 초, 위도와 경도 값이 포함된 샘플 데이터 배열을 대상으로 테스트합니다. + +```python +import pickle +model_filename = 'ufo-model.pkl' +pickle.dump(model, open(model_filename,'wb')) + +model = pickle.load(open('ufo-model.pkl','rb')) +print(model.predict([[50,44,-12]])) +``` + +모델은 영국 국가 코드인, **'3'** 이 반환됩니다. Wild! 👽 + +## 연습 - Flask 앱 만들기 + +지금부터 Flask 앱을 만들어서 모델을 부르고 비슷한 결과를 반환하지만, 시각적으로 만족할 방식으로도 가능합니다. + +1. _ufo-model.pkl_ 파일과 _notebook.ipynb_ 파일 옆에 **web-app** 이라고 불리는 폴더를 만들면서 시작합니다. + +1. 폴더에서 3가지 폴더를 만듭니다: **static**, 내부에 **css** 폴더가 있으며, **templates`** 도 있습니다. 지금부터 다음 파일과 디렉토리들이 있어야 합니다: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pk1 + ``` + + ✅ 완성된 앱을 보려면 solution 폴더를 참조합니다 + +1. _web-app_ 폴더에서 만들 첫 파일은 **requirements.txt** 파일입니다. JavaScript 앱의 _package.json_ 처럼, 앱에 필요한 의존성을 리스트한 파일입니다. **requirements.txt** 에 해당 라인을 추가합니다: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. 지금부터, _web-app_ 으로 이동해서 파일을 실행합니다: + + ```bash + cd web-app + ``` + +1. 터미널에서 `pip install`을 타이핑해서, _reuirements.txt_ 에 나열된 라이브러리를 설치합니다: + + ```bash + pip install -r requirements.txt + ``` + +1. 지금부터, 앱을 완성하기 위해서 3가지 파일을 더 만들 준비를 했습니다: + + 1. 최상단에 **app.py**를 만듭니다. + 2. _templates_ 디렉토리에 **index.html**을 만듭니다. + 3. _static/css_ 디렉토리에 **styles.css**를 만듭니다. + +1. 몇 스타일로 _styles.css_ 파일을 만듭니다: + + ```css + body { + width: 100%; + height: 100%; + font-family: 'Helvetica'; + background: black; + color: #fff; + text-align: center; + letter-spacing: 1.4px; + font-size: 30px; + } + + input { + min-width: 150px; + } + + .grid { + width: 300px; + border: 1px solid #2d2d2d; + display: grid; + justify-content: center; + margin: 20px auto; + } + + .box { + color: #fff; + background: #2d2d2d; + padding: 12px; + display: inline-block; + } + ``` + +1. 다음으로 _index.html_ 파일을 만듭니다: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
+ +
+ +

According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?

+ +
+ + + + +
+ + +

{{ prediction_text }}

+ +
+
+ + + + ``` + + 파일의 템플릿을 봅니다. 예측 텍스트: `{{}}`처럼, 앱에서 제공할 수 있는 변수 주위, 'mustache' 구문을 확인해봅니다. `/predict` 라우터에 예측을 보낼 폼도 있습니다. + + 마지막으로, 모델을 써서 예측으로 보여줄 python 파일을 만들 준비가 되었습니다: + +1. `app.py` 에 추가합니다: + + ```python + import numpy as np + from flask import Flask, request, render_template + import pickle + + app = Flask(__name__) + + model = pickle.load(open("../ufo-model.pkl", "rb")) + + + @app.route("/") + def home(): + return render_template("index.html") + + + @app.route("/predict", methods=["POST"]) + def predict(): + + int_features = [int(x) for x in request.form.values()] + final_features = [np.array(int_features)] + prediction = model.predict(final_features) + + output = prediction[0] + + countries = ["Australia", "Canada", "Germany", "UK", "US"] + + return render_template( + "index.html", prediction_text="Likely country: {}".format(countries[output]) + ) + + + if __name__ == "__main__": + app.run(debug=True) + ``` + + > 💡 팁: [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode)를 추가하면 Flask 사용해서 웹 앱을 실행하는 도중에, 서버를 다시 시작할 필요없이 애플리케이션에 변경점이 바로 반영됩니다. 조심하세요! 프로덕션 앱에서 이 모드를 활성화하지 맙시다. + +만약 `python app.py` 또는 `python3 app.py`를 실행하면 - 웹 서버가 로컬에서 시작하고, 짧은 폼을 작성하면 UFOs가 목격된 장소에 대해 주목받을 질문의 답을 얻을 수 있습니다! + +하기 전, `app.py`의 일부분을 봅니다: + +1. 먼저, 의존성을 불러오고 앱이 시작합니다. +1. 그 다음, 모델을 가져옵니다. +1. 그 다음, index.html을 홈 라우터에 랜더링합니다. + +`/predict` 라우터에서, 폼이 보내질 때 몇가지 해프닝이 생깁니다: + +1. 폼 변수를 모아서 numpy 배열로 변환합니다. 그러면 모델로 보내지고 예측이 반환됩니다. +2. 국가를 보여줄 때는 예상된 국가 코드에서 읽을 수 있는 텍스트로 다시 랜더링하고, 이 값을 템플릿에서 랜더링할 수 있게 index.html로 보냅니다. + +Flask와 pickled 모델과 같이, 모델을 사용하는 이 방식은, 비교적으로 간단합니다. 어려운 것은 예측을 받기 위해서 모델에 줄 데이터의 모양을 이해해야 한다는 것입니다. 모든 모델이 어떻게 훈련받았는 지에 따릅니다. 예측을 받기 위해서 3개 데이터 포인트를 넣어야 합니다. + +전문 세팅에서, 모델을 훈련하는 사람과 웹 또는 모바일 앱에서 사용하는 사람 사이 얼마나 좋은 소통이 필요한 지 알 수 있습니다. 이 케이스는, 오직 한 사람, 당신입니다! + +--- + +## 🚀 도전: + +노트북에서 작성하고 Flask 앱에서 모델을 가져오는 대신, Flask 앱에서 바로 모델을 훈련할 수 있습니다! 어쩌면 데이터를 정리하고, 노트북에서 Python 코드로 변환해서, `train`이라고 불리는 라우터로 앱에서 모델을 훈련합니다. 이러한 방식을 추구했을 때 장점과 단점은 무엇인가요? + + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/18/) + +## 검토 & 자기주도 학습 + +ML 모델로 웹 앱을 만드는 방식은 많습니다. JavaScript 또는 Python으로 머신러닝을 활용하는 웹 앱의 제작 방식에 대한 목록을 만듭니다. 구조를 고려합니다: 모델이 앱이나 클라우드에 있나요? 만약 후자의 경우, 어떻게 접근하나요? 적용한 ML 웹 솔루션에 대해 아키텍쳐 모델을 그립니다. + +## 과제 + +[Try a different model](../assignment.md) + + From c9321ea19ae6b53607bc8684d9e386580700116d Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 17 Jul 2021 18:07:14 +0900 Subject: [PATCH 13/37] ADD : translate 4 --- 3-Web-App/1-Web-App/translations/README.ko.md | 2 +- 3-Web-App/README.ko.md | 2 +- 4-Classification/README.ko.md | 27 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 4-Classification/README.ko.md diff --git a/3-Web-App/1-Web-App/translations/README.ko.md b/3-Web-App/1-Web-App/translations/README.ko.md index b0572a2570..1f96443fa0 100644 --- a/3-Web-App/1-Web-App/translations/README.ko.md +++ b/3-Web-App/1-Web-App/translations/README.ko.md @@ -48,7 +48,7 @@ - **긴 예시 설명**. "A man emerges from a beam of light that shines on a grassy field at night and he runs towards the Texas Instruments parking lot". - **짧은 예시 설명**. "the lights chased us". -[ufos.csv](./data/ufos.csv) 스프레드시트에는 목격된 `city`, `state` 와 `country`, 오브젝트의 `shape` 와 `latitude` 및 `longitude` 열이 포함되어 있습니다. +[ufos.csv](.././data/ufos.csv) 스프레드시트에는 목격된 `city`, `state` 와 `country`, 오브젝트의 `shape` 와 `latitude` 및 `longitude` 열이 포함되어 있습니다. 강의에 있는 빈 [notebook](../notebook.ipynb)에서 진행합니다: diff --git a/3-Web-App/README.ko.md b/3-Web-App/README.ko.md index ab069d3925..2d52ab4313 100644 --- a/3-Web-App/README.ko.md +++ b/3-Web-App/README.ko.md @@ -9,7 +9,7 @@ Photo by Lisheng Chang on Unsplash + +## 무엇을 배우나요 + +이 섹션에서, 데이터를 배우며 도음이 될 다른 classifiers을 배우기 위해서 이 커리큘럼 첫 파트에서 배운 regression의 모든 내용을 바탕으로 진행합니다. + +> There are useful low-code tools that can help you learn about working with classification models. Try [Azure ML for this task](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-15963-cxa) + +## 강의 + +1. [classification 소개하기](1-Introduction/translations/README.ko.md) +2. [더 많은 classifiers](2-Classifiers-1/translations/README.ko.md) +3. [또 다른 classifiers](3-Classifiers-2/translations/README.ko.md) +4. [응용: web app 만들기](4-Applied/translations/README.ko.md) + +## 크레딧 + +"Getting started with classification" was written with ♥️ by [Cassie Breviu](https://www.twitter.com/cassieview) and [Jen Looper](https://www.twitter.com/jenlooper) + +맛있는 요리 데이터셋은 [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines)에서 가져왔습니다. \ No newline at end of file From 1655fc12d1bad108daad586a6561309eda1beed8 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 18 Jul 2021 11:59:37 +0900 Subject: [PATCH 14/37] ADD : translate 4-1 --- .../1-Introduction/translations/README.ko.md | 292 ++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 4-Classification/1-Introduction/translations/README.ko.md diff --git a/4-Classification/1-Introduction/translations/README.ko.md b/4-Classification/1-Introduction/translations/README.ko.md new file mode 100644 index 0000000000..7b8dd68397 --- /dev/null +++ b/4-Classification/1-Introduction/translations/README.ko.md @@ -0,0 +1,292 @@ +# classification 소개하기 + +4개 강의에서, classic 머신러닝의 기본 초점인 - _classification_ 을 찾아 볼 예정입니다. 아시아와 인도의 모든 훌륭한 요리 데이터셋과 함께 다양한 classification 알고리즘을 사용할 예정입니다. 배고파보세요! + +![just a pinch!](../images/pinch.png) + +> Celebrate pan-Asian cuisines in these lessons! Image by [Jen Looper](https://twitter.com/jenlooper) + +Classification은 regression 기술과 공통점이 많은 [supervised learning](https://wikipedia.org/wiki/Supervised_learning)의 폼입니다. 만약 머신러닝이 데이터셋으로 사물의 값이나 이름을 예측한다면, 일반적으로 classification는 2가지 그룹으로 나누어집니다: _binary classification_ 과 _multiclass classification_. + +[![Introduction to classification](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduction to classification") + +> 🎥 이미지를 누르면 영상 시청: MIT's John Guttag introduces classification + +생각합니다: + +- **Linear regression** 변수 사이 관계를 예측하고 새로운 데이터 포인트로 라인과 엮인 위치에 대한 정확한 예측을 하도록 도움을 줍니다. 예시로, _what price a pumpkin would be in September vs. December_ 를 예측할 수 있습니다. +- **Logistic regression** "binary categories"를 찾을 때 도와줄 수 있습니다: at this price point, _is this pumpkin orange or not-orange_? + +Classification은 다양한 알고리즘으로 데이터 포인트의 라벨 혹은 클래스를 결정할 다른 방식을 고릅니다. 요리 데이터로, 재료 그룹을 찾아서, 전통 요리로 결정할 수 있는지 알아보려 합니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/19/) + +### 소개 + +Classification은 머신러닝 연구원과 데이터 사이언티스트의 기본 활동의 하나입니다. 바이너리 값("is this email spam or not?")의 기본 classification부터, 컴퓨터 비전으로 복잡한 이미지 classification과 segmentation까지, 데이터를 클래스로 정렬하고 물어보는 것은 항상 유용합니다. + +보다 과학적인 방식으로 프로세스를 설명해보자면, classification 방식은 입력한 변수 사이 관계를 출력 변수에 맵핑할 수 있는 예측 모델을 만듭니다. + +![binary vs. multiclass classification](../images/binary-multiclass.png) + +> Binary vs. multiclass problems for classification algorithms to handle. Infographic by [Jen Looper](https://twitter.com/jenlooper) + +데이터를 정리, 시각화, 그리고 ML 작업을 준비하는 프로세스를 시작하기 전, 데이터를 분류할 때 활용할 수 있는 머신러닝의 다양한 방식에 대하여 알아봅니다. + +[statistics](https://wikipedia.org/wiki/Statistical_classification)에서 분리된, classic 머신러닝을 사용하는 classification은, `smoker`, `weight`, 그리고 `age`처럼 _likelihood of developing X disease_ 에 대하여 결정합니다. 전에 수행한 regression 연습과 비슷한 supervised learning 기술로서, 데이터에 라벨링한 ML 알고리즘은 라벨로 데이터셋의 클래스(또는 'features')를 분류하고 예측해서 그룹 또는 결과에 할당합니다. + +✅ 잠시 요리 데이터셋을 상상해봅니다. multiclass 모델은 어떻게 답변할까요? 바이너리 모델은 어떻게 답변할까요? 주어진 요리에 fenugreek를 사용할 지 어떻게 확인하나요? 만약 star anise, artichokes, cauliflower, 그리고 horseradish로 가득한 식품 가방을 선물해서, 전형적 인도 요리를 만들 수 있는지, 보고 싶다면 어떻게 하나요? + + +[![Crazy mystery baskets](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Crazy mystery baskets") + +> 🎥 영상을 보려면 이미지 클릭합니다. The whole premise of the show 'Chopped' is the 'mystery basket' where chefs have to make some dish out of a random choice of ingredients. Surely a ML model would have helped! + +## 안녕 'classifier' + +요리 데이터셋에 물어보고 싶은 질문은, 여러 잠재적 국민 요리를 만들 수 있기 때문에 실제로 **multiclass question**입니다. 재료가 배치되었을 때, 많은 클래스 중에 어떤 데이터가 맞을까요? + +Scikit-learn은 해결하고 싶은 문제의 타입에 따라서, 데이터를 분류하며 사용할 여러가지 알고리즘을 제공합니다. 다음 2가지 강의에서, 몇 알고리즘에 대하여 더 배울 예정입니다. + +## 연습 - 데이터 정리하며 균형잡기 + +프로젝트를 시작하기 전, 첫번째로 해야 할 일은, 더 좋은 결과를 얻기 위해서 데이터를 정리하고 **balance** 하는 일입니다. 이 폴더의 최상단에 있는 빈 _notebook.ipynb_ 파일에서 시작합니다. + +먼저 설치할 것은 [imblearn](https://imbalanced-learn.org/stable/)입니다. 데이터의 균형을 잘 잡아줄 Scikit-learn 패키지입니다 (몇 분동안 배우게 됩니다). + +1. 이렇게, `imblearn` 설치하고, `pip install`을 실행합니다: + + ```python + pip install imblearn + ``` + +1. 데이터를 가져오고 시각화할 때 필요한 패키지를 Import 합니다, `imblearn`의 `SMOTE`도 import 합니다. + + ```python + import pandas as pd + import matplotlib.pyplot as plt + import matplotlib as mpl + import numpy as np + from imblearn.over_sampling import SMOTE + ``` + + 지금부터 데이터를 가져와서 읽게 세팅되었습니다. + +1. 다음 작업으로 데이터를 가져옵니다: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + `read_csv()`를 사용하면 _cusines.csv_ csv 파일의 컨텐츠를 읽고 `df` 변수에 놓습니다. + +1. 데이터의 모양을 확인합니다: + + ```python + df.head() + ``` + + 다음은 처음 5개 행입니다: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. `info()`를 불러서 데이터의 정보를 봅니다: + + ```python + df.info() + ``` + + 출력됩니다: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## 연습 - 요리에 대하여 배우기 + +지금부터 작업이 더 흥미로워집니다. 요리별, 데이터의 분포를 알아봅니다 + +1. `barh()`를 불러서 바 형태로 데이터를 Plot합니다: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![cuisine data distribution](../images/cuisine-dist.png) + + 한정된 요리 갯수가 있지만, 데이터의 분포는 고르지 않습니다. 고칠 수 있습니다! 이전에, 조금 찾아봅니다. + +1. 요리별로 사용할 수 있는 데이터 크기를 보기 위해서 출력합니다: + + ```python + thai_df = df[(df.cuisine == "thai")] + japanese_df = df[(df.cuisine == "japanese")] + chinese_df = df[(df.cuisine == "chinese")] + indian_df = df[(df.cuisine == "indian")] + korean_df = df[(df.cuisine == "korean")] + + print(f'thai df: {thai_df.shape}') + print(f'japanese df: {japanese_df.shape}') + print(f'chinese df: {chinese_df.shape}') + print(f'indian df: {indian_df.shape}') + print(f'korean df: {korean_df.shape}') + ``` + + 이렇게 출력됩니다: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## 성분 발견하기 + +지금부터 데이터를 깊게 파서 요리별 일반적인 재료가 무엇인지 배울 수 있습니다. 요리 사이의 혼동을 일으킬 중복 데이터를 정리할 필요가 있으므로, 문제에 대하여 배우겠습니다. + +1. Python에서 성분 데이터프레임을 생성하기 위해서 `create_ingredient()` 함수를 만듭니다. 함수는 도움이 안되는 열을 드랍하고 카운트로 재료를 정렬하게 됩니다: + + ```python + def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False + inplace=False) + return ingredient_df + ``` + + 지금부터 함수를 사용해서 요리별 가장 인기있는 10개 재료의 아이디어를 얻을 수 있습니다. + +1. `create_ingredient()` 부르고 `barh()`을 부르면서 plot합니다: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![thai](../images/thai.png) + +1. 일본 데이터에서 똑같이 합니다: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![japanese](../images/japanese.png) + +1. 지금 중국 재료에서도 합니다: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![chinese](../images/chinese.png) + +1. 인도 재료에서도 Plot 합니다: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![indian](../images/indian.png) + +1. 마지막으로, 한국 재료에도 plot 합니다: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![korean](../images/korean.png) + +1. 지금부터, `drop()`을 불러서, 전통 요리 사이에 혼란을 주는 가장 공통적인 재료를 드랍합니다: + + 모두 쌀, 마늘과 생강을 좋아합니다! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## 데이터셋 균형 맞추기 + +지금까지 [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html)를 사용해서, 데이터를 정리했습니다. - "Synthetic Minority Over-sampling Technique" - to balance it. + +1. `fit_resample()`을 부르는, 전략은 interpolation으로 새로운 샘플을 생성합니다. + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + 데이터를 균형맞추면, 분류할 때 더 좋은 결과를 냅니다. binary classification에 대하여 생각해봅니다. 만약 대부분 데이터가 한 클래스라면, ML 모델은 단지 데이터가 많다는 이유로, 해당 클래스를 더 자주 예측합니다. 데이터 균형을 맞추면 왜곡된 데이터로 불균형을 제거하는 과정을 도와줍니다. + +1. 지금부터 성분별 라벨의 수를 확인할 수 있습니다: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + 이렇게 출력됩니다: + + ```output + new label count: korean 799 + chinese 799 + indian 799 + japanese 799 + thai 799 + Name: cuisine, dtype: int64 + old label count: korean 799 + indian 598 + chinese 442 + japanese 320 + thai 289 + Name: cuisine, dtype: int64 + ``` + + 이 데이터는 훌륭하고 깔끔하고, 균형 잡히고, 그리고 매우 맛있습니다! + +1. `transformed_df.head()` 와 `transformed_df.info()`로 데이터를 다시 볼 수 있습니다. 다음 강의에서 쓸 수 있도록 데이터를 복사해서 저장합니다: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisine.csv") + ``` + + 새로운 CSV는 최상단 데이터 폴더에서 찾을 수 있습니다. + +--- + +## 🚀 도전 + +해당 커리큘럼은 여러 흥미로운 데이터셋을 포함하고 있습니다. `data` 폴더를 파보면서 binary 또는 multi-class classification에 적당한 데이터셋이 포함되어 있나요? 데이터셋에 어떻게 물어보나요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/20/) + +## 검토 & 자기주도 학습 + +SMOTE API를 찾아봅니다. 어떤 사용 케이스에 잘 사용하나요? 어떤 문제를 해결하나요? + +## 과제 + +[Explore classification methods](../assignment.md) From 427609cb7054d436351c2c50b8ed63e664a596c5 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 18 Jul 2021 21:25:30 +0900 Subject: [PATCH 15/37] ADD : translate 4-2 --- .../2-Classifiers-1/translations/README.ko.md | 243 ++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 4-Classification/2-Classifiers-1/translations/README.ko.md diff --git a/4-Classification/2-Classifiers-1/translations/README.ko.md b/4-Classification/2-Classifiers-1/translations/README.ko.md new file mode 100644 index 0000000000..2483eddb28 --- /dev/null +++ b/4-Classification/2-Classifiers-1/translations/README.ko.md @@ -0,0 +1,243 @@ +# 요리 classifiers 1 + +이 강의에서는, 요리에 대하여 균형적이고, 깔끔한 데이터로 채운 저번 강의에서 저장했던 데이터셋을 사용합니다. + +다양한 classifiers와 데이터셋을 사용해서 _재료 그룹 기반으로 주어진 국민 요리를 예측_ 합니다. 이러는 동안, classification 작업에 알고리즘을 활용할 몇 방식에 대해 자세히 배워볼 예정입니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/21/) + +## 준비하기 + +[Lesson 1](../../1-Introduction/README.md)을 완료했다고 가정하고, 4가지 강의의 최상단 `/data` 폴더에서 _cleaned_cuisines.csv_ 파일이 있는지 확인합니다. + +## 연습 - 국민 요리 예측하기 + +1. 강의의 _notebook.ipynb_ 폴더에서 작업하고, Pandas 라이브러리와 이 파일을 가져옵니다: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../../data/cleaned_cuisine.csv") + cuisines_df.head() + ``` + + 데이터는 이렇게 보입니다: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. 지금부터, 여러가지 라이브러리를 가져옵니다: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. 훈련을 위한 2가지 데이터프레임으로 X 와 y 좌표를 나눕니다. `cuisine`은 라벨 프레임일 수 있습니다: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + 이렇게 보일 예정입니다: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. `drop()`을 불러서 `Unnamed: 0` 열과 `cuisine` 열을 드랍합니다. 훈련 가능한 features로 남긴 데이터를 저장합니다: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + features는 이렇게 보입니다: + + | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | + | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | --- | + | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + +지금부터 모델을 훈련할 준비가 되었습니다! + +## classifier 고르기 + +이제 데이터를 정리하고 훈련할 준비가 되었으므로, 작업에 사용할 알고리즘을 정해야 합니다. + +Scikit-learn은 Supervised Learning 아래에 classification 그룹으로 묶여있고, 이 카테고리에서 다양한 분류 방식을 찾을 수 있습니다. [The variety](https://scikit-learn.org/stable/supervised_learning.html)는 처음에 꽤 당황스럽습니다. 다음 방식에 모든 classification 기술이 포함되어 있습니다: + +- Linear 모델 +- Support Vector Machines +- Stochastic Gradient Descent +- Nearest Neighbors +- Gaussian Processes +- Decision Trees +- Ensemble methods (voting Classifier) +- Multiclass 와 multioutput algorithms (multiclass 와 multilabel classification, multiclass-multioutput classification) + +> [neural networks to classify data](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification)를 사용할 수 있지만, 이 강의의 범위를 벗어납니다. + +### 어떠한 classifier 사용하나요? + +그래서, 어떤 classifier를 골라야 하나요? 자주, 여러가지로 실행하며 좋은 결과를 보는 게 테스트 방식입니다. Scikit-learn은 KNeighbors, SVC 두 방식으로 GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB 그리고 QuadraticDiscrinationAnalysis 와 비교하여 만든 데이터셋에 대한 [side-by-side comparison](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html)을 제공하고, 시각화된 결과를 보입니다: + +![comparison of classifiers](../images/comparison.png) +> Plots generated on Scikit-learn's documentation + +> AutoML은 클라우드에서 comparisons을 실행해서 이러한 문제를 깔끔하게 해결했으며, 데이터에 적당한 알고리즘을 고를 수 있습니다. [here](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-15963-cxa)에서 시도해봅니다. + +### 더 괜찮은 접근법 + +그러나, 성급히 추측하기보다 더 괜찮은 방식으로, 내려받을 수 있는 [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-15963-cxa)의 아이디어를 따르는 것입니다. 여기, multiclass 문제에 대하여, 몇 선택 사항을 볼 수 있습니다: + +![cheatsheet for multiclass problems](../images/cheatsheet.png) +> multiclass classification 옵션을 잘 설명하는, Microsoft의 알고리즘 치트 시트의 섹션 + +✅ 치트 시트를 내려받고, 출력해서, 벽에 겁니다! + +### 추리하기 + +만약 주어진 제약 사항을 감안해서 다른 접근 방식으로 추론할 수 있는지 봅니다: + +- **Neural networks 매우 무겁습니다**. 깔끔하지만, 최소 데이터셋과, 노트북으로 로컬에서 훈련했다는 사실을 보면, 이 작업에서 neural networks는 매우 무겁습니다. +- **two-class classifier 아닙니다**. one-vs-all를 빼기 위해서, two-class classifier를 사용하지 않습니다. +- **Decision tree 또는 logistic regression 작동할 수 있습니다**. decision tree 또는, multiclass를 위한 logistic regression이 작동할 수 있습니다. +- **Multiclass Boosted Decision Trees 다른 문제를 해결합니다**. multiclass boosted decision tree는 nonparametric 작업에 가장 적당합니다. 예시로. 랭킹을 만드려고 디자인 했으므로, 유용하지 않습니다. + +### Scikit-learn 사용하기 + +Scikit-learn으로 데이터를 분석할 예정입니다. 그러나, Scikit-learn에는 logistic regression을 사용할 많은 방식이 존재합니다. [parameters to pass](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression)를 찾아봅니다. + +기본적으로 Scikit-learn에서 logistic regression을 하도록 요청할 때 지정할 필요가 있는, `multi_class` 와 `solver` 중요한 두 개의 파라미터가 있습니다. `multi_class` 값은 특정 동작을 적용합니다. solver의 값은 사용할 알고리즘입니다. 모든 solver가 모든 `multi_class` 값들을 연결하지 않습니다. + +문서에 따르면, multiclass 케이스인 경우, 훈련 알고리즘은 아래와 같습니다: + +- **one-vs-rest (OvR) 스키마를 사용합니다**, `multi_class` 옵션을 `ovr`로 한 경우 +- **cross-entropy loss를 사용합니다**, `multi_class` 옵션을 `multinomial`로 한 경우. (현재 `multinomial` 옵션은 ‘lbfgs’, ‘sag’, ‘saga’ 그리고 ‘newton-cg’ solvers에서 지원됩니다.)" + +> 🎓 'scheme'는 여기에서 'ovr' (one-vs-rest) 혹은 'multinomial'일 것입니다. logistic regression은 binary classification을 잘 지원할 수 있도록 디자인 되었으므로, 스키마를 사용하면 multiclass classification 작업을 잘 핸들링할 수 있습니다. [source](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'solver'는 "the algorithm to use in the optimization problem"로 정의됩니다. [source](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn은 solvers가 다양한 데이터 구조에 제시된 다른 문제 방식을 설명하고자 이 표를 제공합니다: + +![solvers](../images/solvers.png) + +## 연습 - 데이터 나누기 + +지난 강의에서 최근에 배웠으므로 첫 훈련 시도에 대한 logistic regression으로 집중할 수 있습니다. +`train_test_split()` 불러서 데이터를 훈련과 테스트 그룹으로 나눕니다: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## 연습 - logistic regression 적용하기 + +multiclass 케이스로, 사용할 _scheme_ 와 설정할 _solver_ 를 선택해야 합니다. 훈련할 multiclass 세팅과 **liblinear** solver와 함께 LogisticRegression을 사용합니다. + +1. multi_class를 `ovr`로 설정하고 solver도 `liblinear`로 설정해서 logistic regression을 만듭니다: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ 가끔 기본적으로 설정되는, `lbfgs`처럼 다른 solver를 시도합니다 + + > 노트, Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) 함수를 사용해서 필요한 순간에 데이터를 평평하게 핍니다. + + 정확도는 **80%** 보다 좋습니다! + +1. 하나의 행 데이터 (#50)를 테스트하면 모델이 작동하는 것을 볼 수 있습니다: + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + 결과가 출력됩니다: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ 다른 행 번호로 시도해보고 결과를 확인합니다. + +1. 깊게 파보면, 예측 정확도를 확인할 수 있습니다: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + 결과가 출력됩니다 - 인도 요리가 가장 좋은 확률에 최선으로 추측됩니다. + + | | 0 | | | | | | | | | | | | | | | | | | | | | + | -------: | -------: | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | + | indian | 0.715851 | | | | | | | | | | | | | | | | | | | | | + | chinese | 0.229475 | | | | | | | | | | | | | | | | | | | | | + | japanese | 0.029763 | | | | | | | | | | | | | | | | | | | | | + | korean | 0.017277 | | | | | | | | | | | | | | | | | | | | | + | thai | 0.007634 | | | | | | | | | | | | | | | | | | | | | + + ✅ 모델이 이를 인도 요리라고 확신하는 이유를 설명할 수 있나요? + +1. regression 강의에서 했던 행동처럼, classification 리포트를 출력해서 자세한 정보를 얻습니다: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | precision | recall | f1-score | support | | | | | | | | | | | | | | | | | | | + | ------------ | ------ | -------- | ------- | ---- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | | | | | | | | | | | | | | | | | | + | indian | 0.91 | 0.93 | 0.92 | 254 | | | | | | | | | | | | | | | | | | + | japanese | 0.70 | 0.75 | 0.72 | 220 | | | | | | | | | | | | | | | | | | + | korean | 0.86 | 0.76 | 0.81 | 242 | | | | | | | | | | | | | | | | | | + | thai | 0.79 | 0.85 | 0.82 | 254 | | | | | | | | | | | | | | | | | | + | accuracy | 0.80 | 1199 | | | | | | | | | | | | | | | | | | | | + | macro avg | 0.80 | 0.80 | 0.80 | 1199 | | | | | | | | | | | | | | | | | | + | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | | | | | | | | | | | | | | | | | | + +## 🚀 도전 + +이 강의에서, 정리된 데이터로 재료의 시리즈를 기반으로 국민 요리를 예측할 수 있는 머신러닝 모델을 만들었습니다. 시간을 투자해서 Scikit-learn이 데이터를 분류하기 위해 제공하는 다양한 옵션을 읽어봅니다. 무대 뒤에서 생기는 일을 이해하기 위해서 'solver'의 개념을 깊게 파봅니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/22/) +## 검토 & 자기주도 학습 + +[this lesson](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)에서 logistic regression 뒤의 수학에 대해서 더 자세히 파봅니다. + +## 과제 + +[Study the solvers](../assignment.md) From 5e5042c67a133275939bfd5ad3f3da21fbb28494 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Mon, 19 Jul 2021 21:15:05 +0900 Subject: [PATCH 16/37] ADD : translate 4-3 --- .../3-Classifiers-2/translations/README.ko.md | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 4-Classification/3-Classifiers-2/translations/README.ko.md diff --git a/4-Classification/3-Classifiers-2/translations/README.ko.md b/4-Classification/3-Classifiers-2/translations/README.ko.md new file mode 100644 index 0000000000..05b729f225 --- /dev/null +++ b/4-Classification/3-Classifiers-2/translations/README.ko.md @@ -0,0 +1,235 @@ +# 요리 classifiers 2 + +두번째 classification 강의에서, 숫자 데이터를 분류하는 더 많은 방식을 알아봅니다. 다른 것보다 하나의 classifier를 선택하는 파급효과도 배우게 됩니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/23/) + +### 필요 조건 + +직전 강의를 완료하고 4강 폴더의 최상단 `data` 폴더에 _cleaned_cuisine.csv_ 라고 불리는 정리된 데이터셋이 있다고 가정합니다. + +### 준비하기 + +정리된 데이터셋과 _notebook.ipynb_ 파일을 불러오고 X 와 y 데이터프레임으로 나누면, 모델 제작 프로세스를 준비하게 됩니다. + +## Classification map + +이전에, Microsoft 치트 시트를 사용해서 데이터를 분류할 때 다양한 옵션을 배울 수 있었습니다. Scikit-learn은 estimators (classifiers)를 좁히는 데 더 도움을 받을 수 있었고, 보다 세분화된 치트 시트를 비슷하게 제공합니다: + +![ML Map from Scikit-learn](../images/map.png) +> 팁: [visit this map online](https://scikit-learn.org/stable/tutorial/machine_learning_map/)으로 경로를 따라 클릭해서 문서를 읽어봅니다. + +### 계획 + +지도는 데이터를 명쾌하게 파악하면 정한 길을 따라 'walk'할 수 있으므르 매우 도움이 됩니다: + +- 샘플을 >50개 가지고 있습니다 +- 카테고리를 예측하고 싶습니다 +- 라벨링된 데이터를 가지고 있습니다 +- 100K개 보다 적은 샘플을 가지고 있습니다 +- ✨ Linear SVC를 고를 수 있습니다 +- 동작하지 않을 때, 숫자 데이터를 가지고 있으므로 + - ✨ KNeighbors Classifier를 시도할 수 있습니다 + - 만약 그것도 동작하지 않는다면, ✨ SVC 와 ✨ Ensemble Classifiers를 시도합니다. + +따라가면 도움을 받을 수 있습니다. + +## 연습 - 데이터 나누기 + +경로를 따라서, 사용할 라이브러리를 가져오기 시작해야 합니다. + +1. 필요한 라이브러리를 Import 합니다: + + ```python + from sklearn.neighbors import KNeighborsClassifier + from sklearn.linear_model import LogisticRegression + from sklearn.svm import SVC + from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + import numpy as np + ``` + +1. 훈련과 테스트 데이터로 나눕니다: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Linear SVC classifier + +Support-Vector clustering (SVC)는 ML 기술 중에서 Support-Vector machines의 하위입니다 (아래에서 자세히 알아봅니다). 이 메소드에서, 'kernel'을 선택하고 라벨을 클러스터하는 방식을 결정할 수 있습니다. 'C' 파라미터는 파라미터의 영향을 규제할 'regularization'을 나타냅니다. 커널은 [several](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC) 중에서 있을 수 있습니다. 여기는 linear SVC를 활용하도록 'linear'로 설정합니다. 확률은 'false'가 기본입니다; 하지만 확률을 추정하기 위해서 'true'로 설정합니다. 확률을 얻으려면 데이터를 섞어서 랜덤 상태 '0'으로 설정합니다. + +### 연습 - linear SVC 적용하기 + +classifiers의 배열을 만들기 시작합니다. 테스트하며 배열에 점차 추가할 예정입니다. + +1. Linear SVC로 시작합니다: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Linear SVC로 모델을 훈련하고 리포트도 출력합니다: + + ```python + n_classifiers = len(classifiers) + + for index, (name, classifier) in enumerate(classifiers.items()): + classifier.fit(X_train, np.ravel(y_train)) + + y_pred = classifier.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) + print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) + print(classification_report(y_test,y_pred)) + ``` + + 결과는 멋집니다: + + ```output + Accuracy (train) for Linear SVC: 78.6% + precision recall f1-score support + + chinese 0.71 0.67 0.69 242 + indian 0.88 0.86 0.87 234 + japanese 0.79 0.74 0.76 254 + korean 0.85 0.81 0.83 242 + thai 0.71 0.86 0.78 227 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +## K-Neighbors classifier + +K-Neighbors는 supervised 와 unsupervised learning에서 사용하는 ML 방식 중 "neighbors" 계열의 일부분입니다. 이 메소드에서, 미리 정의한 수의 포인트를 만들고 포인트 주변의 데이터를 수집하면 데이터에 대한 일반화된 라벨을 예측할 수 있습니다. + +### 연습 - K-Neighbors classifier 적용하기 + +이전 classifier는 좋았고, 데이터도 잘 동작했지만, 더 정확도를 높일 수 있을 수 있습니다. K-Neighbors classifier를 시도해봅니다. + +1. classifier 배열에 라인을 추가합니다 (Linear SVC 아이템 뒤에 컴마를 추가합니다): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + 결과는 조금 나쁩니다: + + ```output + Accuracy (train) for KNN classifier: 73.8% + precision recall f1-score support + + chinese 0.64 0.67 0.66 242 + indian 0.86 0.78 0.82 234 + japanese 0.66 0.83 0.74 254 + korean 0.94 0.58 0.72 242 + thai 0.71 0.82 0.76 227 + + accuracy 0.74 1199 + macro avg 0.76 0.74 0.74 1199 + weighted avg 0.76 0.74 0.74 1199 + ``` + + ✅ [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)에 대하여 알아봅니다 + +## Support Vector Classifier + +Support-Vector classifiers는 classification 과 regression 작업에 사용하는 ML 방식 중에서 [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) 계열의 일부분입니다. SVMs은 두 카테고리 사이의 거리를 최대로 하려고 "공간의 포인트에 훈련 예시를 맵핑"합니다. 차후 데이터는 카테고리를 예측할 수 있게 이 공간에 맵핑됩니다. + +### 연습 - Support Vector Classifier 적용하기 + +Support Vector Classifier로 정확도를 조금 더 올립니다. + +1. K-Neighbors 아이템 뒤로 컴마를 추가하고, 라인을 추가합니다: + + ```python + 'SVC': SVC(), + ``` + + 결과는 꽤 좋습니다! + + ```output + Accuracy (train) for SVC: 83.2% + precision recall f1-score support + + chinese 0.79 0.74 0.76 242 + indian 0.88 0.90 0.89 234 + japanese 0.87 0.81 0.84 254 + korean 0.91 0.82 0.86 242 + thai 0.74 0.90 0.81 227 + + accuracy 0.83 1199 + macro avg 0.84 0.83 0.83 1199 + weighted avg 0.84 0.83 0.83 1199 + ``` + + ✅ [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm)에 대하여 알아봅니다 + +## Ensemble Classifiers + +지난 테스트에서 꽤 좋았지만, 경로를 끝까지 따라갑니다. Ensemble Classifiers, 구체적으로 Random Forest 와 AdaBoost를 시도합니다: + +```python +'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +특별하게 Random Forest는, 결과가 매우 좋습니다: + +```output +Accuracy (train) for RFST: 84.5% + precision recall f1-score support + + chinese 0.80 0.77 0.78 242 + indian 0.89 0.92 0.90 234 + japanese 0.86 0.84 0.85 254 + korean 0.88 0.83 0.85 242 + thai 0.80 0.87 0.83 227 + + accuracy 0.84 1199 + macro avg 0.85 0.85 0.84 1199 +weighted avg 0.85 0.84 0.84 1199 + +Accuracy (train) for ADA: 72.4% + precision recall f1-score support + + chinese 0.64 0.49 0.56 242 + indian 0.91 0.83 0.87 234 + japanese 0.68 0.69 0.69 254 + korean 0.73 0.79 0.76 242 + thai 0.67 0.83 0.74 227 + + accuracy 0.72 1199 + macro avg 0.73 0.73 0.72 1199 +weighted avg 0.73 0.72 0.72 1199 +``` + +✅ [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html)에 대해 배웁니다 + +머신러닝의 방식 "여러 기본 estimators의 에측을 합쳐"서 모델의 품질을 향상시킵니다. 예시로, Random Trees 와 AdaBoost를 사용합니다. + +- 평균 방식인 [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest)는, 오버피팅을 피하려 랜덤성이 들어간 'decision trees'의 'forest'를 만듭니다. n_estimators 파라미터는 트리의 수로 설정합니다. + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html)는 데이터셋을 classifier로 맞추고 classifier의 카피를 같은 데이터셋에 맞춥니다.잘 못 분류된 아이템의 가중치에 집중하고 다음 classifier를 교정하도록 맞춥니다. + +--- + +## 🚀 도전 + +각 기술에는 트윅할 수 있는 많은 수의 파라미터가 존재합니다. 각 기본 파라미터를 조사하고 파라미터를 조절헤서 모델 품질에 어떤 의미가 부여되는지 생각합니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/24/) + +## 검토 & 자기주도 학습 + +강의에서 많은 특수 용어가 있어서, 잠시 시간을 투자해서 유용한 용어의 [this list](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-15963-cxa)를 검토합니다! + +## 과제 + +[Parameter play](../assignment.md) From c787766f292afcc693c8fa652f7cf8be3afc523c Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Wed, 21 Jul 2021 21:05:02 +0900 Subject: [PATCH 17/37] ADD : translate 4-4 --- .../4-Applied/translations/README.ko.md | 337 ++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 4-Classification/4-Applied/translations/README.ko.md diff --git a/4-Classification/4-Applied/translations/README.ko.md b/4-Classification/4-Applied/translations/README.ko.md new file mode 100644 index 0000000000..72d239e7ee --- /dev/null +++ b/4-Classification/4-Applied/translations/README.ko.md @@ -0,0 +1,337 @@ +# 요리 추천 Web App 만들기 + +이 강의에서, 이전 강의에서 배웠던 몇 기술과 이 계열에서 사용했던 맛있는 요리 데이터셋으로 classification 모델을 만들 예정입니다. 추가로, Onnx의 웹 런타임을 활용해서, 저장된 모델로 작은 웹 앱을 만들 것입니다. + +머신러닝의 유용하고 실용적인 사용 방식 중에 하나인 recommendation system을 만들고, 오늘 이 쪽으로 처음 걷습니다! + +[![Recommendation Systems Introduction](https://img.youtube.com/vi/giIXNoiqO_U/0.jpg)](https://youtu.be/giIXNoiqO_U "Recommendation Systems Introduction") + +> 🎥 영상 보려면 이미지 클릭: Andrew Ng introduces recommendation system design + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/25/) + +이 강의에서 다음을 배우게 됩니다: + +- 모델을 만들고 Onnx 모델로 저장하는 방식 +- Netron 사용해서 모델 검사하는 방식 +- 추론을 위한 웹 앱에서 모델을 사용하는 방식 + +## 모델 만들기 + +Applied ML 시스템을 만드는 것은 비지니스 시스템에서 이 기술을 활용하는 부분이 중요합니다. Onnx로 웹 애플리케이션에서 (필요하면 오프라인 컨텍스트에서 사용하기도 합니다) 모델을 사용할 수 있습니다. + +[previous lesson](../../../3-Web-App/1-Web-App/README.md)에서, UFO 목격에 대한 Regression 모델을 만들었고, "pickled" 한 것을, Flask 앱에서 사용했습니다. 이 구조는 알고 있다면 매우 유용하지만, full-stack Python 앱이므로, JavaScript 애플리케이션을 포함해야 된다고 요구될 수 있습니다. + +이 강의에서, 추론할 기초 JavaScript-기반 시스템을 만듭니다. 그러나 먼저, 모델을 훈련하고 Onnx와 같이 사용하기 위해서 변환할 필요가 있습니다. + +## 연습 - classification 모델 훈련 + +먼저, 이미 사용했던 깨끗한 요리 데이터셋으로 classification 모델을 훈련합니다. + +1. 유용한 라이브러리를 가져와서 시작합니다: + + ```python + pip install skl2onnx + import pandas as pd + ``` + + Scikit-learn 모델을 Onnx 포맷으로 변환할 때 도움을 주는 '[skl2onnx](https://onnx.ai/sklearn-onnx/)' 가 필요합니다. + +1. 그리고, `read_csv()` 사용해서 CSV 파일을 읽어보면, 이전 강의에서 했던 같은 방식으로 데이터를 작업합니다: + + ```python + data = pd.read_csv('../data/cleaned_cuisine.csv') + data.head() + ``` + +1. 첫 2개의 필요없는 열을 제거하고 'X'로 나머지 데이터를 저장합니다: + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. 'y'로 라벨을 저장합니다: + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### 훈련 루틴 개시하기 + +좋은 정확도의 'SVC' 라이브러리를 사용할 예정입니다. + +1. Scikit-learn에서 적합한 라이브러리를 Import 합니다: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.svm import SVC + from sklearn.model_selection import cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report + ``` + +1. 훈련과 테스트 셋으로 가릅니다: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. 이전 강의에서 했던 것처럼 SVC Classification model 모델을 만듭니다: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. 지금부터, `predict()`를 불러서, 모델을 테스트합니다: + + ```python + y_pred = model.predict(X_test) + ``` + +1. 모델의 품질을 확인하기 위해서 classification 리포트를 출력합니다: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + 전에 본 것처럼, 정확도는 좋습니다: + + ```output + precision recall f1-score support + + chinese 0.72 0.69 0.70 257 + indian 0.91 0.87 0.89 243 + japanese 0.79 0.77 0.78 239 + korean 0.83 0.79 0.81 236 + thai 0.72 0.84 0.78 224 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +### 모델을 Onnx로 변환하기 + +적절한 Tensor 숫자로 변환할 수 있어야 합니다. 데이터셋은 380개 성분이 나열되며, `FloatTensorType`에 숫자를 적어야 합니다: + +1. 380개의 tensor 숫자로 변환하기. + + ```python + from skl2onnx import convert_sklearn + from skl2onnx.common.data_types import FloatTensorType + + initial_type = [('float_input', FloatTensorType([None, 380]))] + options = {id(model): {'nocl': True, 'zipmap': False}} + ``` + +1. onx를 생성하고 **model.onnx** 파일로 저장합니다: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > 노트, 변환 스크립트에서 [options](https://onnx.ai/sklearn-onnx/parameterized.html)을 줄 수 있습니다. 이 케이스에서, 'nocl'는 True, 'zipmap'은 False로 줬습니다. (필수는 아니지만) classification 모델이라서, 사전의 리스트를 만드는 ZipMap을 지울 옵션이 있습니다. `nocl`은 모델에 있는 클래스 정보를 나타냅니다. `nocl`을 'True'로 설정해서 모델의 크기를 줄입니다. + +전체 노트북을 실행하면 Onnx 모델이 만들어지고 폴더에 저장됩니다. + +## 모델 보기 + +Onnx 모델은 Visual Studio code에서 잘 볼 수 없지만, 많은 연구원들이 모델을 잘 만들었는지 보고 싶어서 모델을 시각화할 때 사용하기 매우 좋은 자유 소프트웨어가 있습니다. [Netron](https://github.com/lutzroeder/Netron)을 내려받고 model.onnx 파일을 엽니다. 380개 입력과 나열된 classifier로 간단한 모델을 시각화해서 볼 수 있습니다: + +![Netron visual](../images/netron.png) + +Netron은 모델을 보게 도와주는 도구입니다. + +지금부터 웹 앱에서 neat 모델을 사용할 준비가 되었습니다. 냉장고를 볼 때 편리한 앱을 만들고 모델이 결정해서 건내준 요리를 조리할 수 있게 남은 재료 조합을 찾아봅니다. + +## recommender 웹 애플리케이션 만들기 + +웹 앱에서 바로 모델을 사용할 수 있습니다. 이 구조를 사용한다면 로컬에서 실행할 수 있고 필요하면 오프라인으로 가능합니다. `model.onnx` 파일을 저장한 동일 폴더에서 `index.html` 파일을 만들기 시작합니다. + +1. _index.html_ 파일에서, 다음 마크업을 추가합니다: + + ```html + + +
+ Cuisine Matcher +
+ + ... + + + ``` + +1. 지금부터, `body` 테그에서 작업하며, 일부 요소를 반영하는 체크박스의 리스트로 보여줄 약간의 마크업을 추가합니다: + + ```html +

Check your refrigerator. What can you create?

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+ ``` + + 각 체크박스에 값이 주어졌습니다. 데이터셋에 따라서 식재료가 발견된 인덱스를 반영합니다. Apple을 예시로 들면, 알파벳 리스트에서, 5번째 열을 차지하므로, 0부터 세기 시작해서 값은 '4'가 됩니다. 주어진 식재료의 색인을 찾기 위해서 [ingredients spreadsheet](../../data/ingredient_indexes.csv)를 참고할 수 있습니다 + + index.html 파일에 작업을 계속 이어서, 마지막 닫는 `` 뒤에 모델을 부를 script 블록을 추가합니다. + +1. 먼저, [Onnx Runtime](https://www.onnxruntime.ai/)을 가져옵니다: + + ```html + + ``` + + > Onnx 런타임은 최적화와 사용할 API를 포함해서, 넓은 범위의 하드웨어 플랫폼으로 Onnx 모델을 실행할 때 쓰입니다. + +1. 런타임이 자리에 있다면, 이렇게 부를 수 있습니다: + + ```javascript + + ``` + +이 코드에서, 몇가지 해프닝이 생깁니다: + +1. 체크박스 요소가 체크되었는 지에 따라, 추론해서 모델로 보낼 380개 가능한 값(1 또는 0)의 배열을 만듭니다. +2. 체크박스의 배열과 애플리케이션을 시작하며 불렀던 `init` 함수에서 체크되었는 지 확인할 방식을 만들었습니다. 체크박스를 체크하면, 고른 재료를 반영할 수 있게 `ingredients` 배열이 변경됩니다. +3. 모든 체크박스를 체크했는지 확인하는 `testCheckboxes` 함수를 만들었습니다. +4. 버튼을 누르면 이 함수를 사용하고, 만약 모든 체크박스가 체크되어 있다면, 추론하기 시작합니다. +5. 추론 루틴에 포함됩니다: + 1. 모델의 비동기 로드 세팅하기 + 2. 모델로 보낼 Tensor 구조 만들기 + 3. 모델을 훈련할 때 만들었던 입력 `float_input`을 반영하는 'feeds' 만들기 (Netron으로 이름을 확인할 수 있습니다) + 4. 모델로 'feeds'를 보내고 응답 기다리기 + +## 애플리케이션 테스트하기 + +index.html 파일의 폴더에서 Visual Studio Code로 터미널 세션을 엽니다. 전역적으로 `[http-server](https://www.npmjs.com/package/http-server)`를 설치했는지 확인하고, 프롬프트에 `http-server`를 타이핑합니다. 로컬 호스트로 열고 웹 앱을 볼 수 있습니다. 여러 재료를 기반으로 추천된 요리를 확인합니다: + +![ingredient web app](../images/web-app.png) + +축하드립니다, 약간의 필드로 'recommendation' 웹 앱을 만들었습니다. 시간을 조금 내어 이 시스템을 만들어봅니다! + +## 🚀 도전 + +이 웹 앱은 매우 작아서, [ingredient_indexes](../../data/ingredient_indexes.csv) 데이터에서 성분과 인덱스로 계속 만듭니다. 주어진 국민 요리를 만드려면 어떤 풍미 조합으로 작업해야 되나요? + +## [Post-lecture quiz](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/26/) + +## 검토 & 자기주도 학습 + +이 강의에서 식품 재료에 대한 recommendation 시스템 구축의 유용함을 다뤘지만, ML 애플리케이션 영역은 예제가 매우 많습니다. 이 시스템이 어떻게 만들어졌는지 읽어봅니다: + +- https://www.sciencedirect.com/topics/computer-science/recommendation-engine +- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/ +- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/ + +## 과제 + +[Build a new recommender](../assignment.md) From b2d07eb752b27763757dc6a56b045663a399853d Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Wed, 21 Jul 2021 22:14:14 +0900 Subject: [PATCH 18/37] ADD : translate 5 --- 5-Clustering/README.ko.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 5-Clustering/README.ko.md diff --git a/5-Clustering/README.ko.md b/5-Clustering/README.ko.md new file mode 100644 index 0000000000..f2f5083fb0 --- /dev/null +++ b/5-Clustering/README.ko.md @@ -0,0 +1,28 @@ +# 머신러닝을 위한 Clustering 모델 + +Clustering은 서로 비슷한 오브젝트를 찾고 clusters라고 불린 그룹으로 묶는 머신러닝 작업입니다. Clustering이 머신러닝의 다른 접근법과 다른 점은, 자동으로 어떤 일이 생긴다는 것이며, 사실은, supervised learning의 반대라고 말하는 게 맞습니다. + +## 지역 토픽: 나이지리아 사람들의 음악 취향을 위한 clustering 모델 🎧 + +나이지리아의 다양한 사람들은 다양한 음악 취향이 있습니다. Spotify에서 긁어온 데이터를 사용해서 ([this article](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)에서 영감받았습니다), 나이지니아에서 인기있는 음악을 알아보겠습니다. 데이터셋에 다양한 노래의 'danceability' 점수, 'acousticness', loudness, 'speechiness', 인기도와 에너지 데이터가 포함됩니다. 데이터에서 패턴을 찾는 것은 흥미로울 예정입니다! + +![A turntable](./images/turntable.jpg) + +Photo by Marcela Laskoski on Unsplash + +이 강의의 시리즈에서, clustering 기술로 데이터를 분석하는 새로운 방식을 찾아볼 예정입니다. Clustering은 데이터셋에 라벨이 없으면 더욱 더 유용합니다. 만약 라벨이 있다면, 이전 강의에서 배운대로 classification 기술이 더 유용할 수 있습니다. 그러나 라벨링되지 않은 데이터를 그룹으로 묶으려면, clustering은 패턴을 발견하기 위한 좋은 방식입니다. + +> clustering 모델 작업을 배울 때 도움을 받을 수 있는 유용한 low-code 도구가 있습니다. [Azure ML for this task](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-15963-cxa)를 시도해봅니다. + +## 강의 + +1. [clustering 소개하기](1-Visualize/translations/README.ko.md) +2. [K-Means clustering](2-K-Means/translations/README.ko.md) + +## 크레딧 + +These lessons were written with 🎶 by [Jen Looper](https://www.twitter.com/jenlooper) with helpful reviews by [Rishit Dagli](https://rishit_dagli) and [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan). + +[Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) 데이터셋은 Spotify 스크랩해서 Kaggle에서 가져왔습니다. + +이 강의를 만들 때 도움된 유용한 K-Means 예시는 [iris exploration](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), [introductory notebook](https://www.kaggle.com/prashant111/k-means-clustering-with-python), 과 [hypothetical NGO example](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering)이 포함됩니다. \ No newline at end of file From b8cae5a365eb3326d009d71b89135429e41908f5 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Fri, 23 Jul 2021 22:13:58 +0900 Subject: [PATCH 19/37] ADD : translate 6 --- 6-NLP/README.ko.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 6-NLP/README.ko.md diff --git a/6-NLP/README.ko.md b/6-NLP/README.ko.md new file mode 100644 index 0000000000..254d0137cb --- /dev/null +++ b/6-NLP/README.ko.md @@ -0,0 +1,24 @@ +# Natural language processing 시작하기 + +Natural language processing, 즉 NLP는, 인공지능의 하위 필드입니다. 전체 필드는 기계가 인간의 언어를 이해하고 처리하는 것을 도와줍니다. 맞춤법 검사 또는 기게 번역과 같은 작업을 수행할 때 쓸 수 있습니다. + +## 지역 토픽: 유럽 언어와 문학 그리고 유럽의 로맨틱 호텔 ❤️ + +커리큘럼의 섹션에서, 머신러닝의 가장 널리 퍼진 사용법 중 하나를 소개합니다: natural language processing (NLP). 전산 언어학에서 나온, 인공지능 카테고리는 음성 또는 텍스트 통신으로 인간과 기계 사이를 연결합니다. + +이 강의에서 머신러닝이 이 대화를 점차 'smart'하게 만드는 방식을 배우고자 작은 대화 봇을 만들어서 NLP의 기본을 배울 예정입니다. 1813년에 출판한, Jane Austen의 고전 소설, **Pride and Prejudice**에, Elizabeth Bennett과 Mr. Darcy 같이 이야기하며 과거로 시간 여행을 하게 됩니다. 그러면, 유럽의 호텔 리뷰로 감정 분석을 배우면서 지식을 발전시킬 예정입니다. + +![Pride and Prejudice book and tea](images/p&p.jpg) +> Photo by Elaine Howlin on Unsplash + +## 강의 + +1. [Natural language processing 소개하기](1-Introduction-to-NLP/translations/README.ko.md) +2. [일반적 NLP 작업과 기술](2-Tasks/translations/README.ko.md) +3. [머신러닝으로 번역과 감정 분석하기](3-Translation-Sentiment/translations/README.ko.md) +4. [데이터 준비하기](4-Hotel-Reviews-1/translations/README.ko.md) +5. [감정 분석을 위한 NLTK](5-Hotel-Reviews-2/translations/README.ko.md) + +## 크래딧 + +These natural language processing lessons were written with ☕ by [Stephen Howell](https://twitter.com/Howell_MSFT) From 0eb3a2e1a4c1bc4532fac46bd469eaf978f06cc6 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Fri, 23 Jul 2021 23:06:27 +0900 Subject: [PATCH 20/37] ADD : translate 7 --- 7-TimeSeries/README.ko.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 7-TimeSeries/README.ko.md diff --git a/7-TimeSeries/README.ko.md b/7-TimeSeries/README.ko.md new file mode 100644 index 0000000000..504dd20aaa --- /dev/null +++ b/7-TimeSeries/README.ko.md @@ -0,0 +1,22 @@ +# Time series forecasting 소개하기 + +time series forecasting은 무엇인가요? 과거의 트렌드로 분석해서 미래 이벤트를 예측합니다. + +## 지역 토픽: 전세계 전기 사용량 ✨ + +2개의 강의에서, 타 필드의 산업과 비지니스 애플리케이션에서도 매우 쓸모있는 머신러닝의 비교적 덜 알려진 영역인, time series forecasting을 소개할 예정입니다. neural network로 모델의 유틸리티를 개선할 수 있지만, 모델은 과거 기반으로 미래 성능을 예측할수 있게 도와줄 수 있으므로 classical 머신러닝의 컨텍스트로 공부해볼 예정입니다. + +여기에서 핵심은 과거 부하 패턴 기반으로 향후 전력 사용량의 예측에 대해 배울 수 있는 흥미로운 데이터셋인, 전세계의 전기 사용량입니다. 이 예측 종류가 비지니스 환경에서 많이 돕고 있는지 볼 수 있습니다. + +![electric grid](images/electric-grid.jpg) + +Photo by Peddi Sai hrithik of electrical towers on a road in Rajasthan on Unsplash + +## 강의 + +1. [Time series forecasting 소개하기](1-Introduction/translations/README.ko.md) +2. [ARIMA time series 모델 만들기](2-ARIMA/translations/README.ko.md) + +## 크레딧 + +"Introduction to time series forecasting" was written with ⚡️ by [Francesca Lazzeri](https://twitter.com/frlazzeri) and [Jen Looper](https://twitter.com/jenlooper) From 0243f67325475dccba431807169efb052599a754 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 24 Jul 2021 16:02:10 +0900 Subject: [PATCH 21/37] ADD : translate 8 --- 8-Reinforcement/README.ko.md | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 8-Reinforcement/README.ko.md diff --git a/8-Reinforcement/README.ko.md b/8-Reinforcement/README.ko.md new file mode 100644 index 0000000000..d901657392 --- /dev/null +++ b/8-Reinforcement/README.ko.md @@ -0,0 +1,54 @@ +# Reinforcement learning 소개하기 + +Reinforcement learning, 즉 RL은, supervised learning 과 unsupervised learning 다음의, 기초 머신러닝 페러다임 중 하나로 봅니다. RL은 모든 의사결정입니다: 올바른 결정을 하거나 최소한 배우게 됩니다. + +주식 시장처럼 시뮬레이션된 환경을 상상해봅니다. 만약 규제시키면 어떤 일이 벌어질까요. 긍정적이거나 부정적인 영향을 주나요? 만약 부정적인 일이 생긴다면, 진로를 바꾸어, _negative reinforcement_ 을 배울 필요가 있습니다. 긍정적인 결과는, _positive reinforcement_ 로 만들 필요가 있습니다. + +![peter and the wolf](images/peter.png) + +> Peter and his friends need to escape the hungry wolf! Image by [Jen Looper](https://twitter.com/jenlooper) + +## 지역 토픽: 피터와 늑대 (러시아) + +[Peter and the Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)는 러시아 작곡가 [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev)가 작성한 뮤지컬 동화입니다. 늑대를 쫓아내기 위해 용감하게 집 밖의 숲으로 떠나는, 젊은 개척가 피터의 이야기입니다. 이 섹션에서, Peter를 도와주기 위해서 머신러닝 알고리즘을 훈련해볼 예정입니다: + +- 주변 영역을 **탐색**하고 최적의 길을 안내하는 지도 만들기 +- 빨리 움직이기 위해서, 스케이트보드를 사용하고 밸런스잡는 방식을 **배우기** + +[![Peter and the Wolf](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Peter and the Wolf by Prokofiev를 들으려면 이미지 클릭 + +## Reinforcement learning + +이전 섹션에서, 머신러닝 문제의 예시를 보았습니다: + +- **Supervised**, 해결하려는 문제에 대해서 예시 솔루션을 추천할 데이터셋이 있습니다. [Classification](../4-Classification/README.ko.md) 과 [regression](../2-Regression/README.ko.md)은 supervised learning 작업입니다. + +- **Unsupervised**, 라벨링된 훈련 데이터가 없습니다. unsupervised learning의 주요 예시는 [Clustering](../5-Clustering/README.ko.md)입니다. + +이 섹션에서, 라벨링된 훈련 데이터가 필요없는 학습 문제의 새로운 타입에 대하여 소개할 예정입니다. 여러 문제의 타입이 있습니다: + +- **[Semi-supervised learning](https://wikipedia.org/wiki/Semi-supervised_learning)**, 모델을 사전-훈련하며 사용할 수 있던 라벨링하지 않은 데이터를 많이 가지고 있습니다. +- **[Reinforcement learning](https://wikipedia.org/wiki/Reinforcement_learning)**, 에이전트는 시뮬레이션된 환경에서 실험해서 행동하는 방식을 학습합니다. + +### 예시 - 컴퓨터 게임 + +체스나, [Super Mario](https://wikipedia.org/wiki/Super_Mario) 같은, 게임 플레이를 컴퓨터에게 가르치고 싶다고 가정합니다. 컴퓨터가 게임을 플레이하려면, 게임 상태마다 어떻게 움직여야 되는지 예측할 필요가 있습니다. classification 문제처럼 보이겠지만, 아닙니다 - 상태와 일치하는 작업이 같이 있는 데이터셋은 없기 때문입니다. 기존 체스 경기 혹은 Super Mario를 즐기는 플레이어의 기록이 같은 소수의 데이터가 있을 수 있겠지만, 데이터가 가능한 상태의 충분히 많은 수를 커버할 수 없을 수 있습니다. + +기존 게임 데이터를 찾는 대신에, **Reinforcement Learning** (RL)은 매번 *making the computer play* 하고 결과를 지켜보는 아이디어가 기반됩니다. 그래서, Reinforcement Learning을 적용하면, 2가지가 필요합니다: + +- 게임을 계속 플레이할 수 있는 **환경**과 **시뮬레이터**. 시뮬레이터는 모든 게임 규칙의 가능한 상태와 동작을 정의합니다. + +- **Reward function**, 각자 움직이거나 게임이 진행되면서 얼마나 잘 했는지 알려줍니다. + +다른 타입의 머신러닝과 RL 사이에 다른 주요 포인트는 RL에서 일반적으로 게임을 끝내기 전에 이기거나 지는 것을 알 수 없다는 점입니다. 그래서, 특정 동작이 좋을지 나쁠지 말할 수 없습니다 - 오직 게임의 끝에서 보상을 받습니다. 그리고 목표는 불확실 조건에서 모델을 훈련할 알고리즘을 만드는 것입니다. **Q-learning**이라고 불리는 RL 알고리즘에 대하여 배울 예정입니다. + +## 강의 + +1. [Reinforcement learning과 Q-Learning 소개하기](1-QLearning/translations/EADME.ko.md) +2. [헬스장 시뮬레이션 환경 사용하기](2-Gym/translations/README.ko.md) + +## 크레딧 + +"Introduction to Reinforcement Learning" was written with ♥️ by [Dmitry Soshnikov](http://soshnikov.com) From a719c0602c9f54c398c2e81279f2f41f046dbfc3 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 24 Jul 2021 16:02:22 +0900 Subject: [PATCH 22/37] ADD : translate 9 --- 9-Real-World/README.ko.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 9-Real-World/README.ko.md diff --git a/9-Real-World/README.ko.md b/9-Real-World/README.ko.md new file mode 100644 index 0000000000..300095d773 --- /dev/null +++ b/9-Real-World/README.ko.md @@ -0,0 +1,15 @@ +# Postscript: Classic 머신러닝의 현실 애플리케이션 + +커리큘럼의 이 섹션에서, classical ML의 실제-세계 에플리케이션을 소개힐 예정입니다. 가능한 neural networks, 딥러닝과 AI를 피하면서, 이 전략을 사용한 애플리케이션에 대한 백서와 아티클을 찾으려 웹 서핑을 했습니다. ML이 비즈니스 시스템, 생태학 애플리케이션, 금융, 예술과 문화, 그리고 더 많은 곳에서 어떻게 사용되는지 배웁니다. + +![chess](images/chess.jpg) + +> Photo by Alexis Fauvet on Unsplash + +## 강의 + +1. [ML의 현실 애플리케이션](1-Applications/translations/README.ko.md) + +## 크레딧 + +"Real-World Applications" was written by a team of folks, including [Jen Looper](https://twitter.com/jenlooper) and [Ornella Altunyan](https://twitter.com/ornelladotcom). \ No newline at end of file From 14282e0d8947a890a48ed6aeed1e748e51b787ae Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Mon, 26 Jul 2021 22:45:55 +0900 Subject: [PATCH 23/37] ADD : translate 5-1 --- .../1-Visualize/translations/README.ko.md | 335 ++++++++++++++++++ 1 file changed, 335 insertions(+) create mode 100644 5-Clustering/1-Visualize/translations/README.ko.md diff --git a/5-Clustering/1-Visualize/translations/README.ko.md b/5-Clustering/1-Visualize/translations/README.ko.md new file mode 100644 index 0000000000..58ea5dde90 --- /dev/null +++ b/5-Clustering/1-Visualize/translations/README.ko.md @@ -0,0 +1,335 @@ +# Clustering 소개하기 + +Clustering이 데이터셋에 라벨을 붙이지 않거나 입력이 미리 정의한 출력과 맞지 않는다고 가정한다면 [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning) 타입입니다. 다양한 알고리즘으로 라벨링되지 않은 데이터를 정렬하고 데이터에서 식별할 패턴에 따라 묶을 수 있게 제공됩니다. + +[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") + +> 🎥 영상을 보려면 이미지 클릭. While you're studying machine learning with clustering, enjoy some Nigerian Dance Hall tracks - this is a highly rated song from 2014 by PSquare. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/27/) + +### 소개 + +[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124)은 데이터를 탐색할 때 매우 유용합니다. 나이지리아 사람들이 음악을 듣는 방식에서 트렌드와 패턴을 찾아 도움을 받을 수 있는지 봅니다. + +✅ 시간을 내서 clustering 사용법에 대해 생각해봅니다. 실생활에서, clustering은 빨래 바구니를 가지고 가족 구성원의 옷 🧦👕👖🩲을 정리하는 순간에 발생합니다. 데이터 사이언스에서, clustering은 사용자의 선호를 분석하거나, 라벨을 붙이지 않은 데이터셋 특성을 정하는 순간에 발생합니다. Clustering은, 어떤 식으로든, 양말 서랍처럼, 혼란스러움을 이해하는 순간에 도움을 받을 수 있습니다. + +[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") + +> 🎥 영상을 보려면 이미지 클릭: MIT's John Guttag introduces clustering + +전문적인 설정에서, clustering은 시장 세분화처럼 결정하면서 사용할 수 있습니다, 예시로, 특정 나이대가 어떤 아이템을 구매하는지 결정할 수 있습니다. 또 다른 용도는 anomaly detection이며, 아마도 신용 카드 거래 데이터셋에서 사기를 적발하기 위함입니다. 또는 clustering으로 의학촬영의 배치에서 종양을 판단할 수 있습니다. + +✅ 시간을 내서, 은행, 이커머스, 비지니스 설정에서, 'in the wild' 어떻게 clustering을 접했는지 생각합니다. + +> 🎓 흥미로운 사실은, cluster analysis는 1930년에 인류학과 심리학의 필드에서 유래되었습니다. 어떻게 사용했는지 상상 되나요? + +또한, 그룹화된 검색 결과를 위해서 사용합니다. - 예를 들면, 쇼핑 링크, 이미지, 또는 리뷰. Clustering은 줄이려는 대규모 데이터셋이 있고 세분화된 분석을 하고 싶을 때 유용하므로, 다른 모델이 설계되기 전까지 데이터를 학습하며 이 기술을 사용할 수 있습니다. + +✅ 데이터가 클러스터에서 구성되면, 클러스터 ID를 할당하며, 이 기술로 데이터셋의 프라이버시를 보호할 때 유용합니다; 식별할 수 있는 데이터를 더 노출하는 대신, 클러스터 ID로 데이터 포인트를 참조할 수 있습니다. 클러스터의 다른 요소가 아닌 클러스터 ID를 참조해서 식별하는 이유를 생각할 수 있나요? + +이 [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-15963-cxa)에서 clustering 기술을 깊게 이해합니다. + +## Clustering 시작하기 + +[Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html)은 clustering을 수행하는 방식의 큰 배열을 제공합니다. 선택한 타입은 사용 케이스에 따라서 달라질 예정입니다. 문서에 따르면, 각 방식에 다양한 이점이 있습니다. Scikit-learn에서 지원하는 방식과 적절한 사용 케이스에 대한 단순화된 테이블입니다: + +| Method name | Use case | +| :--------------------------- | :--------------------------------------------------------------------- | +| K-Means | general purpose, inductive | +| Affinity propagation | many, uneven clusters, inductive | +| Mean-shift | many, uneven clusters, inductive | +| Spectral clustering | few, even clusters, transductive | +| Ward hierarchical clustering | many, constrained clusters, transductive | +| Agglomerative clustering | many, constrained, non Euclidean distances, transductive | +| DBSCAN | non-flat geometry, uneven clusters, transductive | +| OPTICS | non-flat geometry, uneven clusters with variable density, transductive | +| Gaussian mixtures | flat geometry, inductive | +| BIRCH | large dataset with outliers, inductive | + +> 🎓 클러스터를 만드는 방식에서 데이터 포인트를 그룹으로 수집하는 것과 많이 비슷합니다. 몇 단어를 풀어봅니다: +> +> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Transductive 추론은 특정한 테스트 케이스로 맵핑되어 관찰된 훈련 케이스에서 유래됩니다. Inductive 추론은 오직 테스트 케이스에서만 적용되는 일반적인 규칙으로 맵핑된 훈련 케이스에서 유래됩니다. +> +> 예시: 오직 일부만 라벨링된 데이터를 가지고 있다고 생각합니다. 일부 'records', 'cds', 공백으로 이루어져 있습니다. 공백에 라벨을 제공하는 일입니다. 만약 inductive 접근법을 선택했다면, 'records'와 'cds'를 찾는 모델로 훈련하고, 라벨링되지 않은 데이터에 라벨을 적용합니다. 이 접근법은 실제 'cassettes'를 분류할 때 골치아픕니다. transductive 접근법은, 반면에, 비슷한 아이템과 함께 그룹으로 묶어서 라벨을 적용하므로 알려지지 않은 데이터보다 효과적으로 핸들링합니다. 이 케이스에서, 클러스터는 'round musical things'와 'square musical things'를 반영할 수 있습니다. +> +> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> 수학 용어에서 유래된, non-flat vs. flat 기하학은 'flat' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) 또는 'non-flat' (non-Euclidean) 기하학 방식으로 포인트 사이 거리를 특정하는 것을 의미합니다. +> +> 이 컨텍스트에서 'Flat'은 Euclidean 기하학 (일부는 'plane' 기하학으로 가르침)을, non-flat은 non-Euclidean을 나타냅니다. 기하학은 머신러닝과 어떤 연관성이 있나요? 음, 수학과 기반이 같은 두 필드라서, 클러스터에서 포인트 사이의 거리를 측정할 수 있는 공통 방식이 있으며, 데이터의 특성에 기반해서, 'flat' 또는 'non-flat'으로 마무리지을 수 있습니다. [Euclidean distances](https://wikipedia.org/wiki/Euclidean_distance)는 두 포인트 사이 선분의 길이로 측정합니다. [Non-Euclidean distances](https://wikipedia.org/wiki/Non-Euclidean_geometry)는 곡선에 따라서 측정됩니다. 만약 데이터가, 시각화되어서, 평면에 존재하지 않은 것으로 보인다면, 특별 알고리즘을 사용해서 핸들링할 수 있습니다. +> +![Flat vs Nonflat Geometry Infographic](.././images/flat-nonflat.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> 클러스터는 distance matrix로 정의됩니다, 예시로. 포인트 사이 거리입니다. 거리는 몇 방식으로 측정될 수 있습니다. Euclidean 클러스터는 포인트 값의 평균으로 정의되고, 'centroid' 또는 중심 포인트를 포함합니다. 거리는 이 중심까지 거리로 측정됩니다. Non-Euclidean 거리는 다른 포인트에서 가까운 포인트, 'clustroids'로 나타냅니다. Clustroid는 다음과 같이 다양한 방식으로 정의할 수 있습니다. +> +> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf)은 unsupervised 방식에서 'semi-supervised' 학습을 접목합니다. 포인트 사이 관계는 'cannot link' 또는 'must-link'로 플래그되어 데이터 셋에 일부 룰을 강제합니다. + +> +> 예시: 만약 알고리즘이 라벨링하지 못했거나 세미-라벨링된 데이터의 배치에서 풀리면, 만들어지는 클러스터의 품질이 내려갈 수 있습니다. 위 예시에서, 클러스터는 'round music things'와 'square music things'와 'triangular things'와 'cookies'를 그룹으로 묶을 수 있습니다. 만약 제한사항이나, 따라야할 룰이 주어진다면 ("the item must be made of plastic", "the item needs to be able to produce music") 알고리즘이 더 좋은 선택을 하도록 '제한'해서 도와줄 수 있습니다. +> +> 🎓 'Density' +> +> 'noisy' 데이터는 'dense'로 칩니다. 각 클러스터의 포인트 사이 거리에서 조금 밀집해있거나, 'crowded'한 것으로 증명할 수 있으므로, 데이터는 적당한 clustering 방식으로 분석되어질 필요가 있습니다. [This article](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html)에서 K-Means clustering vs. HDBSCAN 알고리즘을 사용해서 고르지않는 클러스터 밀집도로 노이즈 데이터셋을 찾아보고 서로 다른 차이점을 시연합니다. + +## Clustering 알고리즘 + +100개 이상 clustering 알고리즘이 있고, 현재 데이터의 특성에 기반해서 사용하는 게 다릅니다. 몇 주요 사항에 대해 이야기해봅니다: + +- **Hierarchical clustering**. 만약 오브젝트가 멀리 떨어져있지 않고, 가까운 오브젝트와 근접성으로 분류된다면, 클러스터는 다른 오브젝트의 거리에 따라서 형태가 만들어집니다. Scikit-learn의 agglomerative clustering은 계층적입니다. + + ![Hierarchical clustering Infographic](.././images/hierarchical.png) + > Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Centroid clustering**. 이 인기있는 알고리즘은 'k', 또는 형성할 클러스터의 수를 선택해야 될 필요가 있으며, 이후 알고리즘은 클러스터의 중심 포인트를 결정하고 포인트 주변 데이터를 수집합니다. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering)은 인기있는 centroid clustering 버전입니다. 중심이 가까운 평균에 따라서 이름이 정해집니다. 클러스터에서 제곱 거리가 최소화됩니다. + + ![Centroid clustering Infographic](.././images/centroid.png) + > Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Distribution-based clustering**. 통계 모델링에서, distribution-based clustering은 데이터 포인트가 클러스터에 있는 확률을 기반으로, 할당에 중점을 둡니다. Gaussian mixture 방식이 이 타입에 속합니다. + +- **Density-based clustering**. 데이터 포인트는 밀집도나 서로 그룹으로 묶어진 기반으로 클러스터에 할당합니다. 그룹에서 멀리 떨어진 데이터 포인트를 아웃라이어나 노이즈로 간주합니다. DBSCAN, Mean-shift와 OPTICS는 이 clustering 타입에 해당됩니다. + +- **Grid-based clustering**. multi-dimensional 데이터셋이면, 그리드가 만들어지고 데이터가 그리드의 셀에 나눈 뒤에, 클러스터를 만듭니다. + +## 연습 - 데이터 cluster + +기술에서 Clustering은 적절한 시각화로 크게 도움받으므로, 음악 데이터로 시각화해서 시작해봅니다. 이 연습은 데이터의 특성에 가장 효과적으로 사용할 clustering 방식을 정할 때 도움받을 수 있습니다. + +1. 이 폴더에서 _notebook.ipynb_ 파일을 엽니다. + +1. 좋은 데이터 시각화를 위해서 `Seaborn` 패키지를 가져옵니다. + + ```python + pip install seaborn + ``` + +1. _nigerian-songs.csv_ 의 노래 데이터를 추가합니다. 일부 노래 데이터가 있는 데이터 프레임을 불러옵니다. 라이브러리를 가져오고 데이터를 덤프해서 찾아봅니다: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + 데이터의 첫 몇 줄을 확인합니다: + + | | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 | + | 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 | + | 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | + | 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | + | 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | + +1. `info()`를 불러서, 데이터 프레임에 대한 약간의 정보를 얻습니다: + + ```python + df.info() + ``` + + 출력은 이렇게 보입니다: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. `isnull()`을 부르고 합산이 0인지 확인해서, Null 값을 다시 검토합니다: + + ```python + df.isnull().sum() + ``` + + 좋게 보입니다: + + ```output + name 0 + album 0 + artist 0 + artist_top_genre 0 + release_date 0 + length 0 + popularity 0 + danceability 0 + acousticness 0 + energy 0 + instrumentalness 0 + liveness 0 + loudness 0 + speechiness 0 + tempo 0 + time_signature 0 + dtype: int64 + ``` + +1. 데이터를 서술합니다: + + ```python + df.describe() + ``` + + | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | + | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | + | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | + | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | + | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | + | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | + | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | + | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | + | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | + +> 🤔 만약 라벨링 안 한 데이터가 필요하지 않은 unsupervised 방식으로, clustering을 작업하게되면, 왜 데이터로 라벨을 보여주나요? 데이터 탐색 단계에서 편리하겠지만, clustering 알고리즘이 동작할 때는 필요 없습니다. 열 헤더를 제거하고 열 넘버로 데이터를 참조할 수 있습니다. + +데이터의 일반적 값을 봅니다. 랭킹에 못 들은 음악을 보여주는 건, '0'일 수 있습니다. 바로 제거하겠습니다. + +1. 가장 인기있는 장르를 찾기 위해서 barplot을 사용합니다: + + ```python + import seaborn as sns + + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top[:5].index,y=top[:5].values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ![most popular](.././images/popular.png) + +✅ 만약 상위 값을 많이 보려면, top `[:5]`을 더 큰 값으로 변경하거나, 제거해서 다 봅니다. + +노트, 상위 장르가 'Missing'으로 서술되어 있으면, Spotify에서 분류하지 않았으므로, 제거합니다. + +1. 필터링해서 missing 데이터를 제거합니다 + + ```python + df = df[df['artist_top_genre'] != 'Missing'] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + 이제 장르를 다시 확인합니다: + + ![most popular](../images/all-genres.png) + +1. 지금까지, 상위 3개 장르가 데이터셋을 장악했습니다. `afro dancehall`, `afropop`, 그리고 `nigerian pop`에 집중하고 인기도 값이 0인 모든 것을 지우기 위해서 추가로 필터링합니다 (데이터셋에서 인기도로 분류하지 않은 것은 이 목적에서 노이즈로 간주될 수 있다는 점을 의미합니다): + + ```python + df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] + df = df[(df['popularity'] > 0)] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + +1. 특별히 강력한 방식으로 데이터에 상관 관계가 있는지 보기 위해서 빠르게 테스트합니다: + + ```python + corrmat = df.corr() + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![correlations](../images/correlation.png) + + 유일하게 강한 상관 관계는 `energy`와 `loudness` 사이에 있으며, 일반적으로 화려한 음악이 에너지 넘치는다는 사실은 놀랍지 않습니다. 아니라면, 상관 관계는 상대적으로 약합니다. clustering 알고리즘이 데이터를 만드는 과정을 보는 것은 흥미로울 예정입니다. + + > 🎓 상관 관계가 인과 관계를 의미하지 않는다는 것을 참고합니다! 상관 관계의 증거는 있지만 인과 관계의 증거가 없습니다. [amusing web site](https://tylervigen.com/spurious-correlations)에 이 점을 강조할 몇 자료가 있습니다. + +데이터셋에 노래의 perceived popularity와 danceability가 수렴되나요? FacetGrid는 장르와 관계없이, 일렬로 늘어선 동심원을 보여줍니다. 나이지리아 사람들의 취향이 이 장르에서 특정 danceability 레벨에 수렴할 수 있지 않을까요? + +✅ 다른 데이터 포인트 (energy, loudness, speechiness)와 더 많거나 다른 뮤지컬 장르로 시도합니다. 무엇을 찾을 수 있나요? 일반적으로 데이터 포인트가 확산하는 것을 보려면 `df.describe()` 테이블을 찾아봅니다. + +### 연습 - 데이터 분산 + +이 3개 장르는 인기도에 기반해서, danceability의 인지도와 상당히 다르나요? + +1. 주어진 x와 y 축에 따라서 인기도와 danceability에 대한 상위 3개 장르 데이터 분포를 찾아봅니다. + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + 일반적인 수렴 점을 중심으로 동심원을 발견해서, 점의 분포를 확인할 수 있습니다. + + > 🎓 이 예시에서 continuous probability density curve로 데이터를 나타내는 KDE (Kernel Density Estimate) 그래프를 사용합니다. 여러 분포로 작업할 때 데이터를 해석할 수 있습니다. + + 보통은, 3가지 장르가 인기도와 danceability로 루즈하게 정렬됩니다. 루즈하게-정렬된 데이터에서 클러스터를 결정하는 것은 힘듭니다: + + ![distribution](../images/distribution.png) + +1. scatter plot을 만듭니다: + + + ```python + sns.FacetGrid(df, hue="artist_top_genre", size=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + 동일 축의 scatterplot은 비슷한 수렴 패턴을 보입니다 + + ![Facetgrid](../images/facetgrid.png) + +보통, clustering은, scatterplots으로 데이터 클러스터를 표시할 수 있으므로, 이 시각화 타입을 숙지하는 것은 매우 유용합니다. 다음 강의에서, 필터링된 데이터를 가져와서 k-means clustering으로 흥미로운 방식이 겹쳐보일 이 데이터의 그룹을 찾아보겠습니다. + +--- + +## 🚀 도전 + +다음 강의를 준비하기 위해서, 프로덕션 환경에서 찾아서 사용할 수 있는 다양한 clustering 알고리즘을 차트로 만듭니다. clustering은 어떤 문제를 해결하려고 시도하나요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/28/) + +## 검토 & 자기주도 학습 + +clustering 알고리즘을 적용하기 전에, 배운대로, 데이터셋의 특성을 이해하는 게 좋습니다. 이 토픽 [here](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)을 더 읽어봅니다. + +[This helpful article](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/)에서 다양한 데이터 형태가 주어지면, 다양한 clustering 알고리즘이 동작하는 다른 방식을 알려줍니다. + +## 과제 + +[Research other visualizations for clustering](../assignment.md) From 05cf7d2fe6b8c4f4577560a81cda0c8ed4d455cb Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Wed, 28 Jul 2021 21:05:36 +0900 Subject: [PATCH 24/37] ADD : translate 5-2 --- .../2-K-Means/translations/README.ko.md | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 5-Clustering/2-K-Means/translations/README.ko.md diff --git a/5-Clustering/2-K-Means/translations/README.ko.md b/5-Clustering/2-K-Means/translations/README.ko.md new file mode 100644 index 0000000000..c5506d28e8 --- /dev/null +++ b/5-Clustering/2-K-Means/translations/README.ko.md @@ -0,0 +1,251 @@ +# K-Means clustering + +[![Andrew Ng explains Clustering](https://img.youtube.com/vi/hDmNF9JG3lo/0.jpg)](https://youtu.be/hDmNF9JG3lo "Andrew Ng explains Clustering") + +> 🎥 영상을 보려면 이미지 클릭: Andrew Ng explains clustering + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/29/) + +이 강의에서, Scikit-learn과 함께 이전에 가져온 나이지리아 음악 데이터셋으로 클러스터 제작 방식을 배울 예정입니다. Clustering을 위한 K-Means 기초를 다루게 됩니다. 참고로, 이전 강의에서 배웠던대로, 클러스터로 작업하는 여러 방식이 있고 데이터를 기반한 방식도 있습니다. 가장 일반적 clustering 기술인 K-Means을 시도해보려고 합니다. 시작해봅니다! + +다음 용어를 배우게 됩니다: + +- Silhouette scoring +- Elbow method +- Inertia +- Variance + +## 소개 + +[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering)은 신호 처리 도메인에서 파생된 방식입니다. observations 계열로서 데이터 그룹을 'k' 클러스터로 나누고 분할하며 사용했습니다. 각자 observation은 가까운 'mean', 또는 클러스터의 중심 포인트에 주어진 정밀한 데이터 포인트를 그룹으로 묶기 위해서 작동합니다. + +클러스터는 포인트(또는 'seed')와 일치하는 영역을 포함한, [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram)으로 시각화할 수 있습니다. + +![voronoi diagram](../images/voronoi.png) + +> infographic by [Jen Looper](https://twitter.com/jenlooper) + +K-Means clustering은 [executes in a three-step process](https://scikit-learn.org/stable/modules/clustering.html#k-means)로 처리됩니다: + +1. 알고리즘은 데이터셋에서 샘플링한 중심 포인트의 k-number를 선택합니다. 반복합니다: + 1. 가장 가까운 무게 중심에 각자 샘플을 할당합니다. + 2. 이전의 무게 중심에서 할당된 모든 샘플의 평균 값을 가지면서 새로운 무게 중심을 만듭니다. + 3. 그러면, 새롭고 오래된 무게 중심 사이의 거리를 계산하고 무계 중심이 안정될 때까지 반복합니다. + +K-Means을 사용한 한 가지 약점은 무게 중심의 숫자를, 'k'로 해야 된다는 사실입니다. 다행스럽게 'elbow method'는 'k' 값을 좋게 시작할 수 있게 추정하는 데 도움을 받을 수 있습니다. 몇 분동안 시도할 예정입니다. + +## 전제 조건 + +마지막 강의에서 했던 데이터를 가져와서 미리 정리한 이 강의의 _notebook.ipynb_ 파일로 작업할 예정입니다. + +## 연습 - 준비하기 + +노래 데이터를 다시 보는 것부터 시작합니다. + +1. 각 열에 `boxplot()`을 불러서, boxplot을 만듭니다: + + ```python + plt.figure(figsize=(20,20), dpi=200) + + plt.subplot(4,3,1) + sns.boxplot(x = 'popularity', data = df) + + plt.subplot(4,3,2) + sns.boxplot(x = 'acousticness', data = df) + + plt.subplot(4,3,3) + sns.boxplot(x = 'energy', data = df) + + plt.subplot(4,3,4) + sns.boxplot(x = 'instrumentalness', data = df) + + plt.subplot(4,3,5) + sns.boxplot(x = 'liveness', data = df) + + plt.subplot(4,3,6) + sns.boxplot(x = 'loudness', data = df) + + plt.subplot(4,3,7) + sns.boxplot(x = 'speechiness', data = df) + + plt.subplot(4,3,8) + sns.boxplot(x = 'tempo', data = df) + + plt.subplot(4,3,9) + sns.boxplot(x = 'time_signature', data = df) + + plt.subplot(4,3,10) + sns.boxplot(x = 'danceability', data = df) + + plt.subplot(4,3,11) + sns.boxplot(x = 'length', data = df) + + plt.subplot(4,3,12) + sns.boxplot(x = 'release_date', data = df) + ``` + + 이 데이터는 약간의 노이즈가 있습니다: 각 열을 boxplot으로 지켜보면 아웃라이어를 볼 수 있습니다. + + ![outliers](../images/boxplots.png) + +데이터셋을 찾고 이 아웃라이어를 제거하는 대신에, 데이터는 꽤 작아지게 됩니다. + +1. 지금부터, clustering 연습에서 사용할 열을 선택합니다. 유사한 범위로 하나 선택하고 `artist_top_genre` 열을 숫자 데이터로 인코딩합니다: + + ```python + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + + X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] + + y = df['artist_top_genre'] + + X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) + + y = le.transform(y) + ``` + +1. 이제 얼마나 많은 클러스터를 타겟으로 잡을지 선택해야 합니다. 데이터셋에서 조각낸 3개 장르가 있으므로, 3개를 시도합니다: + + ```python + from sklearn.cluster import KMeans + + nclusters = 3 + seed = 0 + + km = KMeans(n_clusters=nclusters, random_state=seed) + km.fit(X) + + # Predict the cluster for each data point + + y_cluster_kmeans = km.predict(X) + y_cluster_kmeans + ``` + +데이터 프레임의 각 열에서 예측된 클러스터 (0, 1,또는 2)로 배열을 출력해서 볼 수 있습니다. + +1. 배열로 'silhouette score'를 계산합니다: + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Silhouette score + +1에 근접한 silhouette score를 찾아봅니다. 이 점수는 -1에서 1까지 다양하며, 클러스터가 밀접하여 다른 것과 잘-분리됩니다. 0 근접 값은 주변 클러스터의 decision boundary에 매우 가까운 샘플과 함께 클러스터를 오버랩헤서 니타냅니다. [source](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam). + +**.53** 점이므로, 중간에 위치합니다. 데이터가 이 clustering 타입에 특히 잘-맞지 않다는 점을 나타내고 있지만, 계속 진행합니다. + +### 연습 - 모델 만들기 + +1. `KMeans`을 import 하고 clustering 처리를 시작합니다. + + ```python + from sklearn.cluster import KMeans + wcss = [] + + for i in range(1, 11): + kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) + kmeans.fit(X) + wcss.append(kmeans.inertia_) + + ``` + + 여기 설명을 뒷받침할 몇 파트가 있습니다. + + > 🎓 range: clustering 프로세스의 반복입니다 + + > 🎓 random_state: "Determines random number generation for centroid initialization."[source](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "within-cluster sums of squares"은 클러스터 무게 중심으로 클러스터에서 모든 포인트의 squared average 거리를 측정합니다. [source](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Inertia: K-Means 알고리즘은 'inertia'를 최소로 유지하기 위해서 무게 중심을 선택하려고 시도합니다, "a measure of how internally coherent clusters are."[source](https://scikit-learn.org/stable/modules/clustering.html). 값은 각 반복에서 wcss 변수로 추가됩니다. + + > 🎓 k-means++: [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means)에서 'k-means++' 최적화를 사용할 수 있고, 무게 중심을 (일반적인) 거리로 각자 떨어져서 초기화하면, 아마 랜덤 초기화보다 더 좋은 결과로 이어질 수 있습니다. + +### Elbow method + +예전에 추측했던 것을 기반으로, 3개 노래 장르를 타겟팅 했으므로, 3게 클러스터를 선택해야 되었습니다. 그러나 그랬어야만 하나요? + +1. 'elbow method'을 사용해서 확인합니다. + + ```python + plt.figure(figsize=(10,5)) + sns.lineplot(range(1, 11), wcss,marker='o',color='red') + plt.title('Elbow') + plt.xlabel('Number of clusters') + plt.ylabel('WCSS') + plt.show() + ``` + + 이전 단계에서 만들었던 `wcss` 변수로, 최적 클러스터 수를 나타낼 elbow의 'bend'가 어디있는지 보여주는 차트를 만듭니다. 아마도 3 **입니다**! + + ![elbow method](../images/elbow.png) + +## 연습 - 클러스터 보이기 + +1. 프로세스를 다시 시도하여, 이 시점에 3개 클러스터를 다시 설정하고, scatterplot으로 클러스터를 보여줍니다: + + ```python + from sklearn.cluster import KMeans + kmeans = KMeans(n_clusters = 3) + kmeans.fit(X) + labels = kmeans.predict(X) + plt.scatter(df['popularity'],df['danceability'],c = labels) + plt.xlabel('popularity') + plt.ylabel('danceability') + plt.show() + ``` + +1. 모델 정확도를 확인합니다: + + ```python + labels = kmeans.labels_ + + correct_labels = sum(y == labels) + + print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) + + print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) + ``` + + 이 모델의 정확도는 매우 좋지 않으며, 클러스터의 형태가 왜 그랬는지 힌트를 줍니다. + + ![clusters](../images/clusters.png) + + 이 데이터는 매우 불안정하며, 상관 관계가 낮고 열 값 사이에 편차가 커서 잘 클러스터될 수 없습니다. 사실, 만들어진 클러스터는 정의한 3개 장르 카테고리에 크게 영향받거나 뒤틀릴 수 있습니다. 학습 프로세스입니다! + + Scikit-learn 문서에, 클러스터가 매우 명확하지 않은 모델, 'variance' 문제가 있습니다: + + ![problem models](../images/problems.png) + > Infographic from Scikit-learn + +## Variance + +Variance는 "the average of the squared differences from the Mean."으로 정의되었습니다. [source](https://www.mathsisfun.com/data/standard-deviation.html) 이 clustering 문제의 컨텍스트에서, 데이터셋 숫자가 평균에서 너무 크게 이탈되어 데이터로 나타냅니다. + +✅ 이 이슈를 해결할 모든 방식을 생각해보는 훌륭한 순간입니다. 데이터를 조금 트윅해볼까요? 다른 열을 사용해볼까요? 다른 알고리즘을 사용해볼까요? 힌트: [scaling your data](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/)로 노멀라이즈하고 다른 컬럼을 테스트헤봅니다. + +> '[variance calculator](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)'로 좀 더 개념을 이해해봅니다. + +--- + +## 🚀 도전 + +파라미터를 트윅하면서, 노트북으로 시간을 보냅니다. 데이터를 더 정리해서 (예시로, 아웃라이어 제거) 모델의 정확도를 개선할 수 있나요? 가중치로 주어진 데이터 샘플에서 더 가중치를 줄 수 있습니다. 괜찮은 클러스터를 만들기 위헤 어떤 다른 일을 할 수 있나요? + +힌트: 데이터를 더 키워봅니다. 가까운 범위 조건에 비슷한 데이터 열을 만들고자 추가하는 표준 스케일링 코드를 노트북에 주석으로 남겼습니다. silhouette 점수가 낮아지는 동안, elbow 그래프의 'kink'가 주름 펴지는 것을 볼 수 있습니다. 데이터를 조정하지 않고 남기면 덜 분산된 데이터가 더 많은 가중치로 나를 수 있다는 이유입니다. [here](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226) 이 문제를 조금 더 읽어봅니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/30/) + +## 검토 & 자기주도 학습 + +Stanford의 K-Means 시뮬레이터를 찾아봅니다 [here](https://stanford.edu/class/engr108/visualizations/kmeans/kmeans.html). 이 도구로 샘플 데이터 포인트를 시각화하고 무게 중심을 결정할 수 있습니다. 새로운 데이터로, 'update'를 클릭해서 수렴을 찾는데 얼마나 오래 걸리는지 봅니다. 데이터의 랜덤성, 클러스터 수와 무게 중심 수를 고칠 수 있습니다. 데이터를 그룹으로 묶기 위한 아이디어를 얻는 게 도움이 되나요? + +또한, Stanford의 [this handout on k-means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html)을 찾아봅니다. + +## 과제 + +[Try different clustering methods](../assignment.md) From 7d9331b5010e3b102c3edb2474278d1fb043d098 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Fri, 30 Jul 2021 18:26:06 +0900 Subject: [PATCH 25/37] ADD : translate 6-1 --- .../translations/README.ko.md | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 6-NLP/1-Introduction-to-NLP/translations/README.ko.md diff --git a/6-NLP/1-Introduction-to-NLP/translations/README.ko.md b/6-NLP/1-Introduction-to-NLP/translations/README.ko.md new file mode 100644 index 0000000000..46b9506dfa --- /dev/null +++ b/6-NLP/1-Introduction-to-NLP/translations/README.ko.md @@ -0,0 +1,165 @@ +# Natural language processing 소개하기 + +이 강의애서 *computational linguistics* 하위인, *natural language processing*의 간단한 역사와 중요 컨셉을 다룹니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/31/) + +## 소개 + +일반적으로 알고있는, NLP는, 머신러닝이 프로덕션 소프트웨어에 적용되어 사용하는 잘-알려진 영역 중 하나입니다. + +✅ 항상 사용하는 소프트웨어에서 NLP가 들어갈 수 있는지 생각할 수 있나요? 규칙적으로 사용하는 워드 프로그램이나 모바일 앱은 어떤가요? + +해당 내용을 배우게 됩니다: + +- **언어의 아이디어**. 언어가 어떻게 발전했고 어떤 주요 연구 영역인가요? +- **정의와 컨셉**. 또한 파싱, 문법, 그리고 명사와 동사를 식별하는 것을 합쳐서, 컴퓨터가 텍스트를 처리하는 방식에 대한 정의와 개념을 배우게 됩니다. 이 강의에서 약간의 코딩 작업을 하며, 다음 강의 뒤에 배울 코드에서 중요한 개념을 소개합니다. + +## 전산 언어학 + +전산 언어학은 컴퓨터가 언어와 합쳐서 이해, 번역, 그리고 커뮤니케이션 방식을 연구하는 수십 년을 넘어 연구 개발하고 있는 영역입니다. natural language processing (NLP)은 컴퓨터가 인간 언어를, 'natural'하게, 처리할 수 있는 것에 초점을 맞춘 관련 필드입니다. + +### 예시 - 전화번호 받아쓰기 + +만약 핸드폰에 타이핑하거나 가상 어시스턴트에 질문을 했다면, 음성은 텍스트 형태로 변환되고 언급한 언어에서 처리되거나 *파싱*됩니다. 감지된 키워드는 핸드폰이나 어시스턴트가 이해하고 행동할 수 있는 포맷으로 처리됩니다. + +![comprehension](../images/comprehension.png) +> Real linguistic comprehension is hard! Image by [Jen Looper](https://twitter.com/jenlooper) + +### 이 기술은 어떻게 만들어지나요? + +누군가 컴퓨터 프로그램을 작성했기 때문에 가능합니다. 수십 년 전에, 과학소설 작가는 사람들이 컴퓨터와 이야기하며, 컴퓨터가 그 의미를 항상 정확히 이해할 것이라고 예측했습니다. 슬프게, 많은 사람들이 상상했던 내용보다 더 어려운 문제로 밝혀졌고, 이제 더 잘 이해되는 문제이지만, 문장 의미를 이해함에 있어서 'perfect'한 natural language processing을 성공하기에는 상당히 어렵습니다. 유머를 이해하거나 문장에서 풍자처럼 감정을 알아차릴 때 특히 어렵습니다. + +이 포인트에서, 학교 수업에서 선생님이 문장의 문법 파트를 가르쳤던 기억을 회상할 수 있습니다. 일부 국가에서는, 학생에게 문법과 언어학을 전공 과목으로 가르치지만, 많은 곳에서, 이 주제를 언어 학습의 일부로 합칩니다: 초등학교에서 모국어(읽고 쓰는 방식 배우기)와 중학교나, 고등학교에서 제2 외국어를 배울 수 있습니다. 만약 명사와 형용사 또는 부사를 구분하는 전문가가 아니라고 해도 걱정하지 맙시다! + +만약 *simple present*와 *present progressive* 사이에서 몸부림치면, 혼자가 아닙니다. 모국어를 언어로 쓰는, 많은 사람들에게 도전입니다. 좋은 소식은 컴퓨터가 형식적인 규칙을 적용하는 것은 매우 좋고, 사람말고 문장을 *parse*할 수 있는 코드로 작성하는 방식을 배우게 됩니다. 나중에 할 큰 도전은 문장의 *meaning*과, *sentiment*를 이해하는 것입니다. + +## 전제 조건 + +이 강의에서, 주요 전제 조건은 이 강의의 언어를 읽고 이해해야 합니다. 풀 수 있는 수학 문제나 방정식이 아닙니다. 원작자가 영어로 이 강의를 작성했지만, 다른 언어로 번역되었으므로, 번역본으로 읽을 수 있게 되었습니다. 다른 언어로 사용된 (다른 언어의 다른 문법을 비교하는) 예시가 있습니다. 번역을 *하지 않았어도*, 설명 텍스트는, 의미가 명확해야 합니다. + +코딩 작업이면, Python으로 Python 3.8 버전을 사용할 예정입니다. + +이 섹션에서, 필요하고, 사용할 예정입니다: + +- **Python 3 이해**. Python 3의 프로그래밍 언어 이해. 이 강의에서는 입력, 반복, 파일 입력, 배열을 사용합니다. +- **Visual Studio Code + 확장**. Visual Studio Code와 Python 확장을 사용할 예정입니다. 선택에 따라 Python IDE를 사용할 수 있습니다. +- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob)은 간단한 Python 텍스트 처리 라이브러리입니다. TextBlob 사이트 설명을 따라서 시스템에 설치합니다 (보이는 것처럼, corpora도 설치합니다): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 팁: VS Code 환경에서 Python을 바로 실행할 수 있습니다. [docs](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-15963-cxa)으로 정보를 더 확인합니다. + +## 기계와 대화하기 + +컴퓨터가 인간 언어를 이해하려 시도한 역사는 수십 년전으로, natural language processing을 고려한 초창기 사이언티스트 중 한 사람이 *Alan Turing*입니다. + +### 'Turing test' + +Turing이 1950년에 *artificial intelligence*를 연구하고 있을 때, 만약 대화하고 있는 사람이 다른 사람이나 컴퓨터와 대화하고 있는지 확신할 수 없다면, 사람과 컴퓨터의 대화를 (타이핑된 통신으로) 테스트할 수 있는지 고려했습니다. + +만약, 일정 대화 이후에, 사람이 컴퓨터에서 나온 대답인지 결정할 수 없다면, 컴퓨터가 *thinking*하고 있다고 말할 수 있나요? + +### 영감 - 'the imitation game' + +*The Imitation Game*으로 불리는 파티 게임에서 유래된 아이디어로 질문자가 방에 혼자있고 (다른 방의) 두 사람 중 남성과 여성을 결정할 일을 맡게 됩니다. 질문하는 사람은 노트를 보낼 수 있으며, 성별을 알 수 없는 사람이 작성해서 보낼 답변을 생각하고 질문해야 합니다. 당연하게, 다른 방에 있는 사람도 잘 못 이끌거나 혼동하는 방식으로 답변하며, 정직하게 대답해주는 모습을 보여 질문하는 사람을 속이려고 합니다. + +### Eliza 개발 + +1960년에 *Joseph Weizenbaum*으로 불린 MIT 사이언티스트는, 사람의 질문을 답변하고 답변을 이해하는 모습을 주는 컴퓨터 'therapist' [*Eliza*](https:/wikipedia.org/wiki/ELIZA)를 개발했습니다. 하지만, Eliza는 문장을 파싱하고 특정 문법 구조와 키워드를 식별하여 이유있는 답변을 준다고 할 수 있지만, 문장을 *understand*한다고 말할 수 없습니다. 만약 Eliza가 "**I am** sad" 포맷과 유사한 문장을 제시받으면 문장에서 단어를 재배열하고 대치해서 "How long have **you been** sad" 형태로 응답할 수 있습니다. + +Eliza가 문장을 이해하고 다음 질문을 대답하는 것처럼 인상을 줬지만, 실제로는, 시제를 바꾸고 일부 단어를 추가했을 뿐입니다. 만약 Eliza가 응답할 키워드를 식별하지 못하는 경우, 여러 다른 문장에 적용할 수 있는 랜덤 응답으로 대신합니다. 만약 사용자가 "**You are** a bicycle"라고 작성하면 더 이유있는 응답 대신에, "How long have **I been** a bicycle?"처럼 답변하므로, Eliza는 쉽게 속을 수 있습니다. + +[![Chatting with Eliza](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Chatting with Eliza") + +> 🎥 original ELIZA program에 대한 영상보려면 이미지 클릭 + +> 노트: ACM 계정을 가지고 있다면 출판된 [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) 원본 설명을 읽을 수 있습니다. 대신, [wikipedia](https://wikipedia.org/wiki/ELIZA)에서 Eliza에 대한 내용을 읽을 수도 있습니다. + +## 연습 - 기초 대화 봇 코드 작성하기 + +Eliza와 같은, 대화 봇은, 사용자 입력을 유도해서 지능적으로 이해하고 답변하는 프로그램입니다. Eliza와 다르게, 봇은 지능적 대화 형태를 띄는 여러 룰이 없습니다. 대신, 봇은 대부분 사소한 대화에서 작동할 랜덤으로 응답해서 대화를 지속하는, 하나의 능력만 가지고 있을 것입니다. + +### 계획 + +대화 봇을 만들 몇 단계가 있습니다: + +1. 봇과 상호작용하는 방식을 사용자에 알려줄 명령 출력 +2. 반복 시작 + 1. 사용자 입력 승인 + 2. 만약 사용자 종료 요청하면, 종료 + 3. 사용자 입력 처리 및 응답 결정 (이 케이스는, 응답할 수 있는 일반적인 대답 목록에서 랜덤 선택) + 4. 응답 출력 +3. 2 단계로 돌아가서 반복 + +### 봇 만들기 + +다음으로 봇을 만듭니다. 약간의 구문을 정의해서 시작해볼 예정입니다. + +1. 해당 랜덤 응답으로 Python에서 봇을 만듭니다: + + ```python + random_responses = ["That is quite interesting, please tell me more.", + "I see. Do go on.", + "Why do you say that?", + "Funny weather we've been having, isn't it?", + "Let's change the subject.", + "Did you catch the game last night?"] + ``` + + 가이드하는 약간의 샘플 출력이 있습니다 (사용자 입력은 라인의 시작점에 `>` 있습니다): + + ```output + Hello, I am Marvin, the simple robot. + You can end this conversation at any time by typing 'bye' + After typing each answer, press 'enter' + How are you today? + > I am good thanks + That is quite interesting, please tell me more. + > today I went for a walk + Did you catch the game last night? + > I did, but my team lost + Funny weather we've been having, isn't it? + > yes but I hope next week is better + Let's change the subject. + > ok, lets talk about music + Why do you say that? + > because I like music! + Why do you say that? + > bye + It was nice talking to you, goodbye! + ``` + + 작업에 맞는 하나의 솔루션은 [here](../solution/bot.py) 입니다 + + ✅ 잠시 멈추고 생각합니다 + + 1. 랜덤 응답이 실제로 누군가를 이해했다고 생각하게 'trick'을 쓴다고 생각하나요? + 2. 봇이 더 효과있으려면 어떤 기능을 해야 될까요? + 3. 만약 봇이 문장의 의미를 정말 'understand' 했다면, 대화에서 이전 문장의 의미도 'remember'할 필요가 있을까요? + +--- + +## 🚀 도전 + +"잠시 멈추고 생각합니다" 항목 중 하나를 골라서 코드를 구현하거나 의사 코드로 종이에 솔루션을 작성합니다. + +다음 강의에서, natural language와 머신러닝을 분석하는 여러 다른 접근 방식에 대해 배울 예정입니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/32/) + +## 검토 & 자기주도 학습 + +더 읽을 수 있는 틈에 아래 레퍼런스를 찾아봅니다. + +### 레퍼런스 + +1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . +2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. + +## 과제 + +[Search for a bot](../assignment.md) From 90fc9a1c4ccbf9cfb32aa74f5cb906fc4d826dcd Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 31 Jul 2021 15:12:34 +0900 Subject: [PATCH 26/37] ADD : translate 6-2 --- 6-NLP/2-Tasks/translations/README.ko.md | 214 ++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 6-NLP/2-Tasks/translations/README.ko.md diff --git a/6-NLP/2-Tasks/translations/README.ko.md b/6-NLP/2-Tasks/translations/README.ko.md new file mode 100644 index 0000000000..8410026037 --- /dev/null +++ b/6-NLP/2-Tasks/translations/README.ko.md @@ -0,0 +1,214 @@ +# 일반적인 natural language processing 작업과 기술 + +대부분 *natural language processing* 작업으로, 처리한 텍스트를 분해하고, 검사하고, 그리고 결과를 저장하거나 룰과 데이터셋을 서로 참조했습니다. 이 작업들로, 프로그래머가 _meaning_ 또는 _intent_ 또는 오직 텍스트에 있는 용어와 단어의 _frequency_ 만 끌어낼 수 있게 합니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/33/) + +텍스트를 처리하며 사용했던 일반적인 기술을 찾아봅니다. 머신러닝에 결합된, 이 기술은 효율적으로 많은 텍스트를 분석하는데 도와줍니다. 그러나, 이 작업에 ML을 적용하기 전에, NLP 스페셜리스트가 일으킨 문제를 이해합니다. + +## NLP의 공통 작업 + +작업하고 있는 텍스트를 분석하는 다양한 방식이 있습니다. 진행할 작업과 이 작업으로 텍스트 이해도로 측정하고 결론을 지을 수 있습니다. 대부분 순서대로 작업합니다. + +### Tokenization + +아마 많은 NLP 알고리즘으로 처음 할 일은 토큰이나, 단어로 텍스트를 나누는 것입니다. 간단하게 들리지만, 문장 부호와 다른 언어의 단어와 문장 구분 기호를 고려하는 건 까다로울 수 있습니다. + +![tokenization](../images/tokenization.png) +> Tokenizing a sentence from **Pride and Prejudice**. Infographic by [Jen Looper](https://twitter.com/jenlooper) + +### Embeddings + +[Word embeddings](https://wikipedia.org/wiki/Word_embedding)은 텍스트 데이터를 숫자처럼 변환하는 방식입니다. Embeddings은 의미가 비슷한 단어이거나 cluster와 단어를 함께 쓰는 방식으로 이루어집니다. + +![word embeddings](../images/embedding.png) +> "I have the highest respect for your nerves, they are my old friends." - Word embeddings for a sentence in **Pride and Prejudice**. Infographic by [Jen Looper](https://twitter.com/jenlooper) + +✅ [this interesting tool](https://projector.tensorflow.org/)로 단어 embeddings를 실험해봅니다. 하나의 단어를 클릭하면 비슷한 단어의 클러스터를 보여줍니다: 'disney', 'lego', 'playstation', 그리고 'console'이 'toy' 클러스터에 있있습니다. + +### 파싱 & Part-of-speech Tagging + +토큰화된 모든 단어는 품사를 명사, 동사, 형용사로 테그할 수 있습니다. `the quick red fox jumped over the lazy brown dog` 문장은 fox = noun, jumped = verb로 POS 태그될 수 있습니다. + +![parsing](../images/parse.png) + +> Parsing a sentence from **Pride and Prejudice**. Infographic by [Jen Looper](https://twitter.com/jenlooper) + +파싱은 문장에서 각자 단어들이 관련있는지 인식하는 것입니다. 예시로 `the quick red fox jumped`는 `lazy brown dog` 시퀀스와 나눠진 형용사-명사-동사 시퀀스 입니다. + +### 단어와 구문 빈도 + +텍스트의 많은 분량을 분석할 때 유용한 순서는 흥미있는 모든 단어 또는 자주 나오는 사전을 만드는 것입니다. `the quick red fox jumped over the lazy brown dog` 문구는 단어 빈도가 2 입니다. + +단어 빈도를 세는 예시를 찾아봅니다. Rudyard Kipling의 시인 The Winners는 다음을 담고 있습니다: + +```output +What the moral? Who rides may read. +When the night is thick and the tracks are blind +A friend at a pinch is a friend, indeed, +But a fool to wait for the laggard behind. +Down to Gehenna or up to the Throne, +He travels the fastest who travels alone. +``` + +구문 빈도는 필요에 의해서 대소문자를 구분하지 않거나 구분하므로, `a friend`는 빈도 2이고 `the`는 빈도 6, 그리고 `travels`는 2입니다. + +### N-grams + +텍스트는 지정한 길이의 단어 시퀀스, 한 단어(unigram), 두 단어(bigrams), 세 단어(trigrams) 또는 모든 수의 단어(n-grams)로 나눌 수 있습니다. + +예시로 n-gram 2점인 `the quick red fox jumped over the lazy brown dog`는 다음 n-grams을 만듭니다: + +1. the quick +2. quick red +3. red fox +4. fox jumped +5. jumped over +6. over the +7. the lazy +8. lazy brown +9. brown dog + +문장 위 슬라이드 박스로 시각화하는 게 쉬울 수 있습니다. 여기는 3 단어로 이루어진 n-grams이며, n-gram은 각 문장에서 볼드체로 있습니다: + +1. **the quick red** fox jumped over the lazy brown dog +2. the **quick red fox** jumped over the lazy brown dog +3. the quick **red fox jumped** over the lazy brown dog +4. the quick red **fox jumped over** the lazy brown dog +5. the quick red fox **jumped over the** lazy brown dog +6. the quick red fox jumped **over the lazy** brown dog +7. the quick red fox jumped over **the lazy brown** dog +8. the quick red fox jumped over the **lazy brown dog** + +![n-grams sliding window](../images/n-grams.gif) + +> N-gram value of 3: Infographic by [Jen Looper](https://twitter.com/jenlooper) + +### Noun phrase 추출 + +대부분 문장에서, 문장의 주어나, 목적어인 명사가 있습니다. 영어에서, 자주 'a' 또는 'an' 또는 'the'가 앞에 오게 가릴 수 있습니다. "noun phrase 추출'로 문장의 주어 또는 목적어를 가려내려 하는 것은 NLP에서 문장의 의미를 이해할 때 일반적인 작업입니다. + +✅ "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun." 문장에서, noun phrases를 가려낼 수 있나요? + +`the quick red fox jumped over the lazy brown dog` 문장에서 noun phrases 2개가 있습니다: **quick red fox** 와 **lazy brown dog**. + +### 감정 분석 + +문장이나 텍스트는 감정이나, *positive* 또는 *negative*인지 분석할 수 있습니다. 감정은 *polarity* 와 *objectivity/subjectivity*로 측정됩니다. Polarity는 -1.0 에서 1.0 (negative 에서 positive) 이며 0.0 에서 1.0 (가장 객관적에서 가장 주관적으로)으로 측정됩니다. + +✅ 나중에 머신러닝으로 감정을 판단하는 다른 방식을 배울 수 있지만, 하나의 방식은 전문가가 positive 또는 negative로 분류된 단어와 구분의 리스트를 가지고 polarity 점수를 계산한 텍스트로 모델을 적용하는 것입니다. 일부 상황에서 어떻게 작동하고 다른 상황에서도 잘 동작하는지 볼 수 있나요? + +### Inflection + +Inflection은 단어를 가져와서 단수나 복수 단어를 얻게 됩니다. + +### Lemmatization + +*lemma*는 단어 세트에서 어원이나 표제어고, 예시로 *flew*, *flies*, *flying*은 *fly* 동사의 lemma를 가지고 있습니다. + +특히, NLP 연구원이 사용할 수 있는 유용한 데이터베이스도 있습니다: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/)은 다양한 언어로 모든 단어를 단어, 동의어, 반의어 그리고 다양한 기타 내용으로 이룬 데이터베이스입니다. 번역, 맞춤법 검사, 또는 모든 타입의 언어 도구를 만드려고 시도할 때 매우 유용합니다. + +## NLP 라이브러리 + +운 좋게, 훌륭한 Python 라이브러리로 natural language processing이나 머신러닝에 전문적이지 않은 개발자도 쉽게 접근할 수 있으므로, 이 기술을 스스로 다 만들지 않아도 됩니다. 다음 강의에서 더 많은 예시를 포함하지만, 여기에서 다음 작업에 도움이 될 몇 유용한 예시를 배울 예정입니다. + +### 연습 - `TextBlob` 라이브러리 사용 + +이 타입의 작업을 처리하는 유용한 API를 포함한 TextBlob이라고 불리는 라이브리를 사용합니다. TextBlob은 "stands on the giant shoulders of [NLTK](https://nltk.org) and [pattern](https://github.com/clips/pattern), and plays nicely with both."이며 API에서 상당히 많이 ML이 녹아들어졌습니다. + +> 노트: 잘하는 Python 개발자를 위해서 추천하는 TextBlob의 유용한 [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) 가이드가 존재합니다 + +*noun phrases* 식별하려고 시도하는 순간, TextBlob은 noun phrases를 찾고자 몇 추출 옵션을 제공합니다. + +1. `ConllExtractor` 봅니다. + + ```python + from textblob import TextBlob + from textblob.np_extractors import ConllExtractor + # import and create a Conll extractor to use later + extractor = ConllExtractor() + + # later when you need a noun phrase extractor: + user_input = input("> ") + user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified + np = user_input_blob.noun_phrases + ``` + + > 어떤 일이 생기나요? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor)는 "A noun phrase extractor that uses chunk parsing trained with the ConLL-2000 training corpus."입니다. ConLL-2000은 2000 Conference on Computational Natural Language Learning을 의미합니다. 매년 까다로운 NLP 문제를 해결하기 위한 워크숍을 호스트하는 컨퍼런스이며, 2000년에는 noun chunking이었습니다. 모델은 "sections 15-18 as training data (211727 tokens) and section 20 as test data (47377 tokens)"로 Wall Street Journal에서 훈련되었습니다. [here](https://www.clips.uantwerpen.be/conll2000/chunking/)에서 사용한 순서와 [results](https://ifarm.nl/erikt/research/np-chunking.html)를 볼 수 있습니다. + +### 도전 - NLP로 봇 개선하기 + +이전 강의에서 매우 간단한 Q&A 봇을 만들었습니다. 이제, 감정을 넣어서 분석하고 감정과 맞는 응답을 출력하여 Marvin을 좀 더 감성적으로 만듭니다. 또 `noun_phrase`를 식별하고 물어볼 필요가 있습니다. + +더 좋은 대화 봇을 만들 때 단계가 있습니다: + +1. 사용자에게 봇과 상호작용하는 방식 출력 +2. 반복 시작 + 1. 사용자 입력 승인 + 2. 만약 사용자가 종료 요청하면, 종료 + 3. 사용자 입력 처리하고 적절한 감정 응답 결정 + 4. 만약 감정에서 noun phrase 탐지되면, 복수형 변경하고 이 토픽에서 입력 추가 요청 + 5. 응답 출력 +3. 2 단계로 돌아가서 반복 + +여기 TextBlob으로 감정을 탐지하는 코드 스니펫이 있습니다. 감정 응답에 4개 *gradients*만 있다는 점을 참고합니다 (좋아하는 경우 더 가질 수 있음): + +```python +if user_input_blob.polarity <= -0.5: + response = "Oh dear, that sounds bad. " +elif user_input_blob.polarity <= 0: + response = "Hmm, that's not great. " +elif user_input_blob.polarity <= 0.5: + response = "Well, that sounds positive. " +elif user_input_blob.polarity <= 1: + response = "Wow, that sounds great. " +``` + +여기는 가이드할 약간의 샘플 출력이 있습니다 (사용자 입력은 라인 시작에 > 있습니다): + +```output +Hello, I am Marvin, the friendly robot. +You can end this conversation at any time by typing 'bye' +After typing each answer, press 'enter' +How are you today? +> I am ok +Well, that sounds positive. Can you tell me more? +> I went for a walk and saw a lovely cat +Well, that sounds positive. Can you tell me more about lovely cats? +> cats are the best. But I also have a cool dog +Wow, that sounds great. Can you tell me more about cool dogs? +> I have an old hounddog but he is sick +Hmm, that's not great. Can you tell me more about old hounddogs? +> bye +It was nice talking to you, goodbye! +``` + +작업에 대한 하나의 가능한 솔루션은 [here](../solution/bot.py) 있습니다. + +✅ 지식 점검 + +1. 봇이 그 사람들을 실제로 이해했다고 생각할 수 있게 감성적인 반응으로 'trick'할 수 있다고 생각하나요? +2. noun phrase를 식별하면 봇을 더 '믿을' 수 있나요? +3. 문장에서 'noun phrase'를 추출하는 이유는 무엇인가요? + +--- + +이전의 지식 점검에서 봇을 구현하고 친구에게 테스트해봅니다. 그들을 속일 수 있나요? 좀 더 '믿을 수'있게 봇을 만들 수 있나요? + +## 🚀 도전 + +이전의 지식 점검에서 작업하고 구현합니다. 친구에게 봇을 테스트합니다. 그들을 속일 수 있나요? 좀 더 '믿을 수'있게 봇을 만들 수 있나요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/34/) + +## 검토 & 자기주도 학습 + +다음 몇 강의에서 감정 분석에 대하여 더 배울 예정입니다. [KDNuggets](https://www.kdnuggets.com/tag/nlp) 같은 아티클에서 흥미로운 기술을 연구합니다. + +## 과제 + +[Make a bot talk back](../assignment.md) From a57bc91e30e9101912734393787944ee53f8b6aa Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 1 Aug 2021 18:13:51 +0900 Subject: [PATCH 27/37] ADD : translate 6-3 --- .../translations/README.ko.md | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 6-NLP/3-Translation-Sentiment/translations/README.ko.md diff --git a/6-NLP/3-Translation-Sentiment/translations/README.ko.md b/6-NLP/3-Translation-Sentiment/translations/README.ko.md new file mode 100644 index 0000000000..b051f18437 --- /dev/null +++ b/6-NLP/3-Translation-Sentiment/translations/README.ko.md @@ -0,0 +1,188 @@ +# ML로 번역하고 감정 분석하기 + +이전 강의에서 noun phrase 추출하는 기초 NLP 작업을 하기 위해 ML behind-the-scenes을 포함한 라이브러리인, `TextBlob`으로 기본적인 봇을 만드는 방식을 배웠습니다. 컴퓨터 언어학에서 다른 중요한 도전은 구두나 다른 언어로 문장을 정확하게 _translation_ 하는 것입니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/35/) + +번역은 천여 개 언어와 각자 많이 다른 문법 규칙이 있다는 사실에 의해서 합쳐진 매우 어려운 문제입니다. 한 접근 방식은 영어처럼, 한 언어의 형식적인 문법 규칙을 비-언어 종속 구조로 변환하고, 다른 언어로 변환하면서 번역합니다. 이 접근 방식은 다음 단계로 진행된다는 점을 의미합니다: + +1. **Identification**. nouns, verbs 등으로 입력하는 언어의 단어를 식별하거나 태그를 답니다. +2. **Create translation**. 타겟 언어 포맷의 각 단어로 바로 번역합니다. + +### 예시 문장, 영어를 아일랜드어로 + +'영어'에서, _I feel happy_ 문장은 순서대로 3개 단어가 이루어집니다: + +- **subject** (I) +- **verb** (feel) +- **adjective** (happy) + +그러나, '아일랜드' 언어에서, 같은 문장은 매우 다른 문법적인 구조를 가지고 있습니다 - "*happy*" 또는 "*sad*" 같은 감정이 *다가오는* 것으로 표현되었습니다. + +아일랜드어로 `Tá athas orm`인 영어 표현은 `I feel happy`입니다. *문자 그대로* 번역하면 `Happy is upon me`입니다. + +영어로 번역하는 아일랜드 사람은 `I feel happy`라고 말하며, `Happy is upon me`는 아니라고 합니다, +그 이유는 단어와 문장 구조가 다르다면, 문장의 의미를 이해하는 게 달라진다고 생각했기 때문입니다. + +아일랜드어 문장의 형식적인 순서는 이렇습니다: + +- **verb** (Tá or is) +- **adjective** (athas, or happy) +- **subject** (orm, or upon me) + +## 번역 + +전문적이지 않은 변역 프로그램은 문장 구조를 무시하고, 단어만 번역할 수 있습니다. + +✅ 만약 성인이 되고나서 두번째 (혹은 세 번보다 더 많은) 언어를 배웠다면, 번역문을 말할 때, 모국어로 생각하고 머리 속 개념으로 두번째 언어를 번역했을 것입니다. 전문적이지 않은 번역 프로그램이 하는 일과 유사합니다. 유창하게 하려면 이 단계를 넘기는 것이 중요합니다! + +전문적이지 않은 번역은 나쁘고 (그리고 때떄로 명쾌한) 잘 못된 번역으로 될 수 있습니다: 아일랜드어에서 `Mise bhraitheann athas`는 문자 그대로 `I feel happy`로 번역합니다. (문자 그대로) `me feel happy`를 의미하지만 올바른 아일랜드어 문장은 아닙니다. 영어와 아일랜드어는 섬에 가깝게 붙어서 사용하는 언어지만, 다른 문법 구조로 인해서 매우 다른 언어가 되었습니다. + +> [this one](https://www.youtube.com/watch?v=mRIaLSdRMMs)에서 아일랜드 언어 전통에 관련한 약간의 비디오를 시청할 수 있습니다. + +### 머신러닝 접근 방식 + +아직, natural language processing 에 형식적인 룰 접근하는 방식에 대하여 배웠습니다. 다른 접근 방식은 단어의 의미를 무시하고, _대신 머신러닝으로 패턴을 감지_ 하는 방식입니다. 만약 원본과 타겟 언어 모두에 많은 텍스트 (a *corpus*) 또는 몇 텍스트 (*corpora*)를 가진다면 번역할 수 있습니다. + +예시로, 1813년에 Jane Austen이 쓴 잘 알려진 영어 소설, *Pride and Prejudice* 케이스를 고려해봅니다. 만약 영어로 된 책과 *French*로 되어 번역한 책을 참고해보면, _idiomatically_ 가 다르게 번역된 구문을 찾을 수 있습니다. 몇 분에 할 수 있습니다. + +예시로, `I have no money` 같은 영어 구문을 불어로 그대로 번역할 때, `Je n'ai pas de monnaie`로 될 수 있습니다. "Monnaie"는 'money' 와 'monnaie'가 동의어가 아니므로, 까다로운 불어 'false cognate' 입니다. 돈이 없다는 ('monnaie' 의미인 'loose change' 보다) 의미를 더 잘 전달할 수 있기 때문에, 사람이 만들 수 있는 더 좋은 번역은 `Je n'ai pas d'argent` 일 것 입니다. + +![monnaie](../images/monnaie.png) + +> Image by [Jen Looper](https://twitter.com/jenlooper) + +만약 ML 모델에 이를 만들 충분한 수동 번역이 되는 경우, 언어에 다 능숙한 사람이 이전에 번역한 텍스트에서 공통적인 패턴을 식별하여 번역의 정확도를 향상시킬 수 있습니다. + +### 연습 - 번역 + +`TextBlob`을 사용해서 문장을 번역합니다. **Pride and Prejudice**의 유명한 첫 라인으로 시도합니다: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob`은 번역 작업을 은근히 잘합니다: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +사실은, V. Leconte and Ch. Pressoir 책의 1932년 불어 번역보다, TextBlob의 번역이 더 정확하다고 주장할 수 있습니다: + +"C'est une vérité universelle qu'un celibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle residence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +이 케이스는, 'clarity'하게 원저자가 불필요한 단어를 넣는 수작업 번역보다 ML에서 제안하는 번역이 더 좋게 작업합니다. + +> 어떤가요? TextBlob이 더 좋게 번역되는 이유는 무엇인가요? 음, 그 뒤에는, 수작업으로 가장 적당한 문자열을 예측한 수백만 문장을 파싱할 수 있는 정교한, AI Google 번역을 사용하고 있습니다. 여기에 수동으로 진행되지 않고, `blob.translate`를 사용하려면 인터넷 연결이 필요합니다. + +✅ 몇 문장을 더 시도해봅니다. ML이나 수작업 번역 중에, 어떤 게 좋나요? 어떤 케이스에서 말이죠? + +## 감정 분석 + +머신러닝이 감정 분석을 더 잘 작업하는 것은 다른 영역입니다. 감정에 대한 비-ML 방식은 'positive' 와 'negative'인 단어와 구문를 식별합니다. 그러면, 새로운 텍스트의 조각이 주어졌을 때, 긍정, 부정과 중립 단어의 모든 값을 계산하여 전체적인 감정을 식별합니다. + +이 방식은 Marvin 작업에서 봤던 것처럼 쉽게 속았습니다 - 문장 `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` 는 빈정되고 부정적인 감정 문장이지만, 간단한 알고리즘은 긍정적으로 'great', 'wonderful', 'glad'를, 부정적으로는 'waste', 'lost'와 'dark'를 파악했습니다. 충돌되는 단어로 전체적인 감정이 흔들립니다. + +✅ 잠시 시간을 내어 사람이 이야기할 때 어떻게 풍자를 전달하는지 멈추고 생각해봅니다. 목소리 톤 조절하는 게 큰 룰입니다. 목소리가 의미를 어떻게 전달하는지 발견하는 다른 방식으로 "Well, that film was awesome" 구문을 말해봅니다. + +### ML 접근 방식 + +ML 접근 방식은 텍스트의 부정과 긍정적인 본문을 수동으로 수집합니다 - 트윗, 또는 영화 리뷰, 또는 사람이 점수를 주고 의견을 작성할 수 있는 모든 것. NLP 기술이 의견과 점수를 적용할 수 있는 순간에, 패턴이 드러납니다 (예시. 긍정적인 영화 리뷰는 'Oscar worthy' 구문을 부정적인 영화 리뷰보다 더 많이 사용하는 경향이 있으며 긍정적인 레스토랑 리뷰는 'disgusting'보다 'gourmet'라고 더 말하는 경향이 있습니다). + +> ⚖️ **Example**: 만약 정치인 사무실에서 일하고 있으며 새 법을 검토하면, 선거권자들은 새로운 법에 대한 서포팅하거나 반대하는 메일을 사무실로 보낼 수 있습니다. 이메일을 읽고 *for*와 *against* 기준으로 2 파일로 분류하는 일을 한다고 가정합니다. 만약 많은 메일을 받으면, 모든 것을 읽으려고 시도하다가 숨막힐 수 있습니다. 만약 봇이 모든 것을 읽고 이해해서 이메일이 어느 파일에 속하는지 알려줄 수 있다면, 좋을 수 있나요? +> +> 하나의 방식은 머신러닝을 사용해서 이루어내는 것입니다. 이메일의 *against* 일부와 *for* 일부를 모델에 훈련합니다. 모델은 구문과 단어를 찬성과 반대 측면으로 연관하려는 경향이 있지만, *모든 컨텐츠를 이해하지 못하고*, 오직 특정 단어와 패턴이 *against* 또는 *for* 이메일에 나타날 것 같다는 것만 알게됩니다. 모델을 훈련하지 않은 몇 이메일로 테스트할 수 있으며, 같은 결말이 나왔다는 것을 볼 수 있습니다. 그렇게, 모델의 정확도를 만족하게 된다면, 각자 읽을 필요없이 이후 이메일을 처리할 수 있습니다. + +✅ 이 프로세스가 이전 강의에서 사용했던 것처럼 들리나요? + +## 연습 - 감정적인 문장 + +감정은 -1 에서 1로 *polarity* 측정하며, 가장 부정적인 문장은 -1 으로 의미하고, 그리고 1은 가장 긍정적입니다. 감정은 objectivity (0) 와 subjectivity (1)를 0 - 1 점으로 측정하기도 합니다. + +Jane Austen의 *Pride and Prejudice*를 다르게 봅니다. 텍스트는 [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm)에서 존재합니다. 샘플은 책 처음과 마지막 문장의 감정을 분석하고 감정 polarity와 subjectivity/objectivity 점수를 출력하는 짧은 프로그램이며 다음과 같이 보여집니다. + +다음 작업에서 (설명한) `TextBlob` 라이브러리로 `sentiment`를 (감정 계산기를 작성하지 않아도) 탐지합니다. + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +다음 출력을 보게 됩니다: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## 도전 - 감정 polarity 확인 + +만약 *Pride and Prejudice*가 절대적 부정적인 내용보다 긍정적인 문장이 더 있다면, 작업은 감정 polarity로 탐지합니다. 이 작업에서, 1 or -1 polarity 점수가 각자 절대적으로 positive 하거나 negative 하다고 생각할 수 있습니다. + +**단계:** + +1. .txt 파일로 이루어진 Project Gutenberg의 [copy of Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm)를 내려받습니다. 파일의 시작과 끝에 있는 메타데이터를 제거해서, 원본 텍스트만 남깁니다 +2. Python으로 파일을 열고 문자열로 컨텐츠를 풉니다 +3. 책의 문자열로 TextBlob을 만듭니다 +4. 책의 각 문장을 반복해서 분석합니다 + 1. 만약 polarity가 1 또는 -1이면 문장을 배열이나 positive 또는 negative 메시지 리스트에 저장합니다 +5. 마지막으로, (각자) 모든 긍정적인 문장과 부정적인 문장, 각 수를 출력합니다 + +여기에 샘플 [solution](../solutions/notebook.ipynb)이 있습니다. + +✅ 지식 점검 + +1. 감정은 문장에서 사용된 단어를 기반하지만, 코드는 단어를 *이해하나요*? +2. 감정 polarity가 정확하다고 생각하거나, 다시 말하면, 점수에 *동의* 하나요? + 1. 특히나, 다음 문장이 절대적으로 **긍정** polarity라는 점을 동의하거나 거부하나요? + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. 다음 3개 문장은 절대적으로 긍정 문장이지만, 자세히 읽으면, 긍정 문장이 아닙니다. 왜 감정이 긍정 문장으로 생각하도록 분석되었나요? + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. 다음 문장을 절대적인 **부정** polarity로 동의하거나 거부하나요? + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ 모든 Jane Austen의 팬은 자주 자신의 책으로 English Regency 사회의 말도 안되는 측면을 비판하는 것을 이해합니다. *Pride and Prejudice*의 주요 캐릭터인 Elizabeth Bennett은, (작성자 같은) 예민한 소셜 옵저버이며 그녀의 언어는 가끔 뉘앙스가 미묘합니다. 심지어 Mr. Darcy (이야기에 흥미로운 것을 좋아하는 자)도 Elizabeth의 장난스럽고 놀리는 언어를 주목합니다: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀 도전 + +사용자 입력으로 다른 features를 추출해서 Marvin을 더 좋게 만들 수 있나요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/36/) + +## 검토 & 자기주도 학습 + +텍스트에서 감정을 추출하는 많은 방식이 있습니다. 이 기술로 사용할 수 있는 비지니스 애플리케이션을 생각해봅니다. 어떻게 틀릴 수 있는지도 생각해봅니다. [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-15963-cxa) 같이 감정 분석을 하는 정교한 enterprise-ready 시스템에 대하여 읽어봅니다. Pride and Prejudice 일부 문장에서 미묘한 차이를 감지할 수 있는지 테스트 합니다. + +## 과제 + +[Poetic license](../assignment.md) From 56d615d3b2796d9533fbe04292829fadd6b03540 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Fri, 6 Aug 2021 18:20:07 +0900 Subject: [PATCH 28/37] ADD : translate 6-4 --- .../translations/README.ko.md | 408 ++++++++++++++++++ 1 file changed, 408 insertions(+) create mode 100644 6-NLP/4-Hotel-Reviews-1/translations/README.ko.md diff --git a/6-NLP/4-Hotel-Reviews-1/translations/README.ko.md b/6-NLP/4-Hotel-Reviews-1/translations/README.ko.md new file mode 100644 index 0000000000..796a59b737 --- /dev/null +++ b/6-NLP/4-Hotel-Reviews-1/translations/README.ko.md @@ -0,0 +1,408 @@ +# 호텔 리뷰로 감정 분석하기 - 데이터 처리 + +이 섹션에서는 큰 데이터셋의 탐색적으로 데이터를 분석하는 이전 강의의 기술을 사용할 예정입니다. 다양한 열의 유용성을 잘 이해하면, 배울 수 있습니다: + +- 필요하지 않은 열을 제거하는 방식 +- 이미 존재하는 열을 기반으로 일부 새로운 데이터를 계산하는 방식 +- 최종 도전에서 사용하고자 결과 데이터셋을 저장하는 방식 + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/37/) + +### 소개 + +지금까지 텍스트 데이터가 숫자 데이터 타입과 꽤 다르다는 것을 배웠습니다. 만약 사람이 텍스트를 쓰거나 읽는다면, 패턴과 빈도, 감정과 의미를 찾기 위해서 분석할 수 있습니다. 이 강의에서 실전인 진짜 데이터로 진행합니다: **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** 이며 [CC0: Public Domain license](https://creativecommons.org/publicdomain/zero/1.0/)를 포함합니다. 퍼블릭 소스의 from Booking.com에서 스크랩했습니다. Jiashen Liu가 데이터셋을 생성했습니다. + +### 준비 + +다음 내용이 필요할 예정입니다: + +* Python 3로 .ipynb 노트북을 실행할 능력 +* pandas +* NLTK, [which you should install locally](https://www.nltk.org/install.html) +* Kaggle [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)에서 사용할 데이터셋. 압축 풀면 230 MB 입니다. NLP 강의와 관련있는 상단 `/data` 폴더에 내려받습니다. + +## 탐색적 데이터 분석 + +이 도전은 감정 분석과 게스트 리뷰 점수로 호텔 추천 봇을 만든다고 가정합니다. 데이터셋은 6개 도시에 있는 1493개 다른 호텔의 리뷰를 포함해서 사용합니다. + +호델 리뷰 데이터셋을 Python으로, NLTK 감정 분석을 확인할 수 있습니다: + +* 리뷰에서 가장 빈번하게 사용된 단어와 구문은 무엇인가요? +* 호텔을 설명하는 공식 *tags*는 리뷰 점수와 관계가 있나요? (예시로, *Solo traveller*보다 *Family with young children*으로 왔을 때 호텔 리뷰가 더 부정적이고, 어쩌면 *Solo travellers*가 더 괜찮나요?) +* NLTK 감정 점수가 호텔 리뷰어의 숫자로만 이루어진 점수를 '동의'할 수 있나요? + +#### 데이터셋 + +내려받아서 로컬에 저장한 데이터셋을 알아보겠습니다. VS Code나 엑셀 같은 에디터로 파일을 엽니다. + +데이터셋의 헤더는 다음과 같습니다: + +*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng* + +여기에 쉽게 풀 수 있는 방식으로 그룹을 묶습니다: + +##### Hotel 열 + +* `Hotel_Name`, `Hotel_Address`, `lat` (latitude), `lng` (longitude) + * *lat* 과 *lng*으로 Python에서 호텔 위치를 보일 맵을 plot합니다 (아마 부정적이고 긍정적인 리뷰에 대한 색상) + * Hotel_Address는 분명 우리에게 유용하지 않으므로, 쉽게 분류하고 검색할 수 있게 국가로 대체할 예정입니다 + +**Hotel Meta-review 열** + +* `Average_Score` + * 데이터셋을 만든 사람에 의하면, 이 열은 *지난 연도에 작성된 최신 코멘트를 기반으로 계산한, 호텔의 평균 점수*입니다. 점수를 계산하는 특이한 방식처럼 보이지만, 현재 액면가로 보일 수 있도록 스크랩한 데이터입니다. + + ✅ 데이터에서 다른 열을 기반으로, 평균 점수를 계산하는 방식을 생각할 수 있나요? + +* `Total_Number_of_Reviews` + * 호텔이 받은 리뷰의 총 개수 - 만약 데이터셋의 리뷰를 나타내는 것이면 (일부 코드 작성없이) 명확하지 않습니다 +* `Additional_Number_of_Scoring` + * 리뷰 점수가 부여되었지만 리뷰어가 작성한 긍정적이나 부정적인 리뷰가 없다는 점을 의미합니다 + +**Review columns** + +- `Reviewer_Score` + - 숫자 값은 최소 2.5 최대 값 10 사이의 최대 소수점 1자리 입니다. + - 2.5가 낮은 숫자인 이유는 없습니다 +- `Negative_Review` + - 만약 리뷰어가 아무것도 작성하지 않았다면, 필드는 "**No Negative**"로 채워집니다 + - 리뷰어가 부정적인 리뷰 열에 긍정적인 리뷰를 남길 수 있다는 점을 참고합니다 (e.g. "there is nothing bad about this hotel") +- `Review_Total_Negative_Word_Counts` + - 많은 부정적인 단어들은 점수가 낮습니다 (감정을 확인하지 않습니다) +- `Positive_Review` + - 만약 리뷰어가 아무것도 작성하지 않았다면, 필드는 "**No Positive**"로 채워집니다 + - 리뷰어가 긍정적인 리뷰 열에 부정적인 리뷰를 남길 수 있다는 점을 참고합니다 (e.g. "there is nothing good about this hotel at all") +- `Review_Total_Positive_Word_Counts` + - 많은 긍정적인 단어들은 점수가 높습니다 (감정을 확인하지 않습니다) +- `Review_Date` and `days_since_review` + - 최근이나 과거에 작성된 리뷰가 적용될 수 있습니다 (과거에 작성된 리뷰는 호텔 관리가 바뀌었거나, 리노베이션이 끝났거나, 수영장이 생기는 등 최근보다 정확하지 않을 수 있습니다.) +- `Tags` + - 리뷰어가 게스트 타입 (예시. 솔로 혹은 패밀리), 지낸 룸 타입, 지낸 기간처럼 작성한 리뷰 방식을 설명하고자 선택할 수 있는 짧은 설명문입니다. + - 불행하게도, 이 태그를 사용하는 것은 문제가 있으므로, 아래 usefulness를 설명하는 섹션으로 확인합니다 + +**리뷰어 열** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - 예시로, 수백 개 리뷰를 작성한 다량의 리뷰어가 긍정적보다 부정적으로 리뷰를 남긴다고 판단할 수 있다면, recommendation 모델에서 한 인자가 될 수 있습니다. 그러나, 특정 리뷰를 작성한 리뷰어는 유니크 코드로 식별하지 않으므로, 리뷰 셋에 링크할 수 없습니다. 100개보다 더 작성한 30명 리뷰어가 있지만, recommendation 모델에 어떤 방식으로 도울 수 있는지 보기 힘듭니다. + +- `Reviewer_Nationality` + - 일부 사람들은 국가마다 성향이 다르므로 긍정적이나 부정적인 리뷰를 줄 수 있다고 생각합니다. 모델에 사례 증거를 신중히 만듭니다. 국가(인종)에 대한 고정 관념이며, 각 리뷰어는 경험을 기반해서 개인적으로 리뷰를 작성했습니다. 이전에 지낸 호텔, 이동한 거리, 그리고 개인 체질 같은 요인으로 다르게 필터링되었을 수 있습니다. 국적이 리뷰 점수에 대한 이유가 되는 것은 합리적이지 않습니다. + +##### 예제 + +| Average Score | Total Number Reviews | Reviewer Score | Negative
Review | Positive Review | Tags | +| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | This is currently not a hotel but a construction site I was terroized from early morning and all day with unacceptable building noise while resting after a long trip and working in the room People were working all day i e with jackhammers in the adjacent rooms I asked for a room change but no silent room was available To make thinks worse I was overcharged I checked out in the evening since I had to leave very early flight and received an appropiate bill A day later the hotel made another charge without my concent in excess of booked price It s a terrible place Don t punish yourself by booking here | Nothing Terrible place Stay away | Business trip Couple Standard Double Room Stayed 2 nights | + +본 내용처럼, 게스트는 호텔에 즐겁게 지내지 못했습니다. 호텔은 1945개 리뷰 중 7.8 점으로 좋은 평균이지만, 리뷰어는 2.5점을 주며 지냈던 내용을 115개 단어를 부정적으로 남겼습니다. 만약 Positive_Review 열이 깨끗하면, 긍정이 없다고 추측하겠지만, 7개 경고문을 작성했습니다. 만약 단어 의미나 단어 감정 대신 단어 자체를 센다면, 리뷰어 의도를 왜곡해서 볼 수 있습니다. 이상하게, 2.5 점은 혼란스러우며, 만약 호탤애 지낸 게 불쾌하다고, 모든 포인트를 다 주나요? 데이터셋을 가까이 조사하면, 낮을 수 있는 점수가 0점이 아니라, 2.5점이라고 볼 수 있습니다. 가능한 높은 점수는 10점 입니다. + +##### Tags + +언급된 것처럼, 한 눈에, `Tags`로 데이터를 분류하는 아이디어는 의미있습니다. 불행히, 주어진 호텔에서는, 옵션이 *Single room*, *Twin room*, 그리고 *Double room* 옵션일 수 있지만, 다음 호텔에서, *Deluxe Single Room*, *Classic Queen Room*, 그리고 *Executive King Room*처럼 태그는 표준화되지 못했습니다. 같은 것을 의미할 수 있지만, 너무 많은 옵션이 있으므로 다음을 선택합니다: + +1. 각자 케이스에 맞게 바꿀 방식이 명확하지 않으므로, 모든 단어를 단일 표준으로 변경하려는 시도는 매우 어렵습니다. (예시. *Classic single room* 을 *Single room*으로 맵핑하는 것은 가능하지만 *Superior Queen Room with Courtyard Garden or City View*를 맵핑하려면 매우 어렵습니다) + +1. NLP 접근 방식을 가지고 각자 호텔에 적용되는 *Solo*, *Business Traveller*, 또는 *Family with young kids* 같은 특정 용어의 빈도를 측정하며, 추천 모델에 인자로 반영합니다 + +태그는 일반적으로 (항상 그렇지 않지만) *Type of trip*, *Type of guests*, *Type of room*, *Number of nights*, 그리고 *Type of device review was submitted on* 에 따라서 5에서 6개 컴마로 구분된 값 리스트를 포함한 단일 필드입니다. 그러나, 일부 리뷰어는 각 필드를 채우지 않기 때문에 (하나정도 공백으로 남길 수 있습니다), 값을 동일한 순서로 항상 유지할 수 없습니다. + +예시는, *Type of group*으로 합니다. `Tags` 열에 1025개 필드가 서로 안 겹칠 가능성이 있지만, 불행히도 일부만 그룹으로 (일부 방 타입처럼) 참조합니다. 만약 패밀리를 언급한 것만 필터링하면, 많은 *Family room* 타입 결과를 포함해서 냅니다. 만약 *with* 용어를 포함하면, 즉 *Family with* 값을 센다면, 결과는 더 좋게, "Family with young children" 또는 "Family with older children" 문구가 포함된 515,000개 중 80,000개 넘는 결과가 나옵니다. + +태그 열을 쓰기에는 완벽하지 않다는 것을 의미하지만, 약간 작업하면 유용해질 수 있습니다. + +##### 평균 호텔 점수 + +이해할 수 없는 데이터셋으로 이상하거나 모순되는게 많지만, 모델을 만들 때 알 수 있는 예시가 있습니다. 만약 알게 된다면, 토론 섹션에 알려주세요! + +데이터셋의 평균 점수와 리뷰 수에 관련된 열은 다음과 같습니다: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +이 데이터셋에서 가장 리뷰가 많은 싱글 호텔은 515,000개 중 4789개 리뷰를 받은 *Britannia International Hotel Canary Wharf*입니다. 하지만 만약 호텔의 `Total_Number_of_Reviews` 값을 보면, 9086 입니다. 리뷰없는 점수가 많을 것이라고 추정할 수 있어서, `Additional_Number_of_Scoring` 열 값을 추가할 필요가 있습니다. 이 값은 2682이며, `Total_Number_of_Reviews`의 1615가 부족해져서 4789를 더하면 7,471이 됩니다. + +만약 `Average_Score` 열로, 데이터셋에서 리뷰의 평균을 추축할 수 있지만, Kaggle 설명은 "*Average Score of the hotel, calculated based on the latest comment in the last year*"라고 합니다. 유용해보이지 않지만, 데이터셋의 리뷰 점수를 기반해서 평균을 계산할 수 있습니다. 예시로 동일한 호텔을 사용해서, 평균 호텔 점수가 7.1로 주어졌지만 계산된 점수는(데이터셋의 평균 리뷰어 점수) 6.8입니다. 비슷하지만, 같은 값은 아니고, `Additional_Number_of_Scoring` 리뷰에서 주어진 점수가 평균을 7.1 올렸다고 추측할 수 있습니다. 불행히 테스트하거나 확인할 방식은 없으므로, 가지고 있지 않는 것을 기반으로 하거나 참조할 때 `Average_Score`, `Additional_Number_of_Scoring` 과 `Total_Number_of_Reviews`를 쓰거나 신뢰하기 어렵습니다. + +더 복잡해지면, 두 번째로 리뷰 수가 높은 호텔은 계산된 평균 점수 8.12이며 데이터셋 `Average_Score`는 8.1입니다. 우연히 점수를 맞추었거나 첫 번째 호텔이 모순되었나요? + +이 호텔이 아웃라이어일 수 있고, 아마도 대부분 값을 센다는 가정에 (하지만 일부 이유로 안 합니다) 데이터셋 값을 찾고 값을 올바르게 사용하거나 (또는 사용하지 않게) 결정하는 짧은 프로그램을 작성할 예정입니다. + +> 🚨 주의할 사항 +> +> 데이터셋으로 작업할 때 텍스트를 수동으로 읽거나 분석하지 않고 텍스트에서 무언가를 계산하는 코드를 작성하게 됩니다. 사람을 거치지 않고 의미나 감정을 분석하는 것은, NLP의 정수입니다. 그러나, 알부 부정적인 리뷰를 읽을 수 있습니다. 직접 할 필요가 없으므로, 하지말라고 권유하고 싶습니다. 일부는 "The weather wasn't great"와 같이, 멍청하거나, 관련없는 부정적 호텔 리뷰이거나, 호텔에서 어떤 컨트롤도 할 수 없는 내용입니다. 하지만 이것도 일부 어두운 측면의 리뷰입니다. 때로 부정적인 리뷰는 racist, sexist, 또는 ageist적 입니다. 불행하지만 퍼블릭 웹사이트에서 긁어온 데이터에서 예상하게 됩니다. 일부 리뷰어는 싫어하거나, 불편하거나, 화낼 수 있는 리뷰를 남깁니다. 읽고 속상한 것보다 코드로 감정을 측정하는 것이 더 좋습니다. 즉, 소수가 작성하지만, 모두 똑같이 있습니다. + +## 연습 - 데이터 탐색 + +### 데이터 불러오기 + +데이터를 시각적으로 확인하는 것도 충분하므로, 이제 살짝 코드를 작성하고 답변을 얻겠습니다! 이 섹션에서 pandas 라이브러리를 사용합니다. 첫 작업은 CSV 데이터를 불러오고 읽어올 수 있는지 확인하는 작업입니다. pandas 라이브러리는 빠른 CSV 리더이며, 이전 강의에서 했던, dataframe에 결과를 둡니다. 불러올 CSV는 50만 행이 넘지만, 17 열만 있습니다. Pandas는 모든 행에서 작업할 기능을 포함해서, 데이터프레임과 상호 작용하는 강력한 방식을 많이 제공합니다. + +이 강의의 이 곳에서, 코드 스니펫과 일부 코드 설명과 일부 결과에 의미를 둔 토론을 하게 됩니다. 코드에 있는 _notebook.ipynb_ 를 사용합니다. + +사용할 데이터 파일을 불러오기 위해서 시작합니다: + +```python +# Load the hotel reviews from CSV +import pandas as pd +import time +# importing time so the start and end time can be used to calculate file loading time +print("Loading data file now, this could take a while depending on file size") +start = time.time() +# df is 'DataFrame' - make sure you downloaded the file to the data folder +df = pd.read_csv('../../data/Hotel_Reviews.csv') +end = time.time() +print("Loading took " + str(round(end - start, 2)) + " seconds") +``` + +이제 데이터가 불러와지면, 일부 작업을 할 수 있습니다. 다음 파트를 위해서 프로그램의 상단에 코드를 둡니다. + +## 데이터 탐색하기 + +이 케이스에서, 데이터는 이미 *깨끗하므로*, 작업할 준비가 되었고, 영어만 대상으로한 알고리즘에 걸릴 수 있는 다른 언어가 없다는 점을 의미합니다. + +✅ NLP 기술을 적용하기 전 포맷에 일부 초기 처리가 필요한 데이터로 작성할 수 있지만, 이번에는 아닙니다. 만약 한다면, 비-영어권 언어를 핸들링 할 수 있나요? + +데이터를 불러오는 순간, 코드로 탐색할 수 있는지 시간을 내어 확인합니다. `Negative_Review` 와 `Positive_Review` 열에 집중하기 윈하면 매우 쉽습니다. NLP 알고리즘이 처리할 자연어 텍스트로 채워졌습니다. 하지만 잠깐 기다려봅니다! NLP와 감정으로 들어가기 전, 다음 코드로 만약 데이터셋에 주어진 값이 pandas로 계산한 값과 매치되는지 확실히 봅시다. + +## 데이터프레임 작업 + +이 강의에서 첫 작업은 데이터프레임을 (바꾸지 않고) 점검하는 코드로 작성해서 다음 가정이 올바른지 체크하는 것입니다. + +> 많은 프로그래밍 작업처럼, 마무리할 여러 방식이 있지만, 특히 미래에 다시 코드를 작성할 때 이해하기 쉬우려면, 간단하고, 쉽게 할 수 있도록 좋은 조언을 하게 됩니다. 데이터프레임에는, 효율적인 방식으로 자주 할 수 있는 포괄적인 API가 있습니다. + +코딩 작업으로 다음 질문을 설명하며 솔루션에 기대지 않고 답변할 수 있게 시도합니다 + +1. 직전에 불러온 데이터프레임의 *shape*를 출력합니다 (shape는 행과 열의 개수입니다) +2. 리뷰어 국적 대상으로 빈도 카운트를 계산합니다: + 1. `Reviewer_Nationality` 열에 얼마나 많은 별개 값이 있으며 어떤가요? + 2. 데이터셋에서 가장 일반적인 리뷰어 국적은 어디인가요 (국가와 리뷰 개수 출력)? + 3. 다음으로 더 자주 발견되는 국적은 어디고, 빈도를 카운트하나요? +3. 상위 10에 드는 리뷰어 국적에서 가장 자주 리뷰된 호텔은 어디인가요? +4. 데이터셋에서 호텔 별 (호텔의 빈도 개수) 리뷰가 얼마나 있나요? +5. 데이터셋에서 각 호텔마다 `Average_Score` 열이 있지만, 평균 점수도 계산할 수 있습니다 (각 호텔의 데이터셋에서 모든 리뷰어 점수의 평균을 얻습니다). 계산된 평균을 포함한 `Calc_Average_Score` 열 헤더로 데이터프레임에 새로운 열을 추가합니다. +6. 호텔에서 동일한 (반올림한 소수점 1자리) `Average_Score` 와 `Calc_Average_Score`를 가지고 있나요? + 1. Series (row)로 값을 비교하며, 값이 같지 않을 때 메시지를 출력하는 Python 함수를 작성합니다. 그러면 `.apply()` 메소드를 사용해서 처리하면 함수로 모든 행을 처리할 수 있습니다. +7. "No Negative"의 `Negative_Review` 열 값에 있는 행이 얼마나 있는지 계산하고 출력합니다 +8. "No Positive"의 `Positive_Review` 열 값에 있는 행이 얼마나 있는지 계산하고 출력합니다 +9. "No Positive"의 `Negative_Review` 열 값**과** "No Negative"의 `Negative_Review` 열 값에 있는 행이 얼마나 있는지 계산하고 출력합니다 + +### 코드 답변 + +1. 직전에 불러온 데이터프레임의 *shape*를 출력합니다 (shape는 행과 열의 개수입니다) + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. 리뷰어 국적 대상으로 빈도 카운트를 계산합니다: + + 1. `Reviewer_Nationality` 열에 얼마나 많은 별개 값이 있으며 어떤가요? + 2. 데이터셋에서 가장 일반적인 리뷰어 국적은 어디인가요 (국가와 리뷰 개수 출력)? + + ```python + # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality + nationality_freq = df["Reviewer_Nationality"].value_counts() + print("There are " + str(nationality_freq.size) + " different nationalities") + # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data + print(nationality_freq) + + There are 227 different nationalities + United Kingdom 245246 + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + ... + Comoros 1 + Palau 1 + Northern Mariana Islands 1 + Cape Verde 1 + Guinea 1 + Name: Reviewer_Nationality, Length: 227, dtype: int64 + ``` + + 3. 다음으로 더 자주 발견되는 국적은 어디고, 빈도를 카운트하나요? + + ```python + print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.") + # Notice there is a leading space on the values, strip() removes that for printing + # What is the top 10 most common nationalities and their frequencies? + print("The next 10 highest frequency reviewer nationalities are:") + print(nationality_freq[1:11].to_string()) + + The highest frequency reviewer nationality is United Kingdom with 245246 reviews. + The next 10 highest frequency reviewer nationalities are: + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + Saudi Arabia 8951 + Netherlands 8772 + Switzerland 8678 + Germany 7941 + Canada 7894 + France 7296 + ``` + +3. 상위 10에 드는 리뷰어 국적에서 가장 자주 리뷰된 호텔은 어디인가요? + + ```python + # What was the most frequently reviewed hotel for the top 10 nationalities + # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow) + for nat in nationality_freq[:10].index: + # First, extract all the rows that match the criteria into a new dataframe + nat_df = df[df["Reviewer_Nationality"] == nat] + # Now get the hotel freq + freq = nat_df["Hotel_Name"].value_counts() + print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.") + + The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews. + The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews. + The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews. + The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews. + The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews. + The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews. + The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews. + The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews. + The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews. + The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews. + ``` + +4. 데이터셋에서 호텔 별 (호텔의 빈도 개수) 리뷰가 얼마나 있나요? + + ```python + # First create a new dataframe based on the old one, removing the uneeded columns + hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1) + + # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found + hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count') + + # Get rid of all the duplicated rows + hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"]) + display(hotel_freq_df) + ``` + | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | + | :----------------------------------------: | :---------------------: | :-----------------: | + | Britannia International Hotel Canary Wharf | 9086 | 4789 | + | Park Plaza Westminster Bridge London | 12158 | 4169 | + | Copthorne Tara Hotel London Kensington | 7105 | 3578 | + | ... | ... | ... | + | Mercure Paris Porte d Orleans | 110 | 10 | + | Hotel Wagner | 135 | 10 | + | Hotel Gallitzinberg | 173 | 8 | + + *counted in the dataset* 결과로 `Total_Number_of_Reviews`에서 값이 매치되지 않는 점을 알 것입니다. 데이터셋의 값이 호텔의 모든 리뷰 개수를 나타낸다고 하지만, 모두 스크랩하지 못했거나, 계산이 다릅니다. `Total_Number_of_Reviews`는 불명확성으로 인하여 모델에서 사용하지 않습니다. + +5. 데이터셋에서 각 호텔마다 `Average_Score` 열이 있지만, 평균 점수를 계산할 수 있습니다 (각 호텔의 데이터셋에서 모든 리뷰어 점수의 평균을 얻습니다). 계산된 평균을 포함한 `Calc_Average_Score` 열 헤더로 데이터프레임에 새로운 열을 추가합니다. `Hotel_Name`, `Average_Score`, 그리고 `Calc_Average_Score` 열을 출력합니다. + + ```python + # define a function that takes a row and performs some calculation with it + def get_difference_review_avg(row): + return row["Average_Score"] - row["Calc_Average_Score"] + + # 'mean' is mathematical word for 'average' + df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + + # Add a new column with the difference between the two average scores + df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1) + + # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel) + review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"]) + + # Sort the dataframe to find the lowest and highest average score difference + review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"]) + + display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]]) + ``` + + 또는 `Average_Score` 값과 계산된 평균 점수가 가끔 다른 이유를 궁금할 수 있습니다. 값의 일부는 매칭되지만, 다른지 알 수 없으므로, 이 케이스에서 스스로 평균을 계산하는 리뷰 점수로 사용해야 안전합니다. 말하기를, 차이가 일반적으로 매우 작지만, 여기는 데이터셋 평균과 계산된 평균에 가장 큰 차이를 보이는 호텔입니다: + + | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | + | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | + | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | + | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | + | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | + | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | + | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | + | ... | ... | ... | ... | + | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | + | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | + | 0.9 | 6.8 | 5.9 | Villa Eugenie | + | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | + | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | + + 점수 차이가 1보다 큰 호텔이 오직 1개이므로, 아마도 차이를 무시하고 계산된 평균 점수를 사용할 수 있을 것입니다. + +6. "No Negative"의 `Negative_Review` 열 값에 있는 행이 얼마나 있는지 계산하고 출력합니다 + +7. "No Positive"의 `Positive_Review` 열 값에 있는 행이 얼마나 있는지 계산하고 출력합니다 + +8. "No Positive"의 `Negative_Review` 열 값**과** "No Negative"의 `Negative_Review` 열 값에 있는 행이 얼마나 있는지 계산하고 출력합니다 + + ```python + # with lambdas: + start = time.time() + no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) + print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index))) + + no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index))) + + both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) + end = time.time() + print("Lambdas took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Lambdas took 9.64 seconds + ``` + +## 다른 방식 + +다른 방식으로 Lambda 없이 아이템을 카운트하고, sum으로 행을 카운트합니다: + + ```python + # without lambdas (using a mixture of notations to show you can use both) + start = time.time() + no_negative_reviews = sum(df.Negative_Review == "No Negative") + print("Number of No Negative reviews: " + str(no_negative_reviews)) + + no_positive_reviews = sum(df["Positive_Review"] == "No Positive") + print("Number of No Positive reviews: " + str(no_positive_reviews)) + + both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) + print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews)) + + end = time.time() + print("Sum took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Sum took 0.19 seconds + ``` + + 둘 다 `Negative_Review` 와 `Positive_Review` 열에 대하여 각자 "No Negative"와 "No Positive" 값이 127개 행을 가지고 있다는 점을 알 수 있습니다. 리뷰어가 숫자로 이루어진 점수를 호텔에 주었지만, 어느 긍정적이나 부정적인 리뷰도 남기지 않았다는 점을 의미합니다. 운이 좋아서 적은 행 개수로(515738 중 127, 0.02%), 모델 또는 결과가 어느 방향으로 치우치지 않앗지만, 리뷰 데이터셋에 리뷰가 없으므로, 이와 같이 행을 찾기 위해서 데이터를 찾을 보람이 있습니다. + +지금 데이터셋을 찾아서, 다음 강의에서 데이터를 필터링하고 감정 분석을 추가해봅니다. + +--- +## 🚀 도전 + +이전 강의에서 본 것처럼, 이 강의에서 작업하기 전 데이터와 약점을 이해하는 것이 얼마나 치명적이게 중요한지 보여줍니다. 특별히, 텍스트-기반 데이터는, 조심히 조사해야 합니다. 다양한 text-heavy 데이터셋을 파보고 모델에서 치우치거나 편향된 감정으로 끼워놓은 영역을 찾을 수 있는지 확인합니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/38/) + +## 검토 & 자기주도 학습 + +[this Learning Path on NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-15963-cxa)로 음성과 text-heavy 모델을 만들 때 시도하는 도구를 찾아봅니다. + +## 과제 + +[NLTK](../assignment.md) From 80ceb2a3c5ccc24655514c65223a7821279554cc Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 7 Aug 2021 19:54:09 +0900 Subject: [PATCH 29/37] ADD : translate 6-5 --- .../translations/README.ko.md | 376 ++++++++++++++++++ 1 file changed, 376 insertions(+) create mode 100644 6-NLP/5-Hotel-Reviews-2/translations/README.ko.md diff --git a/6-NLP/5-Hotel-Reviews-2/translations/README.ko.md b/6-NLP/5-Hotel-Reviews-2/translations/README.ko.md new file mode 100644 index 0000000000..574f4ab504 --- /dev/null +++ b/6-NLP/5-Hotel-Reviews-2/translations/README.ko.md @@ -0,0 +1,376 @@ +# 호텔 리뷰로 감정 분석하기 + +지금까지 자세히 데이터셋을 살펴보았으며, 열을 필터링하고 데이터셋으로 NLP 기술을 사용하여 호텔에 대한 새로운 시각을 얻게 될 시간입니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/39/) + +### 필터링 & 감정 분석 작업 + +알고 있는 것처럼, 데이터셋에 약간의 이슈가 있었습니다. 일부 열은 필요없는 정보로 채워져있으며, 부정확해 보입니다. 만약 맞는 경우, 어떻게 계산되었는지 불투명하고, 답을 스스로 계산해서 독립적으로 확인할 수 없습니다. + +## 연습: 조금 더 데이터 처리하기 + +조금 더 데이터를 정리합니다. 열을 추가하는 것은 나중에 유용하며, 다른 열에서 값을 변경하고, 특정한 열을 완전히 드랍하게 됩니다. + +1. 초기 column 처리합니다 + + 1. `lat` 과 `lng`를 드랍합니다 + + 2. `Hotel_Address` 값을 다음 값으로 치환합니다 (만약 주소에 도시와 국가가 같다면, 도시와 국가만 변경합니다). + + 데이터셋에서 도시와 국가만 있습니다: + + Amsterdam, Netherlands + + Barcelona, Spain + + London, United Kingdom + + Milan, Italy + + Paris, France + + Vienna, Austria + + ```python + def replace_address(row): + if "Netherlands" in row["Hotel_Address"]: + return "Amsterdam, Netherlands" + elif "Barcelona" in row["Hotel_Address"]: + return "Barcelona, Spain" + elif "United Kingdom" in row["Hotel_Address"]: + return "London, United Kingdom" + elif "Milan" in row["Hotel_Address"]: + return "Milan, Italy" + elif "France" in row["Hotel_Address"]: + return "Paris, France" + elif "Vienna" in row["Hotel_Address"]: + return "Vienna, Austria" + + # Replace all the addresses with a shortened, more useful form + df["Hotel_Address"] = df.apply(replace_address, axis = 1) + # The sum of the value_counts() should add up to the total number of reviews + print(df["Hotel_Address"].value_counts()) + ``` + + 지금부터 국가 레벨 데이터로 쿼리할 수 있습니다: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Netherlands | 105 | + | Barcelona, Spain | 211 | + | London, United Kingdom | 400 | + | Milan, Italy | 162 | + | Paris, France | 458 | + | Vienna, Austria | 158 | + +2. 호텔 Meta-review 열을 처리합니다 + + 1. `Additional_Number_of_Scoring`을 드랍합니다 + + 1. `Total_Number_of_Reviews`를 데이터셋에 실제로 있는 총 호텔 리뷰로 치환합니다 + + 1. `Average_Score`를 계산해둔 점수로 치환합니다 + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. 리뷰 열을 처리합니다 + + 1. `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` 그리고 `days_since_review`를 드랍합니다 + + 2. `Reviewer_Score`, `Negative_Review`, 그리고 `Positive_Review` 를 두고, + + 3. 당장 `Tags` 도 둡니다 + + - 다음 섹션에서 태그에 추가적인 필터링 작업을 조금 진행하고 태그를 드랍하게 됩니다 + +4. 리뷰어 열을 처리합니다 + + 1. `Total_Number_of_Reviews_Reviewer_Has_Given`을 드랍합니다 + + 2. `Reviewer_Nationality`를 둡니다 + +### Tag 열 + +`Tag`열은 열에 저장된 (텍스트 폼의) 리스트라서 문제가 됩니다. 불행하게 순서와 열의 서브 섹션의 숫자는 항상 같지 않습니다. 515,000 행과 1427개 호텔이고, 각자 리뷰어가 선택할 수 있는 옵션은 조금씩 다르기 때문에, 사람에게 흥미로운 알맞은 문구를 가리기 힘듭니다. NLP가 빛나는 영역입니다. 텍스트를 스캔하고 가장 일반적인 문구를 찾으며, 셀 수 있습니다. + +불행히도, 단일 단어는 아니지만, multi-word 구문은 (예시. *Business trip*) 흥미롭습니다. 많은 데이터에 (6762646 단어) multi-word frequency distribution 알고리즘을 실행하는 것은 특별히 오래 걸릴 수 있지만, 데이터를 보지 않아도, 필요한 비용으로 보일 것입니다. `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']` 처럼 태그 샘플로 보면, 해야 하는 처리로 많이 줄일 수 있는지 물어볼 수 있기 때문에, 탐색적 데이터 분석은 유용합니다. 운이 좋게도, - 그러나 먼저 관심있는 태그를 확실히 하고자 다음 몇 단계가 필요합니다. + +### tags 필터링 + +데이터셋의 목표는 좋은 호텔을 선택할 때 (호텔 추천 봇을 만들어 달라고 맡기는 클라이언트일 수 있습니다) 도움을 받고자 감정과 열을 추가하는 것이라고 되새깁니다. 태그가 최종 데이터셋에서 유용한지 스스로에게 물어볼 필요가 있습니다. 한 가지 해석이 있습니다 (만약 다른 사유로 데이터셋이 필요한 경우에 선택할 수 있거나 안하기도 합니다): + +1. 여행 타입이 적절하고, 유지되어야 합니다 +2. 게스트 그룹 타입은 중요하고, 유지되어야 합니다 +3. 게스트가 지낸 룸 타입, 스위트, 또는 스튜디오 타입은 관련 없습니다 (모든 호텔은 기본적으로 같은 룸이 존재합니다) +4. 리뷰를 작성한 디바이스는 관련 없습니다 +5. 만약 리뷰어가 좋아하는 호텔을 더 오래 지낸다면, 리뷰어가 지낸 숙박 기간과 *관련이 있을* 수 있지만, 확대 해석이며, 아마 관련 없습니다 + +요약하면, **2가지 종류 태그를 유지하고 나머지를 제거합니다**. + +먼저, 더 좋은 포맷이 될 때까지 태그를 안 세고 싶으므로, square brackets과 quotes를 제거해야 합니다. 여러 방식으로 할 수 있지만, 많은 데이터를 처리하며 오랜 시간이 걸리므로 빠르게 하길 원합니다. 운이 좋게도, pandas는 각 단계를 쉬운 방식으로 할 수 있습니다. + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +각자 태그는 이처럼 이루어집니다: `Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device`. + +다음으로 문제를 찾았습니다. 리뷰, 또는 행에 5개 열이 있고, 일부는 3개이거나, 6개입니다. 데이터셋이 어떻게 만들어졌는가에 따른 결과이며, 고치기 어렵습니다. 각 구문의 빈도 카운트를 얻고 싶지만, 각 리뷰의 순서가 다르므로, 카운트에 벗어날 수 있고, 호텔이 가치가 있는 태그로 할당받지 못할 수 있습니다. + +각 태그는 multi-word 지만 쉼표로 구분되어 있기 때문에, 대신 다른 순서로 사용하며 가산점을 받습니다! 간단한 방식은 태그에서 순서와 일치하는 열에 넣은 각 태그로 6개 임시 열을 만드는 것입니다. 6개 열을 하나의 큰 열로 합치고 결과 열에 `value_counts()` 메소드를 실행할 수 있습니다. 출력하면, 2428개 유니크 태그를 보게 됩니다. 여기 작은 샘플이 있습니다: + +| Tag | Count | +| ------------------------------ | ------ | +| Leisure trip | 417778 | +| Submitted from a mobile device | 307640 | +| Couple | 252294 | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Solo traveler | 108545 | +| Stayed 3 nights | 95821 | +| Business trip | 82939 | +| Group | 65392 | +| Family with young children | 61015 | +| Stayed 4 nights | 47817 | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Family with older children | 26349 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Stayed 5 nights | 20845 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | +| 2 rooms | 12393 | + +`Submitted from a mobile device` 같은 일부 일반적인 태그는 사용하지 못해서, phrase occurrence를 카운트하기 전에 지우는 게 똑똑할 수 있지만, 빠르게 작업하려면 그냥 두고 무시할 수 있습니다. + +### length of stay 태그 지우기 + +이 태그를 지우는 것은 1단계이며, 고려할 태그의 총 개수를 약간 줄이게 됩니다. 데이터셋에서 지우지 말고, 리뷰 데이터셋에 카운트/유지할 값으로 고려할 대상에서 지우게 선택합니다. + +| Length of stay | Count | +| ---------------- | ------ | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Stayed 3 nights | 95821 | +| Stayed 4 nights | 47817 | +| Stayed 5 nights | 20845 | +| Stayed 6 nights | 9776 | +| Stayed 7 nights | 7399 | +| Stayed 8 nights | 2502 | +| Stayed 9 nights | 1293 | +| ... | ... | + +룸, 스위트, 스튜디오, 아파트 등 매우 다양합니다. 대부분 같은 것을 의미하고 관련 없으므로, 대상에서 지웁니다. + +| Type of room | Count | +| ----------------------------- | ----- | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | + +최종적으로, (많이 처리할 일이 없기 때문에) 즐겁게, 다음 *유용한* 태그만 남길 예정입니다: + +| Tag | Count | +| --------------------------------------------- | ------ | +| Leisure trip | 417778 | +| Couple | 252294 | +| Solo traveler | 108545 | +| Business trip | 82939 | +| Group (combined with Travellers with friends) | 67535 | +| Family with young children | 61015 | +| Family with older children | 26349 | +| With a pet | 1405 | + +`Travellers with friends`는 `Group`과 거의 같다고 주장할 수 있어서, 둘을 합치면 공평할 것입니다. 올바른 태그로 식별하기 위한 코드는 [the Tags notebook](../solution/1-notebook.ipynb)에 있습니다. + +마지막 단계는 각 태그로 새로운 열을 만드는 것입니다. 그러면, 모든 리뷰 행에서, `Tag` 열이 하나의 새로운 열과 매치되면, 1을 추가하고, 아니면, 0을 추가합니다. 마지막 결과는 비지니스 vs 레저, 또는 애완동물 동반 언급하면서, 호텔 추천할 때 유용한 정보이므로, 얼마나 많은 리뷰어가 (총계) 호텔을 선택했는지 카운트합니다. + +```python +# Process the Tags into new columns +# The file Hotel_Reviews_Tags.py, identifies the most important tags +# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, +# Family with young children, Family with older children, With a pet +df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0) +df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0) +df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0) +df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0) +df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0) +df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0) +df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0) +df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0) + +``` + +### 파일 저장하기 + +마지막으로, 새로운 이름으로 바로 데이터셋을 저장합니다. + +```python +df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True) + +# Saving new data file with calculated columns +print("Saving results to Hotel_Reviews_Filtered.csv") +df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False) +``` + +## 감정 분석 작업 + +마지막 섹션에서, 리뷰 열에 감정 분석을 적용하고 데이터셋에 결과를 저장힙니다. + +## 연습: 필터링된 데이터를 불러오고 저장하기 + +지금 원본 데이터셋 *말고*, 이전 색션에서 저장했던 필터링된 데이터셋을 불러오고 있습니다. + +```python +import time +import pandas as pd +import nltk as nltk +from nltk.corpus import stopwords +from nltk.sentiment.vader import SentimentIntensityAnalyzer +nltk.download('vader_lexicon') + +# Load the filtered hotel reviews from CSV +df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv') + +# You code will be added here + + +# Finally remember to save the hotel reviews with new NLP data added +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False) +``` + +### stop word 제거하기 + +만약 긍정적이고 부정적인 리뷰 열에 감정 분석을 하는 경우, 오랜 시간이 걸릴 수 있습니다. 빠른 CPU를 가진 강력한 노트북으로 테스트하면, 사용한 감정 라이브러리에 따라서 12 - 14 분 정도 걸립니다. (상대적)으로 오래 걸려서, 빠르게 할 수 있는지 알아볼 가치가 있습니다. + +문장의 감정을 바꾸지 않는 stop word나, 일반적인 영어 단어를 지우는 것은, 첫 단계입니다. 지우게 된다면, 감정 분석이 더 빠르게 되지만, 정확도가 낮아지지 않습니다 (stop word는 감정에 영향없지만, 분석이 느려집니다). + +긴 부정적 리뷰는 395 단어로 었지만 , stop word를 지우면, 195 단어만 남습니다. + +stop word를 지우는 것은 빨라서, 테스트 디바이스에서 515,000 행이 넘는 2개 리뷰 열에 stop word를 지우면 3.3초 걸립니다. 디바이스의 CPU 속도, 램, SSD 등에 따라 더 오래 걸리거나 빨리 끝날 수 있습니다. 작업이 상대적으로 빨라지고 감정 분석 시간도 향상시킬 수 있다면, 할 가치가 있음을 의미합니다. + +```python +from nltk.corpus import stopwords + +# Load the hotel reviews from CSV +df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv") + +# Remove stop words - can be slow for a lot of text! +# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches +# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends +start = time.time() +cache = set(stopwords.words("english")) +def remove_stopwords(review): + text = " ".join([word for word in review.split() if word not in cache]) + return text + +# Remove the stop words from both columns +df.Negative_Review = df.Negative_Review.apply(remove_stopwords) +df.Positive_Review = df.Positive_Review.apply(remove_stopwords) +``` + +### 감정 분석하기 + +지금부터 모든 부정적이고 긍정적인 리뷰 열에 대한 감정 분석을 계산하고, 2개 열에 결과를 저장해야 합니다. 감정 테스트는 같은 리뷰로 리뷰어의 점수를 비교할 예정입니다. 예시로, 만약 부정적인 리뷰가 1 (많이 긍정적인 감정) 감정이고 1 긍정적인 리뷰 감정이라고 감정을 내렸지만, 리뷰어가 낮은 점수로 호텔을 리뷰하면, 리뷰 텍스트가 점수와 어느 것도 매치되지 않거나, sentiment analyser가 감정을 똑바로 인식할 수 없습니다. 일부 감정 점수는 다 틀릴 수 있고, 그 이유를 자주 설명할 수 있습니다. 예시로. "Of course I LOVED sleeping in a room with no heating" 리뷰는 극도로 풍자적이고 sentiment analyser는 긍정적인 감정이라고 생각하지만, 사람이 읽으면 풍자라는 것을 알 수 있습니다. + +NLTK는 학습하는 다양한 sentiment analyzer를 제공하고, 이를 대신헤서 감정이 얼마나 정확한지 볼 수 있습니다. VADER sentiment analysis를 여기에서 사용했습니다. + +> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +```python +from nltk.sentiment.vader import SentimentIntensityAnalyzer + +# Create the vader sentiment analyser (there are others in NLTK you can try too) +vader_sentiment = SentimentIntensityAnalyzer() +# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +# There are 3 possibilities of input for a review: +# It could be "No Negative", in which case, return 0 +# It could be "No Positive", in which case, return 0 +# It could be a review, in which case calculate the sentiment +def calc_sentiment(review): + if review == "No Negative" or review == "No Positive": + return 0 + return vader_sentiment.polarity_scores(review)["compound"] +``` + +이후에 프로그램에서 감정을 계산하려 준비할 때, 다음 각 리뷰에서 적용할 수 있습니다: + +```python +# Add a negative sentiment and positive sentiment column +print("Calculating sentiment columns for both positive and negative reviews") +start = time.time() +df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment) +df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment) +end = time.time() +print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds") +``` + +이 컴퓨터에서 120초 정도 걸리지만, 각자 컴퓨터마다 다릅니다. 만약 결과를 출력하고 감정이 리뷰와 매치되는지 보려면 아래와 같이 진행합니다: + +```python +df = df.sort_values(by=["Negative_Sentiment"], ascending=True) +print(df[["Negative_Review", "Negative_Sentiment"]]) +df = df.sort_values(by=["Positive_Sentiment"], ascending=True) +print(df[["Positive_Review", "Positive_Sentiment"]]) +``` + +마지막으로 할 일은 도전에서 사용하기 전, 파일을 저장하는 것입니다! 쉽게 작업하도록 모든 새로운 열로 다시 정렬을 (사람인 경우, 외형 변경) 고려해야 합니다. + +```python +# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) +df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1) + +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) +``` + +(Hotel_Reviews_Filtered.csv 파일 만들어서 [your filtering notebook](solution/notebook-filtering.ipynb) 실행한 후에) [the analysis notebook](solution/notebook-sentiment-analysis.ipynb)으로 전체 코드를 실행해야 합니다. + +검토하는, 단계는 이렇습니다: + +1. 원본 데이터셋 **Hotel_Reviews.csv** 파일은 이전 강의에서 [the explorer notebook](../../4-Hotel-Reviews-1/solution/notebook-explorer.ipynb)으로 살펴보았습니다 +2. Hotel_Reviews.csv는 [the filtering notebook](../solution/notebook-filtering.ipynb)에서 필터링되고 **Hotel_Reviews_Filtered.csv**에 결과로 남습니다 +3. Hotel_Reviews_Filtered.csv는 [the sentiment analysis notebook](../solution/notebook-sentiment-analysis.ipynb)에서 처리되어 **Hotel_Reviews_NLP.csv**에 결과로 남습니다 +4. 다음 NLP 도전에서 Hotel_Reviews_NLP.csv를 사용합니다 + +### 결론 + +시작했을 때, 열과 데이터로 이루어진 데이터셋이 었었지만 모두 다 확인되거나 사용되지 않았습니다. 데이터를 살펴보았으며, 필요없는 것은 필터링해서 지웠고, 유용하게 태그를 변환했고, 평균을 계산했으며, 일부 감정 열을 추가하고 기대하면서, 자연어 처리에 대한 일부 흥미로운 사실을 학습했습니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/40/) + +## 도전 + +이제부터 감정을 분석해둔 데이터셋을 가지고 있으므로, 이 커리큘럼 (clustering, perhaps?)에서 배웠던 전략으로 감정 주변 패턴을 결정해봅니다. + +## 검토 & 자기주도 학습 + +[this Learn module](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-15963-cxa)로 더 배우고 다른 도구도 사용해서 텍스트에서 감정을 찾습니다. + +## 과제 + +[Try a different dataset](../assignment.md) From 478a8d7a9fdc6a83fce4f346ac28acd7addc4361 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 8 Aug 2021 19:50:52 +0900 Subject: [PATCH 30/37] ADD : translate 7-1 --- .../1-Introduction/translations/README.ko.md | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 7-TimeSeries/1-Introduction/translations/README.ko.md diff --git a/7-TimeSeries/1-Introduction/translations/README.ko.md b/7-TimeSeries/1-Introduction/translations/README.ko.md new file mode 100644 index 0000000000..e5fdcd3181 --- /dev/null +++ b/7-TimeSeries/1-Introduction/translations/README.ko.md @@ -0,0 +1,186 @@ +# Time series forecasting 소개하기 + +![Summary of time series in a sketchnote](../../../sketchnotes/ml-timeseries.png) + +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +이 강의와 다음에서, 다른 토픽보다 덜 알려진 ML 사이언티스트의 레파토리 중에 흥미롭고 가치있는 파트인, time series forecasting에 대하여 약간 배우게 됩니다. Time series forecasting은 일종의 'crystal ball'입니다: 가격과 같은 값의 과거 성적에 기반해서, 미래 잠재 값을 예측할 수 있습니다. + +[![Introduction to time series forecasting](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Introduction to time series forecasting") + +> 🎥 이미지를 눌러서 time series forecasting에 대한 비디오를 봅니다 + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/41/) + +가격, 재고, 그리고 공급과 연관된 이슈에 직접 적용하게 된다면, 비지니스에 실제로 가치있는 유용하고 흥미로운 필드가 됩니다. 딥러닝 기술은 미래의 성능을 잘 예측하기 위해 더 많은 인사이트를 얻고자 사용했지만, time series forecasting은 classic ML 기술에서 지속적으로 많은 정보를 얻는 필드입니다. + +> Penn State의 유용한 time series 커리큘럼은 [here](https://online.stat.psu.edu/stat510/lesson/1)에서 찾을 수 있습니다 + +## 소개 + +시간에 따라 얼마나 자주 사용하는지 데이터를 제공하는 smart parking meters의 배열을 관리한다고 가정해봅니다. + +> 미터기의 과거 퍼포먼스를 기반으로, 공급과 수요의 법칙에 따라서 미래 값을, 예측할 수 있나요? + +목표를 이루기 위해 언제 할 지 정확히 예측하는 것은 time series forecasting으로 다룰 수 있는 도전입니다. 주차 공간을 찾을 때 바쁜 시간이면 더 많은 요금을 받아서 기분은 안 좋겠지만, 거리 청소할 수익을 벌 수 있는 확실한 방식이 될 예정입니다! + +time series 알고리즘 일부를 알아보면서 노트북에서 정리하고 준비한 일부 데이터로 시작합니다. 분석할 데이터는 GEFCom2014 forecasting competition에서 가져왔습니다. 2012년과 2014년 사이 시간당 전기 부하와 온도 값의 3년치로 이루어져 있습니다. 전기 부하와 온도의 과거에 기록된 패턴이 주어지면, 전기 부하의 미래 값을 예측할 수 있습니다. + +이 예시에서, 과거에 기록된 부하 데이터만 사용해서, 한 time step에 앞서 예측하는 방식을 배우게 됩니다. 그러나, 시작하기 전, 무대 뒤에서 어떤 일이 일어나는지 이해하는 것이 유용합니다. + +## 일부 정의 + +'time series' 용어를 만나면 여러 다른 맥락에서 사용하는 것을 이해할 필요가 있습니다. + +🎓 **Time series** + +수학에서, "time series은 시간 순서로 인덱스된 (또는 리스트되거나 그래픽으로 표기) 데이터 포인트 시리즈입니다. 가장 일반적으로, time series는 연속해서 같은 간격의 포인트로 되어있는 시퀀스입니다." time series 예시로는 [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series)의 당일 마감 값입니다. time series plot과 통계 모델링을 사용하면 신호 처리, 닐씨 예측, 지진 경보 등 발생하고 시간이 지나면서 데이터 포인트를 그릴 수 있는 다양한 필드에서 자주 마주하게 됩니다. + +🎓 **Time series analysis** + +Time series 분석은, 방금 전에 언급했던 time series 데이터의 분석입니다. Time series 데이터는 interrupting 이벤트 이전과 이후에 time series 진화 패턴을 감지하는 'interrupted time series'를 포함한 별개 폼을 가질 수 있습니다. time series에 필요한 분석 타입은, 데이터의 특성에 기반합니다. Time series 데이터 자체는 계열 숫자 또는 문자 폼을 가질 수 있습니다. + +분석하면, frequency-domain과 time-domain, 선형과 비선형 등 포함해서, 다양한 방식을 사용합니다. 이 데이터 타입을 분석할 많은 방식에 대해서 [Learn more](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm)합니다. + +🎓 **Time series forecasting** + +Time series forecasting은 모델로 이전에 수집한 과거 데이터에서 보여준 패턴을 기반으로 미래 값을 예측합니다. regression 모델은 plot에서 x 변수를 사용할 타임 인덱스로, time series 데이터를 살펴보는 것이 가능하지만, 앞서 언급한 데이터는 스페셜 타입 모델을 사용해서 잘 분석하게 됩니다. + +Time series 데이터는 linear regression으로 분석할 수 있는 데이터와 다르게, 정렬된 관찰 값의 리스트입니다. 가장 일반적인 하나는 "Autoregressive Integrated Moving Average"의 약어인, ARIMA입니다. + +[ARIMA models](https://online.stat.psu.edu/stat510/lesson/1/1.1)은 "시리즈의 현재 값을 과거 값과 과거 예측 오류로 엮습니다." 데이터가 시간이 지나면서 정렬되는, time-domain 데이터를 분석하는 게 가장 적당합니다. + +> [here](https://people.duke.edu/~rnau/411arim.htm)에서 배울 수 있고 다음 강의에서 다룰 예정인, ARIMA 모델에는 여러 타입이 있습니다. + +다음 강의에서, 시간이 지나가면서 바뀌는 하나의 변수에 초점을 맞추어진, [Univariate Time Series](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm)로 ARIMA 모델을 만드려고 합니다. 데이터 타입의 예시는 Mauna Loa Observatory에서 월별 C02 concentration을 기록한 [this dataset](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm)입니다. + +| CO2 | YearMonth | Year | Month | +| :----: | :-------: | :---: | :---: | +| 330.62 | 1975.04 | 1975 | 1 | +| 331.40 | 1975.13 | 1975 | 2 | +| 331.87 | 1975.21 | 1975 | 3 | +| 333.18 | 1975.29 | 1975 | 4 | +| 333.92 | 1975.38 | 1975 | 5 | +| 333.43 | 1975.46 | 1975 | 6 | +| 331.85 | 1975.54 | 1975 | 7 | +| 330.01 | 1975.63 | 1975 | 8 | +| 328.51 | 1975.71 | 1975 | 9 | +| 328.41 | 1975.79 | 1975 | 10 | +| 329.25 | 1975.88 | 1975 | 11 | +| 330.97 | 1975.96 | 1975 | 12 | + +✅ 이 데이터셋에서 시간이 지나며 변수를 식별합니다 + +## 고려할 Time Series [data characteristics](https://online.stat.psu.edu/stat510/lesson/1/1.1) + +time series 데이터를 봤을 때, 패턴을 더 잘 이해하고자 계산하고 완화해야 할 필요가 있는 특성이라는 점을 알 수 있습니다. 만약 분석하기 원하는 'signal'로 잠재적으로 제공하는 time series 데이터를 고려하면, 이 특성을 'noise'라고 생각할 수 있습니다. 일부 통계 기술로 이 특성 중 일부를 파생해서 이 'noise'를 자주 줄일 필요가 있을 것입니다. + +time series 작업하기 위해서 알아야 되는 일부 컨셉은 여기 있습니다: + +🎓 **Trends** + +트랜드는 시간이 지나면서 측정할 수 있는 증감으로 정의합니다. [Read more](https://machinelearningmastery.com/time-series-trends-in-python). time series의 컨텍스트에서, time series으로 트랜드를 사용하고 필요할 때 지우는 방식입니다. + +🎓 **[Seasonality](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +다양한 plot 타입이 데이터에서 seasonality를 어떻게 보여주는지 [Take a look](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm)합니다. + +🎓 **Outliers** + +아웃라이어는 표준회된 데이터 분산에서 멀어져 있습니다. + +🎓 **Long-run cycle** + +seasonality의 독립적으로, 1년 보다 긴 경제 침체같은 long-run cycle을 보여줄 수 있습니다. + +🎓 **Constant variance** + +시간이 지나면서, 일부 데이터는 낮과 밤 비율의 에너지 사용량처럼, 변하지 않는 파동을 보여줍니다. + +🎓 **Abrupt changes** + +데이터는 더 분석할 필요가 있는 갑작스러운 변화를 보여줄 수 있습니다. 예시로, COVID로 인하여 비지니스가 갑자기 끝나면, 데이터에 변경이 가해집니다. + +✅ 여기는 몇 년이 넘도록 일일 인-게임 통화를 보여주는 [sample time series plot](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python)입니다. 이 데이터에서 리스트로 되어있는 특성을 모두 식별할 수 있나요? + +![In-game currency spend](.././images/currency.png) + +## 연습 - 전력 사용량 데이터로 시작하기 + +주어진 과거 사용량으로 미래 전력 사용량을 예측하기 위한 time series 모델을 만들기 시작합시다. + +> 이 예시의 데이터는 GEFCom2014 forecasting competition에서 가져왔습니다. 2012년과 2014년 사이 시간당 전력 부하와 온도 값 3년치로 이루어져 있습니다. +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli and Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016. + +1. 이 강의의 `working` 폴더에서, _notebook.ipynb_ 파일을 엽니다. 데이터를 불러오고 시각화하기 위해 도움을 받을 수 있는 라이브러리를 추가해서 시작합니다 + + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + 참고, 환경을 세팅하고 데이터를 내려받으려 포함된 `common` 폴더에 있는 파일을 사용합니다. + +2. 다음으로, `load_data()`와 `head()`를 불러서 데이터프레임으로 데이터를 검사합니다: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + 날짜와 load를 나타내는 두 열을 볼 수 있습니다: + + | | load | + | :-----------------: | :----: | + | 2012-01-01 00:00:00 | 2698.0 | + | 2012-01-01 01:00:00 | 2558.0 | + | 2012-01-01 02:00:00 | 2444.0 | + | 2012-01-01 03:00:00 | 2402.0 | + | 2012-01-01 04:00:00 | 2403.0 | + +3. 지금부터, `plot()` 불러서 데이터를 plot 합니다: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![energy plot](../images/energy-plot.png) + +4. 지금부터, `[from date]: [to date]` 패턴에서 `energy`를 넣어서 제공하는, July 2014 첫 주를 plot합니다: + + ```python + energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![july](../images/july-2014.png) + + 예쁜 plot 입니다! 이 plot을 보고 다음 리스트된 특성을 다 판단할 수 있는지 확인합니다. 데이터를 시각화해서 추측할 내용이 있나요? + +다음 강의에서, 일부 예측하는 ARIMA 모델을 만들 예정입니다. + +--- + +## 🚀 도전 + +time series forecasting에서 얻을 수 있다고 생각할 수 있는 모든 산업과 조사 영역의 리스트를 만듭니다. 예술에 이 기술을 적용할 수 있다고 생각하나요? 경제학에서? 생태학에서? 리테일에서? 산업에서? 금융에서? 또 다른 곳은 어딘가요? + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/42/) + +## 검토 & 자기주도 학습 + +여기에서 커버되지 않지만, neural network는 가끔 time series forecasting의 classic 방식을 개선할 때 사용합니다. [in this article](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412)에서 해당 내용을 더 읽어봅니다. + +## 과제 + +[Visualize some more time series](../assignment.md) From 62d1acaeb8cf21920dee28f83ec6e5f8c1c4262c Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Mon, 9 Aug 2021 22:24:15 +0900 Subject: [PATCH 31/37] ADD : translate 7-2 --- .../2-ARIMA/translations/README.ko.md | 395 ++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 7-TimeSeries/2-ARIMA/translations/README.ko.md diff --git a/7-TimeSeries/2-ARIMA/translations/README.ko.md b/7-TimeSeries/2-ARIMA/translations/README.ko.md new file mode 100644 index 0000000000..71b4de77d0 --- /dev/null +++ b/7-TimeSeries/2-ARIMA/translations/README.ko.md @@ -0,0 +1,395 @@ +# ARIMA로 Time series forecasting 하기 + +이전 강의에서, time series forecasting에 대해 약간 배웠고 시간대 간격으로 전력 부하의 파동을 보여주는 데이터셋도 불러왔습니다. + +[![Introduction to ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introduction to ARIMA") + +> 🎥 영상을 보려면 이미지 클릭: A brief introduction to ARIMA models. The example is done in R, but the concepts are universal. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/43/) + +## 소개 + +이 강의에서, [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)로 모델을 만드는 상세한 방식을 살펴볼 예정입니다. ARIMA 모델은 [non-stationarity](https://wikipedia.org/wiki/Stationary_process)를 보여주는 데이터에 특히 알맞습니다. + +## 일반적인 컨셉 + +ARIMA로 작업하려고 한다면, 일부 컨셉을 알 필요가 있습니다: + +- 🎓 **Stationarity**. 통계 컨텍스트에서, stationarity는 시간이 지나면서 분포가 변경되지 않는 데이터를 나타냅니다. Non-stationary 데이터라면, 분석하기 위해서 변환이 필요한 트랜드로 파동을 보여줍니다. 예시로, Seasonality는, 데이터에 파동을 나타나게 할 수 있고 'seasonal-differencing' 처리로 뺄 수 있습니다. + +- 🎓 **[Differencing](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Differencing 데이터는, 통계 컨텍스트에서 다시 언급하자면, non-stationary 데이터를 non-constant 트랜드로 지워서 움직이지 않게 변형시키는 프로세스를 나타냅니다. "Differencing removes the changes in the level of a time series, eliminating trend and seasonality and consequently stabilizing the mean of the time series." [Paper by Shixiong et al](https://arxiv.org/abs/1904.07632) + +## Time series의 컨텍스트에서 ARIMA + +ARIMA의 파트를 언팩해서 어떻게 time series 모델을 만들고 예측하는 데에 도움을 주는지 더 이해합니다. + +- **AR - for AutoRegressive**. 이름에서 추측하듯, Autoregressive 모델은, 데이터에서 이전 값을 분석하고 가정하기 위해서 시간을 'back' 합니다. 이전 값은 'lags'이라고 불립니다. 예시로 연필의 월별 판매를 보여주는 데이터가 존재합니다. 각 월별 판매 총액은 데이터셋에서 'evolving variable'으로 생각됩니다. 이 모델은 "evolving variable of interest is regressed on its own lagged (i.e., prior) values."로 만들어졌습니다. [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - for Integrated**. 비슷한 'ARMA' 모델과 다르게, ARIMA의 'I'는 *[integrated](https://wikipedia.org/wiki/Order_of_integration)* 측면을 나타냅니다. non-stationarity를 제거하기 위해서 differencing 단계가 적용될 때 데이터는 'integrated'됩니다. + +- **MA - for Moving Average**. 이 모델의 [moving-average](https://wikipedia.org/wiki/Moving-average_model) 측면에서 lags의 현재와 과거 값을 지켜봐서 결정하는 출력 변수를 나타냅니다. + +결론: ARIMA는 가능한 근접하게 time series 데이터의 스페셜 폼에 맞는 모델을 만들기 위해서 사용합니다. + +## 연습 - ARIMA 모델 만들기 + +이 강의의 _/working_ 폴더를 열고 _notebook.ipynb_ 파일을 찾습니다. + +1. 노트북을 실행해서 `statsmodels` Python 라이브러리를 불러옵니다; ARIMA 모델이 필요할 예정입니다. + +1. 필요한 라이브러리를 불러옵니다 + +1. 지금부터, 데이터를 plot할 때 유용한 여러 라이브러리를 불러옵니다: + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from pandas.plotting import autocorrelation_plot + from statsmodels.tsa.statespace.sarimax import SARIMAX + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + from IPython.display import Image + + %matplotlib inline + pd.options.display.float_format = '{:,.2f}'.format + np.set_printoptions(precision=2) + warnings.filterwarnings("ignore") # specify to ignore warning messages + ``` + +1. `/data/energy.csv` 파일의 데이터를 Pandas 데이터프레임으로 불러오고 찾아봅니다: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. January 2012부터 December 2014까지 유효한 에너지 데이터를 모두 plot합니다. 지난 강의에서 보았던 데이터라서 놀랍지 않습니다: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + 지금부터, 모델을 만들어봅시다! + +### 훈련과 테스트 데이터셋 만들기 + +이제 데이터를 불러왔으면, 훈련과 테스트 셋으로 나눌 수 있습니다. 훈련 셋으로 모델을 훈련할 수 있습니다. 평소처럼, 모델 훈련이 끝나면, 데이터셋으로 정확도를 평가합니다. 모델이 미래에서 정보를 못 얻도록 테스트셋이 훈련 셋의 이후 기간을 커버하는지 확인할 필요가 있습니다. + +1. 2014년 September 1 부터 October 31 까지 2개월간 훈련 셋에 할당합니다. 테스트셋은 2014년 November 1 부터 December 31 까지 2개월간 포함합니다: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + 이 데이터는 에너지의 일일 소비 수량을 반영하므로, 강한 계절적 패턴이 있지만, 소비 수량은 최근 날짜와 매우 비슷합니다. + +1. 다른 점을 시각화합니다: + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![training and testing data](../images/train-test.png) + + 그래서, 데이터를 훈련하면 상대적으로 적은 시간대로도 충분해야 합니다. + + > 노트: ARIMA 모델을 fit할 때 사용하는 함수는 fitting하는 동안 in-sample 검증하므로, 검증 데이터를 생략할 예정입니다. + +### 훈련을 위한 데이터 준비하기 + +지금부터, 데이터 필터링하고 스케일링한 훈련 데이터를 준비할 필요가 있습니다. 필요한 시간대와 열만 포함된 데이터셋을 필터링하고, 0,1 간격으로 데이터를 예측하도록 확장합니다. + +1. 세트 별로 앞서 말해둔 기간만 포함하고 날짜가 추가된 'load' 열만 포함해서 원본 데이터셋을 필터링합니다: + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + 데이터의 모양을 볼 수 있습니다: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. (0, 1) 범위로 데이터를 스케일링합니다: + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. 원본 vs. 스케일된 데이터를 시각화합니다: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![original](../images/original.png) + + > 원본 데이터 + + ![scaled](../images/scaled.png) + + > 스케일된 데이터 + +1. 지금부터 스케일된 데이터를 보정했으므로, 테스트 데이터로 스케일할 수 있습니다: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### ARIMA 구현하기 + +ARIMA를 구현할 시간입니다! 미리 설치해둔 `statsmodels` 라이브러리를 지금 사용하겠습니다. + +이제 다음 몇 단계가 필요합니다 + + 1. `SARIMAX()`을 불러서 데이터를 정의하고 모델 파라미터를 전달합니다: p, d, 그리고 q 파라미터와, P, D, 그리고 Q 파라미터. + 2. fit() 함수를 불러서 훈련 데이터을 위한 모델을 준비합니다. + 3. `forecast()` 함수를 부르고 예측할 단계 숫자를 (`horizon`) 지정해서 예측합니다. + +> 🎓 모든 파라미터는 무엇을 위해서 있나요? ARIMA 모델에 time series의 주요 측면을 모델링 도울 때 사용하는 3개 파라미터가 있습니다: seasonality, trend, 그리고 noise. 파라미터는 이렇습니다: + +`p`: *past* 값을 합치는, 모델의 auto-regressive 측면과 관련있는 파라미터입니다. +`d`: time series에 적용할 *differencing* (🎓 differencing을 기억하나요 👆?) 결과에 영향받는, 모델의 통합 파트와 관련있는 파라미터입니다. +`q`: 모델의 moving-average 파트와 관련있는 파라미터입니다. + +> 노트: 데이터에 - 이러한 것처럼 - 계절적 측면이 있다면, seasonal ARIMA 모델 (SARIMA)을 사용합니다. 이러한 케이스에는 다른 파라미터 셋을 사용할 필요가 있습니다: `P`, `D`와, `Q`는 `p`, `d`와, `q`처럼 같은 집단이라는 점을 설명하지만, 모델의 계절적 컴포넌트에 대응합니다. + +1. 선호하는 horizon 값을 세팅하며 시작합니다. 3시간 동안 시도해봅시다: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + ARIMA 파라미터의 최적 값을 선택하는 것은 다소 주관적이고 시간이 많이 지나므로 어려울 수 있습니다. [`pyramid` library](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html)에서 `auto_arima()` 함수로 사용하는 것을 고려할 수 있습니다. + +1. 지금 당장 좋은 모델을 찾고자 약간 수동으로 선택하려고 합니다. + + ```python + order = (4, 1, 0) + seasonal_order = (1, 1, 0, 24) + + model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order) + results = model.fit() + + print(results.summary()) + ``` + + 결과 테이블이 출력되었습니다. + +첫 모델을 만들었습니다! 지금부터 평가하는 방식을 찾을 필요가 있습니다. + +### 모델 평가하기 + +모델을 평가하려면, `walk forward` 검증이라 불리는 것을 할 수 있습니다. 연습에서, time series 모델은 새로운 데이터를 사용할 수 있는 순간마다 다시-훈련하고 있습니다. 모델은 각 time step마다 최적 예측을 하게 됩니다. + +이 기술로 time series의 초반부터 시작해서, 훈련 데이터셋으로 모델을 훈련합니다. 다음 time step에서 예측하게 됩니다. 예측은 알려진 값을 기반으로 평가하게 됩니다. 훈련 셋은 알려진 값을 포함해서 확장하고 프로세스가 반복하게 됩니다. + +> 노트: 세트의 초반부터 관측치를 지울 수 있는, 훈련 셋에서 새로운 관측치를 추가할 때마다 효과적인 훈련을 위해 훈련 셋 window를 고정해서 유지해야 합니다. + +이 프로세스는 실전에서 모델이 어떻게 할 지에 대해서 강하게 추정하도록 제공합니다. 그러나, 많은 모델을 만들면 계산 비용이 생깁니다. 이는 데이터가 작거나 모델이 간단하지만, 스케일에 이슈가 있을 때 받아들일 수 있습니다. + +Walk-forward 검사는 time series 모델 평가의 최적 표준이고 이 프로젝트에 추천됩니다. + +1. 먼저, 각자 HORIZON 단계에 테스트 데이터 포인트를 만듭니다. + + ```python + test_shifted = test.copy() + + for t in range(1, HORIZON): + test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') + + test_shifted = test_shifted.dropna(how='any') + test_shifted.head(5) + ``` + + | | | load | load+1 | load+2 | + | ---------- | -------- | ---- | ------ | ------ | + | 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 | + | 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 | + | 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 | + | 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 | + | 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 | + + 데이터는 horizon 포인트에 따라서 수평으로 이동합니다. + +1. 테스트 데이터 길이의 크기로 반복해서 sliding window 방식으로 테스트 데이터를 예측합니다: + + ```python + %%time + training_window = 720 # dedicate 30 days (720 hours) for training + + train_ts = train['load'] + test_ts = test_shifted + + history = [x for x in train_ts] + history = history[(-training_window):] + + predictions = list() + + order = (2, 1, 0) + seasonal_order = (1, 1, 0, 24) + + for t in range(test_ts.shape[0]): + model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order) + model_fit = model.fit() + yhat = model_fit.forecast(steps = HORIZON) + predictions.append(yhat) + obs = list(test_ts.iloc[t]) + # move the training window + history.append(obs[0]) + history.pop(0) + print(test_ts.index[t]) + print(t+1, ': predicted =', yhat, 'expected =', obs) + ``` + + 진행하고 있는 훈련을 볼 수 있습니다: + + ```output + 2014-12-30 00:00:00 + 1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323] + + 2014-12-30 01:00:00 + 2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126] + + 2014-12-30 02:00:00 + 3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795] + ``` + +1. 예측과 실제 부하를 비교합니다: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + ```output + | | | timestamp | h | prediction | actual | + | --- | ---------- | --------- | --- | ---------- | -------- | + | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 | + | 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 | + | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 | + | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 | + | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 | + ``` + + 실제 부하와 비교해서, 시간당 데이터의 예측을 관찰해봅니다. 어느정도 정확한가요? + +### 모델 정확도 확인하기 + +모든 예측에서 mean absolute percentage error (MAPE)으로 테스트해서 모델의 정확도를 확인해봅니다. + +> **🧮 Show me the math** +> +> ![MAPE](../images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/)은 다음 공식에서 정의된 비율로 정확도를 예측해서 보여주도록 사용됩니다. actualt 과 predictedt 사이의 차이점을 actualt로 나누게 됩니다. "The absolute value in this calculation is summed for every forecasted point in time and divided by the number of fitted points n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) + +1. 코드로 방정식을 표현합니다: + + ```python + if(HORIZON > 1): + eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual'] + print(eval_df.groupby('h')['APE'].mean()) + ``` + +1. one step MAPE을 계산합니다: + + + ```python + print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%') + ``` + + One step forecast MAPE: 0.5570581332313952 % + +1. multi-step forecast MAPE을 출력합니다: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + 최적으로 낮은 숫자가 가장 좋습니다: 10 MAPE이 10% 내려져서 예측되었다고 생각해봅니다. + +1. 하지만 항상, 이 정확도 측정 종류를 시각적으로 보는 것이 더 쉬우므로, plot 해봅니다: + + ```python + if(HORIZON == 1): + ## Plotting single step forecast + eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8)) + + else: + ## Plotting multi step forecast + plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']] + for t in range(1, HORIZON+1): + plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values + + fig = plt.figure(figsize=(15, 8)) + ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0) + ax = fig.add_subplot(111) + for t in range(1, HORIZON+1): + x = plot_df['timestamp'][(t-1):] + y = plot_df['t+'+str(t)][0:len(x)] + ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t)) + + ax.legend(loc='best') + + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![a time series model](../images/accuracy.png) + +🏆 괜찮은 정확도로 모델을 보여주는, 매우 좋은 plot 입니다. 잘 마쳤습니다! + +--- + +## 🚀 도전 + +Time Series 모델의 정확도를 테스트할 방식을 파봅니다. 이 강의에서 MAPE을 다루지만, 사용할 다른 방식이 있나요? 조사해보고 첨언해봅니다. 도움을 받을 수 있는 문서는 [here](https://otexts.com/fpp2/accuracy.html)에서 찾을 수 있습니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/44/) + +## 검토 & 자기주도 학습 + +이 강의에서 ARIMA로 Time Series Forecasting의 기초만 다룹니다. 시간을 내서 [this repository](https://microsoft.github.io/forecasting/)를 파보고 Time Series 모델 만드는 다양한 방식을 배우기 위한 모델 타입도 깊게 알아봅니다. + +## 과제 + +[A new ARIMA model](../assignment.md) From 7b255d202621f3b17b62d1e985978a3bc1776a3e Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Wed, 11 Aug 2021 21:22:45 +0900 Subject: [PATCH 32/37] ADD : translate 8-1 --- .../1-QLearning/translations/README.ko.md | 322 ++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 8-Reinforcement/1-QLearning/translations/README.ko.md diff --git a/8-Reinforcement/1-QLearning/translations/README.ko.md b/8-Reinforcement/1-QLearning/translations/README.ko.md new file mode 100644 index 0000000000..d031b459a8 --- /dev/null +++ b/8-Reinforcement/1-QLearning/translations/README.ko.md @@ -0,0 +1,322 @@ +# Reinforcement Learning과 Q-Learning 소개하기 + +![Summary of reinforcement in machine learning in a sketchnote](../../../sketchnotes/ml-reinforcement.png) +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Reinforcement learning에는 3가지 중요한 컨셉이 섞여있습니다: agent, 일부 states, 그리고 state 당 actions 세트. 특정 상황에서 행동하면 agent에게 보상이 주어집니다. Super Mario 게임을 다시 상상해봅니다. 마리오가 되어서, 게임 레벨에 진입하고, 구덩이 옆에 있습니다. 그 위에 동전이 있습니다. 게임 레벨에서, 특정 위치에 있는, 마리오가 됩니다 ... 이게 state 입니다. 한 단계 오른쪽으로 이동하면 (action) 구덩이를 빠져서, 낮은 점수를 받습니다. 그러나, 점프 버튼을 누르면 점수를 얻고 살아남을 수 있습니다. 긍정적인 결과이며, 긍정적인 점수를 줘야 합니다. + +reinforcement learning과 (게임) 시뮬레이터로, 살아남고 가능한 많은 점수로 최대 보상을 받는 게임의 플레이 방식을 배울 수 있습니다. + +[![Intro to Reinforcement Learning](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 Dmitry discuss Reinforcement Learning 들으려면 이미지 클릭 + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/45/) + +## 전제조건 및 설정 + +이 강의에서, Python으로 약간의 코드를 실험할 예정입니다. 이 강의에서 Jupyter Notebook을, 컴퓨터나 클라우드 어디에서나 실행해야 합니다. + +[the lesson notebook](../notebook.ipynb)을 열고 이 강의로 만들 수 있습니다. + +> **노트:** 만약 클라우드에서 코드를 연다면, 노트북 코드에서 사용하는 [`rlboard.py`](../rlboard.py) 파일도 가져올 필요가 있습니다. 노트북과 같은 디렉토리에 추가합니다. + +## 소개 + +이 강의에서, 러시아 작곡가 [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev)의 동화 곡에 영감을 받은, **[Peter and the Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)** 의 월드를 탐험해볼 예정입니다. **Reinforcement Learning**으로 Peter가 환경을 탐험하고, 맛있는 사과를 모으고 늑대는 피할 것입니다. + +**Reinforcement Learning** (RL)은 많은 실험을 돌려서 일부 **environment**에서 **agent**의 최적화된 동작을 배울 수 있는 훈련 기술입니다. 이 환경의 agent는 **reward function**으로 정의된, 약간의 **goal**을 가지고 있어야 합니다. + +## 환경 + +단순하고자, Peter의 월드를 이렇게 `width` x `height` 크기의 정사각형 보드로 고려해보려 합니다: + +![Peter's Environment](../images/environment.png) + +이 보드에서 각 셀은 이 중 하나 입니다: + +* **ground**, Peter와 다른 생명체가 걸을 수 있습니다. +* **water**, 무조건 걸을 수 없습니다. +* a **tree** or **grass**, 휴식할 수 있는 장소입니다. +* an **apple**, Peter가 스스로 먹으려고 찾을 수 있는 물건입니다. +* a **wolf**, 위험하고 피해야 합니다. + +이 환경에서 작성하는 코드가 포함되어 있는, [`rlboard.py`](../rlboard.py) 별도 Python 모듈이 있습니다. 그러므로 이 코드는 컨셉을 이해하는 게 중요하지 않으므로, 모듈을 가져오고 샘플 보드를 (code block 1) 만들고자 사용할 예정입니다: + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +이 코드는 위와 비슷하게 그림을 출력하게 됩니다. + +## 액션과 정책 + +예시에서, Peter의 목표는 늑대와 장애물을 피하고, 사과를 찾는 것입니다. 그러기 위해서, 사과를 찾기 전까지 걷게 됩니다. + +그러므로, 어느 위치에서, 다음 액션 중 하나를 선택할 수 있습니다: up, down, left 그리고 right. + +이 액션을 dictionary로 정의하고, 좌표 변경의 쌍을 맵핑합니다. 오른쪽 이동(`R`)은 `(1,0)` 쌍에 대응합니다. (code block 2): + +```python +actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } +action_idx = { a : i for i,a in enumerate(actions.keys()) } +``` + +요약해보면, 이 시나리오의 전략과 목표는 다음과 같습니다: + +- **agent (Peter)의 전략**은, **policy**로 불리며 정의됩니다. 정책은 주어진 state에서 action을 반환하는 함수입니다. 이 케이스에서, 문제의 state는 플레이어의 현재 위치를 포함해서, 보드로 표현합니다. + +- **reinforcement learning의 목표**는, 결국 문제를 효율적으로 풀수 있게 좋은 정책을 학습하는 것입니다. 그러나, 기본적으로, **random walk**라고 불리는 단순한 정책을 고려해보겠습니다. + +## 랜덤 워킹 + +랜덤 워킹 전략으로 첫 문제를 풀어봅시다. 랜덤 워킹으로, 사과에 닿을 때까지, 허용된 액션에서 다음 액션을 무작위로 선택합니다 (code block 3). + +1. 아래 코드로 랜덤 워킹을 구현합니다: + + ```python + def random_policy(m): + return random.choice(list(actions)) + + def walk(m,policy,start_position=None): + n = 0 # number of steps + # set initial position + if start_position: + m.human = start_position + else: + m.random_start() + while True: + if m.at() == Board.Cell.apple: + return n # success! + if m.at() in [Board.Cell.wolf, Board.Cell.water]: + return -1 # eaten by wolf or drowned + while True: + a = actions[policy(m)] + new_pos = m.move_pos(m.human,a) + if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water: + m.move(a) # do the actual move + break + n+=1 + + walk(m,random_policy) + ``` + + `walk`를 부르면 실행할 때마다 다르게, 일치하는 경로의 길이를 반환합니다. + +1. 워킹 실험을 여러 번 (say, 100) 실행하고, 통계 결과를 출력합니다 (code block 4): + + ```python + def print_statistics(policy): + s,w,n = 0,0,0 + for _ in range(100): + z = walk(m,policy) + if z<0: + w+=1 + else: + s += z + n += 1 + print(f"Average path length = {s/n}, eaten by wolf: {w} times") + + print_statistics(random_policy) + ``` + + 가까운 사과으로 가는 평균 걸음이 대략 5-6 걸음이라는 사실로 주어졌을 때, 경로의 평균 길이가 대략 30-40 걸음이므로, 꽤 오래 걸립니다. + + 또 랜덤 워킹을 하는 동안 Peter의 행동이 어떻게 되는지 확인할 수 있습니다: + + ![Peter's Random Walk](../images/random_walk.gif) + +## 보상 함수 + +정책을 더 지능적으로 만드려면, 행동을 다른 것보다 "더" 좋은지 이해할 필요가 있습니다. 이렇게, 목표를 정의할 필요가 있습니다. + +목표는 각 state에서 일부 점수 값을 반환할 예정인, **reward function**로 정의할 수 있습니다. 높은 점수일수록, 더 좋은 보상 함수입니다. (code block 5) + +```python +move_reward = -0.1 +goal_reward = 10 +end_reward = -10 + +def reward(m,pos=None): + pos = pos or m.human + if not m.is_valid(pos): + return end_reward + x = m.at(pos) + if x==Board.Cell.water or x == Board.Cell.wolf: + return end_reward + if x==Board.Cell.apple: + return goal_reward + return move_reward +``` + +보상 함수에 대해서 흥미로운 것은 많은 경우에, *게임이 끝날 때만 중요한 보상을 줍니다*. 알고리즘이 끝날 때 긍정적인 보상으로 이어지는 "good" 단계를 어떻게든지 기억하고, 중요도를 올려야 된다는 점을 의미합니다. 비슷하게, 나쁜 결과를 이끄는 모든 동작을 하지 말아야 합니다. + +## Q-Learning + +여기에서 논의할 알고리즘은 **Q-Learning**이라고 불립니다. 이 알고리즘에서, 정책은 **Q-Table** 불리는 함수 (데이터 구조)로 정의합니다. 주어진 state에서 각 액션의 "goodness"를 기록합니다. + +테이블, 또는 multi-dimensional 배열로 자주 표현하는 게 편리하므로 Q-Table이라고 부릅니다. 보드는 `width` x `height` 크기라서, `width` x `height` x `len(actions)` 형태의 numpy 배열로 Q-Table을 표현할 수 있습니다 : (code block 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Q-Table의 모든 값이 같다면, 이 케이스에서 - 0.25 으로 초기화합니다. 각자 state는 모두가 충분히 동일하게 움직이므로, "random walk" 정책에 대응됩니다. 보드에서 테이블을 시각화하기 위해서 Q-Table을 `plot` 함수에 전달할 수 있습니다: `m.plot(Q)`. + +![Peter's Environment](../images/env_init.png) + +각자 셀의 중심에 이동하는 방향이 표시되는 "arrow"가 있습니다. 모든 방향은 같으므로, 점이 출력됩니다. + +사과로 가는 길을 더 빨리 찾을 수 있으므로, 지금부터 시물레이션을 돌리고, 환경을 찾고, 그리고 더 좋은 Q-Table 분포 값을 배울 필요가 있습니다. + +## Q-Learning의 핵심: Bellman 방정식 + +움직이기 시작하면, 각 액션은 알맞은 보상을 가집니다, 예시로. 이론적으로 가장 높은 보상을 바로 주면서 다음 액션을 선택할 수 있습니다. 그러나, 대부분 state 에서, 행동은 사과에 가려는 목표가 성취감에 없으므로, 어떤 방향이 더 좋은지 바로 결정하지 못합니다. + +> 즉시 발생되는 결과가 아니라, 시뮬레이션의 끝에 도달했을 때 생기는, 최종 결과라는 것을 기억합니다. + +딜레이된 보상에 대해 설명하려면, 문제를 재귀적으로 생각할 수 있는, **[dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming)** 의 원칙을 사용할 필요가 있습니다. + +지금 state *s*에 있고, state *s'* 다음으로 움직이길 원한다고 가정합니다. 그렇게 하면, 보상 함수로 정의된 즉시 보상 *r(s,a)* 를 일부 미래 보상과 함께 받게 될 예정입니다. Q-Table이 각 액션의 "attractiveness"를 올바르게 가져온다고 가정하면, *s'* state에서 *Q(s',a')* 의 최대 값에 대응하는 *a* 액션을 선택하게 됩니다. 그래서, state *s*에서 얻을 수 있는 가능한 좋은 미래 보상은 `max`a'*Q(s',a')*로 정의될 예정입니다. (여기의 최대는 state *s'*에서 가능한 모든 *a'* 액션으로 계산합니다.) + +주어진 *a* 액션에서, state *s*의 Q-Table 값을 계산하는 **Bellman formula**가 주어집니다: + + + +여기 y는 미래 보상보다 현재 보상을 얼마나 선호하는지 판단하는 **discount factor**로 불리고 있고 반대의 경우도 그렇습니다. + +## 알고리즘 학습 + +다음 방정식이 주어지면, 학습 알고리즘의 의사 코드를 작성할 수 있습니다: + +* 모든 state와 액션에 대하여 같은 숫자로 Q-Table Q 초기화 +* 학습률 α ← 1 설정 +* 수차례 시뮬레이션 반복 + 1. 랜덤 위치에서 시작 + 1. 반복 + 1. state *s* 에서 *a* 액션 선택 + 2. 새로운 state *s'* 로 이동해서 액션 수행 + 3. 게임이 끝나는 조건이 생기거나, 또는 총 보상이 너무 작은 경우 - 시뮬레이션 종료 + 4. 새로운 state에서 *r* 보상 계산 + 5. Bellman 방정식 따라서 Q-Function 업데이트 : *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ maxa'Q(s',a'))* + 6. *s* ← *s'* + 7. 총 보상을 업데이트하고 α. 감소 + +## Exploit vs. explore + +다음 알고리즘에서, 2.1 단계에 액션을 어떻게 선택하는지 명확하지 않습니다. 만약 랜덤으로 액션을 선택하면, 환경을 램덤으로 **explore**하게 되고, 일반적으로 가지 않는 영역도 탐험하게 되면서 꽤 자주 죽을 것 같습니다. 다른 방식은 이미 알고 있는 Q-Table 값을 **exploit**하고, state *s*에서 최고의 액션 (높은 Q-Table 값)을 선택하는 방식입니다. 그러나, 다른 state를 막을 수 있고, 최적의 솔루션을 찾지 못할 수 있습니다. + +따라서, 최적의 방식은 exploration과 exploitation 사이 밸런스를 잘 조절하는 것입니다. 이는 Q-Table 값에 확률로 비례한 state *s*에서 액션을 선택할 수 있습니다. 초반에, Q-Table 값이 모두 같을 때, 랜덤 선택에 해당하겠지만, 환경을 더 배운다면, agent가 탐험하지 않은 경로를 선택하면서, 최적 경로를 따라갈 가능성이 커집니다. + +## Python 구현 + +지금 학습 알고리즘을 구현할 준비가 되었습니다. 그 전에, Q-Table에서 임의 숫자를 액션과 대응되는 확률 백터로 변환하는 일부 함수가 필요합니다. + +1. `probs()` 함수를 만듭니다: + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + ``` + + 백터의 모든 컴포넌트가 똑같다면, 초기 케이스에서 0으로 나누는 것을 피하기 위해서 원본 백터에 약간의 `eps`를 추가합니다. + +**epochs**라고 불리는, 5000번 실험으로 학습 알고리즘을 실행합니다: (code block 8) + + ```python + for epoch in range(5000): + + # Pick initial point + m.random_start() + + # Start travelling + n=0 + cum_reward = 0 + while True: + x,y = m.human + v = probs(Q[x,y]) + a = random.choices(list(actions),weights=v)[0] + dpos = actions[a] + m.move(dpos,check_correctness=False) # we allow player to move outside the board, which terminates episode + r = reward(m) + cum_reward += r + if r==end_reward or cum_reward < -1000: + lpath.append(n) + break + alpha = np.exp(-n / 10e5) + gamma = 0.5 + ai = action_idx[a] + Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max()) + n+=1 + ``` + +이 알고리즘이 실행된 후, Q-Table은 각 단계에 다른 액션의 attractiveness를 정의하는 값으로 업데이트해야 합니다. 움직이고 싶은 방향의 방향으로 각 셀에 백터를 plot해서 Q-Table을 시각화할 수 있습니다. 단순하게, 화살표 머리 대신 작은 원을 그립니다. + + + +## 정책 확인 + +Q-Table은 각 state에서 각 액션의 "attractiveness"를 리스트로 가지고 있으므로, 사용해서 세계에서 실력있는 네비게이션으로 정의하는 것은 상당히 쉽습니다. 간편한 케이스는, 가장 높은 Q-Table 값에 상응하는 액션을 선택할 수 있는 경우입니다: (code block 9) + +```python +def qpolicy_strict(m): + x,y = m.human + v = probs(Q[x,y]) + a = list(actions)[np.argmax(v)] + return a + +walk(m,qpolicy_strict) +``` + +> 만약 코드를 여러 번 시도하면, 가끔 "hangs"을 일으키고, 노트북에 있는 STOP 버튼을 눌러서 중단할 필요가 있다는 점을 알게 됩니다. 최적 Q-Value의 측면에서 두 state가 "point"하는 상황이 있을 수 있기 때문에, 이러한 케이스에는 agent가 그 state 사이를 무한으로 이동하는 현상이 발생됩니다. + +## 🚀 도전 + +> **Task 1:** 특정 걸음 (say, 100) 숫자로 경로의 최대 길이를 제한하는 `walk` 함수를 수정하고, 가끔 코드가 이 값을 반환하는지 지켜봅니다. + +> **Task 2:** 이미 이전에 갔던 곳으로 돌아가지 않도록 `walk` 함수를 수정합니다. `walk`를 반복하는 것을 막을 수 있지만, agent가 탈출할 수 없는 곳은 여전히 "trapped" 될 수 있습니다. + +## Navigation + +더 좋은 네비게이션 정책으로 exploitation과 exploration을 합쳐서, 훈련 중에 사용했습니다. 이 정책에서, Q-Table 값에 비례해서, 특정 확률로 각 액션을 선택할 예정입니다. 이 전략은 이미 탐험한 위치로 agent가 돌아가는 결과를 도출할 수 있지만, 해당 코드에서 볼 수 있는 것처럼, 원하는 위치로 가는 평균 경로가 매우 짧게 결과가 나옵니다. (`print_statistics`가 100번 시뮬레이션 돌렸다는 점을 기억합니다): (code block 10) + +```python +def qpolicy(m): + x,y = m.human + v = probs(Q[x,y]) + a = random.choices(list(actions),weights=v)[0] + return a + +print_statistics(qpolicy) +``` + +이 코드가 실행된 후, 3-6의 범위에서, 이전보다 매우 작은 평균 경로 길이를 얻어야 합니다. + +## 학습 프로세스 조사 + +언급했던 것처럼, 학습 프로세스는 문제 공간의 구조에 대해 얻은 지식에 exploration과 exploration 사이 밸런스를 잘 맞춥니다. 학습 결과가 (agent가 목표로 가는 깗은 경로를 찾을 수 있게 도와주는 능력) 개선되었던 것을 볼 수 있지만, 학습 프로세스를 하는 동안에 평균 경로 길이가 어떻게 작동하는지 보는 것도 흥미롭습니다: + + + +배운 내용을 오약하면 이렇습니다: + +- **평균 경로의 길이 증가**. 처음 여기에서 볼 수 있는 것은, 평균 경로 길이가 증가하는 것입니다. 아마도 환경에 대해 잘 모를 때, 물 또는 늑대, 나쁜 state에 걸릴 수 있다는 사실입니다. 더 배우고 지식으로 시작하면, 환경을 오래 탐험할 수 있지만, 여전히 사과가 어디에 자라고 있는지 잘 모릅니다. + +- **배울수록, 경로 길이 감소**. 충분히 배웠으면, agent가 목표를 달성하는 것은 더 쉽고, 경로 길이가 줄어들기 시작합니다. 그러나 여전히 탐색하게 되므로, 최적의 경로를 자주 빗겨나가고, 새로운 옵션을 탐험해서, 경로를 최적 경로보다 길게 만듭니다. + +- **급격한 길이 증가**. 이 그래프에서 관찰할 수 있는 약간의 포인트는, 갑자기 길이가 길어졌다는 것입니다. 프로세스의 추계학 특성을 나타내고, 일부 포인트에서 새로운 값을 덮어쓰는 Q-Table 계수로 "spoil"될 수 있습니다. 관성적으로 학습률을 줄여서 최소화해야 합니다 (예시로, 훈련이 끝나기 직전에, 작은 값으로만 Q-Table 값을 맞춥니다). + +전체적으로, 학습 프로세스의 성공과 퀄리티는 학습률, 학습률 감소, 그리고 감가율처럼 파라미터에 기반하는게 상당히 중요하다는 점을 기억합니다. 훈련하면서 최적화하면 (예시로, Q-Table coefficients), **parameters**와 구별해서, 가끔 **hyperparameters**라고 불립니다. 최고의 hyperparameter 값을 찾는 프로세스는 **hyperparameter optimization**이라고 불리며, 별도의 토픽이 있을 만합니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/46/) + +## 과제 + +[A More Realistic World](../assignment.md) From 752d5f5883e94098cc87776a51425f662433d694 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sat, 14 Aug 2021 10:36:50 +0900 Subject: [PATCH 33/37] ADD : translate 8-2 --- .../2-Gym/translations/README.ko.md | 340 ++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 8-Reinforcement/2-Gym/translations/README.ko.md diff --git a/8-Reinforcement/2-Gym/translations/README.ko.md b/8-Reinforcement/2-Gym/translations/README.ko.md new file mode 100644 index 0000000000..e7aa135648 --- /dev/null +++ b/8-Reinforcement/2-Gym/translations/README.ko.md @@ -0,0 +1,340 @@ +# CartPole 스케이팅 + +이전 강의에서 풀었던 문제는 장난감 문제처럼 보일 수 있고, 실제 시나리오에서 진짜 적용되지 않습니다. 체스나 바둑을 즐기는 것을 포함한 - 시나리오에 많은 실제 문제와 공유하기 때문에, 이 케이스는 아닙니다. 주어진 룰과 **discrete state**를 보드가 가지고 있기 때문에 비슷합니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/47/) + +## 소개 + +이 강의에서 Q-Learning의 같은 원칙을 하나 이상의 실수가 주어진 state인, **continuous state** 문제로 적용할 예정입니다. 다음 문제를 다루게 됩니다: + +> **문제**: 만약 Peter가 늑대로부터 도망가길 원한다면, 빠르게 움직일 필요가 있습니다. Peter가 특히 Q-Learning으로, 밸런스를 유지하면서, 스케이트를 배울 수 있는지 보게 됩니다. + +![The great escape!](../images/escape.png) + +> Peter와 친구들은 늑대로부터 도망갈 창의력을 얻습니다! Image by [Jen Looper](https://twitter.com/jenlooper) + +**CartPole** 문제로 알려진 밸런스있는 간단한 버전을 사용할 예정입니다. cartpole 월드에서, 왼쪽과 오른쪽으로 움직일 수 있는 수평 슬라이더를 가지며, 목표는 슬라이더의 위쪽에 있는 수직 폴을 밸런스하는 것입니다. + +a cartpole + +## 전제 조건 + +이 강의에서, **OpenAI Gym**으로 불리는 라이브러리를 사용해서 다른 **environments**를 시뮬레이션합니다. 이 강의의 코드를 로컬에서 (에시. from Visual Studio Code), 새로운 윈도우로 열어서 시뮬레이션할 수 있습니다. 코드를 온라인으로 실행할 때는, [here](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7)에서 설명된 것처럼, 코드를 약간 트윅할 필요가 있습니다. + +## OpenAI Gym + +이전 강의에서, 게임의 룰과 state는 스스로 정의했던 `Board` 클래스로 주어졌습니다. balancing pole의 물리학 그늘에서 시뮬레이션하는, 특별한 **simulation environment**를 사용할 예정입니다. 가장 인기있는 reinforcement learning 알고리즘을 훈련하기 위한 시뮬레이션 환경은 [OpenAI](https://openai.com/)애서 관리하는, [Gym](https://gym.openai.com/)이라고 불립니다. 이 gym을 사용해서 cartpole 시뮬레이션부터 Atari 게임까지 다양한 **environments**를 만들 수 있습니다. + +> **노트**: OpenAI Gym [here](https://gym.openai.com/envs/#classic_control)에서 사용할 수 있는 다양한 환경을 볼 수 있습니다. + +먼저, gym을 설치하고 필요한 라이브러리를 가져옵니다 (code block 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## 연습 - cartpole 환경 초기화 + +cartpole balancing 문제를 풀려면, 대상 환경을 초기화할 필요가 있습니다.각 환경은 이렇게 연결되었습니다: + +- **Observation space** 은 환경으로부터 받는 정보의 구조를 정의합니다. cartpole 문제라면, 폴의 위치, 속도와 일부 기타 값을 받습니다. + +- **Action space** 는 가능한 액션을 정의합니다. 이 케이스에서 action space는 추상적이고, 두 액션 **left**와 **right**로 이루어져 있습니다. (code block 2) + +1. 초기화하려면, 다음 코드를 타이핑합니다: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +어떻게 환경이 동작하는지 보려면, 100 번 짧게 시뮬레이션 돌립니다. 각 단계에서, 수행할 액션 중 하나를 제공합니다 - 이 시뮬레이션에서 `action_space`로 액션을 랜덤 선택하게 됩니다. + +1. 아래 코드를 실행하고 어떤 결과가 나오는지 봅니다. + + ✅ 로컬 설치한 Python에서 이 코드를 실행하도록 권장한다는 점을 기억합니다! (code block 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + 이 이미지와 비슷한 내용이 보여지게 됩니다: + + ![non-balancing cartpole](../images/cartpole-nobalance.gif) + +1. 시뮬레이션하는 동안, 액션 방식을 판단하기 위해서 관찰할 필요가 있습니다. 사실, step 함수는 현재 관측치, 보상 함수, 그리고 시뮬레이션을 지속하거나 끝내고자 가리키는 종료 플래그를 반환합니다: (code block 4) + + ```python + env.reset() + + done = False + while not done: + env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + print(f"{obs} -> {rew}") + env.close() + ``` + + 노트북 출력에서 이렇게 보이게 됩니다: + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + 시뮬레이션의 각 단계에서 반환되는 관찰 백터는 다음 값을 포함합니다: + - Position of cart + - Velocity of cart + - Angle of pole + - Rotation rate of pole + +1. 이 숫자의 최소 최대 값을 가져옵니다: (code block 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + 각 시뮬레이션 단계의 보상 값은 항상 1이라는 점을 알 수 있습니다. 목표는 가장 긴 기간에 폴을 합리적으로 수직 위치에 유지하며, 가능한 오래 생존하는 것입니다. + + ✅ 사실, the CartPole 시뮬레이션은 100번 넘는 시도에서 평균 195개 보상을 얻을 수 있게 관리되면 해결된 것으로 여깁니다. + +## State discretization + +Q=Learning에서, 각 state에서 할 것을 정의하는 Q-Table을 만들 필요가 있습니다. 이렇게 하려면, state가 **discreet**으로 되어야하고, 더 정확해지면, 한정된 discrete 값 숫자를 포함해야 합니다. 그래서, 관측치를 어떻게든지 **discretize** 해서, 한정된 state 세트와 맵핑할 필요가 있습니다. + +이렇게 할 수 있는 몇 방식이 있습니다: + +- **Divide into bins**. 만약 특정 값의 간격을 알고있다면, 간격을 **bins**의 수로 나누고, 값을 속해있는 bin 숫자로 변환할 수 있습니다. numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) 메소드로 마무리 지을 수 있습니다. 이 케이스에서, 디지털화를 선택하기 위해서 bin의 수를 기반했기 때문에, state 크기를 정확히 알게 됩니다. + +✅ linear interpolation으로 값을 한정된 간격 (say, from -20 to 20)에 가져오고, 반올림해서 숫자를 정수로 변환할 수 있습니다. 특별하게 입력 값의 정확한 범위를 모른다면, state의 크기에서 조금만 컨트롤하게 둡니다. 예시로, 4개 중에 2개 값은 상/하 한도가 없으므로, state 개수에서 무한으로 결과가 나올 수 있습니다. + +예시에서, 두 번째 접근 방식을 사용하겠습니다. 나중에 알게 되듯이, 정의하지 못한 상/하 한도에도, 이 값은 특정하게 한정된 간격에 벗어난 값을 드물게 가지므로, 극단적인 값을 가진 state는 매우 드뭅니다. + +1. 여기는 모델에서 관측치를 가지고, 4개 정수 값의 튜플을 만드는 함수입니다: (code block 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. bin으로 다른 discretization 방식도 찾아봅니다: (code block 7) + + ```python + def create_bins(i,num): + return np.arange(num+1)*(i[1]-i[0])/num+i[0] + + print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10)) + + ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter + nbins = [20,20,10,10] # number of bins for each parameter + bins = [create_bins(ints[i],nbins[i]) for i in range(4)] + + def discretize_bins(x): + return tuple(np.digitize(x[i],bins[i]) for i in range(4)) + ``` + +1. 지금부터 짧은 시뮬레이션을 실행하고 분리된 환경 값을 관찰합니다. 자유롭게 `discretize`와 `discretize_bins`를 시도하고 다른점이 있다면 봅시다. + + ✅ discretize_bins는 0-베이스인, bin 숫자를 반환합니다. 그래서 0 주변 입력 변수의 값은 간격의 중간에서 (10) 숫자를 반환합니다. discretize에서, 출력 값의 범위에 대해서 신경쓰지 못하고, negative를 허용하므로, state 값은 바뀌지 못하고, 0은 0에 대응합니다. (code block 8) + + ```python + env.reset() + + done = False + while not done: + #env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + #print(discretize_bins(obs)) + print(discretize(obs)) + env.close() + ``` + + ✅ 만약 환경 실행이 어떻게 되는지 보려면 env.render로 시작되는 줄을 주석 해제합니다. 그렇지 않으면 빠르게, 백그라운드에서 실행할 수 있습니다. Q-Learning 프로세스가 진행되면서 "invisible" 실행으로 사용할 수 있습니다. + +## Q-Table 구조 + +이전 강의에서, state는 0부터 8까지 숫자의 간단한 쌍이라서, 8x8x2 형태 numpy tensor로 Q-Table를 표현하는 게 편리합니다. 만약 bins discretization를 사용하면, state vector의 크기를 알 수 있으므로, 같은 접근 방식을 사용하고 20x20x10x10x2 형태 배열로 state를 나타냅니다 (여기 2 개는 액션 공간의 차원이고, 첫 차원은 관찰 공간에서 각 파라미터를 사용하고자 선택된 bin의 숫자에 해당합니다). + +그러나, 가끔은 관찰 공간의 정확한 넓이를 알 수 없습니다. `discretize` 함수의 케이스에서, 원본 값의 일부는 결합되지 않으므로, state가 특정한 제한 사항에 놓여있는지 확신할 수 없습니다. 따라서, 조금 다른 접근 방식으로 사용하고 dictionary로 Q-Table을 표현할 예정입니다. + +1. dictionary 키로 *(state,action)* 쌍을 사용하고, 값을 Q-Table 엔트리 값에 대응합니다. (code block 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + 여기 가능한 모든 액션에 해당하는 state로 주어진 Q-Table 값의 리스트를 반환하는, `qvalues()` 함수도 정의합니다. 만약 앤트리가 Q-Table에 없다면, 기본적으로 0을 반환합니다. + +## Q-Learning 시작합시다 + +지금부터 Peter에게 밸런스를 가르치기 직전입니다! + +1. 먼저, 일부 hyperparameters를 맞춥시다: (code block 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + 여기, `alpha`는 각 단계에서 Q-Table의 현재 값을 어느정도 범위로 조정할 수 있게 정의하는 **learning rate**입니다. 이전 강의에서는 1로 시작하고, 훈련하는 동안 `alpha`를 낮은 값으로 낮춥니다. 이 예시에서 간단하게 하고자 변함없이 그대로 두고, `alpha` 값을 조정하는 실험을 나중에 진행할 수 있습니다. + + `gamma`는 현재 보상을 넘는 미래 보상에 얼마나 우선 순위를 두어야 할지 나타내는 **discount factor**입니다. + + `epsilon`는 exploitation보다 exploration을 선호하는지 안 하는지에 관해 결정하는 **exploration/exploitation factor**입니다. 알고리즘에서, `epsilon` 퍼센트의 케이스는 Q-Table 값에 따라서 다음 액션을 선택하고, 남는 케이스에서는 랜덤 액션을 수행할 예정입니다. 전에 본 적 없는 검색 공간의 영역을 탐색할 수 있습니다. + + ✅ 밸런싱의 측면에서 - 랜덤 액션을 (exploration) 선택하는 것은 잘못된 방향으로 랜덤 펀치를 날릴 수 있으며, pole은 이 "실수"에서 밸런스를 복구하는 방식을 배우게 됩니다. + +### 알고리즘 개선 + +이전 강의의 알고리즘을 두 번 개선할 수 있습니다: + +- 여러 번 시뮬레이션해서, **평균 누적 보상을 계산합니다**. 각자 5000번 반복하면서 프로세스를 출력하고, 이 시간 동안에 누적 보상을 계산합니다. 195 포인트보다 더 얻었다면 - 필수보다 더 높은 퀄리티로, 문제를 해결한 것으로 간주한다는 점을 의미합니다. + +- `Qmax`로, **최대 평균 누적 결과를 계산하고**, 이 결과와 일치하는 Q-Table에 저장합니다. 훈련을 할 때 가끔 평균 누적 결과가 드랍되기 시작하는 것을 알아챌 수 있고, 훈련 중 관찰된 좋은 모델에 해당하는 Q-Table의 값을 그대로 두고 싶습니다. + +1. plot을 진행하기 위해서 `rewards` vector로 각 시뮬레이션의 누적 보상을 얻을 수 있습니다. (code block 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +이 결과에서 알 수 있습니다: + +- **목표에 가까워집니다**. 시뮬레이션을 100+번 넘게 계속 하면 195개 누적 보상을 얻는 목표에 가까워지거나, 실제로 달성했을 수도 있습니다! 만약 작은 숫자를 얻더라도, 평균적으로 5000번 넘게 하고, 드러나있는 표준으로도 100번만 수행해도 되므로, 여전히 알 수 없습니다. + +- **보상이 드랍되기 시작합니다**. 가끔 보상이 드랍되기 시작하면, 시뮬레이션을 안 좋게 만들어서 Q-Table에 이미 학습한 값을 "destroy"할 수 있다는 점을 의미합니다. + +이 관측치는 훈련 프로세스를 plot하면, 더 명확히 보입니다. + +## 훈련 프로세스 Plotting + +훈련 하면서, `rewards` vector로 각 반복에서 누적 보상 값을 얻었습니다. 여기에서 반복 숫자로 plot할 때 볼 수 았습니다: + +```python +plt.plot(rewards) +``` + +![raw progress](../images/train_progress_raw.png) + +그래프에서, 추계학 훈련 프로세스의 특성으로 훈련 세션 길이가 매우 달라지므로, 모든 것을 말할 수 없습니다. 이 그래프를 잘 이해하도록, 훈련 시리즈로 **running average**를 계산할 수 있습니다. 100으로 합시다. `np.convolve`으로 편하게 마무리 지을 수 있습니다: (code block 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![training progress](../images/train_progress_runav.png) + +## 다양한 hyperparameters + +더 안정적으로 훈련하기 위해서, 훈련 중에 일부 hyperparameters를 조정하는 게 괜찮습니다. 이런 특징이 있습니다: + +- **For learning rate**, `alpha`는, 1에 근접한 값으로 시작하고, 파라이터를 계속 줄이게 됩니다. 시간이 지나고, Q-Table에서 좋은 확률 값을 얻으므로, 새로운 값으로 완전히 덮지않고, 살짝 조정하게 됩니다. + +- **Increase epsilon**. 덜 explore하고 더 exploit하려고, `epsilon`을 천천히 증가하기 원할 수 있습니다. `epsilon`의 낮은 값으로 시작하고, 1에 가까이 올리는 것이 괜찮습니다. + +> **Task 1**: hyperparameter 값으로 플레이하고 높은 누적 보상에 달성할 수 있는지 확인합니다. 195보다 더 얻을 수 있나요? + +> **Task 2**: 정식으로 문제를 해결하려면, 100번 연속으로 195개 평균 보상을 얻을 필요가 있습니다. 훈련하면서 측정하고 공식적으로 문제를 해결했는지 확인합니다! + +## 실행 결과 보기 + +실제로 훈련된 모델이 어떻게 동작하는지 보는 것은 흥미롭습니다. 시뮬레이션을 돌리고 Q-Table 확률 분포에 따라서 샘플링된, 훈련을 하는 동안 같은 액션 선택 전략으로 따라갑니다: (code block 13) + +```python +obs = env.reset() +done = False +while not done: + s = discretize(obs) + env.render() + v = probs(np.array(qvalues(s))) + a = random.choices(actions,weights=v)[0] + obs,_,done,_ = env.step(a) +env.close() +``` + +이렇게 보입니다: + +![a balancing cartpole](../images/cartpole-balance.gif) + +--- + +## 🚀 도전 + +> **Task 3**: 여기, Q-Table의 최종 복사본을 사용하는 게, 최고가 아닐 수 있습니다. 최적-성능을 내는 Q-Table로 `Qbest` 변수를 저장했다는 점을 기억합니다! `Qbest`를 `Q`에 복사한 최적-성능을 내는 Q-Table로 같은 예시를 시도하고 다른 점을 파악합니다. + +> **Task 4**: 여기에는 각 단계에서 최상의 액션을 선택하지 않고, 일치하는 확률 분포로 샘플링했습니다. 가장 높은 Q-Table 값으로, 항상 최상의 액션을 선택하면 더 합리적인가요? `np.argmax` 함수로 높은 Q-Table 값에 해당되는 액션 숫자를 찾아서 마무리할 수 있습니다. 이 전략을 구현하고 밸런스를 개선했는지 봅니다. + +## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/48/) + +## 과제: [Train a Mountain Car](../assignment.md) + +## 결론 + +지금부터 agent에 게임에서 원하는 state를 정의하는 보상 함수로 제공하고, 검색 공간을 지능적으로 탐색할 기회를 주며 좋은 결과로 도달하도록 어떻게 훈련하는지 배웠습니다. discrete적이고 연속 환경의 케이스에서 Q-Learning 알고리즘을 성공적으로 적용했지만, discrete적인 액션으로 했습니다. + +Atari 게임 스크린에서의 이미지처럼, 액션 상태 또한 연속적이고, 관찰 공간이 조금 더 복잡해지는 시뮬레이션을 공부하는 것도 중요합니다. 이 문제는 좋은 결과에 도달하기 위해서, neural networks처럼, 더 강한 머신러닝 기술을 자주 사용해야 합니다. 이러한 더 구체적인 토픽은 곧 오게 될 더 어려운 AI 코스의 주제입니다. \ No newline at end of file From c1f52f34271ae3bf8bffdf8f6afd0a93cf4cd7d4 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 15 Aug 2021 11:32:55 +0900 Subject: [PATCH 34/37] ADD : translate 9-1 --- .../1-Applications/translations/README.ko.md | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 9-Real-World/1-Applications/translations/README.ko.md diff --git a/9-Real-World/1-Applications/translations/README.ko.md b/9-Real-World/1-Applications/translations/README.ko.md new file mode 100644 index 0000000000..c3aa37c200 --- /dev/null +++ b/9-Real-World/1-Applications/translations/README.ko.md @@ -0,0 +1,163 @@ +# 추신: 현실의 머신러닝 + + +![Summary of Machine learning in the real world in a sketchnote](../../../sketchnotes/ml-realworld.png) +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +이 커리큘럼에서, 훈련하기 위한 데이터를 준비하고 머신러닝 모델으로 만드는 다양한 방식을 배웠습니다. 일렬의 classic regression, clustering, classification, natural language processing과, time series 모델을 만들었습니다. 축하드립니다! 지금부터, 모두 어떤 것을 고려했는지 궁금할 수 있습니다... 이 모델로 어떤 현실 어플리케이션을 만들었나요? + +보통 딥러닝을 활용하는, AI로 산업에 많은 관심이 모이지만, 여전히 classical 머신러닝 모델의 가치있는 애플리케이션도 존재합니다. 오늘 이 애플리케이션 일부를 사용할 수도 있습니다! 이 강의에서, 8개 다양한 산업과 subject-matter 도메인에서 이 모델 타입으로 애플리케이션의 성능, 신뢰, 지능과, 사용자 가치를 어떻게 더 높일지 탐색할 예정입니다. + +## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/49/) + +## 💰 금융 + +금융 섹터는 머신러닝을 위해 많은 기회를 제공합니다. 이 영역의 많은 문제는 ML로 모델링하고 풀면서 할 수 있습니다. + +### 신용카드 사기 감지 + +코스 초반에 [k-means clustering](../../../5-Clustering/2-K-Means/README.md)에 대하여 배웠지만, 신용카드 사기와 관련된 문제를 풀려면 어떻게 사용할 수 있을까요? + +K-means clustering은 **outlier detection**이라고 불리는 신용카드 사기 탐지 기술 중에 능숙합니다. 데이터셋에 대한 관찰의 아웃라이어 또는, 표준 편차는, 신용카드가 일반적인 수용량으로 사용되거나 평범하지 않은 일이 일어나는지 알려줄 수 있습니다. 다음 링크된 논문에서 본 것처럼, k-means clustering 알고리즘으로 신용카드를 정렬하고 아웃라이어가 얼마나 나오는지 기반해서 트랜잭션을 클러스터에 할당할 수 있습니다. 그러면, 합법적인 트랜잭션과 대비해서 사기 행위인 위험한 클러스터를 평가할 수 있습니다. + +https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf + +### 재산 관리 + +재산 관리에서, 개인 혹은 공사는 클라이언트를 대신해서 투자합니다. 이 일은 오래 재산을 유지하고 증식시키기 위해서, 효율이 나는 투자를 선택하는 게 필수적입니다. + +투자 효율을 평가하는 방식 중 하나는 statistical regression을 통하는 것입니다. [Linear regression](../../../2-Regression/1-Tools/README.md)은 일부 벤치마크와 비교해서 펀드 효율을 이해하는데 가치있는 도구입니다. 또한 regression의 결과가 통게적으로 의미가 있는지, 클라이언트의 투자에 영향을 받을지 따질 수 있습니다. 추가적인 리스크를 고려할 수 있을 때, multiple regression으로 분석을 더욱 더 확장할 수 있습니다. 특정 펀드가 어덯게 동작하는지에 대한 예시로, regression으로 펀드 효율을 평가하는 다음 논문을 확인합니다. + +http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/ + +## 🎓 교육 + +교육 섹터도 ML이 적용되었을 때 매우 흥미롭습니다. 테스트나 에세이에서 치팅을 감지하거나 의도와 상관없는 편견을 정정하는 프로세스 관리처럼, 다루어야 할 흥미로운 문제입니다. + +### 학생 행동 예측 + +[Coursera](https://coursera.com)라는, 온라인 오픈코스 제공자는, 많은 엔지니어링 결정을 논의하는 훌륭한 기술 블로그입니다. 이 연구 케이스에서, 낮은 NPS (Net Promoter Score) 점수와 코스를 유지하거나 하차하는 사이의 모든 상관 관계를 탐색하려는 regression 라인을 plot합니다. + +https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a + +### 편견 완화 + +[Grammarly](https://grammarly.com)는, 맞춤법과 문법 오류를 확인하고, 프로덕트 전반적으로 복잡한 [natural language processing systems](../../../6-NLP/README.md)으로, 작문을 돕습니다. [introductory fairness lesson](../../../1-Introduction/3-fairness/README.md)에서 배운, 머신러닝의 gender bias를 다루는 방식을 기술 블로그에 흥미로운 케이스 스터디로 배포했습니다. + +https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/ + +## 👜 리테일 + +리테일 섹터는 더 좋은 고객 기록을 만들고 최적의 방식으로 재고를 모으는 모든 것에 대하여, ML로 명확하게 이익을 낼 수 있습니다. + +### 고객 기록 개인화 + +가구같은 가정용품을 파는 회사인, Wayfair에서는, 고객이 취향과 니즈에 맞는 제품을 찾도록 돕는 게 최고입니다. 이 아티클에서, 회사의 엔지니어들은 ML과 NLP로 "surface the right results for customers"하는 방식을 설명합니다. 특히나, Query Intent 엔진은 엔티티 추출, classifier 훈련, 자산과 의견 추출, 그리고 고객 리뷰에서 감정 태그까지 사용하도록 만들어졌습니다. 온라인 리테일에서 NLP가 어떻게 작동하는가에 대한 고전적인 사용 방식입니다. + +https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search + +### 재고 관리 + +소비자에게 의상을 배달해주는 박스 서비스인, [StitchFix](https://stitchfix.com)처럼 혁신적이고, 재빠른 회사는, 추천과 재고 관리를 ML에 많이 의존합니다. styling 팀은 merchandising 팀과 같이 일합니다, 사실은 이렇습니다: "one of our data scientists tinkered with a genetic algorithm and applied it to apparel to predict what would be a successful piece of clothing that doesn't exist today. We brought that to the merchandise team and now they can use that as a tool." + +https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/ + +## 🏥 의료 + +의료 섹션은 ML을 활용해서 연구 작업과 재입원 환자 또는 질병 확산 방지처럼 logistic 문제를 최적화할 수 있습니다. + +### 임상실험 관리 + +임상 실험에서 독성은 제약사의 주요 관심사입니다. 알미니 많은 독성을 참을 수 있을까요? 연구에서는, 다양한 임상 시도 방식을 분석해서 임상 시도 결과의 확률을 예측하는 새로운 접근 방식이 개발되었습니다. 특히나, random forest로 약물 그룹 사이에서 식별할 수 있는 [classifier](../../../4-Classification/README.md)도 만들 수 있었습니다. + +https://www.sciencedirect.com/science/article/pii/S2451945616302914 + +### 병원 재입원 관리 + +병원 치료는 특히나, 환자가 다시 입원해야 될 때 손실이 큽니다. 이 논문은 [clustering](../../../5-Clustering/README.md) 알고리즘으로 다시 입원할 가능성을 예측하는 ML로 사용하고 있는 회사를 설명합니다. 이 클러스터는 분석가가 "discover groups of readmissions that may share a common cause"하는 것이 도움됩니다. + +https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning + +### 질병 관리 + +최근 팬데믹은 머신러닝이 질병 확산을 막을 수 있게 도와주는 방식에서 희망찬 미래를 보여주었습니다. 이 아티클에서, ARIMA, ARIMA, logistic curves, linear regression과, SARIMA의 사용법을 알게 됩니다. "This work is an attempt to calculate the rate of spread of this virus and thus to predict the deaths, recoveries, and confirmed cases, so that it may help us to prepare better and survive." + +https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/ + +## 🌲 생태학과 환경 기술 + +자연과 생태학은 동물과 자연 사이의 상호 작용으로 초점을 맞추어진 많이 민감한 시스템으로 이루어져 있습니다. 이 시스템을 정확히 측정하고 산불이 나거나 동물 개체군이 줄어드는 것처럼, 일이 생기면 적절하게 행동하는 게 중요합니다. + +### 숲 관리 + +이전 강의에서 [Reinforcement Learning](../../../8-Reinforcement/README.md)에 대하여 배웠습니다. 자연에서 패턴을 예측 시도하면 매우 유용할 수 있습니다. 특히나, 산불이 나고 외래종의 확산처럼 생태학적 문제를 추적할 때 사용할 수 있습니다. Canada에서, 연구원 그룹은 Reinforcement Learning으로 위성 이미지에서 산불 역학 모델을 만들었습니다. 혁신적인 "spatially spreading process (SSP)"을 사용해서, "the agent at any cell in the landscape."로 산불을 상상했습니다. "The set of actions the fire can take from a location at any point in time includes spreading north, south, east, or west or not spreading. + +This approach inverts the usual RL setup since the dynamics of the corresponding Markov Decision Process (MDP) is a known function for immediate wildfire spread." 다음 링크에서 그룹이 사용했던 classic 알고리즘에 대하여 더 읽어봅니다. + +https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full + +### 동물의 움직임 감지 + +딥러닝이 동물 움직임을 시각적으로-추적하려고 혁신적으로 만들었지만 (여기에 [polar bear tracker](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-15963-cxa)를 만들 수 있습니다), classic ML은 여전히 이 작업에서 자리를 차지하고 있습니다. + +농장 동물의 움직임을 추적하는 센서와 이 비주얼 프로세싱 타입을 사용하는 IoT도 있지만, 더 기본적인 ML 기술은 데이터를 전처리할 때 유용합니다. 예시로, 논문에서, 다양한 classifier 알고리즘으로 양의 상태를 모니터링하고 분석했습니다. 335 페이지에서 ROC curve를 알게 될 수 있습니다. + +https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf + +### ⚡️ 에너지 관리 + +[time series forecasting](../../../7-TimeSeries/README.md)의 강의에서, 수요와 공급의 이해를 기반해서 마을 수익을 발생시키기 위한 smart parking meter의 컨셉을 불렀습니다. 이 아티클에서 clustering, regression과 time series forecasting이 합쳐진, smart metering을 기반으로, Ireland의 미래 애너지 사용량 예측을 어떻게 도와줄 수 있는지 자세히 이야기 합니다. + +https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf + +## 💼 보험 + +보험 섹터는 ML로 수행 가능한 재무와 보험계리학 모델을 구성하고 최적화하는 또 다른 섹터입니다. + +### 변동성 관리 + +생명 보험 제공자인, MetLife는, 재무 모델에서 변동성을 분석하고 완화하는 방식을 곧 보입니다. 이 아티클에서 binary와 ordinal classification 시각화를 파악할 수 있습니다. 또한 예측 시각화도 찾을 수 있습니다. + +https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf + +## 🎨 예술, 문화, 그리고 문학 + +예술에서, 저널리즘을 예시로 들자면, 많이 흥미로운 문제입니다. 가짜 뉴스를 감지하는 것은 사람들의 여론과 관계가 있고 민주주의를 흔든다고 입증되었기 때문에 큰 문제입니다. 박물관도 유물 사이 연결고리를 찾는 것부터 자원 관리까지 모든 것에 ML로 이익을 낼 수 있습니다. + +### 가짜 뉴스 감지 + +가짜 뉴스를 감지하는 것은 오늘의 미디어에서 고양이와 쥐의 게임으로 되어있습니다. 이 아티클에서, 원구원들은 연구했던 여러 ML 기술을 합친 시스템을 테스트하고 최적의 모델을 배포할 수 있다고 제안했습니다: "This system is based on natural language processing to extract features from the data and then these features are used for the training of machine learning classifiers such as Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD), and Logistic Regression(LR)." + +https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf + +이 아티클에서 서로 다른 ML 도메인을 합쳐서 가짜 뉴스의 확산과 실제 데미지를 막는 데 도울 수 있는 흥미로운 결과를 어떻게 얻을 수 있는지 보여줍니다; 이 케이스에서, 핵심은 집단 폭력을 유도했던 COVID 치료 방식에 대한 루머가 확산된 것입니다. + +### 박물관 ML + +박물관은 기술 발전이 다가오면서 수집품 카탈로그 작성과 디지털화 그리고 유물 사이 연결고리 찾는 게 더 쉬워지는 AI 혁신의 정점에 있습니다. [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) 같은 프로젝트는 Vatican Archives처럼 희귀한 수집품의 미스터리를 풀고자 도울 수 있습니다. 그러나, 박물관의 비지니스 측면에서도 ML 모델의 이익이 있습니다. + +예시로, Art Institute of Chicago는 관람객이 어디에 관심있고 언제 박람회에 참석하는지 예측하는 모델을 만들었습니다. 목표로 사용자가 박물관을 방문하는 순간마다 게인마다 맞춰서 최적화된 방문객 경험을 만들고자 했습니다. "During fiscal 2017, the model predicted attendance and admissions within 1 percent of accuracy, says Andrew Simnick, senior vice president at the Art Institute." + +https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices + +## 🏷 마케팅 + +### 고객 세분화 + +가장 효과적인 마케팅 전략은 다양한 그룹핑을 기반으로 다양한 방식에 소비자를 타게팅합니다. 이 아티클에서, Clustering 알고리즘으로 차별화된 마케팅을 지원하기 위한 이야기를 합니다. 차별화된 마케팅은 회사 브랜드 인식을 개선하고, 더 많은 소비자에게 다가가고, 더 많이 돈을 벌고자 도와줄 수 있습니다. + +https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/ + +## 🚀 도전 + +이 커리큘럼에서 배웠던 일부 기술로 이익을 낼 다른 색터를 식별하고, ML을 어떻게 사용하는지 탐색합니다. + +## [강의 후 학습](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/50/) + +## 검토 & 자기주도 학습 + +Wayfair 데이터 사이언스 팀은 회사에서 어떻게 ML을 사용하는지에 대한 여러 흥미로운 비디오를 남겼습니다. [taking a look](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)해볼 가치가 있습니다! + +## 과제 + +[A ML scavenger hunt](../assignment.md) From 6d0cf7e8a022b5eaa65c8fba2492f545ee1d3061 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 15 Aug 2021 14:49:36 +0900 Subject: [PATCH 35/37] FIX : fix stacked changes for korean translation --- .../1-intro-to-ML/translations/README.ko.md | 8 ++- .../2-history-of-ML/translations/README.ko.md | 4 +- .../3-fairness/translations/README.ko.md | 4 +- .../translations/README.ko.md | 16 +++-- .../1-Tools/translations/README.ko.md | 11 ++-- 2-Regression/2-Data/translations/README.ko.md | 7 ++- .../3-Linear/translations/README.ko.md | 5 +- .../4-Logistic/translations/README.ko.md | 35 ++++++----- 3-Web-App/1-Web-App/translations/README.ko.md | 26 ++++----- .../1-Introduction/translations/README.ko.md | 14 +++-- .../2-Classifiers-1/translations/README.ko.md | 58 +++++++++---------- .../3-Classifiers-2/translations/README.ko.md | 6 +- .../4-Applied/translations/README.ko.md | 10 ++-- .../1-Visualize/translations/README.ko.md | 6 +- .../2-K-Means/translations/README.ko.md | 6 +- .../translations/README.ko.md | 6 +- 6-NLP/2-Tasks/translations/README.ko.md | 4 +- .../translations/README.ko.md | 6 +- .../translations/README.ko.md | 4 +- .../translations/README.ko.md | 12 ++-- .../1-Introduction/translations/README.ko.md | 4 +- .../2-ARIMA/translations/README.ko.md | 9 ++- .../1-QLearning/translations/README.ko.md | 8 +-- .../2-Gym/translations/README.ko.md | 4 +- .../1-Applications/translations/README.ko.md | 4 +- 25 files changed, 150 insertions(+), 127 deletions(-) diff --git a/1-Introduction/1-intro-to-ML/translations/README.ko.md b/1-Introduction/1-intro-to-ML/translations/README.ko.md index 4696fc6755..478192bd1f 100644 --- a/1-Introduction/1-intro-to-ML/translations/README.ko.md +++ b/1-Introduction/1-intro-to-ML/translations/README.ko.md @@ -4,7 +4,7 @@ > 🎥 머신러닝, AI 그리고 딥러닝의 차이를 설명하는 영상을 보려면 위 이미지를 클릭합니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/1/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/1/) ### 소개 @@ -21,7 +21,7 @@ - **Python 배우기**. 이 코스에서 사용할 데이터 사이언티스트에게 유용한 프로그래밍 언어인 [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-15963-cxa)에 대한 기본적인 이해를 해야 좋습니다. - **Node.js 와 JavaScript 배우기**. 이 코스에서 웹앱을 빌드할 때 몇 번 JavaScript를 사용하므로, [node](https://nodejs.org) 와 [npm](https://www.npmjs.com/)을 설치해야 합니다, Python 과 JavaScript를 개발하며 모두 쓸 수 있는 [Visual Studio Code](https://code.visualstudio.com/)도 있습니다. - **GitHub 계정 만들기**. [GitHub](https://github.com)에서 찾았으므로, 이미 계정이 있을 수 있습니다, 혹시 없다면, 계정을 만든 뒤에 이 커리큘럼을 포크해서 직접 쓸 수 있습니다. (star 주셔도 됩니다 😊) -- **Scikit-learn 찾아보기**. 이 강의에서 참조하고 있는 ML 라이브러리 셋인 [Scikit-learn]([https://scikit-learn.org/stable/user_guide.html)을 숙지합니다. +- **Scikit-learn 찾아보기**. 이 강의에서 참조하고 있는 ML 라이브러리 셋인 [Scikit-learn](https://scikit-learn.org/stable/user_guide.html)을 숙지합니다. ### 머신러닝은 무엇인가요? @@ -97,12 +97,14 @@ 종이에 그리거나, [Excalidraw](https://excalidraw.com/)처럼 온라인 앱을 이용하여 AI, ML, 딥러닝, 그리고 데이터 사이언스의 차이를 이해합시다. 각 기술들이 잘 해결할 수 있는 문제에 대해 아이디어를 합쳐보세요. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/2/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/2/) ## 리뷰 & 자기주도 학습 클라우드에서 ML 알고리즘을 어떻게 사용하는 지 자세히 알아보려면, [Learning Path](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-15963-cxa)를 따릅니다. +ML의 기초에 대한 [Learning Path](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-15963-cxa)를 봅니다. + ## 과제 [Get up and running](../assignment.md) diff --git a/1-Introduction/2-history-of-ML/translations/README.ko.md b/1-Introduction/2-history-of-ML/translations/README.ko.md index 42621d4569..d630201e21 100644 --- a/1-Introduction/2-history-of-ML/translations/README.ko.md +++ b/1-Introduction/2-history-of-ML/translations/README.ko.md @@ -3,7 +3,7 @@ ![Summary of History of machine learning in a sketchnote](../../../sketchnotes/ml-history.png) > Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/3/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/3/) 이 강의에서, 머신러닝과 인공 지능의 역사에서 주요 마일스톤을 살펴보려 합니다. @@ -103,7 +103,7 @@ natural language processing 연구가 발전하고, 검색이 개선되어 더 역사적인 순간에 사람들 뒤에서 한 가지를 집중적으로 파고 있는 자를 자세히 알아보세요. 매력있는 캐릭터가 있으며, 문화가 사라진 곳에서는 과학적인 발견을 하지 못합니다. 당신은 어떤 발견을 해보았나요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/4/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/4/) ## 검토 & 자기주도 학습 diff --git a/1-Introduction/3-fairness/translations/README.ko.md b/1-Introduction/3-fairness/translations/README.ko.md index 3fb434f806..7cbc8e3534 100644 --- a/1-Introduction/3-fairness/translations/README.ko.md +++ b/1-Introduction/3-fairness/translations/README.ko.md @@ -3,7 +3,7 @@ ![Summary of Fairness in Machine Learning in a sketchnote](../../../sketchnotes/ml-fairness.png) > Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/5/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/5/) ## 소개 @@ -185,7 +185,7 @@ AI와 머신러닝의 공정성을 보장하는 건 계속 복잡한 사회기 모델을 구축하고 사용하면서 불공정한 실-생활 시나리오를 생각해보세요. 어떻게 고려해야 하나요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/6/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/6/) ## 검토 & 자기주도 학습 diff --git a/1-Introduction/4-techniques-of-ML/translations/README.ko.md b/1-Introduction/4-techniques-of-ML/translations/README.ko.md index db5170bddf..8e78db853b 100644 --- a/1-Introduction/4-techniques-of-ML/translations/README.ko.md +++ b/1-Introduction/4-techniques-of-ML/translations/README.ko.md @@ -5,7 +5,7 @@ - 머신러닝을 받쳐주는 프로세스를 고수준에서 이해합니다. - 'models', 'predictions', 그리고 'training data'와 같은 기초 개념을 탐색합니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/7/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/7/) ## 소개 @@ -36,13 +36,17 @@ 어떠한 종류의 질문을 대답하려면, 올바른 타입의 데이터가 필요합니다. 이 포인트에서 필요한 두 가지가 있습니다: - **데이터 수집**. 데이터 분석의 공정도를 설명한 이전 강의를 기억하고, 데이터를 조심히 수집합니다. 데이터의 출처와, 내재적 편견을 알고, 출처를 문서화합니다. -- **데이터 준비**. 데이터 준비 프로세스는 여러 단계가 있습니다. 데이터가 다양한 소스에서 제공되는 경우에는 정렬하고 노멀라이즈해야 할 수 있습니다. ([Clustering](../../../5-Clustering/1-Visualize/README.md)과 같이) 문자열을 숫자로 바꾸는 방식처럼 다양한 방식을 통하여 데이터의 품질과 양을 향상시킬 수 있습니다. ([Classification](../../../4-Classification/1-Introduction/README.md)과 같이) 원본 기반으로, 새로운 데이터를 생성할 수 있습니다. ([Web App](../../3-Web-App/README.md) 강의 이전처럼) 데이터를 정리하고 변경할 수 있습니다. 마지막으로, 훈련하는 기술에 따라서, 무작위로 섞어야 할 수 있습니다. +- **데이터 준비**. 데이터 준비 프로세스는 여러 단계가 있습니다. 데이터가 다양한 소스에서 제공되는 경우에는 정렬하고 노멀라이즈해야 할 수 있습니다. ([Clustering](../../../5-Clustering/1-Visualize/README.md)과 같이) 문자열을 숫자로 바꾸는 방식처럼 다양한 방식을 통하여 데이터의 품질과 양을 향상시킬 수 있습니다. ([Classification](../../../4-Classification/1-Introduction/README.md)과 같이) 원본 기반으로, 새로운 데이터를 생성할 수 있습니다. ([Web App](../../../3-Web-App/README.md) 강의 이전처럼) 데이터를 정리하고 변경할 수 있습니다. 마지막으로, 훈련하는 기술에 따라서, 무작위로 섞어야 할 수 있습니다. ✅ 데이터를 수집하고 처리하면, 그 모양이 의도한 질문을 해결할 수 있는 지 잠시 봅니다. [Clustering](../../5-Clustering/1-Visualize/README.md) 강의에서 본 것처럼, 데이터가 주어진 작업에서 잘 수행하지 못할 수 있습니다! -### feature 변수 선택하기 +### Features와 타겟 + +feature는 데이터의 측정할 수 있는 속성입니다. 많은 데이터셋에서 'date' 'size' 또는 'color'처럼 열 제목으로 표현합니다. 일반적으로 코드에서 X로 보여지는 feature 변수는, 모델을 훈련할 때 사용되는 입력 변수로 나타냅니다. -[feature](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection)는 데이터의 측정할 수 있는 속성입니다. 많은 데이터셋에서 'date' 'size' 또는 'color' 같은 컬럼 제목으로 표현합니다. 일반적인 코드에서 `y`로 나타내는 feature 변수는, 데이터에 물어보려는 질문에 대한 정답을 나타냅니다: 12월에, 어떤 **색상**의 호박이 가장 쌀까요? San Francisco에서, 부동산 **가격**이 가장 좋은 동네는 어디일까요? +타겟은 예측하려고 시도한 것입니다. 코드에서 X로 표시하는 보통 타겟은, 데이터에 물어보려는 질문의 대답을 나타냅니다: 12월에, 어떤 색의 호박이 가장 쌀까요? San Francisco 근처의 좋은 토지 실제 거래가는 어디인가요? 가끔은 타겟을 라벨 속성이라고 부르기도 합니다. + +### feature 변수 선택하기 🎓 **Feature Selection과 Feature Extraction** 모델을 만들 때 선택할 변수를 어떻게 알 수 있을까요? 가장 성능이 좋은 모델에 올바른 변수를 선택하기 위하여 Feature Selection 또는 Feature Extraction 프로세스를 거치게 됩니다. 그러나, 같은 내용이 아닙니다: "Feature extraction creates new features from functions of the original features, whereas feature selection returns a subset of the features." ([source](https://wikipedia.org/wiki/Feature_selection)) @@ -56,7 +60,7 @@ - **학습**. 데이터셋의 파트는 모델을 학습할 때 적당합니다. 이 셋은 본 데이터셋의 대부분을 차지합니다. - **테스트**. 테스트 데이터셋은 독립적인 데이터의 그룹이지만, 미리 만들어진 모델의 성능을 확인할 때에, 가끔 본 데이터에서도 수집됩니다. -- **검증**. 검증 셋은 모델을 개선하며 모델의 hyperparameters, 또는 architecture를 튜닝할 때, 사용하는 작은 독립된 예시 그룹입니다. ([Time Series Forecasting](../../7-TimeSeries/1-Introduction/README.md)에서 언급하듯) 데이터의 크기와 질문에 따라서 세번째 셋을 만들 이유가 없습니다. +- **검증**. 검증 셋은 모델을 개선하며 모델의 hyperparameters, 또는 architecture를 튜닝할 때, 사용하는 작은 독립된 예시 그룹입니다. ([Time Series Forecasting](../../../7-TimeSeries/1-Introduction/README.md)에서 언급하듯) 데이터의 크기와 질문에 따라서 세번째 셋을 만들 이유가 없습니다. ## 모델 구축하기 @@ -99,7 +103,7 @@ ML 실무자의 단계를 반영한 플로우를 그려보세요. 프로세스에서 지금 어디에 있는 지 보이나요? 어려운 내용을 예상할 수 있나요? 어떤게 쉬울까요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/8/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/8/) ## 검토 & 자기주도 학습 diff --git a/2-Regression/1-Tools/translations/README.ko.md b/2-Regression/1-Tools/translations/README.ko.md index 204da91435..f3287dcf5d 100644 --- a/2-Regression/1-Tools/translations/README.ko.md +++ b/2-Regression/1-Tools/translations/README.ko.md @@ -4,7 +4,7 @@ > Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/9/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/9/) ## 소개 @@ -54,7 +54,7 @@ 다음으로, 약간의 Python 코드를 추가합니다. -1. 코드 블록에서 **print("hello notebook'")** 입력합니다. +1. 코드 블록에서 **print('hello notebook')** 입력합니다. 1. 코드를 실행하려면 화살표를 선택합니다. 출력된 구문이 보여야 합니다: @@ -97,7 +97,7 @@ Scikit-learn 사용하면 올바르게 모델을 만들고 사용하기 위해 - **matplotlib**. 유용한 [graphing tool](https://matplotlib.org/)이며 line plot을 만들 때 사용합니다. - **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html)는 Python애서 숫자를 핸들링할 때 유용한 라이브러리입니다. -- **sklearn**. Scikit-learn 라이브러리 입니다. +- **sklearn**. [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) 라이브러리 입니다. 작업을 도움받으려면 라이브러리를 Import 합니다. @@ -183,6 +183,9 @@ s1 tc: T-Cells (a type of white blood cells) ```python plt.scatter(X_test, y_test, color='black') plt.plot(X_test, y_pred, color='blue', linewidth=3) + plt.xlabel('Scaled BMIs') + plt.ylabel('Disease Progression') + plt.title('A Graph Plot Showing Diabetes Progression Against BMI') plt.show() ``` @@ -197,7 +200,7 @@ s1 tc: T-Cells (a type of white blood cells) 이 데이터셋은 다른 변수를 Plot 합니다. 힌트: 이 라인을 수정합니다: `X = X[:, np.newaxis, 2]`. 이 데이터셋의 타겟이 주어질 때, 질병으로 당뇨가 진행되면 어떤 것을 탐색할 수 있나요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/10/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/10/) ## 검토 & 자기주도 학습 diff --git a/2-Regression/2-Data/translations/README.ko.md b/2-Regression/2-Data/translations/README.ko.md index dde1301431..64ddc721e1 100644 --- a/2-Regression/2-Data/translations/README.ko.md +++ b/2-Regression/2-Data/translations/README.ko.md @@ -1,9 +1,10 @@ # Scikit-learn 사용한 regression 모델 만들기: 데이터 준비와 시각화 > ![Data visualization infographic](.././images/data-visualization.png) + > Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/11/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/11/) ## 소개 @@ -53,7 +54,7 @@ visual Studio Code에서 _notebook.ipynb_ 파일을 열고 새로운 Pandas 데 ```python import pandas as pd - pumpkins = pd.read_csv('../../data/US-pumpkins.csv') + pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head() ``` @@ -190,7 +191,7 @@ Jupyter notebooks에서 잘 작동하는 데이터 시각화 라이브러리는 Matplotlib에서 제공하는 다양한 시각화 타입을 찾아보세요. regression 문제에 가장 적당한 타입은 무엇인가요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/12/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/12/) ## 검토 & 자기주도 학습 diff --git a/2-Regression/3-Linear/translations/README.ko.md b/2-Regression/3-Linear/translations/README.ko.md index bbfe09a0bf..57ba3201de 100644 --- a/2-Regression/3-Linear/translations/README.ko.md +++ b/2-Regression/3-Linear/translations/README.ko.md @@ -3,7 +3,7 @@ ![Linear vs polynomial regression infographic](.././images/linear-polynomial.png) > Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/13/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/13/) ### 소개 @@ -85,7 +85,6 @@ Scikit-learn을 사용할 예정이기 때문에, (할 수 있지만) 손으로 ```python from sklearn.preprocessing import LabelEncoder -new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform) new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform) ``` @@ -328,7 +327,7 @@ Scikit-learn에는 polynomial regression 모델을 만들 때 도움을 받을 노트북에서 다른 변수를 테스트하면서 상관 관계가 모델 정확도에 어떻게 대응되는 지 봅니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/14/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/14/) ## 검토 & 자기주도 학습 diff --git a/2-Regression/4-Logistic/translations/README.ko.md b/2-Regression/4-Logistic/translations/README.ko.md index bf52689cd8..1bca896209 100644 --- a/2-Regression/4-Logistic/translations/README.ko.md +++ b/2-Regression/4-Logistic/translations/README.ko.md @@ -3,7 +3,7 @@ ![Logistic vs. linear regression infographic](.././images/logistic-linear.png) > Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/15/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/15/) ## 소개 @@ -209,7 +209,7 @@ binary classification을 찾는 모델을 만드는 건 Scikit-learn에서 놀 > 🎓 '[confusion matrix](https://wikipedia.org/wiki/Confusion_matrix)' (또는 'error matrix')는 모델의 true 대 false 로 긍정 및 부정을 나타내서, 예측의 정확도를 측정하는 테이블입니다. -1. `confusin_matrix()` 불러서, confusion metrics를 사용합니다: +1. `confusion_matrix()` 불러서, confusion metrics를 사용합니다: ```python from sklearn.metrics import confusion_matrix @@ -223,26 +223,35 @@ binary classification을 찾는 모델을 만드는 건 Scikit-learn에서 놀 [ 33, 0]]) ``` -어떤 일이 생기나요? 모델이 2개의 binary categories 인, 'pumpkin' 카테고리와 'not-a-pumpkin' 카테고리 사이에 아이템을 분류하도록 질문받았다고 가정합니다. +Scikit-learn에서, confusion matrices 행은 (axis 0) 실제 라벨이고 열은 (axis 1) 예측된 라벨입니다. -- 만약 모델이 무언가를 호박으로 예측하고 실제로 'pumpkin' 카테고리에 있다면 true positive라고 부르며, 좌측 상단의 숫자로 보여집니다. -- 만약 모델이 무언가를 호박으로 예측하지 않았는데 실제 'pumpkin' 카테고리에 있다면 false positive라고 부르며, 우측 상단의 숫자로 보여집니다. -- 만약 모델이 무언가를 호박으로 예측하지만 실제로 'not-a-pumpkin' 카테고리에 있다면 false negative라고 부르며, 좌측 하단의 숫자로 보여집니다. -- 만약 모델이 무언가를 호박으로 예측하지 않았고 'not-a-pumpkin' 카테고리에 있다면 true negative라고 부르며, 우측 하단의 숫자로 보여집니다. +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | -![Confusion Matrix](../images/confusion-matrix.png) +어떤 일이 생기나요? 모델이 'orange'와 'not-orange' 카테고리의, 두 바이너리 카테고리로 호박을 분류하게 요청받았다고 가정합니다. -> Infographic by [Jen Looper](https://twitter.com/jenlooper) +- 만약 모델이 호박을 오랜지색이 아닌 것으로 예측하고 실제로 'not-orange' 카테고리에 있다면 좌측 상단에서 보여지고, true negative 라고 불립니다. +- 만약 모델이 호박을 오랜지색으로 예측하고 실제로 'not-orange' 카테고리에 있다면 좌측 하단에 보여지고, false negative 라고 불립니다. +- 만약 모델이 호박을 오랜지색이 아닌 것으로 예측하고 실제로 'orange' 카테고리에 있다면 우측 상단에 보여지고, false positive 라고 불립니다. +- 만약 모델이 호박을 오랜지색으로 예측하고 실제로 'orange' 카테고리에 있다면 우측 하단에 보여지고, true positive 라고 불립니다. 예상한 것처럼 true positives와 true negatives는 큰 숫자를 가지고 false positives와 false negatives은 낮은 숫자을 가지는 게 더 좋습니다, 모델의 성능이 더 좋다는 것을 의미합니다. +confusion matrix는 정확도와 재현율에 얼마나 관련있나요? classification 리포트에 정확도와 (0.83) 재현율 (0.98)으로 보여져서 출력되었습니다. + +Precision = tp / (tp + fp) = 162 / (162 + 33) = 0.8307692307692308 + +Recall = tp / (tp + fn) = 162 / (162 + 4) = 0.9759036144578314 + ✅ Q: confusion matrix에 따르면, 모델은 어떻게 되나요? A: 나쁘지 않습니다; true positives의 많은 숫자뿐만 아니라 몇 false negatives도 있습니다. confusion matrix TP/TN 과 FP/FN의 맵핑으로 미리 본 용어에 대하여 다시 봅니다: -🎓 정밀도: TP/(TP + FN) 검색된 인스턴스 중 관련된 인스턴스의 비율 (예시. 잘 라벨링된 라벨) +🎓 정밀도: TP/(TP + FP) 검색된 인스턴스 중 관련된 인스턴스의 비율 (예시. 잘 라벨링된 라벨) -🎓 재현율: TP/(TP + FP) 라벨링이 잘 되었는 지 상관없이, 검색한 관련된 인스턴스의 비율 +🎓 재현율: TP/(TP + FN) 라벨링이 잘 되었는 지 상관없이, 검색한 관련된 인스턴스의 비율 🎓 f1-score: (2 * precision * recall)/(precision + recall) 정밀도와 재현율의 가중치 평균은, 최고 1과 최저 0 @@ -289,9 +298,9 @@ classifications에 대한 이후 강의에서, 모델의 스코어를 개선하 --- ## 🚀 도전 -logistic regression과 관련해서 풀어야할 내용이 더 있습니다! 하지만 배우기 좋은 방식은 실험입니다. 이런 분석에 적당한 데이터셋을 찾아서 모델을 만듭니다. 무엇을 배우나요? 팁: 흥미로운 데이터셋으로 [Kaggle](https://kaggle.com)에서 시도해보세요. +logistic regression과 관련해서 풀어야할 내용이 더 있습니다! 하지만 배우기 좋은 방식은 실험입니다. 이런 분석에 적당한 데이터셋을 찾아서 모델을 만듭니다. 무엇을 배우나요? 팁: 흥미로운 데이터셋으로 [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets)에서 시도해보세요. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/16/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/16/) ## 검토 & 자기주도 학습 diff --git a/3-Web-App/1-Web-App/translations/README.ko.md b/3-Web-App/1-Web-App/translations/README.ko.md index 1f96443fa0..001d719078 100644 --- a/3-Web-App/1-Web-App/translations/README.ko.md +++ b/3-Web-App/1-Web-App/translations/README.ko.md @@ -1,6 +1,6 @@ # ML 모델 사용하여 Web App 만들기 -이 강의에서, 이 세상에 없었던 데이터셋에 대하여 ML 모델을 훈련할 예정입니다: _UFO sightings over the past century_, sourced from [NUFORC's database](https://www.nuforc.org). +이 강의에서, 이 세상에 없었던 데이터셋에 대하여 ML 모델을 훈련할 예정입니다: _UFO sightings over the past century_, sourced from NUFORC's database. 다음을 배우게 됩니다: @@ -11,7 +11,7 @@ 이러면, Flask로 웹 앱을 만들어야 합니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/17/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/17/) ## 앱 만들기 @@ -22,12 +22,12 @@ 많은 질문들을 물어볼 필요가 있습니다: - **웹 앱 혹은 모바일 앱인가요?** 만약 모바일 앱을 만들거나 IoT 컨텍스트에서 모델을 사용해야 되는 경우, [TensorFlow Lite](https://www.tensorflow.org/lite/)로 Android 또는 iOS 앱에서 모델을 사용할 수 있습니다. -- **모델은 어디에 있나요**? 클라우드 또는 로컬 중 어디인가요? -- **오프라인 지원**. 앱이 오프라인으로 동작하나요? +- **모델은 어디에 있나요?** 클라우드 또는 로컬 중 어디인가요? +- **오프라인 지원합니다.** 앱이 오프라인으로 동작하나요? - **모델을 훈련시킬 때 사용하는 기술은 무엇인가요?** 선택된 기술은 사용할 도구에 영향을 줄 수 있습니다. - - **Tensor flow 사용**. 만약 TensorFlow로 모델을 훈련한다면, 예시로, 에코 시스템은 [TensorFlow.js](https://www.tensorflow.org/js/)로 웹 앱에서 사용할 TensorFlow 모델을 변환해주는 기능을 제공합니다. - - **PyTorch 사용**. 만약 [PyTorch](https://pytorch.org/) 같은 라이브러리로 모델을 만들면, [Onnx Runtime](https://www.onnxruntime.ai/)으로 할 수 있는 JavaScript 웹 앱에서 사용하기 위한 [ONNX](https://onnx.ai/) (Open Neural Network Exchange) 포맷으로 내보낼 옵션이 존재합니다. 이 옵션은 Scikit-learn-trained 모델로 이후 강의에서 알아볼 예정입니다. - - **Lobe.ai 또는 Azure Custom vision 사용**. 만약 [Lobe.ai](https://lobe.ai/) 또는 [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-15963-cxa) 같은 ML SaaS (Software as a Service) 시스템으로 모델을 훈련하게 된다면, 이 소프트웨어 타입은 온라인 애플리케이션이 클라우드에서 쿼리된 bespoke API를 만드는 것도 포함해서 많은 플랫폼의 모델들을 내보낼 방식을 제공합니다. + - **Tensor flow 사용합니다.** 만약 TensorFlow로 모델을 훈련한다면, 예시로, 에코 시스템은 [TensorFlow.js](https://www.tensorflow.org/js/)로 웹 앱에서 사용할 TensorFlow 모델을 변환해주는 기능을 제공합니다. + - **PyTorch 사용합니다.** 만약 [PyTorch](https://pytorch.org/) 같은 라이브러리로 모델을 만들면, [Onnx Runtime](https://www.onnxruntime.ai/)으로 할 수 있는 JavaScript 웹 앱에서 사용하기 위한 [ONNX](https://onnx.ai/) (Open Neural Network Exchange) 포맷으로 내보낼 옵션이 존재합니다. 이 옵션은 Scikit-learn-trained 모델로 이후 강의에서 알아볼 예정입니다. + - **Lobe.ai 또는 Azure Custom vision 사용합니다.** 만약 [Lobe.ai](https://lobe.ai/) 또는 [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-15963-cxa) 같은 ML SaaS (Software as a Service) 시스템으로 모델을 훈련하게 된다면, 이 소프트웨어 타입은 온라인 애플리케이션이 클라우드에서 쿼리된 bespoke API를 만드는 것도 포함해서 많은 플랫폼의 모델들을 내보낼 방식을 제공합니다. 또 웹 브라우저에서 모델로만 훈련할 수 있는 모든 Flask 웹 앱을 만들 수 있습니다. JavaScript 컨텍스트에서 TensorFlow.js로 마무리 지을 수 있습니다. @@ -45,8 +45,8 @@ [NUFORC](https://nuforc.org) (The National UFO Reporting Center)에서 모아둔, 80,000 UFO 목격 데이터를 이 강의에서 사용합니다. 데이터에 UFO 목격 관련한 몇 흥미로운 설명이 있습니다, 예시로 들어봅니다: -- **긴 예시 설명**. "A man emerges from a beam of light that shines on a grassy field at night and he runs towards the Texas Instruments parking lot". -- **짧은 예시 설명**. "the lights chased us". +- **긴 예시를 설명합니다.** "A man emerges from a beam of light that shines on a grassy field at night and he runs towards the Texas Instruments parking lot". +- **짧은 예시를 설명합니다.** "the lights chased us". [ufos.csv](.././data/ufos.csv) 스프레드시트에는 목격된 `city`, `state` 와 `country`, 오브젝트의 `shape` 와 `latitude` 및 `longitude` 열이 포함되어 있습니다. @@ -58,7 +58,7 @@ import pandas as pd import numpy as np - ufos = pd.read_csv('../data/ufos.csv') + ufos = pd.read_csv('./data/ufos.csv') ufos.head() ``` @@ -167,7 +167,7 @@ print(model.predict([[50,44,-12]])) css/ templates/ notebook.ipynb - ufo-model.pk1 + ufo-model.pkl ``` ✅ 완성된 앱을 보려면 solution 폴더를 참조합니다 @@ -187,7 +187,7 @@ print(model.predict([[50,44,-12]])) cd web-app ``` -1. 터미널에서 `pip install`을 타이핑해서, _reuirements.txt_ 에 나열된 라이브러리를 설치합니다: +1. 터미널에서 `pip install`을 타이핑해서, _requirements.txt_ 에 나열된 라이브러리를 설치합니다: ```bash pip install -r requirements.txt @@ -335,7 +335,7 @@ Flask와 pickled 모델과 같이, 모델을 사용하는 이 방식은, 비교 노트북에서 작성하고 Flask 앱에서 모델을 가져오는 대신, Flask 앱에서 바로 모델을 훈련할 수 있습니다! 어쩌면 데이터를 정리하고, 노트북에서 Python 코드로 변환해서, `train`이라고 불리는 라우터로 앱에서 모델을 훈련합니다. 이러한 방식을 추구했을 때 장점과 단점은 무엇인가요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/18/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/18/) ## 검토 & 자기주도 학습 diff --git a/4-Classification/1-Introduction/translations/README.ko.md b/4-Classification/1-Introduction/translations/README.ko.md index 7b8dd68397..c1acee0701 100644 --- a/4-Classification/1-Introduction/translations/README.ko.md +++ b/4-Classification/1-Introduction/translations/README.ko.md @@ -19,7 +19,7 @@ Classification은 regression 기술과 공통점이 많은 [supervised learning] Classification은 다양한 알고리즘으로 데이터 포인트의 라벨 혹은 클래스를 결정할 다른 방식을 고릅니다. 요리 데이터로, 재료 그룹을 찾아서, 전통 요리로 결정할 수 있는지 알아보려 합니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/19/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/19/) ### 소개 @@ -164,7 +164,7 @@ Scikit-learn은 해결하고 싶은 문제의 타입에 따라서, 데이터를 def create_ingredient_df(df): ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] - ingredient_df = ingredient_df.sort_values(by='value', ascending=False + ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False) return ingredient_df ``` @@ -265,12 +265,18 @@ Scikit-learn은 해결하고 싶은 문제의 타입에 따라서, 데이터를 이 데이터는 훌륭하고 깔끔하고, 균형 잡히고, 그리고 매우 맛있습니다! +1. 마지막 단계는 라벨과 features를 포함한, 밸런스 맞춘 데이터를 파일로 뽑을 수 있는 새로운 데이터프레임으로 저장합니다: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + 1. `transformed_df.head()` 와 `transformed_df.info()`로 데이터를 다시 볼 수 있습니다. 다음 강의에서 쓸 수 있도록 데이터를 복사해서 저장합니다: ```python transformed_df.head() transformed_df.info() - transformed_df.to_csv("../data/cleaned_cuisine.csv") + transformed_df.to_csv("../data/cleaned_cuisines.csv") ``` 새로운 CSV는 최상단 데이터 폴더에서 찾을 수 있습니다. @@ -281,7 +287,7 @@ Scikit-learn은 해결하고 싶은 문제의 타입에 따라서, 데이터를 해당 커리큘럼은 여러 흥미로운 데이터셋을 포함하고 있습니다. `data` 폴더를 파보면서 binary 또는 multi-class classification에 적당한 데이터셋이 포함되어 있나요? 데이터셋에 어떻게 물어보나요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/20/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/20/) ## 검토 & 자기주도 학습 diff --git a/4-Classification/2-Classifiers-1/translations/README.ko.md b/4-Classification/2-Classifiers-1/translations/README.ko.md index 2483eddb28..e2c5c95979 100644 --- a/4-Classification/2-Classifiers-1/translations/README.ko.md +++ b/4-Classification/2-Classifiers-1/translations/README.ko.md @@ -4,7 +4,7 @@ 다양한 classifiers와 데이터셋을 사용해서 _재료 그룹 기반으로 주어진 국민 요리를 예측_ 합니다. 이러는 동안, classification 작업에 알고리즘을 활용할 몇 방식에 대해 자세히 배워볼 예정입니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/21/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/21/) ## 준비하기 @@ -16,13 +16,13 @@ ```python import pandas as pd - cuisines_df = pd.read_csv("../../data/cleaned_cuisine.csv") + cuisines_df = pd.read_csv("../../data/cleaned_cuisines.csv") cuisines_df.head() ``` 데이터는 이렇게 보입니다: - ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | | 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | @@ -30,7 +30,7 @@ | 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | - ``` + 1. 지금부터, 여러가지 라이브러리를 가져옵니다: @@ -69,13 +69,13 @@ features는 이렇게 보입니다: - | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | - | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | --- | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 지금부터 모델을 훈련할 준비가 되었습니다! @@ -201,13 +201,13 @@ multiclass 케이스로, 사용할 _scheme_ 와 설정할 _solver_ 를 선택해 결과가 출력됩니다 - 인도 요리가 가장 좋은 확률에 최선으로 추측됩니다. - | | 0 | | | | | | | | | | | | | | | | | | | | | - | -------: | -------: | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | - | indian | 0.715851 | | | | | | | | | | | | | | | | | | | | | - | chinese | 0.229475 | | | | | | | | | | | | | | | | | | | | | - | japanese | 0.029763 | | | | | | | | | | | | | | | | | | | | | - | korean | 0.017277 | | | | | | | | | | | | | | | | | | | | | - | thai | 0.007634 | | | | | | | | | | | | | | | | | | | | | + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | ✅ 모델이 이를 인도 요리라고 확신하는 이유를 설명할 수 있나요? @@ -218,22 +218,22 @@ multiclass 케이스로, 사용할 _scheme_ 와 설정할 _solver_ 를 선택해 print(classification_report(y_test,y_pred)) ``` - | precision | recall | f1-score | support | | | | | | | | | | | | | | | | | | | - | ------------ | ------ | -------- | ------- | ---- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | - | chinese | 0.73 | 0.71 | 0.72 | 229 | | | | | | | | | | | | | | | | | | - | indian | 0.91 | 0.93 | 0.92 | 254 | | | | | | | | | | | | | | | | | | - | japanese | 0.70 | 0.75 | 0.72 | 220 | | | | | | | | | | | | | | | | | | - | korean | 0.86 | 0.76 | 0.81 | 242 | | | | | | | | | | | | | | | | | | - | thai | 0.79 | 0.85 | 0.82 | 254 | | | | | | | | | | | | | | | | | | - | accuracy | 0.80 | 1199 | | | | | | | | | | | | | | | | | | | | - | macro avg | 0.80 | 0.80 | 0.80 | 1199 | | | | | | | | | | | | | | | | | | - | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | | | | | | | | | | | | | | | | | | + | | precision | recall | f1-score | support | + | ------------ | --------- | ------ | -------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | accuracy | 0.80 | 1199 | | | + | macro avg | 0.80 | 0.80 | 0.80 | 1199 | + | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | ## 🚀 도전 이 강의에서, 정리된 데이터로 재료의 시리즈를 기반으로 국민 요리를 예측할 수 있는 머신러닝 모델을 만들었습니다. 시간을 투자해서 Scikit-learn이 데이터를 분류하기 위해 제공하는 다양한 옵션을 읽어봅니다. 무대 뒤에서 생기는 일을 이해하기 위해서 'solver'의 개념을 깊게 파봅니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/22/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/22/) ## 검토 & 자기주도 학습 [this lesson](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)에서 logistic regression 뒤의 수학에 대해서 더 자세히 파봅니다. diff --git a/4-Classification/3-Classifiers-2/translations/README.ko.md b/4-Classification/3-Classifiers-2/translations/README.ko.md index 05b729f225..9438c4308b 100644 --- a/4-Classification/3-Classifiers-2/translations/README.ko.md +++ b/4-Classification/3-Classifiers-2/translations/README.ko.md @@ -2,11 +2,11 @@ 두번째 classification 강의에서, 숫자 데이터를 분류하는 더 많은 방식을 알아봅니다. 다른 것보다 하나의 classifier를 선택하는 파급효과도 배우게 됩니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/23/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/23/) ### 필요 조건 -직전 강의를 완료하고 4강 폴더의 최상단 `data` 폴더에 _cleaned_cuisine.csv_ 라고 불리는 정리된 데이터셋이 있다고 가정합니다. +직전 강의를 완료하고 4강 폴더의 최상단 `data` 폴더에 _cleaned_cuisines.csv_ 라고 불리는 정리된 데이터셋이 있다고 가정합니다. ### 준비하기 @@ -224,7 +224,7 @@ weighted avg 0.73 0.72 0.72 1199 각 기술에는 트윅할 수 있는 많은 수의 파라미터가 존재합니다. 각 기본 파라미터를 조사하고 파라미터를 조절헤서 모델 품질에 어떤 의미가 부여되는지 생각합니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/24/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/24/) ## 검토 & 자기주도 학습 diff --git a/4-Classification/4-Applied/translations/README.ko.md b/4-Classification/4-Applied/translations/README.ko.md index 72d239e7ee..d1684ddf6d 100644 --- a/4-Classification/4-Applied/translations/README.ko.md +++ b/4-Classification/4-Applied/translations/README.ko.md @@ -8,7 +8,7 @@ > 🎥 영상 보려면 이미지 클릭: Andrew Ng introduces recommendation system design -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/25/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/25/) 이 강의에서 다음을 배우게 됩니다: @@ -31,7 +31,7 @@ Applied ML 시스템을 만드는 것은 비지니스 시스템에서 이 기술 1. 유용한 라이브러리를 가져와서 시작합니다: ```python - pip install skl2onnx + !pip install skl2onnx import pandas as pd ``` @@ -40,7 +40,7 @@ Applied ML 시스템을 만드는 것은 비지니스 시스템에서 이 기술 1. 그리고, `read_csv()` 사용해서 CSV 파일을 읽어보면, 이전 강의에서 했던 같은 방식으로 데이터를 작업합니다: ```python - data = pd.read_csv('../data/cleaned_cuisine.csv') + data = pd.read_csv('../data/cleaned_cuisines.csv') data.head() ``` @@ -312,7 +312,7 @@ Netron은 모델을 보게 도와주는 도구입니다. ## 애플리케이션 테스트하기 -index.html 파일의 폴더에서 Visual Studio Code로 터미널 세션을 엽니다. 전역적으로 `[http-server](https://www.npmjs.com/package/http-server)`를 설치했는지 확인하고, 프롬프트에 `http-server`를 타이핑합니다. 로컬 호스트로 열고 웹 앱을 볼 수 있습니다. 여러 재료를 기반으로 추천된 요리를 확인합니다: +index.html 파일의 폴더에서 Visual Studio Code로 터미널 세션을 엽니다. 전역적으로 [http-server](https://www.npmjs.com/package/http-server)를 설치했는지 확인하고, 프롬프트에 `http-server`를 타이핑합니다. 로컬 호스트로 열고 웹 앱을 볼 수 있습니다. 여러 재료를 기반으로 추천된 요리를 확인합니다: ![ingredient web app](../images/web-app.png) @@ -322,7 +322,7 @@ index.html 파일의 폴더에서 Visual Studio Code로 터미널 세션을 엽 이 웹 앱은 매우 작아서, [ingredient_indexes](../../data/ingredient_indexes.csv) 데이터에서 성분과 인덱스로 계속 만듭니다. 주어진 국민 요리를 만드려면 어떤 풍미 조합으로 작업해야 되나요? -## [Post-lecture quiz](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/26/) +## [Post-lecture quiz](https://white-water-09ec41f0f.azurestaticapps.net/quiz/26/) ## 검토 & 자기주도 학습 diff --git a/5-Clustering/1-Visualize/translations/README.ko.md b/5-Clustering/1-Visualize/translations/README.ko.md index 58ea5dde90..c561bd621f 100644 --- a/5-Clustering/1-Visualize/translations/README.ko.md +++ b/5-Clustering/1-Visualize/translations/README.ko.md @@ -6,7 +6,7 @@ Clustering이 데이터셋에 라벨을 붙이지 않거나 입력이 미리 정 > 🎥 영상을 보려면 이미지 클릭. While you're studying machine learning with clustering, enjoy some Nigerian Dance Hall tracks - this is a highly rated song from 2014 by PSquare. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/27/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/27/) ### 소개 @@ -108,7 +108,7 @@ Clustering이 데이터셋에 라벨을 붙이지 않거나 입력이 미리 정 1. 좋은 데이터 시각화를 위해서 `Seaborn` 패키지를 가져옵니다. ```python - pip install seaborn + !pip install seaborn ``` 1. _nigerian-songs.csv_ 의 노래 데이터를 추가합니다. 일부 노래 데이터가 있는 데이터 프레임을 불러옵니다. 라이브러리를 가져오고 데이터를 덤프해서 찾아봅니다: @@ -322,7 +322,7 @@ Clustering이 데이터셋에 라벨을 붙이지 않거나 입력이 미리 정 다음 강의를 준비하기 위해서, 프로덕션 환경에서 찾아서 사용할 수 있는 다양한 clustering 알고리즘을 차트로 만듭니다. clustering은 어떤 문제를 해결하려고 시도하나요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/28/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/28/) ## 검토 & 자기주도 학습 diff --git a/5-Clustering/2-K-Means/translations/README.ko.md b/5-Clustering/2-K-Means/translations/README.ko.md index c5506d28e8..7e982b7841 100644 --- a/5-Clustering/2-K-Means/translations/README.ko.md +++ b/5-Clustering/2-K-Means/translations/README.ko.md @@ -4,7 +4,7 @@ > 🎥 영상을 보려면 이미지 클릭: Andrew Ng explains clustering -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/29/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/29/) 이 강의에서, Scikit-learn과 함께 이전에 가져온 나이지리아 음악 데이터셋으로 클러스터 제작 방식을 배울 예정입니다. Clustering을 위한 K-Means 기초를 다루게 됩니다. 참고로, 이전 강의에서 배웠던대로, 클러스터로 작업하는 여러 방식이 있고 데이터를 기반한 방식도 있습니다. 가장 일반적 clustering 기술인 K-Means을 시도해보려고 합니다. 시작해봅니다! @@ -238,11 +238,11 @@ Variance는 "the average of the squared differences from the Mean."으로 정의 힌트: 데이터를 더 키워봅니다. 가까운 범위 조건에 비슷한 데이터 열을 만들고자 추가하는 표준 스케일링 코드를 노트북에 주석으로 남겼습니다. silhouette 점수가 낮아지는 동안, elbow 그래프의 'kink'가 주름 펴지는 것을 볼 수 있습니다. 데이터를 조정하지 않고 남기면 덜 분산된 데이터가 더 많은 가중치로 나를 수 있다는 이유입니다. [here](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226) 이 문제를 조금 더 읽어봅니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/30/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/30/) ## 검토 & 자기주도 학습 -Stanford의 K-Means 시뮬레이터를 찾아봅니다 [here](https://stanford.edu/class/engr108/visualizations/kmeans/kmeans.html). 이 도구로 샘플 데이터 포인트를 시각화하고 무게 중심을 결정할 수 있습니다. 새로운 데이터로, 'update'를 클릭해서 수렴을 찾는데 얼마나 오래 걸리는지 봅니다. 데이터의 랜덤성, 클러스터 수와 무게 중심 수를 고칠 수 있습니다. 데이터를 그룹으로 묶기 위한 아이디어를 얻는 게 도움이 되나요? +[such as this one](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/)같은 K-Means 시뮬레이터를 찾아봅니다. 이 도구로 샘플 데이터 포인트를 시각화하고 무게 중심을 결정할 수 있습니다. 데이터의 랜덤성, 클러스터 수와 무게 중심 수를 고칠 수 있습니다. 데이터를 그룹으로 묶기 위한 아이디어를 얻는 게 도움이 되나요? 또한, Stanford의 [this handout on k-means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html)을 찾아봅니다. diff --git a/6-NLP/1-Introduction-to-NLP/translations/README.ko.md b/6-NLP/1-Introduction-to-NLP/translations/README.ko.md index 46b9506dfa..719775ea7f 100644 --- a/6-NLP/1-Introduction-to-NLP/translations/README.ko.md +++ b/6-NLP/1-Introduction-to-NLP/translations/README.ko.md @@ -2,7 +2,7 @@ 이 강의애서 *computational linguistics* 하위인, *natural language processing*의 간단한 역사와 중요 컨셉을 다룹니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/31/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/31/) ## 소개 @@ -69,7 +69,7 @@ Turing이 1950년에 *artificial intelligence*를 연구하고 있을 때, 만 ### Eliza 개발 -1960년에 *Joseph Weizenbaum*으로 불린 MIT 사이언티스트는, 사람의 질문을 답변하고 답변을 이해하는 모습을 주는 컴퓨터 'therapist' [*Eliza*](https:/wikipedia.org/wiki/ELIZA)를 개발했습니다. 하지만, Eliza는 문장을 파싱하고 특정 문법 구조와 키워드를 식별하여 이유있는 답변을 준다고 할 수 있지만, 문장을 *understand*한다고 말할 수 없습니다. 만약 Eliza가 "**I am** sad" 포맷과 유사한 문장을 제시받으면 문장에서 단어를 재배열하고 대치해서 "How long have **you been** sad" 형태로 응답할 수 있습니다. +1960년에 *Joseph Weizenbaum*으로 불린 MIT 사이언티스트는, 사람의 질문을 답변하고 답변을 이해하는 모습을 주는 컴퓨터 'therapist' [*Eliza*](https://wikipedia.org/wiki/ELIZA)를 개발했습니다. 하지만, Eliza는 문장을 파싱하고 특정 문법 구조와 키워드를 식별하여 이유있는 답변을 준다고 할 수 있지만, 문장을 *understand*한다고 말할 수 없습니다. 만약 Eliza가 "**I am** sad" 포맷과 유사한 문장을 제시받으면 문장에서 단어를 재배열하고 대치해서 "How long have **you been** sad" 형태로 응답할 수 있습니다. Eliza가 문장을 이해하고 다음 질문을 대답하는 것처럼 인상을 줬지만, 실제로는, 시제를 바꾸고 일부 단어를 추가했을 뿐입니다. 만약 Eliza가 응답할 키워드를 식별하지 못하는 경우, 여러 다른 문장에 적용할 수 있는 랜덤 응답으로 대신합니다. 만약 사용자가 "**You are** a bicycle"라고 작성하면 더 이유있는 응답 대신에, "How long have **I been** a bicycle?"처럼 답변하므로, Eliza는 쉽게 속을 수 있습니다. @@ -149,7 +149,7 @@ Eliza와 같은, 대화 봇은, 사용자 입력을 유도해서 지능적으로 다음 강의에서, natural language와 머신러닝을 분석하는 여러 다른 접근 방식에 대해 배울 예정입니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/32/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/32/) ## 검토 & 자기주도 학습 diff --git a/6-NLP/2-Tasks/translations/README.ko.md b/6-NLP/2-Tasks/translations/README.ko.md index 8410026037..ac6c7feb57 100644 --- a/6-NLP/2-Tasks/translations/README.ko.md +++ b/6-NLP/2-Tasks/translations/README.ko.md @@ -2,7 +2,7 @@ 대부분 *natural language processing* 작업으로, 처리한 텍스트를 분해하고, 검사하고, 그리고 결과를 저장하거나 룰과 데이터셋을 서로 참조했습니다. 이 작업들로, 프로그래머가 _meaning_ 또는 _intent_ 또는 오직 텍스트에 있는 용어와 단어의 _frequency_ 만 끌어낼 수 있게 합니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/33/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/33/) 텍스트를 처리하며 사용했던 일반적인 기술을 찾아봅니다. 머신러닝에 결합된, 이 기술은 효율적으로 많은 텍스트를 분석하는데 도와줍니다. 그러나, 이 작업에 ML을 적용하기 전에, NLP 스페셜리스트가 일으킨 문제를 이해합니다. @@ -203,7 +203,7 @@ It was nice talking to you, goodbye! 이전의 지식 점검에서 작업하고 구현합니다. 친구에게 봇을 테스트합니다. 그들을 속일 수 있나요? 좀 더 '믿을 수'있게 봇을 만들 수 있나요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/34/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/34/) ## 검토 & 자기주도 학습 diff --git a/6-NLP/3-Translation-Sentiment/translations/README.ko.md b/6-NLP/3-Translation-Sentiment/translations/README.ko.md index b051f18437..c9c6526e67 100644 --- a/6-NLP/3-Translation-Sentiment/translations/README.ko.md +++ b/6-NLP/3-Translation-Sentiment/translations/README.ko.md @@ -2,7 +2,7 @@ 이전 강의에서 noun phrase 추출하는 기초 NLP 작업을 하기 위해 ML behind-the-scenes을 포함한 라이브러리인, `TextBlob`으로 기본적인 봇을 만드는 방식을 배웠습니다. 컴퓨터 언어학에서 다른 중요한 도전은 구두나 다른 언어로 문장을 정확하게 _translation_ 하는 것입니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/35/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/35/) 번역은 천여 개 언어와 각자 많이 다른 문법 규칙이 있다는 사실에 의해서 합쳐진 매우 어려운 문제입니다. 한 접근 방식은 영어처럼, 한 언어의 형식적인 문법 규칙을 비-언어 종속 구조로 변환하고, 다른 언어로 변환하면서 번역합니다. 이 접근 방식은 다음 단계로 진행된다는 점을 의미합니다: @@ -144,7 +144,7 @@ Darcy, as well as Elizabeth, really loved them; and they were 1. 만약 polarity가 1 또는 -1이면 문장을 배열이나 positive 또는 negative 메시지 리스트에 저장합니다 5. 마지막으로, (각자) 모든 긍정적인 문장과 부정적인 문장, 각 수를 출력합니다 -여기에 샘플 [solution](../solutions/notebook.ipynb)이 있습니다. +여기에 샘플 [solution](../solution/notebook.ipynb)이 있습니다. ✅ 지식 점검 @@ -177,7 +177,7 @@ Darcy, as well as Elizabeth, really loved them; and they were 사용자 입력으로 다른 features를 추출해서 Marvin을 더 좋게 만들 수 있나요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/36/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/36/) ## 검토 & 자기주도 학습 diff --git a/6-NLP/4-Hotel-Reviews-1/translations/README.ko.md b/6-NLP/4-Hotel-Reviews-1/translations/README.ko.md index 796a59b737..59518abdc9 100644 --- a/6-NLP/4-Hotel-Reviews-1/translations/README.ko.md +++ b/6-NLP/4-Hotel-Reviews-1/translations/README.ko.md @@ -6,7 +6,7 @@ - 이미 존재하는 열을 기반으로 일부 새로운 데이터를 계산하는 방식 - 최종 도전에서 사용하고자 결과 데이터셋을 저장하는 방식 -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/37/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/37/) ### 소개 @@ -397,7 +397,7 @@ print("Loading took " + str(round(end - start, 2)) + " seconds") 이전 강의에서 본 것처럼, 이 강의에서 작업하기 전 데이터와 약점을 이해하는 것이 얼마나 치명적이게 중요한지 보여줍니다. 특별히, 텍스트-기반 데이터는, 조심히 조사해야 합니다. 다양한 text-heavy 데이터셋을 파보고 모델에서 치우치거나 편향된 감정으로 끼워놓은 영역을 찾을 수 있는지 확인합니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/38/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/38/) ## 검토 & 자기주도 학습 diff --git a/6-NLP/5-Hotel-Reviews-2/translations/README.ko.md b/6-NLP/5-Hotel-Reviews-2/translations/README.ko.md index 574f4ab504..da89209930 100644 --- a/6-NLP/5-Hotel-Reviews-2/translations/README.ko.md +++ b/6-NLP/5-Hotel-Reviews-2/translations/README.ko.md @@ -2,7 +2,7 @@ 지금까지 자세히 데이터셋을 살펴보았으며, 열을 필터링하고 데이터셋으로 NLP 기술을 사용하여 호텔에 대한 새로운 시각을 얻게 될 시간입니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/39/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/39/) ### 필터링 & 감정 분석 작업 @@ -348,20 +348,20 @@ print("Saving results to Hotel_Reviews_NLP.csv") df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) ``` -(Hotel_Reviews_Filtered.csv 파일 만들어서 [your filtering notebook](solution/notebook-filtering.ipynb) 실행한 후에) [the analysis notebook](solution/notebook-sentiment-analysis.ipynb)으로 전체 코드를 실행해야 합니다. +(Hotel_Reviews_Filtered.csv 파일 만들어서 [your filtering notebook](../solution/1-notebook.ipynb) 실행한 후에) [the analysis notebook](../solution/3-notebook.ipynb)으로 전체 코드를 실행해야 합니다. 검토하는, 단계는 이렇습니다: -1. 원본 데이터셋 **Hotel_Reviews.csv** 파일은 이전 강의에서 [the explorer notebook](../../4-Hotel-Reviews-1/solution/notebook-explorer.ipynb)으로 살펴보았습니다 -2. Hotel_Reviews.csv는 [the filtering notebook](../solution/notebook-filtering.ipynb)에서 필터링되고 **Hotel_Reviews_Filtered.csv**에 결과로 남습니다 -3. Hotel_Reviews_Filtered.csv는 [the sentiment analysis notebook](../solution/notebook-sentiment-analysis.ipynb)에서 처리되어 **Hotel_Reviews_NLP.csv**에 결과로 남습니다 +1. 원본 데이터셋 **Hotel_Reviews.csv** 파일은 이전 강의에서 [the explorer notebook](../../4-Hotel-Reviews-1/solution/notebook.ipynb)으로 살펴보았습니다 +2. Hotel_Reviews.csv는 [the filtering notebook](../solution/1-notebook.ipynb)에서 필터링되고 **Hotel_Reviews_Filtered.csv**에 결과로 남습니다 +3. Hotel_Reviews_Filtered.csv는 [the sentiment analysis notebook](../solution/3-notebook.ipynb)에서 처리되어 **Hotel_Reviews_NLP.csv**에 결과로 남습니다 4. 다음 NLP 도전에서 Hotel_Reviews_NLP.csv를 사용합니다 ### 결론 시작했을 때, 열과 데이터로 이루어진 데이터셋이 었었지만 모두 다 확인되거나 사용되지 않았습니다. 데이터를 살펴보았으며, 필요없는 것은 필터링해서 지웠고, 유용하게 태그를 변환했고, 평균을 계산했으며, 일부 감정 열을 추가하고 기대하면서, 자연어 처리에 대한 일부 흥미로운 사실을 학습했습니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/40/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/40/) ## 도전 diff --git a/7-TimeSeries/1-Introduction/translations/README.ko.md b/7-TimeSeries/1-Introduction/translations/README.ko.md index e5fdcd3181..d8f04e2220 100644 --- a/7-TimeSeries/1-Introduction/translations/README.ko.md +++ b/7-TimeSeries/1-Introduction/translations/README.ko.md @@ -10,7 +10,7 @@ > 🎥 이미지를 눌러서 time series forecasting에 대한 비디오를 봅니다 -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/41/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/41/) 가격, 재고, 그리고 공급과 연관된 이슈에 직접 적용하게 된다면, 비지니스에 실제로 가치있는 유용하고 흥미로운 필드가 됩니다. 딥러닝 기술은 미래의 성능을 잘 예측하기 위해 더 많은 인사이트를 얻고자 사용했지만, time series forecasting은 classic ML 기술에서 지속적으로 많은 정보를 얻는 필드입니다. @@ -175,7 +175,7 @@ seasonality의 독립적으로, 1년 보다 긴 경제 침체같은 long-run cyc time series forecasting에서 얻을 수 있다고 생각할 수 있는 모든 산업과 조사 영역의 리스트를 만듭니다. 예술에 이 기술을 적용할 수 있다고 생각하나요? 경제학에서? 생태학에서? 리테일에서? 산업에서? 금융에서? 또 다른 곳은 어딘가요? -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/42/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/42/) ## 검토 & 자기주도 학습 diff --git a/7-TimeSeries/2-ARIMA/translations/README.ko.md b/7-TimeSeries/2-ARIMA/translations/README.ko.md index 71b4de77d0..7ed625539f 100644 --- a/7-TimeSeries/2-ARIMA/translations/README.ko.md +++ b/7-TimeSeries/2-ARIMA/translations/README.ko.md @@ -6,7 +6,7 @@ > 🎥 영상을 보려면 이미지 클릭: A brief introduction to ARIMA models. The example is done in R, but the concepts are universal. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/43/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/43/) ## 소개 @@ -224,7 +224,7 @@ Walk-forward 검사는 time series 모델 평가의 최적 표준이고 이 프 ```python test_shifted = test.copy() - for t in range(1, HORIZON): + for t in range(1, HORIZON + 1): test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') test_shifted = test_shifted.dropna(how='any') @@ -295,7 +295,7 @@ Walk-forward 검사는 time series 모델 평가의 최적 표준이고 이 프 eval_df.head() ``` - ```output + output | | | timestamp | h | prediction | actual | | --- | ---------- | --------- | --- | ---------- | -------- | | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 | @@ -303,7 +303,6 @@ Walk-forward 검사는 time series 모델 평가의 최적 표준이고 이 프 | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 | | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 | | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 | - ``` 실제 부하와 비교해서, 시간당 데이터의 예측을 관찰해봅니다. 어느정도 정확한가요? @@ -384,7 +383,7 @@ Walk-forward 검사는 time series 모델 평가의 최적 표준이고 이 프 Time Series 모델의 정확도를 테스트할 방식을 파봅니다. 이 강의에서 MAPE을 다루지만, 사용할 다른 방식이 있나요? 조사해보고 첨언해봅니다. 도움을 받을 수 있는 문서는 [here](https://otexts.com/fpp2/accuracy.html)에서 찾을 수 있습니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/44/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/44/) ## 검토 & 자기주도 학습 diff --git a/8-Reinforcement/1-QLearning/translations/README.ko.md b/8-Reinforcement/1-QLearning/translations/README.ko.md index d031b459a8..b91313b67f 100644 --- a/8-Reinforcement/1-QLearning/translations/README.ko.md +++ b/8-Reinforcement/1-QLearning/translations/README.ko.md @@ -11,7 +11,7 @@ reinforcement learning과 (게임) 시뮬레이터로, 살아남고 가능한 > 🎥 Dmitry discuss Reinforcement Learning 들으려면 이미지 클릭 -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/45/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/45/) ## 전제조건 및 설정 @@ -230,7 +230,7 @@ Q-Table의 모든 값이 같다면, 이 케이스에서 - 0.25 으로 초기화 **epochs**라고 불리는, 5000번 실험으로 학습 알고리즘을 실행합니다: (code block 8) - ```python +```python for epoch in range(5000): # Pick initial point @@ -255,7 +255,7 @@ Q-Table의 모든 값이 같다면, 이 케이스에서 - 0.25 으로 초기화 ai = action_idx[a] Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max()) n+=1 - ``` +``` 이 알고리즘이 실행된 후, Q-Table은 각 단계에 다른 액션의 attractiveness를 정의하는 값으로 업데이트해야 합니다. 움직이고 싶은 방향의 방향으로 각 셀에 백터를 plot해서 Q-Table을 시각화할 수 있습니다. 단순하게, 화살표 머리 대신 작은 원을 그립니다. @@ -315,7 +315,7 @@ print_statistics(qpolicy) 전체적으로, 학습 프로세스의 성공과 퀄리티는 학습률, 학습률 감소, 그리고 감가율처럼 파라미터에 기반하는게 상당히 중요하다는 점을 기억합니다. 훈련하면서 최적화하면 (예시로, Q-Table coefficients), **parameters**와 구별해서, 가끔 **hyperparameters**라고 불립니다. 최고의 hyperparameter 값을 찾는 프로세스는 **hyperparameter optimization**이라고 불리며, 별도의 토픽이 있을 만합니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/46/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/46/) ## 과제 diff --git a/8-Reinforcement/2-Gym/translations/README.ko.md b/8-Reinforcement/2-Gym/translations/README.ko.md index e7aa135648..8fc05e8f42 100644 --- a/8-Reinforcement/2-Gym/translations/README.ko.md +++ b/8-Reinforcement/2-Gym/translations/README.ko.md @@ -2,7 +2,7 @@ 이전 강의에서 풀었던 문제는 장난감 문제처럼 보일 수 있고, 실제 시나리오에서 진짜 적용되지 않습니다. 체스나 바둑을 즐기는 것을 포함한 - 시나리오에 많은 실제 문제와 공유하기 때문에, 이 케이스는 아닙니다. 주어진 룰과 **discrete state**를 보드가 가지고 있기 때문에 비슷합니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/47/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/47/) ## 소개 @@ -329,7 +329,7 @@ env.close() > **Task 4**: 여기에는 각 단계에서 최상의 액션을 선택하지 않고, 일치하는 확률 분포로 샘플링했습니다. 가장 높은 Q-Table 값으로, 항상 최상의 액션을 선택하면 더 합리적인가요? `np.argmax` 함수로 높은 Q-Table 값에 해당되는 액션 숫자를 찾아서 마무리할 수 있습니다. 이 전략을 구현하고 밸런스를 개선했는지 봅니다. -## [강의 후 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/48/) +## [강의 후 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/48/) ## 과제: [Train a Mountain Car](../assignment.md) diff --git a/9-Real-World/1-Applications/translations/README.ko.md b/9-Real-World/1-Applications/translations/README.ko.md index c3aa37c200..62c09752c9 100644 --- a/9-Real-World/1-Applications/translations/README.ko.md +++ b/9-Real-World/1-Applications/translations/README.ko.md @@ -8,7 +8,7 @@ 보통 딥러닝을 활용하는, AI로 산업에 많은 관심이 모이지만, 여전히 classical 머신러닝 모델의 가치있는 애플리케이션도 존재합니다. 오늘 이 애플리케이션 일부를 사용할 수도 있습니다! 이 강의에서, 8개 다양한 산업과 subject-matter 도메인에서 이 모델 타입으로 애플리케이션의 성능, 신뢰, 지능과, 사용자 가치를 어떻게 더 높일지 탐색할 예정입니다. -## [강의 전 퀴즈](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/49/) +## [강의 전 퀴즈](https://white-water-09ec41f0f.azurestaticapps.net/quiz/49/) ## 💰 금융 @@ -152,7 +152,7 @@ https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/ 이 커리큘럼에서 배웠던 일부 기술로 이익을 낼 다른 색터를 식별하고, ML을 어떻게 사용하는지 탐색합니다. -## [강의 후 학습](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/50/) +## [강의 후 학습](https://white-water-09ec41f0f.azurestaticapps.net/quiz/50/) ## 검토 & 자기주도 학습 From 265c05dd65f10b906c5030086cc88d4ea9e70225 Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 15 Aug 2021 15:20:08 +0900 Subject: [PATCH 36/37] FIX : replace chapter readme ko translation file --- 1-Introduction/{ => translations}/README.ko.md | 10 +++++----- 2-Regression/{ => translations}/README.ko.md | 10 +++++----- 3-Web-App/{ => translations}/README.ko.md | 4 ++-- 4-Classification/{ => translations}/README.ko.md | 10 +++++----- 5-Clustering/{ => translations}/README.ko.md | 6 +++--- 6-NLP/{ => translations}/README.ko.md | 12 ++++++------ 7-TimeSeries/{ => translations}/README.ko.md | 6 +++--- 8-Reinforcement/{ => translations}/README.ko.md | 10 +++++----- 9-Real-World/{ => translations}/README.ko.md | 4 ++-- 9 files changed, 36 insertions(+), 36 deletions(-) rename 1-Introduction/{ => translations}/README.ko.md (79%) rename 2-Regression/{ => translations}/README.ko.md (89%) rename 3-Web-App/{ => translations}/README.ko.md (93%) rename 4-Classification/{ => translations}/README.ko.md (80%) rename 5-Clustering/{ => translations}/README.ko.md (94%) rename 6-NLP/{ => translations}/README.ko.md (76%) rename 7-TimeSeries/{ => translations}/README.ko.md (87%) rename 8-Reinforcement/{ => translations}/README.ko.md (89%) rename 9-Real-World/{ => translations}/README.ko.md (89%) diff --git a/1-Introduction/README.ko.md b/1-Introduction/translations/README.ko.md similarity index 79% rename from 1-Introduction/README.ko.md rename to 1-Introduction/translations/README.ko.md index 1bbdbb3861..4a5147a6fb 100644 --- a/1-Introduction/README.ko.md +++ b/1-Introduction/translations/README.ko.md @@ -2,15 +2,15 @@ 커리큘럼의 이 섹션에서, 머신러닝 필드의 기초가 될 기본 개념, 의미, 역사와 연구자가 이용하는 기술을 배울 예정입니다. 새로운 ML의 세계로 같이 모험을 떠납시다! -![globe](images/globe.jpg) +![globe](../images/globe.jpg) > Photo by Bill Oxford on Unsplash ### 강의 -1. [머신러닝 소개하기](1-intro-to-ML/translations/README.ko.md) -1. [머신러닝과 AI의 역사](2-history-of-ML/translations/README.ko.md) -1. [공정성과 머신러닝](3-fairness/translations/README.ko.md) -1. [머신러닝의 기술](4-techniques-of-ML/translations/README.ko.md) +1. [머신러닝 소개하기](../1-intro-to-ML/translations/README.ko.md) +1. [머신러닝과 AI의 역사](../2-history-of-ML/translations/README.ko.md) +1. [공정성과 머신러닝](../3-fairness/translations/README.ko.md) +1. [머신러닝의 기술](../4-techniques-of-ML/translations/README.ko.md) ### 크레딧 diff --git a/2-Regression/README.ko.md b/2-Regression/translations/README.ko.md similarity index 89% rename from 2-Regression/README.ko.md rename to 2-Regression/translations/README.ko.md index 74012847dd..81a16ec3a9 100644 --- a/2-Regression/README.ko.md +++ b/2-Regression/translations/README.ko.md @@ -4,7 +4,7 @@ 북미에서, Halloween을 위해서 호박을 소름돋게 무서운 얼굴로 조각하는 경우가 자주 있습니다. 매혹적인 채소에 대하여 찾아봅시다! -![jack-o-lanterns](./images/jack-o-lanterns.jpg) +![jack-o-lanterns](../images/jack-o-lanterns.jpg) > Photo by Beth Teutschmann on Unsplash ## 무엇을 배우나요 @@ -19,10 +19,10 @@ ### Lessons -1. [무역의 도구](1-Tools/translations/README.ko.md) -2. [데이터 관리](2-Data/translations/README.ko.md) -3. [Linear와 polynomial regression](3-Linear/translations/README.ko.md) -4. [Logistic regression](4-Logistic/translations/README.ko.md) +1. [무역의 도구](../1-Tools/translations/README.ko.md) +2. [데이터 관리](../2-Data/translations/README.ko.md) +3. [Linear와 polynomial regression](../3-Linear/translations/README.ko.md) +4. [Logistic regression](../4-Logistic/translations/README.ko.md) --- ### 크레딧 diff --git a/3-Web-App/README.ko.md b/3-Web-App/translations/README.ko.md similarity index 93% rename from 3-Web-App/README.ko.md rename to 3-Web-App/translations/README.ko.md index 2d52ab4313..45ba2b6a43 100644 --- a/3-Web-App/README.ko.md +++ b/3-Web-App/translations/README.ko.md @@ -2,14 +2,14 @@ 커리큘럼의 이 섹션에서, ML이 적용된 주제를 소개할 예정입니다: Scikit-learn 모델을 웹 애플리케이션에서 예측할 때 사용할 수 있는 파일로 저장해봅니다. 모델을 저장하고, Flask에 있는 웹 앱에서 어덯게 사용하는 지도 배웁니다. 먼저 UFO 목격 제보에 관련된 일부 데이터로 모델을 만듭니다! 그러면, 위도와 경도 값으로 몇 초 입력해서 UFO가 보고된 나라를 예측할 수 있는 웹 앱을 만들게 됩니다. -![UFO Parking](images/ufo.jpg) +![UFO Parking](../images/ufo.jpg) Photo by Michael Herren on Unsplash ## 강의 -1. [Web App 만들기](1-Web-App/translations/README.ko.md) +1. [Web App 만들기](../1-Web-App/translations/README.ko.md) ## 크레딧 diff --git a/4-Classification/README.ko.md b/4-Classification/translations/README.ko.md similarity index 80% rename from 4-Classification/README.ko.md rename to 4-Classification/translations/README.ko.md index 60fe16fa29..4bd2c9d46f 100644 --- a/4-Classification/README.ko.md +++ b/4-Classification/translations/README.ko.md @@ -4,7 +4,7 @@ 아시아와 인도의, 전통 음식은 다양하고, 매우 맛있습니다! 재료를 이해하기 위해서 지역 요리에 대한 데이터를 찾아봅니다. -![Thai food seller](./images/thai-food.jpg) +![Thai food seller](../images/thai-food.jpg) > Photo by Lisheng Chang on Unsplash ## 무엇을 배우나요 @@ -15,10 +15,10 @@ ## 강의 -1. [classification 소개하기](1-Introduction/translations/README.ko.md) -2. [더 많은 classifiers](2-Classifiers-1/translations/README.ko.md) -3. [또 다른 classifiers](3-Classifiers-2/translations/README.ko.md) -4. [응용: web app 만들기](4-Applied/translations/README.ko.md) +1. [classification 소개하기](../1-Introduction/translations/README.ko.md) +2. [더 많은 classifiers](../2-Classifiers-1/translations/README.ko.md) +3. [또 다른 classifiers](../3-Classifiers-2/translations/README.ko.md) +4. [응용: web app 만들기](../4-Applied/translations/README.ko.md) ## 크레딧 diff --git a/5-Clustering/README.ko.md b/5-Clustering/translations/README.ko.md similarity index 94% rename from 5-Clustering/README.ko.md rename to 5-Clustering/translations/README.ko.md index f2f5083fb0..5244bdff0b 100644 --- a/5-Clustering/README.ko.md +++ b/5-Clustering/translations/README.ko.md @@ -6,7 +6,7 @@ Clustering은 서로 비슷한 오브젝트를 찾고 clusters라고 불린 그 나이지리아의 다양한 사람들은 다양한 음악 취향이 있습니다. Spotify에서 긁어온 데이터를 사용해서 ([this article](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)에서 영감받았습니다), 나이지니아에서 인기있는 음악을 알아보겠습니다. 데이터셋에 다양한 노래의 'danceability' 점수, 'acousticness', loudness, 'speechiness', 인기도와 에너지 데이터가 포함됩니다. 데이터에서 패턴을 찾는 것은 흥미로울 예정입니다! -![A turntable](./images/turntable.jpg) +![A turntable](../images/turntable.jpg) Photo by Marcela Laskoski on Unsplash @@ -16,8 +16,8 @@ Photo by Elaine Howlin on Unsplash ## 강의 -1. [Natural language processing 소개하기](1-Introduction-to-NLP/translations/README.ko.md) -2. [일반적 NLP 작업과 기술](2-Tasks/translations/README.ko.md) -3. [머신러닝으로 번역과 감정 분석하기](3-Translation-Sentiment/translations/README.ko.md) -4. [데이터 준비하기](4-Hotel-Reviews-1/translations/README.ko.md) -5. [감정 분석을 위한 NLTK](5-Hotel-Reviews-2/translations/README.ko.md) +1. [Natural language processing 소개하기](../1-Introduction-to-NLP/translations/README.ko.md) +2. [일반적 NLP 작업과 기술](../2-Tasks/translations/README.ko.md) +3. [머신러닝으로 번역과 감정 분석하기](../3-Translation-Sentiment/translations/README.ko.md) +4. [데이터 준비하기](../4-Hotel-Reviews-1/translations/README.ko.md) +5. [감정 분석을 위한 NLTK](../5-Hotel-Reviews-2/translations/README.ko.md) ## 크래딧 diff --git a/7-TimeSeries/README.ko.md b/7-TimeSeries/translations/README.ko.md similarity index 87% rename from 7-TimeSeries/README.ko.md rename to 7-TimeSeries/translations/README.ko.md index 504dd20aaa..57c1d4262d 100644 --- a/7-TimeSeries/README.ko.md +++ b/7-TimeSeries/translations/README.ko.md @@ -8,14 +8,14 @@ time series forecasting은 무엇인가요? 과거의 트렌드로 분석해서 여기에서 핵심은 과거 부하 패턴 기반으로 향후 전력 사용량의 예측에 대해 배울 수 있는 흥미로운 데이터셋인, 전세계의 전기 사용량입니다. 이 예측 종류가 비지니스 환경에서 많이 돕고 있는지 볼 수 있습니다. -![electric grid](images/electric-grid.jpg) +![electric grid](../images/electric-grid.jpg) Photo by Peddi Sai hrithik of electrical towers on a road in Rajasthan on Unsplash ## 강의 -1. [Time series forecasting 소개하기](1-Introduction/translations/README.ko.md) -2. [ARIMA time series 모델 만들기](2-ARIMA/translations/README.ko.md) +1. [Time series forecasting 소개하기](../1-Introduction/translations/README.ko.md) +2. [ARIMA time series 모델 만들기](../2-ARIMA/translations/README.ko.md) ## 크레딧 diff --git a/8-Reinforcement/README.ko.md b/8-Reinforcement/translations/README.ko.md similarity index 89% rename from 8-Reinforcement/README.ko.md rename to 8-Reinforcement/translations/README.ko.md index d901657392..e054115787 100644 --- a/8-Reinforcement/README.ko.md +++ b/8-Reinforcement/translations/README.ko.md @@ -4,7 +4,7 @@ Reinforcement learning, 즉 RL은, supervised learning 과 unsupervised learning 주식 시장처럼 시뮬레이션된 환경을 상상해봅니다. 만약 규제시키면 어떤 일이 벌어질까요. 긍정적이거나 부정적인 영향을 주나요? 만약 부정적인 일이 생긴다면, 진로를 바꾸어, _negative reinforcement_ 을 배울 필요가 있습니다. 긍정적인 결과는, _positive reinforcement_ 로 만들 필요가 있습니다. -![peter and the wolf](images/peter.png) +![peter and the wolf](../images/peter.png) > Peter and his friends need to escape the hungry wolf! Image by [Jen Looper](https://twitter.com/jenlooper) @@ -23,9 +23,9 @@ Reinforcement learning, 즉 RL은, supervised learning 과 unsupervised learning 이전 섹션에서, 머신러닝 문제의 예시를 보았습니다: -- **Supervised**, 해결하려는 문제에 대해서 예시 솔루션을 추천할 데이터셋이 있습니다. [Classification](../4-Classification/README.ko.md) 과 [regression](../2-Regression/README.ko.md)은 supervised learning 작업입니다. +- **Supervised**, 해결하려는 문제에 대해서 예시 솔루션을 추천할 데이터셋이 있습니다. [Classification](../../4-Classification/translations/README.ko.md) 과 [regression](../../2-Regression/translations/README.ko.md)은 supervised learning 작업입니다. -- **Unsupervised**, 라벨링된 훈련 데이터가 없습니다. unsupervised learning의 주요 예시는 [Clustering](../5-Clustering/README.ko.md)입니다. +- **Unsupervised**, 라벨링된 훈련 데이터가 없습니다. unsupervised learning의 주요 예시는 [Clustering](../../5-Clustering/translations/README.ko.md)입니다. 이 섹션에서, 라벨링된 훈련 데이터가 필요없는 학습 문제의 새로운 타입에 대하여 소개할 예정입니다. 여러 문제의 타입이 있습니다: @@ -46,8 +46,8 @@ Reinforcement learning, 즉 RL은, supervised learning 과 unsupervised learning ## 강의 -1. [Reinforcement learning과 Q-Learning 소개하기](1-QLearning/translations/EADME.ko.md) -2. [헬스장 시뮬레이션 환경 사용하기](2-Gym/translations/README.ko.md) +1. [Reinforcement learning과 Q-Learning 소개하기](../1-QLearning/translations/EADME.ko.md) +2. [헬스장 시뮬레이션 환경 사용하기](../2-Gym/translations/README.ko.md) ## 크레딧 diff --git a/9-Real-World/README.ko.md b/9-Real-World/translations/README.ko.md similarity index 89% rename from 9-Real-World/README.ko.md rename to 9-Real-World/translations/README.ko.md index 300095d773..26da3f7453 100644 --- a/9-Real-World/README.ko.md +++ b/9-Real-World/translations/README.ko.md @@ -2,13 +2,13 @@ 커리큘럼의 이 섹션에서, classical ML의 실제-세계 에플리케이션을 소개힐 예정입니다. 가능한 neural networks, 딥러닝과 AI를 피하면서, 이 전략을 사용한 애플리케이션에 대한 백서와 아티클을 찾으려 웹 서핑을 했습니다. ML이 비즈니스 시스템, 생태학 애플리케이션, 금융, 예술과 문화, 그리고 더 많은 곳에서 어떻게 사용되는지 배웁니다. -![chess](images/chess.jpg) +![chess](../images/chess.jpg) > Photo by Alexis Fauvet on Unsplash ## 강의 -1. [ML의 현실 애플리케이션](1-Applications/translations/README.ko.md) +1. [ML의 현실 애플리케이션](../1-Applications/translations/README.ko.md) ## 크레딧 From 5c7a30e24695c408cd59b44ea1ca5f7ee7d85baf Mon Sep 17 00:00:00 2001 From: minwook-shin Date: Sun, 15 Aug 2021 17:45:15 +0900 Subject: [PATCH 37/37] ADD: add main readme ko translation --- translations/README.ko.md | 123 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 translations/README.ko.md diff --git a/translations/README.ko.md b/translations/README.ko.md new file mode 100644 index 0000000000..b831530763 --- /dev/null +++ b/translations/README.ko.md @@ -0,0 +1,123 @@ +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +# Machine Learning for Beginners (입문자를 위한 머신러닝) - 커리큘럼 + +> 🌍 세계의 문화로 머신러닝을 알아가면서 전 세계를 여행합니다 🌍 + +Microsoft의 Azure Cloud Advocates는 **Machine Learning**에 대한 모든 12-주, 24-강의 (하나 더!) 커리큘럼을 제공해서 만족합니다. 이 커리큘럼에서는, 곧 만들어질 'AI for Beginners'에서 커버하지 않는 딥러닝을 제외한, **classic machine learning**이라고 불리는 것을 Scikit-learn 라이브러리 위주로 배우게 됩니다. 이 강의에서 곧 만들어질 'Data Science for Beginners' 커리큘럼과 같이 봅니다! + +월드의 많은 영역에 데이터를 적용하면서 이러한 classic 기술로 전 세계를 여행합니다. 각 강의에는 강의 전과 후에 진행하는 퀴즈, 강의를 마치기 위한 설명, 솔루션, 과제 등 있습니다. 새로운 스킬을 'stick'할 수 있다고 증명된 프로젝트-기반 교육학에 의하여 만들면서 배울 수 있습니다. + +**✍️ Hearty thanks to our authors** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Ornella Altunyan, and Amy Boyd + +**🎨 Thanks as well to our illustrators** Tomomi Imura, Dasani Madipalli, and Jen Looper + +**🙏 Special thanks 🙏 to our Microsoft Student Ambassador authors, reviewers and content contributors**, notably Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila, and Snigdha Agarwal + +**🤩 Extra gratitude to Microsoft Student Ambassador Eric Wanjau for our R lessons!** + +--- + +# 시작하기 + +**학생**은, 이 커리큘럼을 사용하기 위해서, 전체 저장소를 자신의 GitHub 계정으로 포크하고 혼자하거나 그룹으로 같이 연습합니다: + +- 강의 전 퀴즈를 시작합니다. +- 강의를 읽고, 각 지식 점검에서 멈추고 습득해서 활동을 끝냅니다. +- 솔루션 코드를 실행하는 것보다 강의를 이해해서 프로젝트를 만들어봅니다; 그러나 코드는 각 프로젝트-지향 강의마다 `/solution` 폴더에 존재합니다. +- 강의 후 퀴즈를 해봅니다. +- 도전을 끝내봅니다. +- 과제를 끝내봅니다. +- 강의 그룹을 끝내면, [Discussion board](https://github.com/microsoft/ML-For-Beginners/discussions)를 방문하고 적절한 PAT rubric를 채워서 "learn out loud" 합니다. 'PAT'은 심화적으로 배우려고 작성하는 rubric인 Progress Assessment 도구 입니다. 같이 배울 수 있게 다른 PAT으로도 할 수 있습니다. + +> 더 배우기 위해서, [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-15963-cxa) 모듈과 학습 경로를 따르는 것을 추천합니다. + +**선생님**은, 이 커리큘럼으로 사용하기 위해서 [included some suggestions](../for-teachers.md)를 준비했습니다. + +--- + +## Team 만나기 + +[![Promo video](../ml-for-beginners.png)](https://youtu.be/Tj1XWrDSYJU "Promo video") + +> 🎥 프로젝트와 이 내용을 작성한 사람들에 대한 영상을 보려면 위 이미지를 클릭합니다! + +--- + +## 교육학 + +이 커리큘럼을 만드는 동안 2가지 교육학 원칙을 선택했습니다: **project-based**에서 실습하고 **frequent quizzes**가 포함되었는지 확인합니다. 추가적으로, 이 커리큘럼은 통합적으로 보이기 위해서 공통적인 **theme**가 있습니다. + +컨텐츠가 프로젝트와 맞게 유지되므로, 프로세스는 학생들이 더 끌리고 개념의 집중도가 높아집니다. 추가적으로, 강의 전 가벼운 퀴즈는 학생들이 공부에 집중하게 해주고, 강의 후 두 번째 퀴즈는 계속 집중하게 합니다. 이 커리큘럼은 유연하고 재밌게 디자인되었으며 다 배우거나 일부만 배울 수 있습니다. 프로젝트는 작게 시작해서 12주 사이클로 끝날 때까지 점점 복잡해집니다. 이 커리큘럼은 추가 크레딧이나 토론의 기초로 사용할 수 있는, ML의 현실에 적용한 postscript도 포함되어 있습니다. + +> [Code of Conduct](../CODE_OF_CONDUCT.md), [Contributing](../CONTRIBUTING.md)과, [Translation](../TRANSLATIONS.md) 가이드라인을 확인해봅니다. 건설적인 피드백을 환영합니다! + +## 각 강의에 포함된 내용: + +- 취사선택 스케치노트 +- 취사선택 추가 영상 +- 강의 전 준비 퀴즈 +- 강의 내용 +- 프로젝트-기반 강의라면, 프로젝트 제작 방식 step-by-step 지도 +- 지식 점검 +- 도전 +- 보충 내용 +- 과제 +- 강의 후 퀴즈 + +> **퀴즈 참고사항**: 모든 퀴즈는 [in this app](https://white-water-09ec41f0f.azurestaticapps.net/)에 묶여있으며, 각 3개 질문으로 총 50개 퀴즈가 있습니다. 강의에 연결되어 있지만 퀴즈 앱은 로컬에서 수행할 수 있습니다; `quiz-app` 폴더의 설명을 따릅니다. + +| 강의 번호 | 토픽 | 강의 그룹 | 학습 목표 | 연결 강의 | 저자 | +| :-----------: | :--------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------: | :------------: | +| 01 | 머신러닝 소개 | [소개](../1-Introduction/translations/README.ko.md) | 머신러닝의 기초 컨셉을 배웁니다 | [강의](../1-Introduction/1-intro-to-ML/translations/README.ko.md) | Muhammad | +| 02 | 머신러닝의 역사 | [소개](../1-Introduction/translations/README.ko.md) | 이 필드의 역사를 배웁니다 | [강의](../1-Introduction/2-history-of-ML/translations/README.ko.md) | Jen and Amy | +| 03 | 공정과 머신러닝 | [소개](../1-Introduction/translations/README.ko.md) | 학생들이 ML 모델을 만들고 적용할 때 고려해야 할 공정과 관련한 중요 철학적인 이슈는 무엇인가요? | [강의](../1-Introduction/3-fairness/translations/README.ko.md) | Tomomi | +| 04 | 머신러닝의 기술 | [소개](../1-Introduction/translations/README.ko.md) | ML 연구원들이 ML 모델을 만들 때 사용할 기술은 무엇인가요? | [강의](../1-Introduction/4-techniques-of-ML/translations/README.ko.md) | Chris and Jen | +| 05 | regression 소개 | [Regression](../2-Regression/translations/README.ko.md) | regression 모델을 위한 Python과 Scikit-learn으로 시작합니다 | [강의](../2-Regression/1-Tools/translations/README.ko.md) | Jen | +| 06 | 북미의 호박 가격 🎃 | [Regression](../2-Regression/translations/README.ko.md) | ML을 준비하기 위해서 데이터를 시각화하고 정리합니다 | [강의](../2-Regression/2-Data/translations/README.ko.md) | Jen | +| 07 | 북미의 호박 가격 🎃 | [Regression](../2-Regression/translations/README.ko.md) | linear와 polynomial regression 모델을 만듭니다 | [강의](2-Regression/3-Linear/translations/README.ko.md) | Jen | +| 08 | 북미의 호박 가격 🎃 | [Regression](../2-Regression/translations/README.ko.md) | logistic regression 모델을 만듭니다 | [강의](../2-Regression/4-Logistic/translations/README.ko.md) | Jen | +| 09 | 웹 앱 🔌 | [웹 앱](../3-Web-App/translations/README.ko.md) | 훈련된 모델로 웹 앱을 만듭니다 | [강의](../3-Web-App/1-Web-App/translations/README.ko.md) | Jen | +| 10 | classification 소개 | [Classification](../4-Classification/translations/README.ko.md) | 데이터 정리, 준비, 그리고 시각화; classification을 소개합니다 | [강의](../4-Classification/1-Introduction/translations/README.ko.md) | Jen and Cassie | +| 11 | 맛있는 아시아와 인도 요리 🍜 | [Classification](../4-Classification/translations/README.ko.md) | classifier를 소개합니다 | [강의](../4-Classification/2-Classifiers-1/translations/README.ko.md) | Jen and Cassie | +| 12 | 맛있는 아시아와 인도 요리 🍜 | [Classification](../4-Classification/translations/README.ko.md) | 더 많은 classifier | [강의](../4-Classification/3-Classifiers-2/translations/README.ko.md) | Jen and Cassie | +| 13 | 맛있는 아시아와 인도 요리 🍜 | [Classification](../4-Classification/translations/README.ko.md) | 모델로 추천 웹 앱을 만듭니다 | [강의](../4-Classification/4-Applied/translations/README.ko.md) | Jen | +| 14 | clustering 소개 | [Clustering](../5-Clustering/translations/README.ko.md) | 데이터 정리, 준비, 그리고 시각화; clustering을 소개합니다 | [강의](../5-Clustering/1-Visualize/translations/README.ko.md) | Jen | +| 15 | 나이지리아인의 음악 취향 알아보기 🎧 | [Clustering](../5-Clustering/translations/README.ko.md) | K-Means clustering 메소드를 탐색합니다 | [강의](../5-Clustering/2-K-Means/translations/README.ko.md) | Jen | +| 16 | natural language processing 소개 ☕️ | [Natural language processing](../6-NLP/translations/README.ko.md) | 간단한 봇을 만들면서 NLP에 대하여 기본을 배웁니다 | [강의](../6-NLP/1-Introduction-to-NLP/translations/README.ko.md) | Stephen | +| 17 | 일반적인 NLP 작업 ☕️ | [Natural language processing](../6-NLP/translations/README.ko.md) | 언어 구조를 다룰 때 필요한 일반 작업을 이해하면서 NLP 지식을 깊게 팝니다 | [강의](../6-NLP/2-Tasks/translations/README.ko.md) | Stephen | +| 18 | 번역과 감정 분석 ♥️ | [Natural language processing](../6-NLP/translations/README.ko.md) | Jane Austen을 통한 번역과 감정 분석 | [강의](../6-NLP/3-Translation-Sentiment/translations/README.ko.md) | Stephen | +| 19 | 유럽의 로맨틱 호텔 ♥️ | [Natural language processing](../6-NLP/translations/README.ko.md) | 호텔 리뷰를 통한 감정 분석 1 | [강의](../6-NLP/4-Hotel-Reviews-1/translations/README.ko.md) | Stephen | +| 20 | 유럽의 로맨틱 호텔 ♥️ | [Natural language processing](../6-NLP/translations/README.ko.md) | 호텔 리뷰를 통한 감정 분석 2 | [강의](../6-NLP/5-Hotel-Reviews-2/translations/README.ko.md) | Stephen | +| 21 | time series forecasting 소개 | [Time series](../7-TimeSeries/translations/README.ko.md) | time series forecasting을 소개합니다 | [강의](../7-TimeSeries/1-Introduction/translations/README.ko.md) | Francesca | +| 22 | ⚡️ 세계 전력 사용량 ⚡️ - ARIMA의 time series forecasting | [Time series](../7-TimeSeries/translations/README.ko.md) | ARIMA의 Time series forecasting | [강의](../7-TimeSeries/2-ARIMA/translations/README.ko.md) | Francesca | +| 23 | reinforcement learning 소개 | [Reinforcement learning](../8-Reinforcement/translations/README.ko.md) | Q-Learning의 reinforcement learning을 소개합니다 | [강의](../8-Reinforcement/1-QLearning/translations/README.ko.md) | Dmitry | +| 24 | 늑대를 피하는 Peter 도와주기! 🐺 | [Reinforcement learning](../8-Reinforcement/translations/README.ko.md) | Gym에서 Reinforcement learning | [강의](../8-Reinforcement/2-Gym/translations/README.ko.md) | Dmitry | +| Postscript | 실생활 ML 시나리오와 애플리케이션 | [야생의 ML](../9-Real-World/translations/README.ko.md) | classical ML의 흥미롭게 드러나는 현실 애플리케이션 | [강의](../9-Real-World/1-Applications/translations/README.ko.md) | Team | + +## 오프라인 접근 + +[Docsify](https://docsify.js.org/#/)에서 문서를 오프라인으로 실행할 수 있습니다. 저장소를 포크해서 로컬 머신에 [install Docsify](https://docsify.js.org/#/quickstart)히고, 이 저장소의 최상위 폴더에서, `docsify serve` 입력합니다. 웹 사이트는 로컬호스트로 3000 포트에서 서버가 켜집니다: `localhost:3000`. + +## PDF + +[here](../pdf/readme.pdf)에서 링크가 있는 커리큘럼의 PDF를 찾습니다. + +## 도와주세요! + +번역에 기여하고 싶으신가요? [translation guidelines](../TRANSLATIONS.md)를 읽고 [here](https://github.com/microsoft/ML-For-Beginners/issues/71)에 입력해주세요. + +## 기타 커리큘럼 + +우리 팀에서는 다른 커리큘럼도 제작합니다! 확인해보세요! + +- [Web Dev for Beginners](https://aka.ms/webdev-beginners) +- [IoT for Beginners](https://aka.ms/iot-beginners)