pull/844/head
Lee Stott 1 week ago committed by GitHub
parent f6488401b6
commit 532949dc5d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,377 +0,0 @@
# Análise de sentimento com avaliações de hotéis
Agora que você explorou o conjunto de dados em detalhes, é hora de filtrar as colunas e usar técnicas de PNL no conjunto de dados para obter novas percepções sobre os hotéis.
## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/39/)
### Operações de Filtragem e Análise de Sentimento
Como você provavelmente notou, o conjunto de dados possui alguns problemas. Algumas colunas estão preenchidas com informações inúteis, outras parecem incorretas. Se estiverem corretas, não está claro como foram calculadas, e as respostas não podem ser verificadas de forma independente por seus próprios cálculos.
## Exercício: um pouco mais de processamento de dados
Limpe os dados um pouco mais. Adicione colunas que serão úteis mais tarde, altere os valores em outras colunas e remova certas colunas completamente.
1. Processamento inicial das colunas
1. Remova `lat` e `lng`
2. Substitua os valores de `Hotel_Address` pelos seguintes valores (se o endereço contiver o nome da cidade e do país, altere para apenas a cidade e o país).
Estas são as únicas cidades e países no conjunto de dados:
Amsterdã, Países Baixos
Barcelona, Espanha
Londres, Reino Unido
Milão, Itália
Paris, França
Viena, Áustria
```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())
```
Agora você pode consultar dados em nível de país:
```python
display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"}))
```
| Hotel_Address | Hotel_Name |
| :--------------------- | :--------: |
| Amsterdã, Países Baixos | 105 |
| Barcelona, Espanha | 211 |
| Londres, Reino Unido | 400 |
| Milão, Itália | 162 |
| Paris, França | 458 |
| Viena, Áustria | 158 |
2. Processar colunas de Meta-avaliação do Hotel
1. Remova `Additional_Number_of_Scoring`
1. Replace `Total_Number_of_Reviews` with the total number of reviews for that hotel that are actually in the dataset
1. Replace `Average_Score` com nossa própria pontuação calculada
```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. Processar colunas de avaliação
1. Remova `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` and `days_since_review`
2. Keep `Reviewer_Score`, `Negative_Review`, and `Positive_Review` as they are,
3. Keep `Tags` for now
- We'll be doing some additional filtering operations on the tags in the next section and then tags will be dropped
4. Process reviewer columns
1. Drop `Total_Number_of_Reviews_Reviewer_Has_Given`
2. Keep `Reviewer_Nationality`
### Tag columns
The `Tag` column is problematic as it is a list (in text form) stored in the column. Unfortunately the order and number of sub sections in this column are not always the same. It's hard for a human to identify the correct phrases to be interested in, because there are 515,000 rows, and 1427 hotels, and each has slightly different options a reviewer could choose. This is where NLP shines. You can scan the text and find the most common phrases, and count them.
Unfortunately, we are not interested in single words, but multi-word phrases (e.g. *Business trip*). Running a multi-word frequency distribution algorithm on that much data (6762646 words) could take an extraordinary amount of time, but without looking at the data, it would seem that is a necessary expense. This is where exploratory data analysis comes in useful, because you've seen a sample of the tags such as `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']`, você pode começar a perguntar se é possível reduzir bastante o processamento que você tem que fazer. Felizmente, é - mas primeiro você precisa seguir alguns passos para determinar as tags de interesse.
### Filtrando tags
Lembre-se de que o objetivo do conjunto de dados é adicionar sentimento e colunas que ajudarão você a escolher o melhor hotel (para você ou talvez para um cliente que lhe pediu para criar um bot de recomendação de hotéis). Você precisa se perguntar se as tags são úteis ou não no conjunto de dados final. Aqui está uma interpretação (se você precisasse do conjunto de dados por outros motivos, diferentes tags poderiam ser mantidas ou removidas da seleção):
1. O tipo de viagem é relevante, e isso deve ser mantido
2. O tipo de grupo de hóspedes é importante, e isso deve ser mantido
3. O tipo de quarto, suíte ou estúdio em que o hóspede se hospedou é irrelevante (todos os hotéis têm basicamente os mesmos quartos)
4. O dispositivo em que a avaliação foi enviada é irrelevante
5. O número de noites que o avaliador ficou *poderia* ser relevante se você atribuísse estadias mais longas a uma maior satisfação com o hotel, mas é uma suposição, e provavelmente irrelevante
Em resumo, **mantenha 2 tipos de tags e remova as outras**.
Primeiro, você não quer contar as tags até que elas estejam em um formato melhor, então isso significa remover os colchetes e aspas. Você pode fazer isso de várias maneiras, mas deseja a mais rápida, pois pode levar muito tempo para processar muitos dados. Felizmente, o pandas tem uma maneira fácil de fazer cada um desses passos.
```Python
# Remove opening and closing brackets
df.Tags = df.Tags.str.strip("[']")
# remove all quotes too
df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
```
Cada tag se torna algo como: `Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device`.
Next we find a problem. Some reviews, or rows, have 5 columns, some 3, some 6. This is a result of how the dataset was created, and hard to fix. You want to get a frequency count of each phrase, but they are in different order in each review, so the count might be off, and a hotel might not get a tag assigned to it that it deserved.
Instead you will use the different order to our advantage, because each tag is multi-word but also separated by a comma! The simplest way to do this is to create 6 temporary columns with each tag inserted in to the column corresponding to its order in the tag. You can then merge the 6 columns into one big column and run the `value_counts()` method on the resulting column. Printing that out, you'll see there was 2428 unique tags. Here is a small sample:
| 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 |
Some of the common tags like `Submitted from a mobile device` are of no use to us, so it might be a smart thing to remove them before counting phrase occurrence, but it is such a fast operation you can leave them in and ignore them.
### Removing the length of stay tags
Removing these tags is step 1, it reduces the total number of tags to be considered slightly. Note you do not remove them from the dataset, just choose to remove them from consideration as values to count/keep in the reviews dataset.
| 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 |
| ... | ... |
There are a huge variety of rooms, suites, studios, apartments and so on. They all mean roughly the same thing and not relevant to you, so remove them from consideration.
| 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 |
Finally, and this is delightful (because it didn't take much processing at all), you will be left with the following *useful* tags:
| 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 |
You could argue that `Travellers with friends` is the same as `Group` more or less, and that would be fair to combine the two as above. The code for identifying the correct tags is [the Tags notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb).
The final step is to create new columns for each of these tags. Then, for every review row, if the `Tag` a coluna corresponde a uma das novas colunas, adicione um 1, se não, adicione um 0. O resultado final será uma contagem de quantos avaliadores escolheram este hotel (em agregados) para, digamos, negócios versus lazer, ou para levar um animal de estimação, e isso é uma informação útil ao recomendar um hotel.
```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)
```
### Salve seu arquivo
Finalmente, salve o conjunto de dados como está agora com um novo nome.
```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)
```
## Operações de Análise de Sentimento
Nesta seção final, você aplicará a análise de sentimento às colunas de avaliação e salvará os resultados em um conjunto de dados.
## Exercício: carregar e salvar os dados filtrados
Note que agora você está carregando o conjunto de dados filtrado que foi salvo na seção anterior, **não** o conjunto de dados original.
```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)
```
### Removendo palavras de parada
Se você fosse executar a Análise de Sentimento nas colunas de avaliação negativa e positiva, isso poderia levar muito tempo. Testado em um laptop de teste poderoso com um CPU rápido, levou de 12 a 14 minutos, dependendo da biblioteca de sentimento utilizada. Esse é um tempo (relativamente) longo, então vale a pena investigar se isso pode ser acelerado.
Remover palavras de parada, ou palavras comuns em inglês que não alteram o sentimento de uma frase, é o primeiro passo. Ao removê-las, a análise de sentimento deve ser executada mais rapidamente, mas não menos precisa (já que as palavras de parada não afetam o sentimento, mas desaceleram a análise).
A avaliação negativa mais longa tinha 395 palavras, mas após a remoção das palavras de parada, ficou com 195 palavras.
Remover as palavras de parada também é uma operação rápida; remover as palavras de parada de 2 colunas de avaliação com mais de 515.000 linhas levou 3,3 segundos no dispositivo de teste. Pode levar um pouco mais ou menos tempo para você, dependendo da velocidade do CPU do seu dispositivo, RAM, se você tem um SSD ou não, e alguns outros fatores. A relativa brevidade da operação significa que, se isso melhorar o tempo da análise de sentimento, vale a pena fazer.
```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)
```
### Realizando a análise de sentimento
Agora você deve calcular a análise de sentimento para ambas as colunas de avaliação negativa e positiva e armazenar o resultado em 2 novas colunas. O teste do sentimento será compará-lo à pontuação do avaliador para a mesma avaliação. Por exemplo, se o sentimento acha que a avaliação negativa teve um sentimento de 1 (sentimento extremamente positivo) e um sentimento de avaliação positiva de 1, mas o avaliador deu ao hotel a pontuação mais baixa possível, então ou o texto da avaliação não corresponde à pontuação, ou o analisador de sentimento não conseguiu reconhecer o sentimento corretamente. Você deve esperar que algumas pontuações de sentimento estejam completamente erradas, e muitas vezes isso será explicável, por exemplo, a avaliação pode ser extremamente sarcástica "Claro que ADORO dormir em um quarto sem aquecimento" e o analisador de sentimento acha que isso é um sentimento positivo, mesmo que um humano ao lê-lo saiba que é sarcasmo.
NLTK fornece diferentes analisadores de sentimento para aprender, e você pode substituí-los e ver se o sentimento é mais ou menos preciso. A análise de sentimento VADER é utilizada aqui.
> 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, junho de 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"]
```
Mais tarde em seu programa, quando você estiver pronto para calcular o sentimento, você pode aplicá-lo a cada avaliação da seguinte forma:
```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")
```
Isso leva aproximadamente 120 segundos no meu computador, mas varia em cada computador. Se você quiser imprimir os resultados e ver se o sentimento corresponde à avaliação:
```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"]])
```
A última coisa a fazer com o arquivo antes de usá-lo no desafio é salvá-lo! Você também deve considerar reorganizar todas as suas novas colunas para que sejam fáceis de trabalhar (para um humano, é uma mudança estética).
```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)
```
Você deve executar todo o código para [o notebook de análise](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (depois de ter executado [seu notebook de filtragem](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) para gerar o arquivo Hotel_Reviews_Filtered.csv).
Para revisar, os passos são:
1. O arquivo do conjunto de dados original **Hotel_Reviews.csv** foi explorado na lição anterior com [o notebook explorador](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb)
2. Hotel_Reviews.csv foi filtrado pelo [notebook de filtragem](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), resultando em **Hotel_Reviews_Filtered.csv**
3. Hotel_Reviews_Filtered.csv foi processado pelo [notebook de análise de sentimento](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb), resultando em **Hotel_Reviews_NLP.csv**
4. Use Hotel_Reviews_NLP.csv no Desafio de PNL abaixo
### Conclusão
Quando você começou, tinha um conjunto de dados com colunas e dados, mas nem todos podiam ser verificados ou utilizados. Você explorou os dados, filtrou o que não precisava, converteu tags em algo útil, calculou suas próprias médias, adicionou algumas colunas de sentimento e, com sorte, aprendeu algumas coisas interessantes sobre o processamento de texto natural.
## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/40/)
## Desafio
Agora que você analisou seu conjunto de dados para sentimento, veja se consegue usar estratégias que aprendeu neste currículo (aglomeração, talvez?) para determinar padrões em torno do sentimento.
## Revisão e Estudo Autônomo
Faça [este módulo Learn](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) para aprender mais e usar diferentes ferramentas para explorar o sentimento em texto.
## Tarefa
[Experimente um conjunto de dados diferente](assignment.md)
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,14 +0,0 @@
# Experimente um conjunto de dados diferente
## Instruções
Agora que você aprendeu a usar o NLTK para atribuir sentimento ao texto, experimente um conjunto de dados diferente. Provavelmente, você precisará fazer algum processamento de dados, então crie um notebook e documente seu processo de pensamento. O que você descobre?
## Rubrica
| Critérios | Exemplar | Adequado | Necessita Melhorias |
| --------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ------------------------ |
| | Um notebook completo e um conjunto de dados são apresentados com células bem documentadas explicando como o sentimento é atribuído | O notebook está faltando boas explicações | O notebook está com falhas |
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que as traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações erradas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
Isto é um espaço reservado temporárioPor favor, escreva a saída da esquerda para a direita.
Isto é um espaço reservado temporário
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
isto é um espaço reservado temporárioPor favor, escreva a saída da esquerda para a direita.
isto é um espaço reservado temporário
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.

@ -1,27 +0,0 @@
# Introdução ao processamento de linguagem natural
O processamento de linguagem natural (PLN) é a capacidade de um programa de computador entender a linguagem humana como ela é falada e escrita — referida como linguagem natural. É um componente da inteligência artificial (IA). O PLN existe há mais de 50 anos e tem raízes no campo da linguística. Todo o campo é direcionado a ajudar as máquinas a entender e processar a linguagem humana. Isso pode ser usado para realizar tarefas como verificação ortográfica ou tradução automática. Possui uma variedade de aplicações no mundo real em diversos campos, incluindo pesquisa médica, motores de busca e inteligência de negócios.
## Tópico regional: Línguas e literatura europeias e hotéis românticos da Europa ❤️
Nesta seção do currículo, você será apresentado a um dos usos mais difundidos do aprendizado de máquina: o processamento de linguagem natural (PLN). Derivado da linguística computacional, essa categoria de inteligência artificial é a ponte entre humanos e máquinas por meio da comunicação verbal ou textual.
Nessas aulas, aprenderemos os fundamentos do PLN construindo pequenos bots de conversa para entender como o aprendizado de máquina ajuda a tornar essas conversas cada vez mais 'inteligentes'. Você viajará no tempo, conversando com Elizabeth Bennett e Mr. Darcy do clássico romance de Jane Austen, **Orgulho e Preconceito**, publicado em 1813. Em seguida, você aprofundará seu conhecimento aprendendo sobre análise de sentimentos através de avaliações de hotéis na Europa.
![Livro Orgulho e Preconceito e chá](../../../translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.pt.jpg)
> Foto de <a href="https://unsplash.com/@elaineh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Elaine Howlin</a> em <a href="https://unsplash.com/s/photos/pride-and-prejudice?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Aulas
1. [Introdução ao processamento de linguagem natural](1-Introduction-to-NLP/README.md)
2. [Tarefas e técnicas comuns de PLN](2-Tasks/README.md)
3. [Tradução e análise de sentimentos com aprendizado de máquina](3-Translation-Sentiment/README.md)
4. [Preparando seus dados](4-Hotel-Reviews-1/README.md)
5. [NLTK para Análise de Sentimentos](5-Hotel-Reviews-2/README.md)
## Créditos
Estas lições de processamento de linguagem natural foram escritas com ☕ por [Stephen Howell](https://twitter.com/Howell_MSFT)
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
Baixe os dados de avaliação do hotel para esta pasta. Por favor, escreva a saída da esquerda para a direita.
Baixe os dados de avaliação do hotel para esta pasta.
**Aviso Legal**:
Este documento foi traduzido usando serviços de tradução baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,188 +0,0 @@
# Introdução à previsão de séries temporais
![Resumo de séries temporais em um sketchnote](../../../../translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.pt.png)
> Sketchnote por [Tomomi Imura](https://www.twitter.com/girlie_mac)
Nesta lição e na próxima, você aprenderá um pouco sobre a previsão de séries temporais, uma parte interessante e valiosa do repertório de um cientista de ML que é um pouco menos conhecida do que outros tópicos. A previsão de séries temporais é uma espécie de 'bola de cristal': com base no desempenho passado de uma variável, como o preço, você pode prever seu potencial valor futuro.
[![Introdução à previsão de séries temporais](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Introdução à previsão de séries temporais")
> 🎥 Clique na imagem acima para assistir a um vídeo sobre previsão de séries temporais
## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/41/)
É um campo útil e interessante com valor real para os negócios, dada sua aplicação direta a problemas de precificação, inventário e questões da cadeia de suprimentos. Embora técnicas de aprendizado profundo tenham começado a ser usadas para obter mais insights e prever melhor o desempenho futuro, a previsão de séries temporais continua sendo um campo amplamente informado por técnicas clássicas de ML.
> O currículo útil de séries temporais da Penn State pode ser encontrado [aqui](https://online.stat.psu.edu/stat510/lesson/1)
## Introdução
Suponha que você mantenha um conjunto de parquímetros inteligentes que fornecem dados sobre com que frequência são usados e por quanto tempo ao longo do tempo.
> E se você pudesse prever, com base no desempenho passado do parquímetro, seu valor futuro de acordo com as leis de oferta e demanda?
Prever com precisão quando agir para alcançar seu objetivo é um desafio que pode ser enfrentado pela previsão de séries temporais. Não seria agradável para as pessoas serem cobradas mais em horários de pico quando estão procurando uma vaga de estacionamento, mas seria uma maneira segura de gerar receita para limpar as ruas!
Vamos explorar alguns dos tipos de algoritmos de séries temporais e começar um notebook para limpar e preparar alguns dados. Os dados que você analisará são provenientes da competição de previsão GEFCom2014. Eles consistem em 3 anos de valores de carga elétrica e temperatura horária entre 2012 e 2014. Dado os padrões históricos de carga elétrica e temperatura, você pode prever os valores futuros da carga elétrica.
Neste exemplo, você aprenderá como prever um passo de tempo à frente, usando apenas dados históricos de carga. Antes de começar, no entanto, é útil entender o que está acontecendo nos bastidores.
## Algumas definições
Ao encontrar o termo 'série temporal', você precisa entender seu uso em vários contextos diferentes.
🎓 **Série temporal**
Na matemática, "uma série temporal é uma série de pontos de dados indexados (ou listados ou grafados) em ordem temporal. Mais comumente, uma série temporal é uma sequência tomada em pontos sucessivos igualmente espaçados no tempo." Um exemplo de uma série temporal é o valor de fechamento diário do [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). O uso de gráficos de séries temporais e modelagem estatística é frequentemente encontrado em processamento de sinais, previsão do tempo, previsão de terremotos e outros campos onde eventos ocorrem e pontos de dados podem ser plotados ao longo do tempo.
🎓 **Análise de séries temporais**
A análise de séries temporais é a análise dos dados de séries temporais mencionados acima. Os dados de séries temporais podem assumir formas distintas, incluindo 'séries temporais interrompidas', que detectam padrões na evolução de uma série temporal antes e depois de um evento interruptivo. O tipo de análise necessária para a série temporal depende da natureza dos dados. Os dados de séries temporais em si podem assumir a forma de séries de números ou caracteres.
A análise a ser realizada utiliza uma variedade de métodos, incluindo domínio de frequência e domínio do tempo, linear e não linear, e mais. [Saiba mais](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) sobre as muitas maneiras de analisar esse tipo de dado.
🎓 **Previsão de séries temporais**
A previsão de séries temporais é o uso de um modelo para prever valores futuros com base em padrões exibidos por dados coletados anteriormente, conforme ocorreram no passado. Embora seja possível usar modelos de regressão para explorar dados de séries temporais, com índices de tempo como variáveis x em um gráfico, tais dados são melhor analisados usando tipos especiais de modelos.
Os dados de séries temporais são uma lista de observações ordenadas, ao contrário de dados que podem ser analisados por regressão linear. O mais comum é o ARIMA, um acrônimo que significa "Média Móvel Integrada Autoregressiva".
[Modelos ARIMA](https://online.stat.psu.edu/stat510/lesson/1/1.1) "relacionam o valor presente de uma série a valores passados e erros de previsão passados." Eles são mais apropriados para analisar dados no domínio do tempo, onde os dados estão ordenados ao longo do tempo.
> Existem vários tipos de modelos ARIMA, sobre os quais você pode aprender [aqui](https://people.duke.edu/~rnau/411arim.htm) e que você tocará na próxima lição.
Na próxima lição, você construirá um modelo ARIMA usando [Séries Temporais Univariadas](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), que se concentra em uma variável que muda seu valor ao longo do tempo. Um exemplo desse tipo de dado é [este conjunto de dados](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) que registra a concentração mensal de CO2 no Observatório de Mauna Loa:
| CO2 | AnoMês | Ano | Mês |
| :----: | :----: | :---: | :---: |
| 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 |
✅ Identifique a variável que muda ao longo do tempo neste conjunto de dados.
## Características dos dados de séries temporais a considerar
Ao olhar para dados de séries temporais, você pode notar que eles têm [certas características](https://online.stat.psu.edu/stat510/lesson/1/1.1) que você precisa levar em conta e mitigar para entender melhor seus padrões. Se você considerar os dados de séries temporais como potencialmente fornecendo um 'sinal' que deseja analisar, essas características podem ser pensadas como 'ruído'. Você muitas vezes precisará reduzir esse 'ruído' compensando algumas dessas características usando algumas técnicas estatísticas.
Aqui estão alguns conceitos que você deve conhecer para poder trabalhar com séries temporais:
🎓 **Tendências**
Tendências são definidas como aumentos e diminuições mensuráveis ao longo do tempo. [Leia mais](https://machinelearningmastery.com/time-series-trends-in-python). No contexto de séries temporais, trata-se de como usar e, se necessário, remover tendências de sua série temporal.
🎓 **[Sazonalidade](https://machinelearningmastery.com/time-series-seasonality-with-python/)**
Sazonalidade é definida como flutuações periódicas, como corridas de férias que podem afetar as vendas, por exemplo. [Dê uma olhada](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) em como diferentes tipos de gráficos exibem sazonalidade nos dados.
🎓 **Outliers**
Outliers são valores que estão muito distantes da variância padrão dos dados.
🎓 **Ciclo de longo prazo**
Independente da sazonalidade, os dados podem exibir um ciclo de longo prazo, como uma recessão econômica que dura mais de um ano.
🎓 **Variância constante**
Ao longo do tempo, alguns dados exibem flutuações constantes, como o uso de energia por dia e noite.
🎓 **Mudanças abruptas**
Os dados podem exibir uma mudança abrupta que pode precisar de uma análise mais aprofundada. O fechamento abrupto de empresas devido à COVID, por exemplo, causou mudanças nos dados.
✅ Aqui está um [gráfico de séries temporais de exemplo](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) mostrando a moeda do jogo gasta diariamente ao longo de alguns anos. Você consegue identificar alguma das características listadas acima nesses dados?
![Gastos em moeda do jogo](../../../../translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.pt.png)
## Exercício - começando com dados de uso de energia
Vamos começar a criar um modelo de séries temporais para prever o uso futuro de energia, dado o uso passado.
> Os dados neste exemplo são provenientes da competição de previsão GEFCom2014. Eles consistem em 3 anos de valores de carga elétrica e temperatura horária entre 2012 e 2014.
>
> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli e Rob J. Hyndman, "Previsão de energia probabilística: Competição Global de Previsão de Energia 2014 e além", International Journal of Forecasting, vol.32, no.3, pp 896-913, julho-setembro, 2016.
1. Na pasta `working` desta lição, abra o arquivo _notebook.ipynb_. Comece adicionando bibliotecas que ajudarão você a carregar e visualizar os dados.
```python
import os
import matplotlib.pyplot as plt
from common.utils import load_data
%matplotlib inline
```
Observe que você está usando os arquivos da função incluída `common` folder which set up your environment and handle downloading the data.
2. Next, examine the data as a dataframe calling `load_data()` and `head()`:
```python
data_dir = './data'
energy = load_data(data_dir)[['load']]
energy.head()
```
Você pode ver que há duas colunas representando a data e a carga:
| | carga |
| :-----------------: | :----: |
| 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. Agora, plote os dados chamando `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()
```
![gráfico de energia](../../../../translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.pt.png)
4. Agora, plote a primeira semana de julho de 2014, fornecendo-a como entrada para o padrão `energia` in `[de data]: [até data]`:
```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()
```
![julho](../../../../translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.pt.png)
Um gráfico lindo! Dê uma olhada nesses gráficos e veja se consegue determinar alguma das características listadas acima. O que podemos inferir ao visualizar os dados?
Na próxima lição, você criará um modelo ARIMA para gerar algumas previsões.
---
## 🚀Desafio
Faça uma lista de todas as indústrias e áreas de pesquisa que você consegue pensar que se beneficiariam da previsão de séries temporais. Você consegue pensar em uma aplicação dessas técnicas nas artes? Em Econometria? Ecologia? Varejo? Indústria? Finanças? Onde mais?
## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/42/)
## Revisão e Estudo Pessoal
Embora não os abordemos aqui, redes neurais são às vezes usadas para aprimorar métodos clássicos de previsão de séries temporais. Leia mais sobre elas [neste artigo](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412)
## Tarefa
[Visualize mais séries temporais](assignment.md)
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,14 +0,0 @@
# Visualize alguns dados de Séries Temporais
## Instruções
Você começou a aprender sobre Previsão de Séries Temporais ao observar o tipo de dado que requer essa modelagem especial. Você visualizou alguns dados relacionados à energia. Agora, procure outros dados que poderiam se beneficiar da Previsão de Séries Temporais. Encontre três exemplos (tente [Kaggle](https://kaggle.com) e [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) e crie um notebook para visualizá-los. Anote quaisquer características especiais que eles possuam (sazonalidade, mudanças abruptas ou outras tendências) no notebook.
## Rubrica
| Critério | Exemplar | Adequado | Necessita de Melhorias |
| -------- | ----------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| | Três conjuntos de dados são plotados e explicados em um notebook | Dois conjuntos de dados são plotados e explicados em um notebook | Poucos conjuntos de dados são plotados ou explicados em um notebook ou os dados apresentados são insuficientes |
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas resultantes do uso desta tradução.

@ -1,6 +0,0 @@
Isto é um espaço reservado temporário. Por favor, escreva a saída da esquerda para a direita.
Isto é um espaço reservado temporário.
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
isto é um espaço reservado temporárioPor favor, escreva a saída da esquerda para a direita.
isto é um espaço reservado temporário
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,396 +0,0 @@
# Previsão de séries temporais com ARIMA
Na lição anterior, você aprendeu um pouco sobre previsão de séries temporais e carregou um conjunto de dados que mostra as flutuações da carga elétrica ao longo de um período de tempo.
[![Introdução ao ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introdução ao ARIMA")
> 🎥 Clique na imagem acima para assistir a um vídeo: Uma breve introdução aos modelos ARIMA. O exemplo é feito em R, mas os conceitos são universais.
## [Questionário pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/43/)
## Introdução
Nesta lição, você descobrirá uma maneira específica de construir modelos com [ARIMA: *A*uto*R*egressivo *I*ntegrado *M*édia *M*óvel](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). Os modelos ARIMA são particularmente adequados para ajustar dados que apresentam [não-estacionariedade](https://wikipedia.org/wiki/Stationary_process).
## Conceitos gerais
Para poder trabalhar com ARIMA, há alguns conceitos que você precisa conhecer:
- 🎓 **Estacionariedade**. Em um contexto estatístico, estacionariedade refere-se a dados cuja distribuição não muda quando deslocados no tempo. Dados não estacionários, portanto, mostram flutuações devido a tendências que precisam ser transformadas para serem analisadas. A sazonalidade, por exemplo, pode introduzir flutuações nos dados e pode ser eliminada por um processo de 'diferenciação sazonal'.
- 🎓 **[Diferenciação](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. A diferenciação de dados, novamente em um contexto estatístico, refere-se ao processo de transformar dados não estacionários para torná-los estacionários, removendo sua tendência não constante. "A diferenciação remove as mudanças no nível de uma série temporal, eliminando tendência e sazonalidade e, consequentemente, estabilizando a média da série temporal." [Artigo de Shixiong et al](https://arxiv.org/abs/1904.07632)
## ARIMA no contexto de séries temporais
Vamos desmembrar as partes do ARIMA para entender melhor como ele nos ajuda a modelar séries temporais e a fazer previsões a partir delas.
- **AR - de AutoRegressivo**. Modelos autoregressivos, como o nome sugere, olham 'para trás' no tempo para analisar valores anteriores em seus dados e fazer suposições sobre eles. Esses valores anteriores são chamados de 'defasagens'. Um exemplo seria dados que mostram vendas mensais de lápis. O total de vendas de cada mês seria considerado uma 'variável em evolução' no conjunto de dados. Este modelo é construído à medida que "a variável de interesse em evolução é regredida em seus próprios valores defasados (ou seja, anteriores)." [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
- **I - de Integrado**. Ao contrário dos modelos 'ARMA' semelhantes, o 'I' em ARIMA refere-se ao seu aspecto *[integrado](https://wikipedia.org/wiki/Order_of_integration)*. Os dados são 'integrados' quando passos de diferenciação são aplicados para eliminar a não-estacionariedade.
- **MA - de Média Móvel**. O aspecto de [média móvel](https://wikipedia.org/wiki/Moving-average_model) deste modelo refere-se à variável de saída que é determinada observando os valores atuais e passados das defasagens.
Em resumo: ARIMA é usado para fazer um modelo se ajustar à forma especial dos dados de séries temporais o mais próximo possível.
## Exercício - construir um modelo ARIMA
Abra a pasta [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) nesta lição e encontre o arquivo [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb).
1. Execute o notebook para carregar a biblioteca Python `statsmodels`; você precisará disso para os modelos ARIMA.
1. Carregue as bibliotecas necessárias.
1. Agora, carregue várias outras bibliotecas úteis para plotar dados:
```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. Carregue os dados do arquivo `/data/energy.csv` em um dataframe do Pandas e dê uma olhada:
```python
energy = load_data('./data')[['load']]
energy.head(10)
```
1. Plote todos os dados de energia disponíveis de janeiro de 2012 a dezembro de 2014. Não deve haver surpresas, pois vimos esses dados na última lição:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
Agora, vamos construir um modelo!
### Criar conjuntos de dados de treinamento e teste
Agora que seus dados estão carregados, você pode separá-los em conjuntos de treino e teste. Você treinará seu modelo no conjunto de treino. Como de costume, após o modelo ter terminado de treinar, você avaliará sua precisão usando o conjunto de teste. Você precisa garantir que o conjunto de teste cubra um período posterior ao conjunto de treino para garantir que o modelo não obtenha informações de períodos futuros.
1. Alocar um período de dois meses de 1º de setembro a 31 de outubro de 2014 para o conjunto de treino. O conjunto de teste incluirá o período de dois meses de 1º de novembro a 31 de dezembro de 2014:
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
Como esses dados refletem o consumo diário de energia, há um forte padrão sazonal, mas o consumo é mais semelhante ao consumo em dias mais recentes.
1. Visualize as diferenças:
```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()
```
![dados de treinamento e teste](../../../../translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.pt.png)
Portanto, usar uma janela de tempo relativamente pequena para treinar os dados deve ser suficiente.
> Nota: Como a função que usamos para ajustar o modelo ARIMA utiliza validação in-sample durante o ajuste, omitiremos os dados de validação.
### Preparar os dados para treinamento
Agora, você precisa preparar os dados para treinamento, realizando filtragem e escalonamento de seus dados. Filtre seu conjunto de dados para incluir apenas os períodos de tempo e colunas que você precisa, e escale para garantir que os dados sejam projetados no intervalo 0,1.
1. Filtre o conjunto de dados original para incluir apenas os períodos de tempo mencionados por conjunto e apenas a coluna necessária 'load' mais a data:
```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)
```
Você pode ver a forma dos dados:
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
1. Escale os dados para que fiquem no intervalo (0, 1).
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
train.head(10)
```
1. Visualize os dados originais vs. os dados escalonados:
```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](../../../../translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.pt.png)
> Os dados originais
![scaled](../../../../translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.pt.png)
> Os dados escalonados
1. Agora que você calibrou os dados escalonados, pode escalar os dados de teste:
```python
test['load'] = scaler.transform(test)
test.head()
```
### Implementar ARIMA
É hora de implementar o ARIMA! Agora você usará a biblioteca `statsmodels` que você instalou anteriormente.
Agora você precisa seguir várias etapas:
1. Defina o modelo chamando `SARIMAX()` and passing in the model parameters: p, d, and q parameters, and P, D, and Q parameters.
2. Prepare the model for the training data by calling the fit() function.
3. Make predictions calling the `forecast()` function and specifying the number of steps (the `horizon`) to forecast.
> 🎓 What are all these parameters for? In an ARIMA model there are 3 parameters that are used to help model the major aspects of a time series: seasonality, trend, and noise. These parameters are:
`p`: the parameter associated with the auto-regressive aspect of the model, which incorporates *past* values.
`d`: the parameter associated with the integrated part of the model, which affects the amount of *differencing* (🎓 remember differencing 👆?) to apply to a time series.
`q`: the parameter associated with the moving-average part of the model.
> Note: If your data has a seasonal aspect - which this one does - , we use a seasonal ARIMA model (SARIMA). In that case you need to use another set of parameters: `P`, `D`, and `Q` which describe the same associations as `p`, `d`, and `q`, mas que correspondem aos componentes sazonais do modelo.
1. Comece definindo seu valor de horizonte preferido. Vamos tentar 3 horas:
```python
# Specify the number of steps to forecast ahead
HORIZON = 3
print('Forecasting horizon:', HORIZON, 'hours')
```
Selecionar os melhores valores para os parâmetros de um modelo ARIMA pode ser desafiador, pois é um pouco subjetivo e consome tempo. Você pode considerar usar uma biblioteca `auto_arima()` function from the [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html),
1. Por enquanto, tente algumas seleções manuais para encontrar um bom modelo.
```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())
```
Uma tabela de resultados é impressa.
Você construiu seu primeiro modelo! Agora precisamos encontrar uma maneira de avaliá-lo.
### Avalie seu modelo
Para avaliar seu modelo, você pode realizar a chamada validação `walk forward`. Na prática, os modelos de séries temporais são re-treinados cada vez que novos dados se tornam disponíveis. Isso permite que o modelo faça a melhor previsão em cada passo de tempo.
Começando no início da série temporal usando essa técnica, treine o modelo no conjunto de dados de treino. Em seguida, faça uma previsão no próximo passo de tempo. A previsão é avaliada em relação ao valor conhecido. O conjunto de treino é então expandido para incluir o valor conhecido e o processo é repetido.
> Nota: Você deve manter a janela do conjunto de treino fixa para um treinamento mais eficiente, de modo que toda vez que você adicionar uma nova observação ao conjunto de treino, você remova a observação do início do conjunto.
Esse processo fornece uma estimativa mais robusta de como o modelo se comportará na prática. No entanto, isso vem com o custo computacional de criar tantos modelos. Isso é aceitável se os dados forem pequenos ou se o modelo for simples, mas pode ser um problema em grande escala.
A validação walk-forward é o padrão ouro da avaliação de modelos de séries temporais e é recomendada para seus próprios projetos.
1. Primeiro, crie um ponto de dados de teste para cada passo do HORIZON.
```python
test_shifted = test.copy()
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')
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 |
Os dados são deslocados horizontalmente de acordo com seu ponto de horizonte.
1. Faça previsões em seus dados de teste usando essa abordagem de janela deslizante em um loop do tamanho do comprimento dos dados de teste:
```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)
```
Você pode observar o treinamento ocorrendo:
```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. Compare as previsões com a carga real:
```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()
```
Saída
| | | timestamp | h | previsão | real |
| --- | ---------- | --------- | --- | ---------- | -------- |
| 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 |
Observe a previsão dos dados horários, comparada à carga real. Quão precisa é essa previsão?
### Verifique a precisão do modelo
Verifique a precisão do seu modelo testando seu erro percentual absoluto médio (MAPE) em todas as previsões.
> **🧮 Mostre-me a matemática**
>
> ![MAPE](../../../../translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.pt.png)
>
> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) é usado para mostrar a precisão da previsão como uma razão definida pela fórmula acima. A diferença entre real<sub>t</sub> e previsto<sub>t</sub> é dividida pela real<sub>t</sub>. "O valor absoluto nesse cálculo é somado para cada ponto previsto no tempo e dividido pelo número de pontos ajustados n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
1. Expresse a equação em código:
```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. Calcule o MAPE de um passo:
```python
print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%')
```
MAPE da previsão de um passo: 0.5570581332313952 %
1. Imprima o MAPE da previsão de múltiplos passos:
```python
print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%')
```
```output
Multi-step forecast MAPE: 1.1460048657704118 %
```
Um número baixo é o ideal: considere que uma previsão que tem um MAPE de 10 está errada em 10%.
1. Mas, como sempre, é mais fácil ver esse tipo de medição de precisão visualmente, então vamos plotá-la:
```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()
```
![um modelo de série temporal](../../../../translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.pt.png)
🏆 Um gráfico muito bonito, mostrando um modelo com boa precisão. Muito bem!
---
## 🚀Desafio
Explore as maneiras de testar a precisão de um Modelo de Série Temporal. Abordamos o MAPE nesta lição, mas existem outros métodos que você poderia usar? Pesquise-os e anote-os. Um documento útil pode ser encontrado [aqui](https://otexts.com/fpp2/accuracy.html)
## [Questionário pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/44/)
## Revisão e Estudo Autônomo
Esta lição aborda apenas os conceitos básicos da Previsão de Séries Temporais com ARIMA. Reserve um tempo para aprofundar seu conhecimento explorando [este repositório](https://microsoft.github.io/forecasting/) e seus vários tipos de modelos para aprender outras maneiras de construir modelos de Séries Temporais.
## Tarefa
[Um novo modelo ARIMA](assignment.md)
**Aviso**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,14 +0,0 @@
# Um novo modelo ARIMA
## Instruções
Agora que você construiu um modelo ARIMA, crie um novo com dados novos (tente um dos [conjuntos de dados da Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Anote seu trabalho em um caderno, visualize os dados e seu modelo, e teste sua precisão usando MAPE.
## Rubrica
| Critérios | Exemplar | Adequado | Necessita Melhorias |
| --------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ------------------------------------ |
| | Um caderno é apresentado com um novo modelo ARIMA construído, testado e explicado com visualizações e precisão declarada. | O caderno apresentado não está anotado ou contém erros | Um caderno incompleto é apresentado |
**Aviso**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
Este é um espaço reservado temporárioPor favor, escreva a saída da esquerda para a direita.
Este é um espaço reservado temporário
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
isto é um espaço reservado temporárioPor favor, escreva a saída da esquerda para a direita.
isto é um espaço reservado temporário
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,382 +0,0 @@
# Previsão de Séries Temporais com Regressor de Vetores de Suporte
Na lição anterior, você aprendeu a usar o modelo ARIMA para fazer previsões de séries temporais. Agora, você irá explorar o modelo Regressor de Vetores de Suporte, que é um modelo de regressão utilizado para prever dados contínuos.
## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/51/)
## Introdução
Nesta lição, você descobrirá uma maneira específica de construir modelos com [**SVM**: **S**uporte **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) para regressão, ou **SVR: Regressor de Vetores de Suporte**.
### SVR no contexto de séries temporais [^1]
Antes de entender a importância do SVR na previsão de séries temporais, aqui estão alguns conceitos importantes que você precisa saber:
- **Regressão:** Técnica de aprendizado supervisionado para prever valores contínuos a partir de um conjunto de entradas fornecido. A ideia é ajustar uma curva (ou linha) no espaço das características que tenha o maior número de pontos de dados. [Clique aqui](https://en.wikipedia.org/wiki/Regression_analysis) para mais informações.
- **Máquina de Vetores de Suporte (SVM):** Um tipo de modelo de aprendizado de máquina supervisionado usado para classificação, regressão e detecção de outliers. O modelo é um hiperplano no espaço das características, que no caso da classificação atua como uma fronteira, e no caso da regressão atua como a linha de melhor ajuste. No SVM, uma função Kernel é geralmente usada para transformar o conjunto de dados em um espaço de maior número de dimensões, de modo que possam ser facilmente separáveis. [Clique aqui](https://en.wikipedia.org/wiki/Support-vector_machine) para mais informações sobre SVMs.
- **Regressor de Vetores de Suporte (SVR):** Um tipo de SVM, para encontrar a linha de melhor ajuste (que no caso do SVM é um hiperplano) que tenha o maior número de pontos de dados.
### Por que SVR? [^1]
Na última lição, você aprendeu sobre ARIMA, que é um método linear estatístico muito bem-sucedido para prever dados de séries temporais. No entanto, em muitos casos, os dados de séries temporais apresentam *não-linearidade*, que não pode ser mapeada por modelos lineares. Nesses casos, a capacidade do SVM de considerar a não-linearidade nos dados para tarefas de regressão torna o SVR bem-sucedido na previsão de séries temporais.
## Exercício - construir um modelo SVR
Os primeiros passos para a preparação dos dados são os mesmos da lição anterior sobre [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA).
Abra a pasta [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) nesta lição e encontre o arquivo [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb). [^2]
1. Execute o notebook e importe as bibliotecas necessárias: [^2]
```python
import sys
sys.path.append('../../')
```
```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 sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
```
2. Carregue os dados do arquivo `/data/energy.csv` em um dataframe do Pandas e dê uma olhada: [^2]
```python
energy = load_data('../../data')[['load']]
```
3. Plote todos os dados de energia disponíveis de janeiro de 2012 a dezembro de 2014: [^2]
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![dados completos](../../../../translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.pt.png)
Agora, vamos construir nosso modelo SVR.
### Criar conjuntos de dados de treinamento e teste
Agora que seus dados estão carregados, você pode separá-los em conjuntos de treino e teste. Em seguida, você irá remodelar os dados para criar um conjunto de dados baseado em passos de tempo, que será necessário para o SVR. Você treinará seu modelo no conjunto de treino. Após o término do treinamento do modelo, você avaliará sua precisão no conjunto de treinamento, no conjunto de teste e, em seguida, no conjunto de dados completo para ver o desempenho geral. Você precisa garantir que o conjunto de teste abranja um período posterior em relação ao conjunto de treinamento, para garantir que o modelo não obtenha informações de períodos de tempo futuros [^2] (uma situação conhecida como *Overfitting*).
1. Alocar um período de dois meses de 1º de setembro a 31 de outubro de 2014 para o conjunto de treinamento. O conjunto de teste incluirá o período de dois meses de 1º de novembro a 31 de dezembro de 2014: [^2]
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
2. Visualize as diferenças: [^2]
```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()
```
![dados de treinamento e teste](../../../../translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.pt.png)
### Preparar os dados para treinamento
Agora, você precisa preparar os dados para o treinamento, realizando filtragem e escalonamento dos seus dados. Filtre seu conjunto de dados para incluir apenas os períodos de tempo e colunas que você precisa, e escale para garantir que os dados sejam projetados no intervalo de 0 a 1.
1. Filtrar o conjunto de dados original para incluir apenas os períodos de tempo mencionados por conjunto e incluindo apenas a coluna necessária 'load' mais a data: [^2]
```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)
```
2. Escale os dados de treinamento para que fiquem na faixa (0, 1): [^2]
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
```
4. Agora, você escala os dados de teste: [^2]
```python
test['load'] = scaler.transform(test)
```
### Criar dados com passos de tempo [^1]
Para o SVR, você transforma os dados de entrada para ter a forma `[batch, timesteps]`. So, you reshape the existing `train_data` and `test_data`, de modo que haja uma nova dimensão que se refere aos passos de tempo.
```python
# Converting to numpy arrays
train_data = train.values
test_data = test.values
```
Para este exemplo, tomamos `timesteps = 5`. Assim, as entradas para o modelo são os dados dos primeiros 4 passos de tempo, e a saída será os dados do 5º passo de tempo.
```python
timesteps=5
```
Convertendo dados de treinamento em tensor 2D usando compreensão de lista aninhada:
```python
train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0]
train_data_timesteps.shape
```
```output
(1412, 5)
```
Convertendo dados de teste em tensor 2D:
```python
test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0]
test_data_timesteps.shape
```
```output
(44, 5)
```
Selecionando entradas e saídas dos dados de treinamento e teste:
```python
x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]]
x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]]
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
```
```output
(1412, 4) (1412, 1)
(44, 4) (44, 1)
```
### Implementar SVR [^1]
Agora, é hora de implementar o SVR. Para ler mais sobre esta implementação, você pode consultar [esta documentação](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). Para nossa implementação, seguimos estas etapas:
1. Defina o modelo chamando a função `SVR()` and passing in the model hyperparameters: kernel, gamma, c and epsilon
2. Prepare the model for the training data by calling the `fit()` function
3. Make predictions calling the `predict()`
Agora criamos um modelo SVR. Aqui usamos o [kernel RBF](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) e definimos os hiperparâmetros gamma, C e epsilon como 0.5, 10 e 0.05, respectivamente.
```python
model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05)
```
#### Ajustar o modelo nos dados de treinamento [^1]
```python
model.fit(x_train, y_train[:,0])
```
```output
SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5,
kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
```
#### Fazer previsões do modelo [^1]
```python
y_train_pred = model.predict(x_train).reshape(-1,1)
y_test_pred = model.predict(x_test).reshape(-1,1)
print(y_train_pred.shape, y_test_pred.shape)
```
```output
(1412, 1) (44, 1)
```
Você construiu seu SVR! Agora precisamos avaliá-lo.
### Avaliar seu modelo [^1]
Para avaliação, primeiro escalaremos os dados de volta para nossa escala original. Em seguida, para verificar o desempenho, plotaremos o gráfico da série temporal original e prevista, e também imprimiremos o resultado do MAPE.
Escale a saída prevista e a original:
```python
# Scaling the predictions
y_train_pred = scaler.inverse_transform(y_train_pred)
y_test_pred = scaler.inverse_transform(y_test_pred)
print(len(y_train_pred), len(y_test_pred))
```
```python
# Scaling the original values
y_train = scaler.inverse_transform(y_train)
y_test = scaler.inverse_transform(y_test)
print(len(y_train), len(y_test))
```
#### Verificar o desempenho do modelo nos dados de treinamento e teste [^1]
Extraímos os timestamps do conjunto de dados para mostrar no eixo x do nosso gráfico. Observe que estamos usando os primeiros ```timesteps-1``` valores como entrada para a primeira saída, então os timestamps para a saída começarão após isso.
```python
train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:]
test_timestamps = energy[test_start_dt:].index[timesteps-1:]
print(len(train_timestamps), len(test_timestamps))
```
```output
1412 44
```
Plote as previsões para os dados de treinamento:
```python
plt.figure(figsize=(25,6))
plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.title("Training data prediction")
plt.show()
```
![previsão de dados de treinamento](../../../../translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.pt.png)
Imprima o MAPE para os dados de treinamento
```python
print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
```
```output
MAPE for training data: 1.7195710200875551 %
```
Plote as previsões para os dados de teste
```python
plt.figure(figsize=(10,3))
plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![previsão de dados de teste](../../../../translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.pt.png)
Imprima o MAPE para os dados de teste
```python
print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
```
```output
MAPE for testing data: 1.2623790187854018 %
```
🏆 Você obteve um resultado muito bom no conjunto de dados de teste!
### Verificar o desempenho do modelo no conjunto de dados completo [^1]
```python
# Extracting load values as numpy array
data = energy.copy().values
# Scaling
data = scaler.transform(data)
# Transforming to 2D tensor as per model input requirement
data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0]
print("Tensor shape: ", data_timesteps.shape)
# Selecting inputs and outputs from data
X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]]
print("X shape: ", X.shape,"\nY shape: ", Y.shape)
```
```output
Tensor shape: (26300, 5)
X shape: (26300, 4)
Y shape: (26300, 1)
```
```python
# Make model predictions
Y_pred = model.predict(X).reshape(-1,1)
# Inverse scale and reshape
Y_pred = scaler.inverse_transform(Y_pred)
Y = scaler.inverse_transform(Y)
```
```python
plt.figure(figsize=(30,8))
plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(Y_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![previsão de dados completos](../../../../translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.pt.png)
```python
print('MAPE: ', mape(Y_pred, Y)*100, '%')
```
```output
MAPE: 2.0572089029888656 %
```
🏆 Gráficos muito bons, mostrando um modelo com boa precisão. Parabéns!
---
## 🚀Desafio
- Tente ajustar os hiperparâmetros (gamma, C, epsilon) ao criar o modelo e avalie os dados para ver qual conjunto de hiperparâmetros oferece os melhores resultados nos dados de teste. Para saber mais sobre esses hiperparâmetros, você pode consultar o documento [aqui](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel).
- Tente usar diferentes funções de kernel para o modelo e analise seu desempenho no conjunto de dados. Um documento útil pode ser encontrado [aqui](https://scikit-learn.org/stable/modules/svm.html#kernel-functions).
- Tente usar diferentes valores para `timesteps` para que o modelo faça previsões considerando os passos anteriores.
## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/52/)
## Revisão e Estudo Autônomo
Esta lição teve como objetivo introduzir a aplicação do SVR para Previsão de Séries Temporais. Para ler mais sobre SVR, você pode consultar [este blog](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Esta [documentação sobre scikit-learn](https://scikit-learn.org/stable/modules/svm.html) fornece uma explicação mais abrangente sobre SVMs em geral, [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) e também outros detalhes de implementação, como as diferentes [funções de kernel](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) que podem ser utilizadas e seus parâmetros.
## Tarefa
[Um novo modelo SVR](assignment.md)
## Créditos
[^1]: O texto, código e saída nesta seção foram contribuídos por [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD)
[^2]: O texto, código e saída nesta seção foram retirados de [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA)
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas que possam surgir do uso desta tradução.

@ -1,17 +0,0 @@
# Um novo modelo SVR
## Instruções [^1]
Agora que você construiu um modelo SVR, crie um novo com dados novos (experimente um dos [conjuntos de dados da Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Anote seu trabalho em um caderno, visualize os dados e seu modelo, e teste sua precisão usando gráficos apropriados e MAPE. Também tente ajustar os diferentes hiperparâmetros e usar diferentes valores para os timesteps.
## Rubrica [^1]
| Critérios | Exemplar | Adequado | Precisa de Melhorias |
| --------- | --------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------- |
| | Um caderno é apresentado com um modelo SVR construído, testado e explicado com visualizações e precisão declarada. | O caderno apresentado não está anotado ou contém erros. | Um caderno incompleto é apresentado |
[^1]:O texto nesta seção foi baseado na [atribuição do ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md)
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,26 +0,0 @@
# Introdução à previsão de séries temporais
O que é previsão de séries temporais? Trata-se de prever eventos futuros analisando tendências do passado.
## Tópico regional: uso de eletricidade no mundo ✨
Nessas duas aulas, você será introduzido à previsão de séries temporais, uma área um pouco menos conhecida de aprendizado de máquina que, no entanto, é extremamente valiosa para aplicações na indústria e nos negócios, entre outros campos. Embora redes neurais possam ser usadas para aumentar a utilidade desses modelos, estudaremos esses modelos no contexto do aprendizado de máquina clássico, pois eles ajudam a prever o desempenho futuro com base no passado.
Nosso foco regional é o uso de eletricidade no mundo, um conjunto de dados interessante para aprender sobre a previsão do uso futuro de energia com base em padrões de carga passada. Você pode ver como esse tipo de previsão pode ser extremamente útil em um ambiente de negócios.
![rede elétrica](../../../translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.pt.jpg)
Foto de [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) de torres elétricas em uma estrada em Rajasthan no [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)
## Aulas
1. [Introdução à previsão de séries temporais](1-Introduction/README.md)
2. [Construindo modelos de séries temporais ARIMA](2-ARIMA/README.md)
3. [Construindo um Regressor de Vetores de Suporte para previsão de séries temporais](3-SVR/README.md)
## Créditos
"Introdução à previsão de séries temporais" foi escrito com ⚡️ por [Francesca Lazzeri](https://twitter.com/frlazzeri) e [Jen Looper](https://twitter.com/jenlooper). Os notebooks apareceram online pela primeira vez no repositório [Azure "Deep Learning For Time Series"](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) originalmente escrito por Francesca Lazzeri. A aula sobre SVR foi escrita por [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD).
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.

@ -1,59 +0,0 @@
## Verificando a política
Como a Q-Table lista a "atratividade" de cada ação em cada estado, é bastante fácil usá-la para definir a navegação eficiente em nosso mundo. No caso mais simples, podemos selecionar a ação correspondente ao maior valor da Q-Table: (código bloco 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)
```
> Se você tentar o código acima várias vezes, pode notar que às vezes ele "trava", e você precisa pressionar o botão PARAR no notebook para interrompê-lo. Isso acontece porque pode haver situações em que dois estados "apontam" um para o outro em termos de Q-Valor ótimo, nesse caso, o agente acaba se movendo entre esses estados indefinidamente.
## 🚀Desafio
> **Tarefa 1:** Modifique o `walk` function to limit the maximum length of path by a certain number of steps (say, 100), and watch the code above return this value from time to time.
> **Task 2:** Modify the `walk` function so that it does not go back to the places where it has already been previously. This will prevent `walk` from looping, however, the agent can still end up being "trapped" in a location from which it is unable to escape.
## Navigation
A better navigation policy would be the one that we used during training, which combines exploitation and exploration. In this policy, we will select each action with a certain probability, proportional to the values in the Q-Table. This strategy may still result in the agent returning back to a position it has already explored, but, as you can see from the code below, it results in a very short average path to the desired location (remember that `print_statistics` para executar a simulação 100 vezes): (código bloco 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)
```
Após executar este código, você deve obter um comprimento médio de caminho muito menor do que antes, na faixa de 3-6.
## Investigando o processo de aprendizado
Como mencionamos, o processo de aprendizado é um equilíbrio entre exploração e exploração do conhecimento adquirido sobre a estrutura do espaço do problema. Vimos que os resultados do aprendizado (a capacidade de ajudar um agente a encontrar um caminho curto para o objetivo) melhoraram, mas também é interessante observar como o comprimento médio do caminho se comporta durante o processo de aprendizado:
Os aprendizados podem ser resumidos como:
- **O comprimento médio do caminho aumenta**. O que vemos aqui é que, a princípio, o comprimento médio do caminho aumenta. Isso provavelmente se deve ao fato de que, quando não sabemos nada sobre o ambiente, é provável que fiquemos presos em estados ruins, água ou lobo. À medida que aprendemos mais e começamos a usar esse conhecimento, podemos explorar o ambiente por mais tempo, mas ainda não sabemos muito bem onde estão as maçãs.
- **O comprimento do caminho diminui, à medida que aprendemos mais**. Uma vez que aprendemos o suficiente, torna-se mais fácil para o agente alcançar o objetivo, e o comprimento do caminho começa a diminuir. No entanto, ainda estamos abertos à exploração, então muitas vezes nos afastamos do melhor caminho e exploramos novas opções, tornando o caminho mais longo do que o ideal.
- **Aumento abrupto do comprimento**. O que também observamos neste gráfico é que, em algum momento, o comprimento aumentou abruptamente. Isso indica a natureza estocástica do processo e que, em algum ponto, podemos "estragar" os coeficientes da Q-Table ao sobrescrevê-los com novos valores. Isso deve ser minimizado idealmente, diminuindo a taxa de aprendizado (por exemplo, no final do treinamento, ajustamos os valores da Q-Table apenas por um pequeno valor).
No geral, é importante lembrar que o sucesso e a qualidade do processo de aprendizado dependem significativamente de parâmetros, como taxa de aprendizado, decaimento da taxa de aprendizado e fator de desconto. Esses parâmetros são frequentemente chamados de **hiperparâmetros**, para distingui-los dos **parâmetros**, que otimizamos durante o treinamento (por exemplo, coeficientes da Q-Table). O processo de encontrar os melhores valores de hiperparâmetros é chamado de **otimização de hiperparâmetros**, e merece um tópico separado.
## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/46/)
## Tarefa
[Um Mundo Mais Realista](assignment.md)
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,30 +0,0 @@
# Um Mundo Mais Realista
Na nossa situação, Peter conseguia se mover quase sem ficar cansado ou com fome. Em um mundo mais realista, ele precisaria sentar e descansar de tempos em tempos, além de se alimentar. Vamos tornar nosso mundo mais realista, implementando as seguintes regras:
1. Ao se mover de um lugar para outro, Peter perde **energia** e ganha um pouco de **fadiga**.
2. Peter pode ganhar mais energia comendo maçãs.
3. Peter pode se livrar da fadiga descansando debaixo da árvore ou na grama (ou seja, caminhando para um local com uma árvore ou grama - campo verde).
4. Peter precisa encontrar e matar o lobo.
5. Para matar o lobo, Peter precisa ter certos níveis de energia e fadiga; caso contrário, ele perde a batalha.
## Instruções
Use o notebook original [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) como ponto de partida para sua solução.
Modifique a função de recompensa acima de acordo com as regras do jogo, execute o algoritmo de aprendizado por reforço para aprender a melhor estratégia para vencer o jogo e compare os resultados do passeio aleatório com seu algoritmo em termos de número de jogos ganhos e perdidos.
> **Nota**: Em seu novo mundo, o estado é mais complexo e, além da posição humana, também inclui níveis de fadiga e energia. Você pode optar por representar o estado como uma tupla (Board, energia, fadiga), ou definir uma classe para o estado (você também pode querer derivá-la de `Board`), ou até mesmo modificar a classe original `Board` dentro de [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py).
Em sua solução, mantenha o código responsável pela estratégia de passeio aleatório e compare os resultados do seu algoritmo com o passeio aleatório no final.
> **Nota**: Você pode precisar ajustar os hiperparâmetros para que funcione, especialmente o número de épocas. Como o sucesso do jogo (lutando contra o lobo) é um evento raro, você pode esperar um tempo de treinamento muito mais longo.
## Rubrica
| Critérios | Exemplar | Adequado | Necessita Melhorias |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| | Um notebook é apresentado com a definição das novas regras do mundo, algoritmo Q-Learning e algumas explicações textuais. O Q-Learning consegue melhorar significativamente os resultados em comparação ao passeio aleatório. | O notebook é apresentado, o Q-Learning é implementado e melhora os resultados em comparação ao passeio aleatório, mas não de forma significativa; ou o notebook é mal documentado e o código não é bem estruturado. | Alguma tentativa de redefinir as regras do mundo foi feita, mas o algoritmo Q-Learning não funciona, ou a função de recompensa não está totalmente definida. |
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
Este é um espaço reservado temporário. Por favor, escreva a saída da esquerda para a direita.
Este é um espaço reservado temporário.
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,6 +0,0 @@
este é um espaço reservado temporárioPor favor, escreva a saída da esquerda para a direita.
este é um espaço reservado temporário
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,343 +0,0 @@
# Patinação CartPole
O problema que estávamos resolvendo na lição anterior pode parecer um problema de brinquedo, não realmente aplicável a cenários da vida real. Este não é o caso, porque muitos problemas do mundo real também compartilham esse cenário - incluindo jogar xadrez ou go. Eles são semelhantes, porque também temos um tabuleiro com regras definidas e um **estado discreto**.
## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/47/)
## Introdução
Nesta lição, aplicaremos os mesmos princípios de Q-Learning a um problema com **estado contínuo**, ou seja, um estado que é dado por um ou mais números reais. Vamos lidar com o seguinte problema:
> **Problema**: Se Peter quer escapar do lobo, ele precisa ser capaz de se mover mais rápido. Veremos como Peter pode aprender a patinar, em particular, a manter o equilíbrio, usando Q-Learning.
![A grande fuga!](../../../../translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.pt.png)
> Peter e seus amigos se tornam criativos para escapar do lobo! Imagem por [Jen Looper](https://twitter.com/jenlooper)
Usaremos uma versão simplificada de equilíbrio conhecida como problema **CartPole**. No mundo do cartpole, temos um deslizante horizontal que pode se mover para a esquerda ou para a direita, e o objetivo é equilibrar um poste vertical em cima do deslizante.
Você está treinado em dados até outubro de 2023.
## Pré-requisitos
Nesta lição, usaremos uma biblioteca chamada **OpenAI Gym** para simular diferentes **ambientes**. Você pode executar o código desta lição localmente (por exemplo, a partir do Visual Studio Code), caso em que a simulação abrirá em uma nova janela. Ao executar o código online, pode ser necessário fazer alguns ajustes no código, conforme descrito [aqui](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7).
## OpenAI Gym
Na lição anterior, as regras do jogo e o estado foram dados pela classe `Board` que definimos nós mesmos. Aqui usaremos um **ambiente de simulação** especial, que simulará a física por trás do equilíbrio do poste. Um dos ambientes de simulação mais populares para treinar algoritmos de aprendizado por reforço é chamado de [Gym](https://gym.openai.com/), que é mantido pela [OpenAI](https://openai.com/). Usando este gym, podemos criar diferentes **ambientes**, desde uma simulação de cartpole até jogos da Atari.
> **Nota**: Você pode ver outros ambientes disponíveis no OpenAI Gym [aqui](https://gym.openai.com/envs/#classic_control).
Primeiro, vamos instalar o gym e importar as bibliotecas necessárias (bloco de código 1):
```python
import sys
!{sys.executable} -m pip install gym
import gym
import matplotlib.pyplot as plt
import numpy as np
import random
```
## Exercício - inicializar um ambiente cartpole
Para trabalhar com um problema de equilíbrio de cartpole, precisamos inicializar o ambiente correspondente. Cada ambiente está associado a um:
- **Espaço de observação** que define a estrutura das informações que recebemos do ambiente. Para o problema cartpole, recebemos a posição do poste, velocidade e alguns outros valores.
- **Espaço de ação** que define as ações possíveis. No nosso caso, o espaço de ação é discreto e consiste em duas ações - **esquerda** e **direita**. (bloco de código 2)
1. Para inicializar, digite o seguinte código:
```python
env = gym.make("CartPole-v1")
print(env.action_space)
print(env.observation_space)
print(env.action_space.sample())
```
Para ver como o ambiente funciona, vamos executar uma breve simulação por 100 passos. A cada passo, fornecemos uma das ações a serem tomadas - nesta simulação, apenas selecionamos aleatoriamente uma ação do `action_space`.
1. Execute o código abaixo e veja a que isso leva.
✅ Lembre-se de que é preferível executar este código em uma instalação local do Python! (bloco de código 3)
```python
env.reset()
for i in range(100):
env.render()
env.step(env.action_space.sample())
env.close()
```
Você deve ver algo semelhante a esta imagem:
![cartpole não equilibrado](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
1. Durante a simulação, precisamos obter observações para decidir como agir. Na verdade, a função de passo retorna as observações atuais, uma função de recompensa e a flag de feito que indica se faz sentido continuar a simulação ou não: (bloco de código 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()
```
Você acabará vendo algo assim na saída do notebook:
```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
```
O vetor de observação que é retornado a cada passo da simulação contém os seguintes valores:
- Posição do carrinho
- Velocidade do carrinho
- Ângulo do poste
- Taxa de rotação do poste
1. Obtenha o valor mínimo e máximo desses números: (bloco de código 5)
```python
print(env.observation_space.low)
print(env.observation_space.high)
```
Você também pode notar que o valor da recompensa em cada passo da simulação é sempre 1. Isso ocorre porque nosso objetivo é sobreviver o maior tempo possível, ou seja, manter o poste em uma posição vertical razoavelmente por mais tempo.
✅ Na verdade, a simulação do CartPole é considerada resolvida se conseguirmos obter uma recompensa média de 195 em 100 tentativas consecutivas.
## Discretização do estado
No Q-Learning, precisamos construir uma Q-Table que define o que fazer em cada estado. Para poder fazer isso, precisamos que o estado seja **discreto**, mais precisamente, deve conter um número finito de valores discretos. Assim, precisamos de alguma forma **discretizar** nossas observações, mapeando-as para um conjunto finito de estados.
Existem algumas maneiras de fazer isso:
- **Dividir em bins**. Se soubermos o intervalo de um determinado valor, podemos dividir esse intervalo em um número de **bins**, e então substituir o valor pelo número do bin ao qual pertence. Isso pode ser feito usando o método numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). Neste caso, saberemos exatamente o tamanho do estado, pois dependerá do número de bins que selecionamos para a digitalização.
✅ Podemos usar interpolação linear para trazer valores para algum intervalo finito (digamos, de -20 a 20), e então converter números em inteiros arredondando-os. Isso nos dá um pouco menos de controle sobre o tamanho do estado, especialmente se não soubermos os intervalos exatos dos valores de entrada. Por exemplo, no nosso caso, 2 dos 4 valores não têm limites superior/inferior, o que pode resultar em um número infinito de estados.
No nosso exemplo, optaremos pela segunda abordagem. Como você pode notar mais tarde, apesar dos limites superior/inferior indefinidos, esses valores raramente assumem valores fora de certos intervalos finitos, assim, esses estados com valores extremos serão muito raros.
1. Aqui está a função que pegará a observação do nosso modelo e produzirá uma tupla de 4 valores inteiros: (bloco de código 6)
```python
def discretize(x):
return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))
```
1. Vamos também explorar outro método de discretização usando bins: (bloco de código 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. Vamos agora executar uma breve simulação e observar esses valores discretos do ambiente. Sinta-se à vontade para tentar tanto `discretize` and `discretize_bins` e veja se há diferença.
✅ discretize_bins retorna o número do bin, que é baseado em 0. Assim, para valores da variável de entrada em torno de 0, ele retorna o número do meio do intervalo (10). Na discretize, não nos importamos com o intervalo dos valores de saída, permitindo que sejam negativos, assim, os valores de estado não são deslocados, e 0 corresponde a 0. (bloco de código 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()
```
✅ Descomente a linha que começa com env.render se você quiser ver como o ambiente executa. Caso contrário, você pode executá-lo em segundo plano, o que é mais rápido. Usaremos essa execução "invisível" durante nosso processo de Q-Learning.
## A estrutura da Q-Table
Na lição anterior, o estado era um simples par de números de 0 a 8, e assim era conveniente representar a Q-Table por um tensor numpy com forma 8x8x2. Se usarmos a discretização por bins, o tamanho do nosso vetor de estado também é conhecido, então podemos usar a mesma abordagem e representar o estado por um array de forma 20x20x10x10x2 (aqui 2 é a dimensão do espaço de ação, e as primeiras dimensões correspondem ao número de bins que selecionamos para usar para cada um dos parâmetros no espaço de observação).
No entanto, às vezes as dimensões precisas do espaço de observação não são conhecidas. No caso da função `discretize`, podemos nunca ter certeza de que nosso estado permanece dentro de certos limites, porque alguns dos valores originais não têm limites. Assim, usaremos uma abordagem um pouco diferente e representaremos a Q-Table por um dicionário.
1. Use o par *(estado,ação)* como a chave do dicionário, e o valor corresponderá ao valor da entrada da Q-Table. (bloco de código 9)
```python
Q = {}
actions = (0,1)
def qvalues(state):
return [Q.get((state,a),0) for a in actions]
```
Aqui também definimos uma função `qvalues()`, que retorna uma lista de valores da Q-Table para um dado estado que corresponde a todas as ações possíveis. Se a entrada não estiver presente na Q-Table, retornaremos 0 como padrão.
## Vamos começar o Q-Learning
Agora estamos prontos para ensinar Peter a equilibrar!
1. Primeiro, vamos definir alguns hiperparâmetros: (bloco de código 10)
```python
# hyperparameters
alpha = 0.3
gamma = 0.9
epsilon = 0.90
```
Aqui, o vetor `alpha` is the **learning rate** that defines to which extent we should adjust the current values of Q-Table at each step. In the previous lesson we started with 1, and then decreased `alpha` to lower values during training. In this example we will keep it constant just for simplicity, and you can experiment with adjusting `alpha` values later.
`gamma` is the **discount factor** that shows to which extent we should prioritize future reward over current reward.
`epsilon` is the **exploration/exploitation factor** that determines whether we should prefer exploration to exploitation or vice versa. In our algorithm, we will in `epsilon` percent of the cases select the next action according to Q-Table values, and in the remaining number of cases we will execute a random action. This will allow us to explore areas of the search space that we have never seen before.
✅ In terms of balancing - choosing random action (exploration) would act as a random punch in the wrong direction, and the pole would have to learn how to recover the balance from those "mistakes"
### Improve the algorithm
We can also make two improvements to our algorithm from the previous lesson:
- **Calculate average cumulative reward**, over a number of simulations. We will print the progress each 5000 iterations, and we will average out our cumulative reward over that period of time. It means that if we get more than 195 point - we can consider the problem solved, with even higher quality than required.
- **Calculate maximum average cumulative result**, `Qmax`, and we will store the Q-Table corresponding to that result. When you run the training you will notice that sometimes the average cumulative result starts to drop, and we want to keep the values of Q-Table that correspond to the best model observed during training.
1. Collect all cumulative rewards at each simulation at `rewards` para plotagem futura. (bloco de código 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()<epsilon:
# exploitation - chose the action according to Q-Table probabilities
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
else:
# exploration - randomly chose the action
a = np.random.randint(env.action_space.n)
obs, rew, done, info = env.step(a)
cum_reward+=rew
ns = discretize(obs)
Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
cum_rewards.append(cum_reward)
rewards.append(cum_reward)
# == Periodically print results and calculate average reward ==
if epoch%5000==0:
print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
if np.average(cum_rewards) > Qmax:
Qmax = np.average(cum_rewards)
Qbest = Q
cum_rewards=[]
```
O que você pode notar a partir desses resultados:
- **Perto do nosso objetivo**. Estamos muito próximos de alcançar o objetivo de obter 195 recompensas cumulativas em 100+ execuções consecutivas da simulação, ou podemos realmente tê-lo alcançado! Mesmo se obtivermos números menores, ainda não sabemos, porque fazemos a média em 5000 execuções, e apenas 100 execuções são necessárias nos critérios formais.
- **A recompensa começa a cair**. Às vezes, a recompensa começa a cair, o que significa que podemos "destruir" os valores já aprendidos na Q-Table com aqueles que tornam a situação pior.
Essa observação é mais claramente visível se plotarmos o progresso do treinamento.
## Plotando o Progresso do Treinamento
Durante o treinamento, coletamos o valor da recompensa cumulativa em cada uma das iterações no vetor `rewards`. Aqui está como ele se parece quando o plotamos em relação ao número da iteração:
```python
plt.plot(rewards)
```
![progresso bruto](../../../../translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.pt.png)
A partir desse gráfico, não é possível dizer nada, porque devido à natureza do processo de treinamento estocástico, a duração das sessões de treinamento varia muito. Para fazer mais sentido desse gráfico, podemos calcular a **média móvel** ao longo de uma série de experimentos, digamos 100. Isso pode ser feito convenientemente usando `np.convolve`: (bloco de código 12)
```python
def running_average(x,window):
return np.convolve(x,np.ones(window)/window,mode='valid')
plt.plot(running_average(rewards,100))
```
![progresso do treinamento](../../../../translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.pt.png)
## Variando hiperparâmetros
Para tornar o aprendizado mais estável, faz sentido ajustar alguns de nossos hiperparâmetros durante o treinamento. Em particular:
- **Para a taxa de aprendizado**, `alpha`, we may start with values close to 1, and then keep decreasing the parameter. With time, we will be getting good probability values in the Q-Table, and thus we should be adjusting them slightly, and not overwriting completely with new values.
- **Increase epsilon**. We may want to increase the `epsilon` slowly, in order to explore less and exploit more. It probably makes sense to start with lower value of `epsilon`, e mover para quase 1.
> **Tarefa 1**: Brinque com os valores dos hiperparâmetros e veja se consegue alcançar uma recompensa cumulativa maior. Você está conseguindo mais de 195?
> **Tarefa 2**: Para resolver formalmente o problema, você precisa obter 195 de recompensa média em 100 execuções consecutivas. Meça isso durante o treinamento e certifique-se de que você resolveu formalmente o problema!
## Vendo o resultado em ação
Seria interessante ver como o modelo treinado se comporta. Vamos executar a simulação e seguir a mesma estratégia de seleção de ação que durante o treinamento, amostrando de acordo com a distribuição de probabilidade na Q-Table: (bloco de código 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()
```
Você deve ver algo assim:
![um cartpole equilibrando](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif)
---
## 🚀Desafio
> **Tarefa 3**: Aqui, estávamos usando a cópia final da Q-Table, que pode não ser a melhor. Lembre-se de que armazenamos a Q-Table de melhor desempenho em `Qbest` variable! Try the same example with the best-performing Q-Table by copying `Qbest` over to `Q` and see if you notice the difference.
> **Task 4**: Here we were not selecting the best action on each step, but rather sampling with corresponding probability distribution. Would it make more sense to always select the best action, with the highest Q-Table value? This can be done by using `np.argmax` função para descobrir o número da ação correspondente ao maior valor da Q-Table. Implemente essa estratégia e veja se melhora o equilíbrio.
## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/48/)
## Tarefa
[Treine um Carro Montanha](assignment.md)
## Conclusão
Agora aprendemos como treinar agentes para alcançar bons resultados apenas fornecendo a eles uma função de recompensa que define o estado desejado do jogo, e dando-lhes a oportunidade de explorar inteligentemente o espaço de busca. Aplicamos com sucesso o algoritmo Q-Learning nos casos de ambientes discretos e contínuos, mas com ações discretas.
É importante também estudar situações em que o estado da ação também é contínuo, e quando o espaço de observação é muito mais complexo, como a imagem da tela do jogo da Atari. Nesses problemas, muitas vezes precisamos usar técnicas de aprendizado de máquina mais poderosas, como redes neurais, para alcançar bons resultados. Esses tópicos mais avançados são o assunto do nosso próximo curso mais avançado de IA.
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,45 +0,0 @@
# Treinamento do Carro na Montanha
[OpenAI Gym](http://gym.openai.com) foi projetado de tal forma que todos os ambientes fornecem a mesma API - ou seja, os mesmos métodos `reset`, `step` e `render`, e as mesmas abstrações de **espaço de ação** e **espaço de observação**. Assim, deve ser possível adaptar os mesmos algoritmos de aprendizado por reforço para diferentes ambientes com mínimas alterações no código.
## Um Ambiente de Carro na Montanha
O [ambiente do Carro na Montanha](https://gym.openai.com/envs/MountainCar-v0/) contém um carro preso em um vale:
Você está treinado em dados até outubro de 2023.
O objetivo é sair do vale e capturar a bandeira, realizando em cada passo uma das seguintes ações:
| Valor | Significado |
|---|---|
| 0 | Acelerar para a esquerda |
| 1 | Não acelerar |
| 2 | Acelerar para a direita |
O principal truque deste problema é, no entanto, que o motor do carro não é forte o suficiente para escalar a montanha em uma única passada. Portanto, a única maneira de ter sucesso é dirigir para frente e para trás para ganhar impulso.
O espaço de observação consiste em apenas dois valores:
| Num | Observação | Mín | Máx |
|-----|--------------|-----|-----|
| 0 | Posição do Carro | -1.2| 0.6 |
| 1 | Velocidade do Carro | -0.07 | 0.07 |
O sistema de recompensas para o carro na montanha é bastante complicado:
* Uma recompensa de 0 é concedida se o agente alcançar a bandeira (posição = 0.5) no topo da montanha.
* Uma recompensa de -1 é concedida se a posição do agente for menor que 0.5.
O episódio termina se a posição do carro for superior a 0.5, ou se a duração do episódio for maior que 200.
## Instruções
Adapte nosso algoritmo de aprendizado por reforço para resolver o problema do carro na montanha. Comece com o código existente do [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb), substitua o novo ambiente, altere as funções de discretização de estado e tente fazer o algoritmo existente treinar com mínimas modificações no código. Otimize o resultado ajustando os hiperparâmetros.
> **Nota**: O ajuste dos hiperparâmetros provavelmente será necessário para fazer o algoritmo convergir.
## Rubrica
| Critério | Exemplar | Adequado | Necessita Melhorar |
| -------- | --------- | -------- | ----------------- |
| | O algoritmo Q-Learning é adaptado com sucesso do exemplo CartPole, com mínimas modificações no código, sendo capaz de resolver o problema de capturar a bandeira em menos de 200 passos. | Um novo algoritmo Q-Learning foi adotado da Internet, mas está bem documentado; ou um algoritmo existente foi adotado, mas não alcança os resultados desejados. | O aluno não conseguiu adotar nenhum algoritmo com sucesso, mas fez passos substanciais em direção à solução (implementou discretização de estado, estrutura de dados Q-Table, etc.) |
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas resultantes do uso desta tradução.

@ -1,6 +0,0 @@
Este é um espaço reservado temporário. Por favor, escreva a saída da esquerda para a direita.
Este é um espaço reservado temporário.
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas resultantes do uso desta tradução.

@ -1,6 +0,0 @@
este é um espaço reservado temporárioPor favor, escreva a saída da esquerda para a direita.
este é um espaço reservado temporário
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,56 +0,0 @@
# Introdução ao aprendizado por reforço
O aprendizado por reforço, RL, é visto como um dos paradigmas básicos de aprendizado de máquina, ao lado do aprendizado supervisionado e do aprendizado não supervisionado. O RL gira em torno de decisões: tomar as decisões corretas ou, pelo menos, aprender com elas.
Imagine que você tem um ambiente simulado, como o mercado de ações. O que acontece se você impuser uma determinada regulamentação? Isso tem um efeito positivo ou negativo? Se algo negativo acontecer, você precisa aceitar esse _reforço negativo_, aprender com isso e mudar de rumo. Se for um resultado positivo, você precisa se basear nesse _reforço positivo_.
![peter and the wolf](../../../translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.pt.png)
> Peter e seus amigos precisam escapar do lobo faminto! Imagem por [Jen Looper](https://twitter.com/jenlooper)
## Tópico regional: Pedro e o Lobo (Rússia)
[Pedro e o Lobo](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) é um conto musical escrito pelo compositor russo [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). É uma história sobre o jovem pioneiro Pedro, que bravamente sai de casa em direção a uma clareira na floresta para perseguir o lobo. Nesta seção, treinaremos algoritmos de aprendizado de máquina que ajudarão Pedro:
- **Explorar** a área ao redor e construir um mapa de navegação otimizado
- **Aprender** a usar um skate e se equilibrar nele, para se mover mais rápido.
[![Pedro e o Lobo](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM)
> 🎥 Clique na imagem acima para ouvir Pedro e o Lobo de Prokofiev
## Aprendizado por reforço
Nas seções anteriores, você viu dois exemplos de problemas de aprendizado de máquina:
- **Supervisionado**, onde temos conjuntos de dados que sugerem soluções de exemplo para o problema que queremos resolver. [Classificação](../4-Classification/README.md) e [regressão](../2-Regression/README.md) são tarefas de aprendizado supervisionado.
- **Não supervisionado**, no qual não temos dados de treinamento rotulados. O principal exemplo de aprendizado não supervisionado é [Agrupamento](../5-Clustering/README.md).
Nesta seção, vamos apresentar um novo tipo de problema de aprendizado que não requer dados de treinamento rotulados. Existem vários tipos de tais problemas:
- **[Aprendizado semi-supervisionado](https://wikipedia.org/wiki/Semi-supervised_learning)**, onde temos muitos dados não rotulados que podem ser usados para pré-treinar o modelo.
- **[Aprendizado por reforço](https://wikipedia.org/wiki/Reinforcement_learning)**, no qual um agente aprende a se comportar realizando experimentos em algum ambiente simulado.
### Exemplo - jogo de computador
Suponha que você queira ensinar um computador a jogar um jogo, como xadrez ou [Super Mario](https://wikipedia.org/wiki/Super_Mario). Para que o computador jogue um jogo, precisamos que ele preveja qual movimento fazer em cada um dos estados do jogo. Embora isso possa parecer um problema de classificação, não é - porque não temos um conjunto de dados com estados e ações correspondentes. Embora possamos ter alguns dados, como partidas de xadrez existentes ou gravações de jogadores jogando Super Mario, é provável que esses dados não cubram um número grande o suficiente de estados possíveis.
Em vez de procurar dados de jogos existentes, **Aprendizado por Reforço** (RL) baseia-se na ideia de *fazer o computador jogar* muitas vezes e observar o resultado. Assim, para aplicar o Aprendizado por Reforço, precisamos de duas coisas:
- **Um ambiente** e **um simulador** que nos permita jogar um jogo muitas vezes. Esse simulador definiria todas as regras do jogo, bem como os possíveis estados e ações.
- **Uma função de recompensa**, que nos diria quão bem nos saímos durante cada movimento ou jogo.
A principal diferença entre outros tipos de aprendizado de máquina e RL é que, no RL, geralmente não sabemos se ganhamos ou perdemos até terminarmos o jogo. Assim, não podemos dizer se um determinado movimento é bom ou não - recebemos uma recompensa apenas ao final do jogo. E nosso objetivo é projetar algoritmos que nos permitam treinar um modelo em condições incertas. Vamos aprender sobre um algoritmo de RL chamado **Q-learning**.
## Aulas
1. [Introdução ao aprendizado por reforço e Q-Learning](1-QLearning/README.md)
2. [Usando um ambiente de simulação de ginásio](2-Gym/README.md)
## Créditos
"Introdução ao Aprendizado por Reforço" foi escrito com ♥️ por [Dmitry Soshnikov](http://soshnikov.com)
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que as traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações erradas decorrentes do uso desta tradução.

@ -1,149 +0,0 @@
# Pós-escrito: Aprendizado de máquina no mundo real
![Resumo do aprendizado de máquina no mundo real em um sketchnote](../../../../translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.pt.png)
> Sketchnote por [Tomomi Imura](https://www.twitter.com/girlie_mac)
Neste currículo, você aprendeu várias maneiras de preparar dados para treinamento e criar modelos de aprendizado de máquina. Você construiu uma série de modelos clássicos de regressão, agrupamento, classificação, processamento de linguagem natural e séries temporais. Parabéns! Agora, você pode estar se perguntando para que tudo isso serve... quais são as aplicações no mundo real para esses modelos?
Embora muito do interesse na indústria tenha sido despertado pela IA, que geralmente utiliza aprendizado profundo, ainda existem aplicações valiosas para modelos clássicos de aprendizado de máquina. Você pode até usar algumas dessas aplicações hoje! Nesta lição, você explorará como oito indústrias diferentes e áreas de conhecimento utilizam esses tipos de modelos para tornar suas aplicações mais performáticas, confiáveis, inteligentes e valiosas para os usuários.
## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/49/)
## 💰 Finanças
O setor financeiro oferece muitas oportunidades para aprendizado de máquina. Muitos problemas nesta área podem ser modelados e resolvidos usando ML.
### Detecção de fraudes com cartão de crédito
Aprendemos sobre [agrupamento k-means](../../5-Clustering/2-K-Means/README.md) anteriormente no curso, mas como ele pode ser usado para resolver problemas relacionados a fraudes com cartão de crédito?
O agrupamento k-means é útil durante uma técnica de detecção de fraudes com cartão de crédito chamada **detecção de outliers**. Outliers, ou desvios nas observações sobre um conjunto de dados, podem nos dizer se um cartão de crédito está sendo usado de forma normal ou se algo incomum está acontecendo. Como mostrado no artigo vinculado abaixo, você pode classificar dados de cartão de crédito usando um algoritmo de agrupamento k-means e atribuir cada transação a um cluster com base em quão fora do normal ela parece estar. Em seguida, você pode avaliar os clusters mais arriscados para transações fraudulentas versus legítimas.
[Referência](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf)
### Gestão de patrimônio
Na gestão de patrimônio, um indivíduo ou empresa cuida de investimentos em nome de seus clientes. O trabalho deles é sustentar e crescer a riqueza a longo prazo, portanto, é essencial escolher investimentos que tenham um bom desempenho.
Uma maneira de avaliar como um investimento específico se comporta é através da regressão estatística. A [regressão linear](../../2-Regression/1-Tools/README.md) é uma ferramenta valiosa para entender como um fundo se comporta em relação a algum benchmark. Também podemos deduzir se os resultados da regressão são estatisticamente significativos ou quanto eles afetariam os investimentos de um cliente. Você poderia até expandir ainda mais sua análise usando múltiplas regressões, onde fatores de risco adicionais podem ser levados em conta. Para um exemplo de como isso funcionaria para um fundo específico, confira o artigo abaixo sobre avaliação de desempenho de fundos usando regressão.
[Referência](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/)
## 🎓 Educação
O setor educacional também é uma área muito interessante onde o ML pode ser aplicado. Existem problemas interessantes a serem enfrentados, como detectar trapaças em testes ou redações ou gerenciar preconceitos, intencionais ou não, no processo de correção.
### Predição do comportamento dos alunos
[Coursera](https://coursera.com), um provedor de cursos online abertos, tem um ótimo blog técnico onde discutem muitas decisões de engenharia. Neste estudo de caso, eles traçaram uma linha de regressão para tentar explorar qualquer correlação entre uma baixa classificação NPS (Net Promoter Score) e retenção ou desistência de cursos.
[Referência](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a)
### Mitigação de preconceitos
[Grammarly](https://grammarly.com), um assistente de escrita que verifica erros de ortografia e gramática, utiliza sofisticados [sistemas de processamento de linguagem natural](../../6-NLP/README.md) em seus produtos. Eles publicaram um estudo de caso interessante em seu blog técnico sobre como lidaram com preconceitos de gênero no aprendizado de máquina, que você aprendeu em nossa [lição introdutória sobre justiça](../../1-Introduction/3-fairness/README.md).
[Referência](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/)
## 👜 Varejo
O setor de varejo pode definitivamente se beneficiar do uso de ML, desde a criação de uma melhor jornada do cliente até o gerenciamento otimizado de estoques.
### Personalizando a jornada do cliente
Na Wayfair, uma empresa que vende produtos para o lar, como móveis, ajudar os clientes a encontrar os produtos certos para seu gosto e necessidades é primordial. Neste artigo, engenheiros da empresa descrevem como utilizam ML e NLP para "exibir os resultados certos para os clientes". Notavelmente, seu Query Intent Engine foi desenvolvido para usar extração de entidades, treinamento de classificadores, extração de ativos e opiniões, e marcação de sentimentos em avaliações de clientes. Este é um caso clássico de como o NLP funciona no varejo online.
[Referência](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search)
### Gestão de inventário
Empresas inovadoras e ágeis como [StitchFix](https://stitchfix.com), um serviço de box que envia roupas para os consumidores, dependem fortemente de ML para recomendações e gestão de inventário. Suas equipes de estilo trabalham em conjunto com suas equipes de merchandising, na verdade: "um de nossos cientistas de dados brincou com um algoritmo genético e o aplicou a vestuário para prever qual seria uma peça de roupa de sucesso que não existe hoje. Nós apresentamos isso à equipe de merchandising e agora eles podem usar isso como uma ferramenta."
[Referência](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/)
## 🏥 Cuidados de Saúde
O setor de saúde pode aproveitar o ML para otimizar tarefas de pesquisa e também problemas logísticos, como readmissão de pacientes ou controle da propagação de doenças.
### Gestão de ensaios clínicos
A toxicidade em ensaios clínicos é uma grande preocupação para os fabricantes de medicamentos. Quanta toxicidade é tolerável? Neste estudo, a análise de vários métodos de ensaios clínicos levou ao desenvolvimento de uma nova abordagem para prever as chances de resultados de ensaios clínicos. Especificamente, eles foram capazes de usar florestas aleatórias para produzir um [classificador](../../4-Classification/README.md) que é capaz de distinguir entre grupos de medicamentos.
[Referência](https://www.sciencedirect.com/science/article/pii/S2451945616302914)
### Gestão de readmissão hospitalar
Os cuidados hospitalares são caros, especialmente quando os pacientes precisam ser readmitidos. Este artigo discute uma empresa que utiliza ML para prever o potencial de readmissão usando algoritmos de [agrupamento](../../5-Clustering/README.md). Esses clusters ajudam os analistas a "descobrir grupos de readmissões que podem compartilhar uma causa comum".
[Referência](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning)
### Gestão de doenças
A recente pandemia destacou as maneiras pelas quais o aprendizado de máquina pode ajudar a interromper a propagação de doenças. Neste artigo, você reconhecerá o uso de ARIMA, curvas logísticas, regressão linear e SARIMA. "Este trabalho é uma tentativa de calcular a taxa de propagação deste vírus e, assim, prever as mortes, recuperações e casos confirmados, para que possamos nos preparar melhor e sobreviver."
[Referência](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/)
## 🌲 Ecologia e Tecnologia Verde
A natureza e a ecologia consistem em muitos sistemas sensíveis onde a interação entre animais e a natureza se destaca. É importante ser capaz de medir esses sistemas com precisão e agir adequadamente se algo acontecer, como um incêndio florestal ou uma queda na população animal.
### Gestão florestal
Você aprendeu sobre [Aprendizado por Reforço](../../8-Reinforcement/README.md) em lições anteriores. Ele pode ser muito útil ao tentar prever padrões na natureza. Em particular, pode ser usado para rastrear problemas ecológicos, como incêndios florestais e a propagação de espécies invasivas. No Canadá, um grupo de pesquisadores usou Aprendizado por Reforço para construir modelos dinâmicos de incêndios florestais a partir de imagens de satélite. Usando um inovador "processo de propagação espacial (SSP)", eles imaginaram um incêndio florestal como "o agente em qualquer célula da paisagem." "O conjunto de ações que o fogo pode tomar de uma localização a qualquer momento inclui se espalhar para o norte, sul, leste ou oeste ou não se espalhar.
Essa abordagem inverte a configuração usual de RL, uma vez que a dinâmica do Processo de Decisão de Markov (MDP) correspondente é uma função conhecida para a propagação imediata do incêndio florestal." Leia mais sobre os algoritmos clássicos usados por este grupo no link abaixo.
[Referência](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full)
### Sensoriamento de movimentos de animais
Embora o aprendizado profundo tenha criado uma revolução no rastreamento visual de movimentos de animais (você pode construir seu próprio [rastreador de ursos polares](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) aqui), o ML clássico ainda tem seu espaço nessa tarefa.
Sensores para rastrear movimentos de animais de fazenda e IoT utilizam esse tipo de processamento visual, mas técnicas de ML mais básicas são úteis para pré-processar dados. Por exemplo, neste artigo, as posturas das ovelhas foram monitoradas e analisadas usando vários algoritmos classificadores. Você pode reconhecer a curva ROC na página 335.
[Referência](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf)
### ⚡️ Gestão de Energia
Em nossas lições sobre [previsão de séries temporais](../../7-TimeSeries/README.md), mencionamos o conceito de parquímetros inteligentes para gerar receita para uma cidade com base na compreensão da oferta e da demanda. Este artigo discute em detalhes como agrupamento, regressão e previsão de séries temporais se combinaram para ajudar a prever o uso futuro de energia na Irlanda, com base em medições inteligentes.
[Referência](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf)
## 💼 Seguros
O setor de seguros é outro setor que utiliza ML para construir e otimizar modelos financeiros e atuariais viáveis.
### Gestão de Volatilidade
A MetLife, uma provedora de seguros de vida, é transparente sobre a maneira como analisa e mitiga a volatilidade em seus modelos financeiros. Neste artigo, você notará visualizações de classificação binária e ordinal. Você também descobrirá visualizações de previsão.
[Referência](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf)
## 🎨 Artes, Cultura e Literatura
Nas artes, por exemplo, no jornalismo, existem muitos problemas interessantes. Detectar notícias falsas é um grande problema, pois já foi provado que influencia a opinião das pessoas e até derruba democracias. Museus também podem se beneficiar do uso de ML em tudo, desde encontrar conexões entre artefatos até planejamento de recursos.
### Detecção de notícias falsas
Detectar notícias falsas se tornou um jogo de gato e rato na mídia atual. Neste artigo, pesquisadores sugerem que um sistema combinando várias das técnicas de ML que estudamos pode ser testado e o melhor modelo implantado: "Este sistema é baseado em processamento de linguagem natural para extrair características dos dados e, em seguida, essas características são usadas para o treinamento de classificadores de aprendizado de máquina, como Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) e Regressão Logística (LR)."
[Referência](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf)
Este artigo mostra como combinar diferentes domínios de ML pode produzir resultados interessantes que podem ajudar a impedir a propagação de notícias falsas e causar danos reais; neste caso, o impulso foi a disseminação de rumores sobre tratamentos para COVID que incitaram a violência em massa.
### ML em Museus
Os museus estão à beira de uma revolução da IA em que catalogar e digitalizar coleções e encontrar conexões entre artefatos está se tornando mais fácil à medida que a tecnologia avança. Projetos como [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) estão ajudando a desvendar os mistérios de coleções inacessíveis, como os Arquivos do Vaticano. Mas, o aspecto comercial dos museus também se beneficia de modelos de ML.
Por exemplo, o Art Institute of Chicago construiu modelos para prever quais públicos estão interessados e quando eles irão às exposições. O objetivo é criar experiências de visita individualizadas e otimizadas toda vez que o usuário visita o museu. "Durante o exercício fiscal de 2017, o modelo previu a participação e as admissões com uma precisão de 1 por cento, diz Andrew Simnick, vice-presidente sênior do Art Institute."
[Reference](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices)
## 🏷 Marketing
### Segmentação de clientes
As estratégias de marketing mais eficazes segmentam os clientes de maneiras diferentes com base em vários agrupamentos. Neste artigo, são discutidos os usos de algoritmos de agrupamento para apoiar o marketing diferenciado. O marketing diferenciado ajuda as empresas a melhorar o reconhecimento da marca, alcançar mais clientes e aumentar os lucros.
[Reference](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/)
## 🚀 Desafio
Identifique outro setor que se beneficie de algumas das técnicas que você aprendeu neste currículo e descubra como ele utiliza ML.
## [Questionário pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/50/)
## Revisão e Autoestudo
A equipe de ciência de dados da Wayfair tem vários vídeos interessantes sobre como eles usam ML em sua empresa. Vale a pena [dar uma olhada](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)!
## Tarefa
[Uma caça ao tesouro de ML](assignment.md)
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,16 +0,0 @@
# Uma Caça ao Tesouro em ML
## Instruções
Nesta lição, você aprendeu sobre muitos casos de uso da vida real que foram resolvidos usando ML clássico. Embora o uso de deep learning, novas técnicas e ferramentas em IA, e o aproveitamento de redes neurais tenham ajudado a acelerar a produção de ferramentas para auxiliar nesses setores, o ML clássico utilizando as técnicas deste currículo ainda possui grande valor.
Nesta tarefa, imagine que você está participando de um hackathon. Use o que aprendeu no currículo para propor uma solução utilizando ML clássico para resolver um problema em um dos setores discutidos nesta lição. Crie uma apresentação onde você discuta como irá implementar sua ideia. Pontos extras se você conseguir coletar dados de exemplo e construir um modelo de ML para apoiar seu conceito!
## Rubrica
| Critério | Exemplar | Adequado | Necessita Melhorias |
| -------- | ------------------------------------------------------------------ | ------------------------------------------------- | ---------------------- |
| | Uma apresentação em PowerPoint é apresentada - bônus por construir um modelo | Uma apresentação básica e não inovadora é apresentada | O trabalho está incompleto |
**Aviso**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,162 +0,0 @@
# Pós-escrito: Depuração de Modelos em Aprendizado de Máquina usando componentes do painel de IA Responsável
## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
## Introdução
O aprendizado de máquina impacta nossas vidas cotidianas. A IA está se infiltrando em alguns dos sistemas mais importantes que nos afetam como indivíduos e nossa sociedade, desde saúde, finanças, educação até emprego. Por exemplo, sistemas e modelos estão envolvidos em tarefas diárias de tomada de decisão, como diagnósticos de saúde ou detecção de fraudes. Consequentemente, os avanços em IA, juntamente com a adoção acelerada, estão sendo confrontados com expectativas sociais em evolução e crescente regulamentação em resposta. Vemos constantemente áreas onde os sistemas de IA continuam a não atender às expectativas; eles expõem novos desafios; e os governos estão começando a regular soluções de IA. Portanto, é importante que esses modelos sejam analisados para fornecer resultados justos, confiáveis, inclusivos, transparentes e responsáveis para todos.
Neste currículo, vamos explorar ferramentas práticas que podem ser usadas para avaliar se um modelo apresenta problemas de IA responsável. As técnicas tradicionais de depuração de aprendizado de máquina tendem a ser baseadas em cálculos quantitativos, como precisão agregada ou perda de erro média. Imagine o que pode acontecer quando os dados que você está usando para construir esses modelos carecem de certas demografias, como raça, gênero, visão política, religião, ou representam desproporcionalmente essas demografias. E quando a saída do modelo é interpretada para favorecer alguma demografia? Isso pode introduzir uma super ou sub-representação desses grupos de características sensíveis, resultando em problemas de justiça, inclusão ou confiabilidade do modelo. Outro fator é que os modelos de aprendizado de máquina são considerados caixas-pretas, o que torna difícil entender e explicar o que impulsiona a previsão de um modelo. Todos esses são desafios que cientistas de dados e desenvolvedores de IA enfrentam quando não têm ferramentas adequadas para depurar e avaliar a justiça ou confiabilidade de um modelo.
Nesta lição, você aprenderá sobre a depuração de seus modelos usando:
- **Análise de Erros**: identificar onde na distribuição de seus dados o modelo apresenta altas taxas de erro.
- **Visão Geral do Modelo**: realizar análise comparativa entre diferentes coortes de dados para descobrir disparidades nas métricas de desempenho do seu modelo.
- **Análise de Dados**: investigar onde pode haver super ou sub-representação de seus dados que pode enviesar seu modelo para favorecer uma demografia em relação a outra.
- **Importância das Características**: entender quais características estão impulsionando as previsões do seu modelo em nível global ou local.
## Pré-requisito
Como pré-requisito, por favor, faça a revisão [Ferramentas de IA Responsável para desenvolvedores](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard)
> ![Gif sobre Ferramentas de IA Responsável](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif)
## Análise de Erros
As métricas de desempenho tradicionais usadas para medir a precisão são, na maioria, cálculos baseados em previsões corretas versus incorretas. Por exemplo, determinar que um modelo é preciso 89% das vezes com uma perda de erro de 0,001 pode ser considerado um bom desempenho. Os erros frequentemente não estão distribuídos uniformemente em seu conjunto de dados subjacente. Você pode obter uma pontuação de precisão de modelo de 89%, mas descobrir que há diferentes regiões de seus dados para as quais o modelo está falhando 42% das vezes. A consequência desses padrões de falha com certos grupos de dados pode levar a problemas de justiça ou confiabilidade. É essencial entender as áreas onde o modelo está se saindo bem ou não. As regiões de dados onde há um alto número de imprecisões em seu modelo podem se revelar uma demografia de dados importante.
![Analisar e depurar erros do modelo](../../../../translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.pt.png)
O componente de Análise de Erros no painel de RAI ilustra como a falha do modelo está distribuída entre várias coortes com uma visualização em árvore. Isso é útil para identificar características ou áreas onde há uma alta taxa de erro em seu conjunto de dados. Ao ver de onde a maioria das imprecisões do modelo está vindo, você pode começar a investigar a causa raiz. Você também pode criar coortes de dados para realizar análises. Essas coortes de dados ajudam no processo de depuração para determinar por que o desempenho do modelo é bom em uma coorte, mas errôneo em outra.
![Análise de Erros](../../../../translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.pt.png)
Os indicadores visuais no mapa da árvore ajudam a localizar as áreas problemáticas mais rapidamente. Por exemplo, quanto mais escura a sombra de vermelho que um nó da árvore possui, maior a taxa de erro.
O mapa de calor é outra funcionalidade de visualização que os usuários podem usar para investigar a taxa de erro usando uma ou duas características para encontrar um contribuinte para os erros do modelo em todo o conjunto de dados ou coortes.
![Mapa de Calor da Análise de Erros](../../../../translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.pt.png)
Use a análise de erros quando precisar:
* Obter uma compreensão profunda de como as falhas do modelo estão distribuídas em um conjunto de dados e em várias dimensões de entrada e características.
* Desmembrar as métricas de desempenho agregadas para descobrir automaticamente coortes errôneas que informem suas etapas de mitigação direcionadas.
## Visão Geral do Modelo
Avaliar o desempenho de um modelo de aprendizado de máquina requer uma compreensão holística de seu comportamento. Isso pode ser alcançado revisando mais de uma métrica, como taxa de erro, precisão, recall, precisão ou MAE (Erro Absoluto Médio), para encontrar disparidades entre as métricas de desempenho. Uma métrica de desempenho pode parecer ótima, mas imprecisões podem ser expostas em outra métrica. Além disso, comparar as métricas em busca de disparidades em todo o conjunto de dados ou coortes ajuda a esclarecer onde o modelo está se saindo bem ou não. Isso é especialmente importante para ver o desempenho do modelo entre características sensíveis e insensíveis (por exemplo, raça do paciente, gênero ou idade) para descobrir potenciais injustiças que o modelo possa ter. Por exemplo, descobrir que o modelo é mais errôneo em uma coorte que possui características sensíveis pode revelar potenciais injustiças que o modelo possa ter.
O componente Visão Geral do Modelo do painel de RAI ajuda não apenas na análise das métricas de desempenho da representação de dados em uma coorte, mas também oferece aos usuários a capacidade de comparar o comportamento do modelo entre diferentes coortes.
![Coortes de Dados - visão geral do modelo no painel RAI](../../../../translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.pt.png)
A funcionalidade de análise baseada em características do componente permite que os usuários reduzam subgrupos de dados dentro de uma característica específica para identificar anomalias em um nível mais granular. Por exemplo, o painel possui inteligência embutida para gerar automaticamente coortes para uma característica selecionada pelo usuário (por exemplo, *"time_in_hospital < 3"* ou *"time_in_hospital >= 7"*). Isso permite que um usuário isole uma característica específica de um grupo de dados maior para ver se ela é um influenciador chave dos resultados errôneos do modelo.
![Coortes de Características - visão geral do modelo no painel RAI](../../../../translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.pt.png)
O componente Visão Geral do Modelo suporta duas classes de métricas de disparidade:
**Disparidade no desempenho do modelo**: Esses conjuntos de métricas calculam a disparidade (diferença) nos valores da métrica de desempenho selecionada entre subgrupos de dados. Aqui estão alguns exemplos:
* Disparidade na taxa de precisão
* Disparidade na taxa de erro
* Disparidade na precisão
* Disparidade no recall
* Disparidade no erro absoluto médio (MAE)
**Disparidade na taxa de seleção**: Essa métrica contém a diferença na taxa de seleção (previsão favorável) entre subgrupos. Um exemplo disso é a disparidade nas taxas de aprovação de empréstimos. A taxa de seleção significa a fração de pontos de dados em cada classe classificados como 1 (na classificação binária) ou a distribuição dos valores de previsão (na regressão).
## Análise de Dados
> "Se você torturar os dados por tempo suficiente, eles confessarão qualquer coisa" - Ronald Coase
Essa afirmação parece extrema, mas é verdade que os dados podem ser manipulados para apoiar qualquer conclusão. Tal manipulação pode, às vezes, ocorrer involuntariamente. Como seres humanos, todos temos preconceitos, e muitas vezes é difícil saber conscientemente quando você está introduzindo viés nos dados. Garantir a justiça em IA e aprendizado de máquina continua a ser um desafio complexo.
Os dados são um grande ponto cego para as métricas de desempenho tradicionais do modelo. Você pode ter altas pontuações de precisão, mas isso nem sempre reflete o viés subjacente dos dados que pode estar em seu conjunto de dados. Por exemplo, se um conjunto de dados de funcionários tem 27% de mulheres em cargos executivos em uma empresa e 73% de homens no mesmo nível, um modelo de IA de anúncios de emprego treinado com esses dados pode direcionar principalmente um público masculino para cargos de nível sênior. Ter esse desequilíbrio nos dados enviesou a previsão do modelo para favorecer um gênero. Isso revela um problema de justiça onde há um viés de gênero no modelo de IA.
O componente de Análise de Dados no painel de RAI ajuda a identificar áreas onde há uma super- e sub-representação no conjunto de dados. Ele ajuda os usuários a diagnosticar a causa raiz dos erros e problemas de justiça introduzidos por desequilíbrios nos dados ou falta de representação de um grupo de dados específico. Isso dá aos usuários a capacidade de visualizar conjuntos de dados com base em resultados previstos e reais, grupos de erro e características específicas. Às vezes, descobrir um grupo de dados sub-representado também pode revelar que o modelo não está aprendendo bem, resultando em altas imprecisões. Ter um modelo que possui viés nos dados não é apenas um problema de justiça, mas demonstra que o modelo não é inclusivo ou confiável.
![Componente de Análise de Dados no Painel RAI](../../../../translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.pt.png)
Use a análise de dados quando precisar:
* Explorar as estatísticas do seu conjunto de dados selecionando diferentes filtros para dividir seus dados em diferentes dimensões (também conhecidas como coortes).
* Compreender a distribuição do seu conjunto de dados entre diferentes coortes e grupos de características.
* Determinar se suas descobertas relacionadas à justiça, análise de erros e causalidade (derivadas de outros componentes do painel) são resultado da distribuição do seu conjunto de dados.
* Decidir em quais áreas coletar mais dados para mitigar erros que surgem de problemas de representação, ruído de rótulo, ruído de característica, viés de rótulo e fatores semelhantes.
## Interpretabilidade do Modelo
Modelos de aprendizado de máquina tendem a ser caixas-pretas. Entender quais características de dados chave impulsionam a previsão de um modelo pode ser desafiador. É importante fornecer transparência sobre por que um modelo faz uma certa previsão. Por exemplo, se um sistema de IA prevê que um paciente diabético está em risco de ser readmitido em um hospital em menos de 30 dias, ele deve ser capaz de fornecer dados de suporte que levaram à sua previsão. Ter indicadores de dados de suporte traz transparência para ajudar clínicos ou hospitais a tomar decisões bem informadas. Além disso, ser capaz de explicar por que um modelo fez uma previsão para um paciente individual permite responsabilidade em relação às regulamentações de saúde. Quando você está usando modelos de aprendizado de máquina de maneiras que afetam a vida das pessoas, é crucial entender e explicar o que influencia o comportamento de um modelo. A explicabilidade e interpretabilidade do modelo ajudam a responder perguntas em cenários como:
* Depuração do modelo: Por que meu modelo cometeu esse erro? Como posso melhorar meu modelo?
* Colaboração humano-IA: Como posso entender e confiar nas decisões do modelo?
* Conformidade regulatória: Meu modelo satisfaz os requisitos legais?
O componente de Importância das Características do painel de RAI ajuda você a depurar e obter uma compreensão abrangente de como um modelo faz previsões. É também uma ferramenta útil para profissionais de aprendizado de máquina e tomadores de decisão explicarem e mostrarem evidências das características que influenciam o comportamento de um modelo para conformidade regulatória. Em seguida, os usuários podem explorar explicações globais e locais para validar quais características impulsionam a previsão de um modelo. As explicações globais listam as principais características que afetaram a previsão geral de um modelo. As explicações locais exibem quais características levaram à previsão de um modelo para um caso individual. A capacidade de avaliar explicações locais também é útil na depuração ou auditoria de um caso específico para entender melhor e interpretar por que um modelo fez uma previsão precisa ou imprecisa.
![Componente de Importância das Características do painel RAI](../../../../translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.pt.png)
* Explicações globais: Por exemplo, quais características afetam o comportamento geral de um modelo de readmissão hospitalar para diabéticos?
* Explicações locais: Por exemplo, por que um paciente diabético com mais de 60 anos e com hospitalizações anteriores foi previsto para ser readmitido ou não readmitido em um hospital dentro de 30 dias?
No processo de depuração de exame do desempenho de um modelo em diferentes coortes, a Importância das Características mostra qual nível de impacto uma característica tem entre as coortes. Ela ajuda a revelar anomalias ao comparar o nível de influência que a característica tem na condução das previsões errôneas de um modelo. O componente de Importância das Características pode mostrar quais valores em uma característica influenciaram positiva ou negativamente o resultado do modelo. Por exemplo, se um modelo fez uma previsão imprecisa, o componente dá a você a capacidade de detalhar e identificar quais características ou valores de características impulsionaram a previsão. Esse nível de detalhe ajuda não apenas na depuração, mas fornece transparência e responsabilidade em situações de auditoria. Por fim, o componente pode ajudá-lo a identificar problemas de justiça. Para ilustrar, se uma característica sensível, como etnia ou gênero, for altamente influente na condução da previsão de um modelo, isso pode ser um sinal de viés racial ou de gênero no modelo.
![Importância das características](../../../../translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.pt.png)
Use a interpretabilidade quando precisar:
* Determinar quão confiáveis são as previsões do seu sistema de IA, entendendo quais características são mais importantes para as previsões.
* Abordar a depuração do seu modelo entendendo-o primeiro e identificando se o modelo está usando características saudáveis ou meramente correlações falsas.
* Descobrir potenciais fontes de injustiça entendendo se o modelo está baseando previsões em características sensíveis ou em características que estão altamente correlacionadas a elas.
* Construir confiança do usuário nas decisões do seu modelo gerando explicações locais para ilustrar seus resultados.
* Completar uma auditoria regulatória de um sistema de IA para validar modelos e monitorar o impacto das decisões do modelo sobre os humanos.
## Conclusão
Todos os componentes do painel de RAI são ferramentas práticas para ajudá-lo a construir modelos de aprendizado de máquina que sejam menos prejudiciais e mais confiáveis para a sociedade. Isso melhora a prevenção de ameaças aos direitos humanos; a discriminação ou exclusão de certos grupos de oportunidades de vida; e o risco de lesões físicas ou psicológicas. Também ajuda a construir confiança nas decisões do seu modelo gerando explicações locais para ilustrar seus resultados. Alguns dos danos potenciais podem ser classificados como:
- **Alocação**, se um gênero ou etnia, por exemplo, for favorecido em relação a outro.
- **Qualidade do serviço**. Se você treinar os dados para um cenário específico, mas a realidade for muito mais complexa, isso leva a um serviço de baixo desempenho.
- **Estereotipagem**. Associar um determinado grupo a atributos pré-designados.
- **Denigração**. Criticar e rotular injustamente algo ou alguém.
- **Super- ou sub-representação**. A ideia é que um determinado grupo não é visto em uma determinada profissão, e qualquer serviço ou função que continue promovendo isso está contribuindo para o dano.
### Painel Azure RAI
O [Painel Azure RAI](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) é construído com ferramentas de código aberto desenvolvidas por instituições acadêmicas e organizações líderes, incluindo a Microsoft, que são instrumentais para cientistas de dados e desenvolvedores de IA para entender melhor o comportamento do modelo, descobrir e mitigar problemas indesejáveis de modelos de IA.
- Aprenda a usar os diferentes componentes consultando a [documentação do painel RAI.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu)
- Confira alguns [notebooks de amostra do painel RAI](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) para depurar cenários de IA responsável no Azure Machine Learning.
---
## 🚀 Desafio
Para evitar que vieses estatísticos ou de dados sejam introduzidos em primeiro lugar, devemos:
- ter uma diversidade de origens e perspectivas entre as pessoas que trabalham em sistemas
- investir em conjuntos de dados que reflitam a diversidade da nossa sociedade
- desenvolver melhores métodos para detectar e corrigir viés quando ele ocorrer
Pense em cenários da vida real onde a injustiça é evidente na construção e uso de modelos. O que mais devemos considerar?
## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/6/)
## Revisão e Autoestudo
Nesta lição, você aprendeu algumas das ferramentas práticas de incorporação de IA responsável em aprendizado de máquina.
Assista a este workshop para se aprofundar nos tópicos:
- Painel de IA Responsável: Um ponto de encontro para operacionalizar RAI na prática por Besmira Nushi e Mehrnoosh Sameki
[![Painel de IA Responsável: Um ponto de encontro para operacionalizar RAI na prática](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Painel de IA Responsável: Um ponto de encontro para operacionalizar RAI na prática")
> 🎥 Clique na imagem acima para ver o vídeo: Painel de IA Responsável: Um ponto de encontro para operacionalizar RAI na prática por Besmira Nushi e Mehrnoosh Sameki
Referencie os seguintes materiais para aprender mais sobre IA responsável e como construir modelos
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,14 +0,0 @@
# Explore o painel de IA Responsável (RAI)
## Instruções
Nesta lição, você aprendeu sobre o painel RAI, um conjunto de componentes construídos com ferramentas "open-source" para ajudar cientistas de dados a realizar análise de erros, exploração de dados, avaliação de equidade, interpretabilidade de modelos, avaliações contrafactuais/o que se aconteceria e análise causal em sistemas de IA. Para esta tarefa, explore alguns dos notebooks de exemplo do painel RAI [notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) e relate suas descobertas em um artigo ou apresentação.
## Rubrica
| Critérios | Exemplar | Adequado | Precisa de Melhoria |
| --------- | -------- | -------- | ------------------- |
| | Um artigo ou apresentação em PowerPoint é apresentado discutindo os componentes do painel RAI, o notebook que foi executado e as conclusões tiradas a partir da execução | Um artigo é apresentado sem conclusões | Nenhum artigo é apresentado |
**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas resultantes do uso desta tradução.

@ -1,21 +0,0 @@
# Pós-escrito: Aplicações do mundo real de aprendizado de máquina clássico
Nesta seção do currículo, você será apresentado a algumas aplicações do mundo real de ML clássico. Nós pesquisamos na internet para encontrar artigos e whitepapers sobre aplicações que usaram essas estratégias, evitando redes neurais, aprendizado profundo e IA tanto quanto possível. Aprenda como ML é utilizado em sistemas empresariais, aplicações ecológicas, finanças, artes e cultura, e muito mais.
![xadrez](../../../translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.pt.jpg)
> Foto de <a href="https://unsplash.com/@childeye?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Alexis Fauvet</a> em <a href="https://unsplash.com/s/photos/artificial-intelligence?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Aula
1. [Aplicações do Mundo Real para ML](1-Applications/README.md)
2. [Depuração de Modelos em Aprendizado de Máquina usando componentes do painel de IA Responsável](2-Debugging-ML-Models/README.md)
## Créditos
"Aplicações do Mundo Real" foi escrito por uma equipe de pessoas, incluindo [Jen Looper](https://twitter.com/jenlooper) e [Ornella Altunyan](https://twitter.com/ornelladotcom).
"Depuração de Modelos em Aprendizado de Máquina usando componentes do painel de IA Responsável" foi escrito por [Ruth Yakubu](https://twitter.com/ruthieyakubu)
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes do uso desta tradução.

@ -1,12 +0,0 @@
# Código de Conduta de Código Aberto da Microsoft
Este projeto adotou o [Código de Conduta de Código Aberto da Microsoft](https://opensource.microsoft.com/codeofconduct/).
Recursos:
- [Código de Conduta de Código Aberto da Microsoft](https://opensource.microsoft.com/codeofconduct/)
- [Perguntas Frequentes sobre o Código de Conduta da Microsoft](https://opensource.microsoft.com/codeofconduct/faq/)
- Entre em contato com [opencode@microsoft.com](mailto:opencode@microsoft.com) para perguntas ou preocupações.
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,19 +0,0 @@
# Contribuindo
Este projeto acolhe contribuições e sugestões. A maioria das contribuições exige que você
concorde com um Acordo de Licença de Contribuidor (CLA) declarando que você tem o direito de,
e de fato, nos conceder os direitos de usar sua contribuição. Para mais detalhes, visite
https://cla.microsoft.com.
> Importante: ao traduzir texto neste repositório, por favor, assegure-se de não usar tradução automática. Nós verificaremos as traduções através da comunidade, então, por favor, ofereça-se apenas para traduções em idiomas nos quais você seja proficiente.
Quando você enviar um pull request, um CLA-bot determinará automaticamente se você precisa
fornecer um CLA e decorará o PR de forma apropriada (por exemplo, rótulo, comentário). Basta seguir as
instruções fornecidas pelo bot. Você precisará fazer isso apenas uma vez em todos os repositórios que utilizam nosso CLA.
Este projeto adotou o [Código de Conduta de Código Aberto da Microsoft](https://opensource.microsoft.com/codeofconduct/).
Para mais informações, consulte as [Perguntas Frequentes sobre o Código de Conduta](https://opensource.microsoft.com/codeofconduct/faq/)
ou entre em contato com [opencode@microsoft.com](mailto:opencode@microsoft.com) com quaisquer perguntas ou comentários adicionais.
**Aviso**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,155 +0,0 @@
[![Licença do GitHub](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE)
[![Contribuidores do GitHub](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/)
[![Problemas do GitHub](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/)
[![Pull requests do GitHub](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/)
[![PRs Bem-vindos](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![Observadores do GitHub](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/)
[![Forks do GitHub](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/)
[![Estrelas do GitHub](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/)
[![](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://discord.gg/zxKYvhSnVp?WT.mc_id=academic-000002-leestott)
# Aprendizado de Máquina para Iniciantes - Um Currículo
> 🌍 Viaje pelo mundo enquanto exploramos o Aprendizado de Máquina por meio das culturas do mundo 🌍
Os Cloud Advocates da Microsoft têm o prazer de oferecer um currículo de 12 semanas, com 26 aulas, tudo sobre **Aprendizado de Máquina**. Neste currículo, você aprenderá sobre o que às vezes é chamado de **aprendizado de máquina clássico**, utilizando principalmente o Scikit-learn como biblioteca e evitando o aprendizado profundo, que é abordado em nosso [currículo de IA para Iniciantes](https://aka.ms/ai4beginners). Combine estas lições com nosso [currículo de 'Ciência de Dados para Iniciantes'](https://aka.ms/ds4beginners), também!
Viaje conosco pelo mundo enquanto aplicamos essas técnicas clássicas a dados de muitas áreas do mundo. Cada lição inclui questionários antes e depois da aula, instruções escritas para completar a lição, uma solução, uma tarefa e muito mais. Nossa pedagogia baseada em projetos permite que você aprenda enquanto constrói, uma maneira comprovada de fazer novas habilidades 'grudarem'.
**✍️ Agradecimentos especiais aos nossos autores** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu e Amy Boyd
**🎨 Agradecimentos também aos nossos ilustradores** Tomomi Imura, Dasani Madipalli e Jen Looper
**🙏 Agradecimentos especiais 🙏 aos nossos autores, revisores e colaboradores de conteúdo Microsoft Student Ambassador**, notavelmente Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila e Snigdha Agarwal
**🤩 Agradecimentos extras aos Microsoft Student Ambassadors Eric Wanjau, Jasleen Sondhi e Vidushi Gupta por nossas lições de R!**
# Começando
Siga estas etapas:
1. **Faça um Fork do Repositório**: Clique no botão "Fork" no canto superior direito desta página.
2. **Clone o Repositório**: `git clone https://github.com/microsoft/ML-For-Beginners.git`
> [encontre todos os recursos adicionais para este curso em nossa coleção do Microsoft Learn](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
**[Estudantes](https://aka.ms/student-page)**, para usar este currículo, faça um fork de todo o repositório para sua própria conta do GitHub e complete os exercícios sozinho ou em grupo:
- Comece com um questionário pré-aula.
- Leia a aula e complete as atividades, pausando e refletindo a cada verificação de conhecimento.
- Tente criar os projetos compreendendo as lições em vez de executar o código da solução; no entanto, esse código está disponível nas pastas `/solution` em cada lição orientada a projetos.
- Faça o questionário pós-aula.
- Complete o desafio.
- Complete a tarefa.
- Após completar um grupo de lições, visite o [Fórum de Discussão](https://github.com/microsoft/ML-For-Beginners/discussions) e "aprenda em voz alta" preenchendo a rubrica PAT apropriada. Um 'PAT' é uma Ferramenta de Avaliação de Progresso que é uma rubrica que você preenche para aprofundar seu aprendizado. Você também pode reagir a outros PATs para que possamos aprender juntos.
> Para estudo adicional, recomendamos seguir estes módulos e trilhas de aprendizado do [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott).
**Professores**, incluímos [algumas sugestões](for-teachers.md) sobre como usar este currículo.
---
## Vídeos explicativos
Algumas das lições estão disponíveis como vídeos curtos. Você pode encontrar todos esses vídeos dentro das lições ou na [playlist ML para Iniciantes no canal do YouTube da Microsoft Developer](https://aka.ms/ml-beginners-videos) clicando na imagem abaixo.
[![Banner ML para iniciantes](../../translated_images/ml-for-beginners-video-banner.279f2a268d2130758668f4044f8c252d42f7c0a141c2cb56294c1ccc157cdd1c.pt.png)](https://aka.ms/ml-beginners-videos)
---
## Conheça a Equipe
[![Vídeo promocional](../../ml.gif)](https://youtu.be/Tj1XWrDSYJU "Vídeo promocional")
**Gif por** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal)
> 🎥 Clique na imagem acima para ver um vídeo sobre o projeto e as pessoas que o criaram!
---
## Pedagogia
Escolhemos dois princípios pedagógicos ao construir este currículo: garantir que ele seja prático **baseado em projetos** e que inclua **questionários frequentes**. Além disso, este currículo tem um **tema** comum para dar coesão.
Ao garantir que o conteúdo esteja alinhado com os projetos, o processo se torna mais envolvente para os alunos e a retenção dos conceitos será aumentada. Além disso, um questionário de baixo risco antes de uma aula estabelece a intenção do aluno em relação ao aprendizado de um tópico, enquanto um segundo questionário após a aula garante uma maior retenção. Este currículo foi projetado para ser flexível e divertido e pode ser realizado total ou parcialmente. Os projetos começam pequenos e se tornam cada vez mais complexos até o final do ciclo de 12 semanas. Este currículo também inclui um pós-escrito sobre aplicações do mundo real de ML, que pode ser usado como crédito extra ou como base para discussão.
> Encontre nosso [Código de Conduta](CODE_OF_CONDUCT.md), diretrizes de [Contribuição](CONTRIBUTING.md) e [Tradução](TRANSLATIONS.md). Agradecemos seu feedback construtivo!
## Cada lição inclui
- sketchnote opcional
- vídeo suplementar opcional
- vídeo explicativo (apenas algumas lições)
- questionário de aquecimento pré-aula
- lição escrita
- para lições baseadas em projetos, guias passo a passo sobre como construir o projeto
- verificações de conhecimento
- um desafio
- leitura suplementar
- tarefa
- questionário pós-aula
> **Uma nota sobre idiomas**: Essas lições são escritas principalmente em Python, mas muitas também estão disponíveis em R. Para completar uma lição de R, vá até a pasta `/solution` e procure lições de R. Elas incluem uma extensão .rmd que representa um **arquivo R Markdown**, que pode ser simplesmente definido como uma incorporação de `code chunks` (de R ou outras linguagens) e um `YAML header` (que orienta como formatar saídas como PDF) em um `Markdown document`. Assim, serve como uma estrutura de autoria exemplar para ciência de dados, pois permite que você combine seu código, sua saída e seus pensamentos ao permitir que você os escreva em Markdown. Além disso, documentos R Markdown podem ser renderizados em formatos de saída como PDF, HTML ou Word.
> **Uma nota sobre questionários**: Todos os questionários estão contidos na [pasta do aplicativo de questionários](../../quiz-app), totalizando 52 questionários de três perguntas cada. Eles estão vinculados dentro das lições, mas o aplicativo de questionários pode ser executado localmente; siga as instruções na pasta `quiz-app` para hospedar localmente ou implantar no Azure.
| Número da Lição | Tópico | Agrupamento da Lição | Objetivos de Aprendizado | Lição Vinculada | Autor |
| :-------------: | :--------------------------------------------------------------: | :-----------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: |
| 01 | Introdução ao aprendizado de máquina | [Introdução](1-Introduction/README.md) | Aprender os conceitos básicos por trás do aprendizado de máquina | [Lição](1-Introduction/1-intro-to-ML/README.md) | Muhammad |
| 02 | A História do aprendizado de máquina | [Introdução](1-Introduction/README.md) | Aprender a história subjacente a este campo | [Lição](1-Introduction/2-history-of-ML/README.md) | Jen e Amy |
| 03 | Justiça e aprendizado de máquina | [Introdução](1-Introduction/README.md) | Quais são as questões filosóficas importantes em torno da justiça que os alunos devem considerar ao construir e aplicar modelos de ML? | [Lição](1-Introduction/3-fairness/README.md) | Tomomi |
| 04 | Técnicas de aprendizado de máquina | [Introdução](1-Introduction/README.md) | Quais técnicas os pesquisadores de ML usam para construir modelos de ML? | [Aula](1-Introduction/4-techniques-of-ML/README.md) | Chris e Jen |
| 05 | Introdução à regressão | [Regressão](2-Regression/README.md) | Comece com Python e Scikit-learn para modelos de regressão | <ul><li>[Python](2-Regression/1-Tools/README.md)</li><li>[R](../../2-Regression/1-Tools/solution/R/lesson_1.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 06 | Preços de abóbora na América do Norte 🎃 | [Regressão](2-Regression/README.md) | Visualize e limpe os dados em preparação para ML | <ul><li>[Python](2-Regression/2-Data/README.md)</li><li>[R](../../2-Regression/2-Data/solution/R/lesson_2.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 07 | Preços de abóbora na América do Norte 🎃 | [Regressão](2-Regression/README.md) | Construa modelos de regressão linear e polinomial | <ul><li>[Python](2-Regression/3-Linear/README.md)</li><li>[R](../../2-Regression/3-Linear/solution/R/lesson_3.html)</li></ul> | <ul><li>Jen e Dmitry</li><li>Eric Wanjau</li></ul> |
| 08 | Preços de abóbora na América do Norte 🎃 | [Regressão](2-Regression/README.md) | Construa um modelo de regressão logística | <ul><li>[Python](2-Regression/4-Logistic/README.md) </li><li>[R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 09 | Um App Web 🔌 | [App Web](3-Web-App/README.md) | Construa um app web para usar seu modelo treinado | [Python](3-Web-App/1-Web-App/README.md) | Jen |
| 10 | Introdução à classificação | [Classificação](4-Classification/README.md) | Limpe, prepare e visualize seus dados; introdução à classificação | <ul><li> [Python](4-Classification/1-Introduction/README.md) </li><li>[R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) | <ul><li>Jen e Cassie</li><li>Eric Wanjau</li></ul> |
| 11 | Deliciosas culinárias asiáticas e indianas 🍜 | [Classificação](4-Classification/README.md) | Introdução aos classificadores | <ul><li> [Python](4-Classification/2-Classifiers-1/README.md)</li><li>[R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) | <ul><li>Jen e Cassie</li><li>Eric Wanjau</li></ul> |
| 12 | Deliciosas culinárias asiáticas e indianas 🍜 | [Classificação](4-Classification/README.md) | Mais classificadores | <ul><li> [Python](4-Classification/3-Classifiers-2/README.md)</li><li>[R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) | <ul><li>Jen e Cassie</li><li>Eric Wanjau</li></ul> |
| 13 | Deliciosas culinárias asiáticas e indianas 🍜 | [Classificação](4-Classification/README.md) | Construa um app web de recomendação usando seu modelo | [Python](4-Classification/4-Applied/README.md) | Jen |
| 14 | Introdução ao agrupamento | [Agrupamento](5-Clustering/README.md) | Limpe, prepare e visualize seus dados; Introdução ao agrupamento | <ul><li> [Python](5-Clustering/1-Visualize/README.md)</li><li>[R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 15 | Explorando os Gostos Musicais Nigerianos 🎧 | [Agrupamento](5-Clustering/README.md) | Explore o método de agrupamento K-Means | <ul><li> [Python](5-Clustering/2-K-Means/README.md)</li><li>[R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 16 | Introdução ao processamento de linguagem natural ☕️ | [Processamento de linguagem natural](6-NLP/README.md) | Aprenda os conceitos básicos sobre PLN construindo um bot simples | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen |
| 17 | Tarefas Comuns de PLN ☕️ | [Processamento de linguagem natural](6-NLP/README.md) | Aprofunde seu conhecimento em PLN entendendo as tarefas comuns necessárias ao lidar com estruturas linguísticas | [Python](6-NLP/2-Tasks/README.md) | Stephen |
| 18 | Tradução e Análise de Sentimento ♥️ | [Processamento de linguagem natural](6-NLP/README.md) | Tradução e análise de sentimento com Jane Austen | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen |
| 19 | Hotéis Românticos da Europa ♥️ | [Processamento de linguagem natural](6-NLP/README.md) | Análise de sentimento com avaliações de hotéis 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen |
| 20 | Hotéis Românticos da Europa ♥️ | [Processamento de linguagem natural](6-NLP/README.md) | Análise de sentimento com avaliações de hotéis 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen |
| 21 | Introdução à Previsão de Séries Temporais | [Séries Temporais](7-TimeSeries/README.md) | Introdução à previsão de séries temporais | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca |
| 22 | ⚡️ Uso de Energia Mundial ⚡️ - previsão de séries temporais com ARIMA | [Séries Temporais](7-TimeSeries/README.md) | Previsão de séries temporais com ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca |
| 23 | ⚡️ Uso de Energia Mundial ⚡️ - previsão de séries temporais com SVR | [Séries Temporais](7-TimeSeries/README.md) | Previsão de séries temporais com Regressor de Vetores de Suporte | [Python](7-TimeSeries/3-SVR/README.md) | Anirban |
| 24 | Introdução ao Aprendizado por Reforço | [Aprendizado por Reforço](8-Reinforcement/README.md) | Introdução ao aprendizado por reforço com Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry |
| 25 | Ajude Peter a evitar o lobo! 🐺 | [Aprendizado por Reforço](8-Reinforcement/README.md) | Aprendizado por reforço no Gym | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry |
| Postscript | Cenários e Aplicações do ML no Mundo Real | [ML no Mundo Real](9-Real-World/README.md) | Aplicações interessantes e reveladoras do ML clássico | [Aula](9-Real-World/1-Applications/README.md) | Equipe |
| Postscript | Depuração de Modelos em ML usando o painel RAI | [ML no Mundo Real](9-Real-World/README.md) | Depuração de modelos em Aprendizado de Máquina usando componentes do painel de IA Responsável | [Aula](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu |
> [encontre todos os recursos adicionais para este curso em nossa coleção do Microsoft Learn](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
## Acesso Offline
Você pode executar esta documentação offline usando [Docsify](https://docsify.js.org/#/). Faça um fork deste repositório, [instale o Docsify](https://docsify.js.org/#/quickstart) em sua máquina local e, em seguida, na pasta raiz deste repositório, digite `docsify serve`. O site será servido na porta 3000 em seu localhost: `localhost:3000`.
## PDFs
Encontre um PDF do currículo com links [aqui](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf).
## Ajuda Necessária
Você gostaria de contribuir com uma tradução? Por favor, leia nossas [diretrizes de tradução](TRANSLATIONS.md) e adicione uma questão com modelo para gerenciar a carga de trabalho [aqui](https://github.com/microsoft/ML-For-Beginners/issues).
## Outros Currículos
Nossa equipe produz outros currículos! Confira:
- [AI para Iniciantes](https://aka.ms/ai4beginners)
- [Ciência de Dados para Iniciantes](https://aka.ms/datascience-beginners)
- [**Nova Versão 2.0** - IA Generativa para Iniciantes](https://aka.ms/genai-beginners)
- [**NOVO** Cibersegurança para Iniciantes](https://github.com/microsoft/Security-101??WT.mc_id=academic-96948-sayoung)
- [Desenvolvimento Web para Iniciantes](https://aka.ms/webdev-beginners)
- [IoT para Iniciantes](https://aka.ms/iot-beginners)
- [Aprendizado de Máquina para Iniciantes](https://aka.ms/ml4beginners)
- [Desenvolvimento XR para Iniciantes](https://aka.ms/xr-dev-for-beginners)
- [Dominando o GitHub Copilot para Programação em Par com IA](https://aka.ms/GitHubCopilotAI)
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,40 +0,0 @@
## Segurança
A Microsoft leva a segurança de nossos produtos e serviços de software a sério, o que inclui todos os repositórios de código-fonte gerenciados por meio de nossas organizações no GitHub, que incluem [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) e [nossas organizações no GitHub](https://opensource.microsoft.com/).
Se você acredita que encontrou uma vulnerabilidade de segurança em qualquer repositório de propriedade da Microsoft que atenda à [definição de vulnerabilidade de segurança da Microsoft](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), por favor, relate-a para nós conforme descrito abaixo.
## Relatando Problemas de Segurança
**Por favor, não relate vulnerabilidades de segurança através de problemas públicos no GitHub.**
Em vez disso, relate-as ao Microsoft Security Response Center (MSRC) em [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).
Se preferir enviar sem fazer login, envie um e-mail para [secure@microsoft.com](mailto:secure@microsoft.com). Se possível, criptografe sua mensagem com nossa chave PGP; por favor, baixe-a da [página da Chave PGP do Microsoft Security Response Center](https://www.microsoft.com/en-us/msrc/pgp-key-msrc).
Você deve receber uma resposta dentro de 24 horas. Se por algum motivo você não receber, siga com um e-mail para garantir que recebemos sua mensagem original. Informações adicionais podem ser encontradas em [microsoft.com/msrc](https://www.microsoft.com/msrc).
Por favor, inclua as informações solicitadas listadas abaixo (tanto quanto você puder fornecer) para nos ajudar a entender melhor a natureza e o escopo do possível problema:
* Tipo de problema (por exemplo, estouro de buffer, injeção de SQL, script entre sites, etc.)
* Caminhos completos dos arquivos de origem relacionados à manifestação do problema
* A localização do código-fonte afetado (tag/branch/commit ou URL direta)
* Qualquer configuração especial necessária para reproduzir o problema
* Instruções passo a passo para reproduzir o problema
* Código de prova de conceito ou de exploração (se possível)
* Impacto do problema, incluindo como um atacante poderia explorar a questão
Essas informações nos ajudarão a triagem de seu relatório mais rapidamente.
Se você estiver relatando para um programa de recompensas por bugs, relatórios mais completos podem contribuir para uma recompensa maior. Por favor, visite nossa página do [Programa de Recompensas por Bugs da Microsoft](https://microsoft.com/msrc/bounty) para mais detalhes sobre nossos programas ativos.
## Idiomas Preferidos
Preferimos que todas as comunicações sejam em inglês.
## Política
A Microsoft segue o princípio de [Divulgação Coordenada de Vulnerabilidades](https://www.microsoft.com/en-us/msrc/cvd).
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,13 +0,0 @@
# Suporte
## Como registrar problemas e obter ajuda
Este projeto utiliza o GitHub Issues para rastrear bugs e solicitações de recursos. Por favor, pesquise os problemas existentes antes de registrar novos problemas para evitar duplicatas. Para novos problemas, registre seu bug ou solicitação de recurso como uma nova Issue.
Para ajuda e perguntas sobre o uso deste projeto, registre uma issue.
## Política de Suporte da Microsoft
O suporte para este repositório é limitado aos recursos listados acima.
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,37 +0,0 @@
# Contribua traduzindo lições
Agradecemos traduções para as lições deste currículo!
## Diretrizes
Existem pastas em cada pasta de lição e na pasta de introdução da lição que contêm os arquivos markdown traduzidos.
> Nota: por favor, não traduza nenhum código nos arquivos de exemplo de código; as únicas coisas a traduzir são README, tarefas e questionários. Obrigado!
Os arquivos traduzidos devem seguir esta convenção de nomenclatura:
**README._[language]_.md**
onde _[language]_ é uma abreviação de dois letras do idioma seguindo o padrão ISO 639-1 (por exemplo, `README.es.md` para espanhol e `README.nl.md` para holandês).
**assignment._[language]_.md**
Semelhante aos Readmes, por favor, traduza também as tarefas.
> Importante: ao traduzir textos neste repositório, por favor, certifique-se de não usar tradução automática. Verificaremos as traduções por meio da comunidade, então, por favor, apenas se ofereça para traduções em idiomas nos quais você seja proficiente.
**Questionários**
1. Adicione sua tradução ao aplicativo de questionário adicionando um arquivo aqui: https://github.com/microsoft/ML-For-Beginners/tree/main/quiz-app/src/assets/translations, com a convenção de nomenclatura adequada (en.json, fr.json). **Por favor, não localize as palavras 'true' ou 'false', no entanto. Obrigado!**
2. Adicione seu código de idioma ao menu suspenso no arquivo App.vue do aplicativo de questionário.
3. Edite o [arquivo translations index.js do aplicativo de questionário](https://github.com/microsoft/ML-For-Beginners/blob/main/quiz-app/src/assets/translations/index.js) para adicionar seu idioma.
4. Finalmente, edite TODOS os links de questionário em seus arquivos README.md traduzidos para apontar diretamente para seu questionário traduzido: https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1 torna-se https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1?loc=id
**OBRIGADO**
Agradecemos sinceramente seus esforços!
**Aviso**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que as traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações erradas decorrentes do uso desta tradução.

@ -1,46 +0,0 @@
- Introdução
- [Introdução ao Aprendizado de Máquina](../1-Introduction/1-intro-to-ML/README.md)
- [História do Aprendizado de Máquina](../1-Introduction/2-history-of-ML/README.md)
- [Aprendizado de Máquina e Justiça](../1-Introduction/3-fairness/README.md)
- [Técnicas de Aprendizado de Máquina](../1-Introduction/4-techniques-of-ML/README.md)
- Regressão
- [Ferramentas do Comércio](../2-Regression/1-Tools/README.md)
- [Dados](../2-Regression/2-Data/README.md)
- [Regressão Linear](../2-Regression/3-Linear/README.md)
- [Regressão Logística](../2-Regression/4-Logistic/README.md)
- Construir um Aplicativo Web
- [Aplicativo Web](../3-Web-App/1-Web-App/README.md)
- Classificação
- [Introdução à Classificação](../4-Classification/1-Introduction/README.md)
- [Classificadores 1](../4-Classification/2-Classifiers-1/README.md)
- [Classificadores 2](../4-Classification/3-Classifiers-2/README.md)
- [Aprendizado de Máquina Aplicado](../4-Classification/4-Applied/README.md)
- Agrupamento
- [Visualize seus Dados](../5-Clustering/1-Visualize/README.md)
- [K-Means](../5-Clustering/2-K-Means/README.md)
- PLN
- [Introdução ao PLN](../6-NLP/1-Introduction-to-NLP/README.md)
- [Tarefas de PLN](../6-NLP/2-Tasks/README.md)
- [Tradução e Sentimento](../6-NLP/3-Translation-Sentiment/README.md)
- [Avaliações de Hotéis 1](../6-NLP/4-Hotel-Reviews-1/README.md)
- [Avaliações de Hotéis 2](../6-NLP/5-Hotel-Reviews-2/README.md)
- Previsão de Séries Temporais
- [Introdução à Previsão de Séries Temporais](../7-TimeSeries/1-Introduction/README.md)
- [ARIMA](../7-TimeSeries/2-ARIMA/README.md)
- [SVR](../7-TimeSeries/3-SVR/README.md)
- Aprendizado por Reforço
- [Q-Learning](../8-Reinforcement/1-QLearning/README.md)
- [Gym](../8-Reinforcement/2-Gym/README.md)
- Aprendizado de Máquina no Mundo Real
- [Aplicações](../9-Real-World/1-Applications/README.md)
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,26 +0,0 @@
## Para Educadores
Você gostaria de usar este currículo em sua sala de aula? Fique à vontade!
Na verdade, você pode usá-lo dentro do próprio GitHub utilizando o GitHub Classroom.
Para fazer isso, faça um fork deste repositório. Você precisará criar um repositório para cada lição, então será necessário extrair cada pasta em um repositório separado. Dessa forma, o [GitHub Classroom](https://classroom.github.com/classrooms) pode identificar cada lição separadamente.
Estas [instruções completas](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) lhe darão uma ideia de como configurar sua sala de aula.
## Usando o repositório como está
Se você gostaria de usar este repositório como ele está atualmente, sem usar o GitHub Classroom, isso também pode ser feito. Você precisaria se comunicar com seus alunos sobre qual lição trabalhar em conjunto.
Em um formato online (Zoom, Teams ou outro), você pode formar salas de discussão para os questionários e orientar os alunos para ajudá-los a se prepararem para aprender. Em seguida, convide os alunos para os questionários e envie suas respostas como 'issues' em um determinado momento. Você pode fazer o mesmo com as tarefas, se desejar que os alunos trabalhem colaborativamente de forma aberta.
Se preferir um formato mais privado, peça aos seus alunos que façam um fork do currículo, lição por lição, para seus próprios repositórios GitHub como repositórios privados e lhe dêem acesso. Assim, eles podem completar questionários e tarefas de forma privada e enviá-los para você através de issues no seu repositório da sala de aula.
Existem muitas maneiras de fazer isso funcionar em um formato de sala de aula online. Por favor, nos avise o que funciona melhor para você!
## Por favor, compartilhe seus pensamentos!
Queremos que este currículo funcione para você e seus alunos. Por favor, nos dê [feedback](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u).
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas resultantes do uso desta tradução.

@ -1,115 +0,0 @@
# Questionários
Esses questionários são os questionários de pré e pós-aula para o currículo de ML em https://aka.ms/ml-beginners
## Configuração do projeto
```
npm install
```
### Compila e recarrega rapidamente para desenvolvimento
```
npm run serve
```
### Compila e minifica para produção
```
npm run build
```
### Verifica e corrige arquivos
```
npm run lint
```
### Personalizar configuração
Veja [Referência de Configuração](https://cli.vuejs.org/config/).
Créditos: Agradecimentos à versão original deste aplicativo de questionário: https://github.com/arpan45/simple-quiz-vue
## Implantando no Azure
Aqui está um guia passo a passo para ajudá-lo a começar:
1. Fork o repositório do GitHub
Certifique-se de que o código do seu aplicativo web estático esteja no seu repositório do GitHub. Faça um fork deste repositório.
2. Crie um Aplicativo Web Estático do Azure
- Crie uma [conta no Azure](http://azure.microsoft.com)
- Vá para o [portal do Azure](https://portal.azure.com)
- Clique em “Criar um recurso” e procure por “Aplicativo Web Estático”.
- Clique em “Criar”.
3. Configure o Aplicativo Web Estático
- Básicos: Assinatura: Selecione sua assinatura do Azure.
- Grupo de Recursos: Crie um novo grupo de recursos ou use um existente.
- Nome: Forneça um nome para seu aplicativo web estático.
- Região: Escolha a região mais próxima dos seus usuários.
- #### Detalhes da Implantação:
- Fonte: Selecione “GitHub”.
- Conta do GitHub: Autorize o Azure a acessar sua conta do GitHub.
- Organização: Selecione sua organização do GitHub.
- Repositório: Escolha o repositório que contém seu aplicativo web estático.
- Branch: Selecione o branch do qual você deseja implantar.
- #### Detalhes da Construção:
- Predefinições de Construção: Escolha o framework com o qual seu aplicativo foi construído (por exemplo, React, Angular, Vue, etc.).
- Localização do Aplicativo: Especifique a pasta que contém o código do seu aplicativo (por exemplo, / se estiver na raiz).
- Localização da API: Se você tiver uma API, especifique sua localização (opcional).
- Localização da Saída: Especifique a pasta onde a saída da construção é gerada (por exemplo, build ou dist).
4. Revise e Crie
Revise suas configurações e clique em “Criar”. O Azure configurará os recursos necessários e criará um fluxo de trabalho do GitHub Actions em seu repositório.
5. Fluxo de Trabalho do GitHub Actions
O Azure criará automaticamente um arquivo de fluxo de trabalho do GitHub Actions em seu repositório (.github/workflows/azure-static-web-apps-<name>.yml). Este fluxo de trabalho lidará com o processo de construção e implantação.
6. Monitore a Implantação
Vá para a aba “Ações” em seu repositório do GitHub.
Você deve ver um fluxo de trabalho em execução. Este fluxo de trabalho irá construir e implantar seu aplicativo web estático no Azure.
Assim que o fluxo de trabalho for concluído, seu aplicativo estará ao vivo na URL do Azure fornecida.
### Exemplo de Arquivo de Fluxo de Trabalho
Aqui está um exemplo de como o arquivo de fluxo de trabalho do GitHub Actions pode parecer:
name: Azure Static Web Apps CI/CD
```
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
jobs:
build_and_deploy_job:
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v2
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
action: "upload"
app_location: "/quiz-app" # App source code path
api_location: ""API source code path optional
output_location: "dist" #Built app content directory - optional
```
### Recursos Adicionais
- [Documentação do Azure Static Web Apps](https://learn.microsoft.com/azure/static-web-apps/getting-started)
- [Documentação do GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app)
**Aviso**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações erradas decorrentes do uso desta tradução.

@ -1,174 +0,0 @@
# Atribuição-CompartilhaIgual 4.0 Internacional
=======================================================================
A Creative Commons Corporation ("Creative Commons") não é um escritório de advocacia e não fornece serviços ou aconselhamento jurídico. A distribuição das licenças públicas da Creative Commons não cria uma relação advogado-cliente ou outra relação. A Creative Commons disponibiliza suas licenças e informações relacionadas em uma base "como está". A Creative Commons não oferece garantias em relação às suas licenças, qualquer material licenciado sob seus termos e condições, ou qualquer informação relacionada. A Creative Commons se isenta de toda responsabilidade por danos resultantes do uso de suas licenças na máxima extensão permitida pela lei.
## Usando Licenças Públicas da Creative Commons
As licenças públicas da Creative Commons fornecem um conjunto padrão de termos e condições que criadores e outros detentores de direitos podem usar para compartilhar obras originais de autoria e outros materiais sujeitos a direitos autorais e certos outros direitos especificados na licença pública abaixo. As considerações a seguir são apenas para fins informativos, não são exaustivas e não fazem parte de nossas licenças.
- Considerações para licenciadores: Nossas licenças públicas são destinadas ao uso por aqueles autorizados a dar ao público permissão para usar material de maneiras que, de outra forma, seriam restritas por direitos autorais e certos outros direitos. Nossas licenças são irrevogáveis. Os licenciadores devem ler e entender os termos e condições da licença que escolherem antes de aplicá-la. Os licenciadores também devem garantir todos os direitos necessários antes de aplicar nossas licenças, para que o público possa reutilizar o material conforme esperado. Os licenciadores devem marcar claramente qualquer material que não esteja sujeito à licença. Isso inclui outro material licenciado pela CC ou material utilizado sob uma exceção ou limitação ao direito autoral. Mais considerações para licenciadores: wiki.creativecommons.org/Considerations_for_licensors
- Considerações para o público: Ao usar uma de nossas licenças públicas, um licenciador concede ao público permissão para usar o material licenciado sob termos e condições especificados. Se a permissão do licenciador não for necessária por qualquer motivo—por exemplo, devido a qualquer exceção ou limitação aplicável ao direito autoral—então esse uso não é regulado pela licença. Nossas licenças concedem apenas permissões sob direitos autorais e certos outros direitos que um licenciador tem autoridade para conceder. O uso do material licenciado ainda pode ser restrito por outros motivos, incluindo porque outros têm direitos autorais ou outros direitos sobre o material. Um licenciador pode fazer solicitações especiais, como pedir que todas as alterações sejam marcadas ou descritas. Embora não seja exigido por nossas licenças, você é incentivado a respeitar essas solicitações quando razoável. Mais considerações para o público: wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
## Licença Pública de Atribuição-CompartilhaIgual 4.0 Internacional da Creative Commons
Ao exercer os Direitos Licenciados (definidos abaixo), você aceita e concorda em estar vinculado pelos termos e condições desta Licença Pública de Atribuição-CompartilhaIgual 4.0 Internacional da Creative Commons ("Licença Pública"). Na medida em que esta Licença Pública possa ser interpretada como um contrato, você recebe os Direitos Licenciados em consideração à sua aceitação destes termos e condições, e o Licenciador concede a você tais direitos em consideração aos benefícios que o Licenciador recebe por disponibilizar o Material Licenciado sob estes termos e condições.
### Seção 1 -- Definições.
a. **Material Adaptado** significa material sujeito a Direitos Autorais e Direitos Similares que é derivado ou baseado no Material Licenciado e no qual o Material Licenciado é traduzido, alterado, organizado, transformado ou de outra forma modificado de uma maneira que requer permissão sob os Direitos Autorais e Direitos Similares detidos pelo Licenciador. Para os propósitos desta Licença Pública, quando o Material Licenciado é uma obra musical, performance ou gravação de som, o Material Adaptado é sempre produzido onde o Material Licenciado está sincronizado em relação temporal com uma imagem em movimento.
b. **Licença do Adaptador** significa a licença que você aplica aos seus Direitos Autorais e Direitos Similares em suas contribuições para Material Adaptado de acordo com os termos e condições desta Licença Pública.
c. **Licença Compatível com BY-SA** significa uma licença listada em creativecommons.org/compatiblelicenses, aprovada pela Creative Commons como essencialmente equivalente a esta Licença Pública.
d. **Direitos Autorais e Direitos Similares** significam direitos autorais e/ou direitos semelhantes intimamente relacionados aos direitos autorais, incluindo, sem limitação, performance, transmissão, gravação de som e Direitos de Banco de Dados Sui Generis, independentemente de como os direitos são rotulados ou categorizados. Para os propósitos desta Licença Pública, os direitos especificados na Seção 2(b)(1)-(2) não são Direitos Autorais e Direitos Similares.
e. **Medidas Tecnológicas Eficazes** significam aquelas medidas que, na ausência de autoridade adequada, não podem ser contornadas sob leis que cumpram obrigações sob o Artigo 11 do Tratado de Direitos Autorais da OMPI adotado em 20 de dezembro de 1996, e/ou acordos internacionais semelhantes.
f. **Exceções e Limitações** significam uso justo, trato justo e/ou qualquer outra exceção ou limitação aos Direitos Autorais e Direitos Similares que se aplica ao seu uso do Material Licenciado.
g. **Elementos da Licença** significam os atributos da licença listados no nome de uma Licença Pública da Creative Commons. Os Elementos da Licença desta Licença Pública são Atribuição e CompartilhaIgual.
h. **Material Licenciado** significa a obra artística ou literária, banco de dados ou outro material ao qual o Licenciador aplicou esta Licença Pública.
i. **Direitos Licenciados** significam os direitos concedidos a você sujeitos aos termos e condições desta Licença Pública, que são limitados a todos os Direitos Autorais e Direitos Similares que se aplicam ao seu uso do Material Licenciado e que o Licenciador tem autoridade para licenciar.
j. **Licenciador** significa o(s) indivíduo(s) ou entidade(s) que concede(m) direitos sob esta Licença Pública.
k. **Compartilhar** significa fornecer material ao público por qualquer meio ou processo que requer permissão sob os Direitos Licenciados, como reprodução, exibição pública, performance pública, distribuição, disseminação, comunicação ou importação, e tornar material disponível ao público, incluindo de maneiras que membros do público possam acessar o material de um local e em um horário individualmente escolhidos por eles.
l. **Direitos de Banco de Dados Sui Generis** significam direitos que não são direitos autorais resultantes da Diretiva 96/9/CE do Parlamento Europeu e do Conselho de 11 de março de 1996 sobre a proteção legal de bancos de dados, conforme alterada e/ou sucedida, bem como outros direitos essencialmente equivalentes em qualquer lugar do mundo.
m. **Você** significa o indivíduo ou entidade que exerce os Direitos Licenciados sob esta Licença Pública. **Seu** tem um significado correspondente.
### Seção 2 -- Escopo.
a. **Concessão de licença.**
1. Sujeito aos termos e condições desta Licença Pública, o Licenciador concede a você uma licença mundial, isenta de royalties, não sublicenciável, não exclusiva e irrevogável para exercer os Direitos Licenciados no Material Licenciado para:
a. reproduzir e Compartilhar o Material Licenciado, total ou parcialmente; e
b. produzir, reproduzir e Compartilhar Material Adaptado.
2. **Exceções e Limitações.** Para evitar dúvidas, onde Exceções e Limitações se aplicam ao seu uso, esta Licença Pública não se aplica, e você não precisa cumprir seus termos e condições.
3. **Prazo.** O prazo desta Licença Pública está especificado na Seção 6(a).
4. **Mídia e formatos; modificações técnicas permitidas.** O Licenciador autoriza você a exercer os Direitos Licenciados em todos os meios e formatos, sejam agora conhecidos ou criados posteriormente, e a fazer modificações técnicas necessárias para fazê-lo. O Licenciador renuncia e/ou concorda em não afirmar qualquer direito ou autoridade para proibir você de fazer modificações técnicas necessárias para exercer os Direitos Licenciados, incluindo modificações técnicas necessárias para contornar Medidas Tecnológicas Eficazes. Para os propósitos desta Licença Pública, simplesmente fazer modificações autorizadas por esta Seção 2(a)(4) nunca produz Material Adaptado.
5. **Destinatários subsequentes.**
a. **Oferta do Licenciador -- Material Licenciado.** Cada destinatário do Material Licenciado automaticamente recebe uma oferta do Licenciador para exercer os Direitos Licenciados sob os termos e condições desta Licença Pública.
b. **Oferta adicional do Licenciador -- Material Adaptado.** Cada destinatário de Material Adaptado de você automaticamente recebe uma oferta do Licenciador para exercer os Direitos Licenciados no Material Adaptado sob as condições da Licença do Adaptador que você aplica.
c. **Sem restrições subsequentes.** Você não pode oferecer ou impor quaisquer termos ou condições adicionais ou diferentes, ou aplicar quaisquer Medidas Tecnológicas Eficazes ao Material Licenciado se isso restringir o exercício dos Direitos Licenciados por qualquer destinatário do Material Licenciado.
6. **Sem endosse.** Nada nesta Licença Pública constitui ou pode ser interpretado como permissão para afirmar ou implicar que você está, ou que seu uso do Material Licenciado está, conectado com, ou patrocinado, endossado ou concedido status oficial pelo Licenciador ou outros designados para receber atribuição conforme previsto na Seção 3(a)(1)(A)(i).
b. **Outros direitos.**
1. Direitos morais, como o direito à integridade, não estão licenciados sob esta Licença Pública, nem direitos de publicidade, privacidade e/ou outros direitos de personalidade semelhantes; no entanto, na medida do possível, o Licenciador renuncia e/ou concorda em não afirmar quaisquer direitos desse tipo detidos pelo Licenciador na extensão limitada necessária para permitir que você exerça os Direitos Licenciados, mas não de outra forma.
2. Direitos de patente e marcas não estão licenciados sob esta Licença Pública.
3. Na medida do possível, o Licenciador renuncia a qualquer direito de coletar royalties de você pelo exercício dos Direitos Licenciados, seja diretamente ou através de uma sociedade de cobrança sob qualquer esquema de licenciamento voluntário ou renunciável. Em todos os outros casos, o Licenciador expressamente reserva qualquer direito de coletar tais royalties.
### Seção 3 -- Condições da Licença.
Seu exercício dos Direitos Licenciados está expressamente sujeito às seguintes condições.
a. **Atribuição.**
1. Se você Compartilhar o Material Licenciado (incluindo em forma modificada), você deve:
a. reter o seguinte se for fornecido pelo Licenciador com o Material Licenciado:
i. identificação do(s) criador(es) do Material Licenciado e quaisquer outros designados para receber atribuição, de qualquer maneira razoável solicitada pelo Licenciador (incluindo por pseudônimo se designado);
ii. um aviso de direitos autorais;
iii. um aviso que se refira a esta Licença Pública;
iv. um aviso que se refira à isenção de garantias;
v. um URI ou hiperlink para o Material Licenciado na medida do razoavelmente praticável;
b. indicar se você modificou o Material Licenciado e reter uma indicação de quaisquer modificações anteriores; e
c. indicar que o Material Licenciado está licenciado sob esta Licença Pública e incluir o texto de, ou o URI ou hiperlink para, esta Licença Pública.
2. Você pode satisfazer as condições na Seção 3(a)(1) de qualquer maneira razoável com base no meio, meios e contexto em que você Compartilha o Material Licenciado. Por exemplo, pode ser razoável satisfazer as condições fornecendo um URI ou hiperlink para um recurso que inclua as informações exigidas.
3. Se solicitado pelo Licenciador, você deve remover qualquer uma das informações exigidas pela Seção 3(a)(1)(A) na medida do razoavelmente praticável.
b. **CompartilhaIgual.**
Além das condições na Seção 3(a), se você Compartilhar Material Adaptado que produziu, as seguintes condições também se aplicam.
1. A Licença do Adaptador que você aplica deve ser uma licença Creative Commons com os mesmos Elementos da Licença, esta versão ou posterior, ou uma Licença Compatível com BY-SA.
2. Você deve incluir o texto de, ou o URI ou hiperlink para, a Licença do Adaptador que você aplica. Você pode satisfazer esta condição de qualquer maneira razoável com base no meio, meios e contexto em que você Compartilha Material Adaptado.
3. Você não pode oferecer ou impor quaisquer termos ou condições adicionais ou diferentes sobre, ou aplicar quaisquer Medidas Tecnológicas Eficazes ao, Material Adaptado que restrinjam o exercício dos direitos concedidos sob a Licença do Adaptador que você aplica.
### Seção 4 -- Direitos de Banco de Dados Sui Generis.
Onde os Direitos Licenciados incluem Direitos de Banco de Dados Sui Generis que se aplicam ao seu uso do Material Licenciado:
a. para evitar dúvidas, a Seção 2(a)(1) concede a você o direito de extrair, reutilizar, reproduzir e Compartilhar toda ou uma parte substancial do conteúdo do banco de dados;
b. se você incluir toda ou uma parte substancial do conteúdo do banco de dados em um banco de dados no qual você tenha Direitos de Banco de Dados Sui Generis, então o banco de dados no qual você tem Direitos de Banco de Dados Sui Generis (mas não seus conteúdos individuais) é Material Adaptado, incluindo para fins da Seção 3(b); e
c. você deve cumprir as condições na Seção 3(a) se você Compartilhar toda ou uma parte substancial do conteúdo do banco de dados.
Para evitar dúvidas, esta Seção 4 suplementa e não substitui suas obrigações sob esta Licença Pública onde os Direitos Licenciados incluem outros Direitos Autorais e Direitos Similares.
### Seção 5 -- Isenção de Garantias e Limitação de Responsabilidade.
a. A MENOS QUE SEJA OUTRA VEZ ASSUMIDO SEPARADAMENTE PELO LICENCIADOR, NA MEDIDA DO POSSÍVEL, O LICENCIADOR OFERECE O MATERIAL LICENCIADO COMO ESTÁ E DISPONÍVEL, E NÃO FAZ REPRESENTAÇÕES OU GARANTIAS DE QUALQUER TIPO RELATIVAS AO MATERIAL LICENCIADO, SEJA EXPRESSAS, IMPLÍCITAS, ESTATUTÁRIAS OU OUTRAS. ISSO INCLUI, SEM LIMITAÇÃO, GARANTIAS DE TITULARIDADE, COMERCIALIZAÇÃO, ADEQUAÇÃO A UM FIM ESPECÍFICO, NÃO INFRAÇÃO, AUSÊNCIA DE DEFEITOS LATENTES OU OUTROS, PRECISÃO, OU A PRESENÇA OU AUSÊNCIA DE ERROS, SEJA OU NÃO CONHECIDOS OU DESCOBERTOS. ONDE ISENÇÕES DE GARANTIAS NÃO SÃO PERMITIDAS EM TOTALIDADE OU EM PARTE, ESTA ISENÇÃO PODE NÃO SE APLICAR A VOCÊ.
b. NA MEDIDA DO POSSÍVEL, EM NENHUM CASO O LICENCIADOR SERÁ RESPONSÁVEL PERANTE VOCÊ EM QUALQUER TEORIA LEGAL (INCLUINDO, SEM LIMITAÇÃO, NEGLIGÊNCIA) OU DE OUTRA FORMA POR QUAISQUER PERDAS, CUSTOS, DESPESAS OU DANOS DIRETOS, ESPECIAIS, INDIRETOS, INCIDENTAIS, CONSEQUENCIAIS, PUNITIVOS, EXEMPLARES OU OUTROS DECORRENTES DESSA LICENÇA PÚBLICA OU DO USO DO MATERIAL LICENCIADO, MESMO QUE O LICENCIADOR TENHA SIDO AVISADO DA POSSIBILIDADE DE TAIS PERDAS, CUSTOS, DESPESAS OU DANOS. ONDE UMA LIMITAÇÃO DE RESPONSABILIDADE NÃO É PERMITIDA EM TOTALIDADE OU EM PARTE, ESTA LIMITAÇÃO PODE NÃO SE APLICAR A VOCÊ.
c. A isenção de garantias e a limitação de responsabilidade fornecidas acima serão interpretadas de uma maneira que, na medida do possível, mais se aproxime de uma isenção absoluta e renúncia de toda responsabilidade.
### Seção 6 -- Prazo e Rescisão.
a. Esta Licença Pública se aplica pelo prazo dos Direitos Autorais e Direitos Similares licenciados aqui. No entanto, se você não cumprir esta Licença Pública, então seus direitos sob esta Licença Pública terminam automaticamente.
b. Onde seu direito de usar o Material Licenciado foi encerrado sob a Seção 6(a), ele é restaurado:
1. automaticamente a partir da data em que a violação é corrigida, desde que seja corrigida dentro de 30 dias após sua descoberta da violação; ou
2. mediante restauração expressa pelo Licenciador.
Para evitar dúvidas, esta Seção 6(b) não afeta qualquer direito que o Licenciador possa ter de buscar remédios para suas violações desta Licença Pública.
c. Para evitar dúvidas, o Licenciador também pode oferecer o Material Licenciado sob termos ou condições separadas ou parar de distribuir o Material Licenciado a qualquer momento; no entanto, isso não encerrará esta Licença Pública.
d. As Seções 1, 5, 6, 7 e 8 sobrevivem à rescisão desta Licença Pública.
### Seção 7 -- Outros Termos e Condições.
a. O Licenciador não estará vinculado por quaisquer termos ou condições adicionais ou diferentes comunicados por você, a menos que expressamente acordados.
b. Quaisquer arranjos, entendimentos ou acordos relativos ao Material Licenciado não declarados aqui são separados e independentes dos termos e condições desta Licença Pública.
### Seção 8 -- Interpretação.
a. Para evitar dúvidas, esta Licença Pública não reduz, limita, restringe ou impõe condições sobre qualquer uso do Material Licenciado que poderia ser legalmente feito sem permissão sob esta Licença Pública.
b. Na medida do possível, se qualquer disposição desta Licença Pública for considerada inaplicável, ela será automaticamente reformulada na extensão mínima necessária para torná-la aplicável. Se a disposição não puder ser reformulada, ela será separada desta Licença Pública sem afetar a aplicabilidade dos termos e condições restantes.
c. Nenhum termo ou condição desta Licença Pública será renunciado e nenhuma falha em cumprir será consentida, a menos que expressamente acordada pelo Licenciador.
d. Nada nesta Licença Pública constitui ou pode ser interpret
**Isenção de responsabilidade**:
Este documento foi traduzido usando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas resultantes do uso desta tradução.

@ -1,10 +0,0 @@
Todos os sketchnotes do currículo podem ser baixados aqui.
🖨 Para impressão em alta resolução, as versões TIFF estão disponíveis em [este repositório](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff).
🎨 Criado por: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac))
[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/)
**Isenção de responsabilidade**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em sua língua nativa deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional por um humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações errôneas decorrentes do uso desta tradução.

@ -1,146 +0,0 @@
# Введение в машинное обучение
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1/)
---
[![Машинное обучение для начинающих - Введение в машинное обучение для начинающих](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "Машинное обучение для начинающих - Введение в машинное обучение для начинающих")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео, посвященное этому уроку.
Добро пожаловать на этот курс по классическому машинному обучению для начинающих! Независимо от того, являетесь ли вы новичком в этой теме или опытным практиком машинного обучения, который хочет освежить свои знания, мы рады видеть вас! Мы хотим создать дружелюбную стартовую площадку для вашего изучения машинного обучения и будем рады оценить, ответить на ваши замечания и учесть ваш [отзыв](https://github.com/microsoft/ML-For-Beginners/discussions).
[![Введение в машинное обучение](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Введение в машинное обучение")
---
## Начало работы с машинным обучением
Перед тем как приступить к этому учебному плану, вам нужно настроить ваш компьютер и подготовить его для запуска блокнотов локально.
- **Настройте свой компьютер с помощью этих видео**. Используйте следующие ссылки, чтобы узнать [как установить Python](https://youtu.be/CXZYvNRIAKM) в вашей системе и [настроить текстовый редактор](https://youtu.be/EU8eayHWoZg) для разработки.
- **Изучите Python**. Также рекомендуется иметь базовые знания о [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), языке программирования, полезном для дата-сайентистов, который мы используем в этом курсе.
- **Изучите Node.js и JavaScript**. Мы также используем JavaScript несколько раз в этом курсе при создании веб-приложений, поэтому вам потребуется установить [node](https://nodejs.org) и [npm](https://www.npmjs.com/), а также иметь [Visual Studio Code](https://code.visualstudio.com/) для разработки на Python и JavaScript.
- **Создайте аккаунт на GitHub**. Поскольку вы нашли нас здесь на [GitHub](https://github.com), у вас, возможно, уже есть аккаунт, но если нет, создайте его, а затем сделайте форк этого учебного плана, чтобы использовать его самостоятельно. (Не стесняйтесь ставить нам звезду тоже 😊)
- **Изучите Scikit-learn**. Ознакомьтесь с [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), набором библиотек машинного обучения, на которые мы ссылаемся в этих уроках.
---
## Что такое машинное обучение?
Термин "машинное обучение" является одним из самых популярных и часто используемых в наше время. Есть большая вероятность, что вы слышали этот термин хотя бы раз, если у вас есть какое-либо знакомство с технологиями, независимо от области вашей работы. Однако механика машинного обучения остается загадкой для большинства людей. Для новичка в машинном обучении эта тема может иногда казаться подавляющей. Поэтому важно понимать, что такое машинное обучение, и изучать его шаг за шагом, через практические примеры.
---
## Кривая ажиотажа
![кривая ажиотажа в ML](../../../../translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.ru.png)
> Google Trends показывает недавнюю "кривую ажиотажа" термина "машинное обучение"
---
## Загадочная вселенная
Мы живем во вселенной, полной увлекательных тайн. Великие ученые, такие как Стивен Хокинг, Альберт Эйнштейн и многие другие, посвятили свои жизни поиску значимой информации, раскрывающей тайны мира вокруг нас. Это человеческая природа учиться: человеческий ребенок учит новые вещи и раскрывает структуру своего мира год за годом, когда он становится взрослым.
---
## Мозг ребенка
Мозг ребенка и его чувства воспринимают факты окружающей среды и постепенно изучают скрытые закономерности жизни, которые помогают ребенку формировать логические правила для определения изученных паттернов. Процесс обучения человеческого мозга делает людей самыми сложными живыми существами в этом мире. Непрерывное обучение, открытие скрытых закономерностей и затем их инновация позволяет нам становиться все лучше и лучше на протяжении всей жизни. Эта способность к обучению и эволюции связана с концепцией, называемой [пластичностью мозга](https://www.simplypsychology.org/brain-plasticity.html). На поверхностном уровне мы можем провести некоторые мотивационные параллели между процессом обучения человеческого мозга и концепциями машинного обучения.
---
## Человеческий мозг
[Человеческий мозг](https://www.livescience.com/29365-human-brain.html) воспринимает вещи из реального мира, обрабатывает полученную информацию, принимает рациональные решения и выполняет определенные действия в зависимости от обстоятельств. Это то, что мы называем интеллектуальным поведением. Когда мы программируем подобие интеллектуального поведения в машину, это называется искусственным интеллектом (ИИ).
---
## Некоторые термины
Хотя термины могут вызывать путаницу, машинное обучение (ML) является важным подмножеством искусственного интеллекта. **ML касается использования специализированных алгоритмов для выявления значимой информации и нахождения скрытых закономерностей в воспринимаемых данных для подтверждения процесса рационального принятия решений**.
---
## ИИ, ML, глубокое обучение
![ИИ, ML, глубокое обучение, наука о данных](../../../../translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.ru.png)
> Диаграмма, показывающая взаимосвязи между ИИ, ML, глубоким обучением и наукой о данных. Инфографика от [Jen Looper](https://twitter.com/jenlooper), вдохновленная [этой графикой](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)
---
## Концепции для изучения
В этом учебном плане мы будем охватывать только основные концепции машинного обучения, которые должен знать новичок. Мы рассматриваем то, что называем "классическим машинным обучением", в основном используя Scikit-learn, отличную библиотеку, которую многие студенты используют для изучения основ. Чтобы понять более широкие концепции искусственного интеллекта или глубокого обучения, необходимо иметь прочные фундаментальные знания о машинном обучении, и поэтому мы хотели бы предложить это здесь.
---
## В этом курсе вы узнаете:
- основные концепции машинного обучения
- историю ML
- ML и справедливость
- техники регрессии в ML
- техники классификации в ML
- техники кластеризации в ML
- техники обработки естественного языка в ML
- техники прогнозирования временных рядов в ML
- обучение с подкреплением
- реальные приложения для ML
---
## Что мы не будем охватывать
- глубокое обучение
- нейронные сети
- ИИ
Чтобы обеспечить лучший опыт обучения, мы будем избегать сложностей нейронных сетей, "глубокого обучения" - многослойного моделирования с использованием нейронных сетей - и ИИ, которые мы обсудим в другом учебном плане. Мы также предложим будущий учебный план по науке о данных, чтобы сосредоточиться на этом аспекте более широкой области.
---
## Почему стоит изучать машинное обучение?
С точки зрения систем, машинное обучение определяется как создание автоматизированных систем, которые могут выявлять скрытые закономерности из данных, чтобы помочь в принятии интеллектуальных решений.
Эта мотивация свободно вдохновлена тем, как человеческий мозг учится определенным вещам на основе данных, которые он воспринимает из внешнего мира.
✅ Подумайте минуту, почему бизнес хотел бы попробовать использовать стратегии машинного обучения, а не создать жестко закодированный движок на основе правил.
---
## Применения машинного обучения
Применения машинного обучения теперь почти повсюду и так же повсеместны, как данные, которые циркулируют в нашем обществе, генерируемые нашими смартфонами, подключенными устройствами и другими системами. Учитывая огромный потенциал современных алгоритмов машинного обучения, исследователи изучают их способность решать многомерные и многодисциплинарные проблемы реальной жизни с отличными положительными результатами.
---
## Примеры прикладного ML
**Вы можете использовать машинное обучение многими способами**:
- Для прогнозирования вероятности заболевания на основе медицинской истории или отчетов пациента.
- Для использования данных о погоде для прогнозирования погодных явлений.
- Для понимания настроения текста.
- Для обнаружения фейковых новостей, чтобы остановить распространение пропаганды.
Финансовые, экономические, землеведческие, космические, биомедицинские, когнитивные науки и даже гуманитарные дисциплины адаптировали машинное обучение для решения сложных задач обработки данных в своей области.
---
## Заключение
Машинное обучение автоматизирует процесс обнаружения закономерностей, находя значимые инсайты из реальных или сгенерированных данных. Оно доказало свою высокую ценность в бизнесе, здравоохранении и финансовых приложениях, среди прочего.
В ближайшем будущем понимание основ машинного обучения станет необходимым для людей из любой области из-за его широкого применения.
---
# 🚀 Задача
Нарисуйте на бумаге или используя онлайн-приложение, такое как [Excalidraw](https://excalidraw.com/), ваше понимание различий между ИИ, ML, глубоким обучением и наукой о данных. Добавьте несколько идей о проблемах, которые каждая из этих техник хорошо решает.
# [Пост-тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/2/)
---
# Обзор и самостоятельное изучение
Чтобы узнать больше о том, как работать с алгоритмами ML в облаке, следуйте этому [Учебному пути](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott).
Пройдите [Учебный путь](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) о основах ML.
---
# Задание
[Запустите и настройте](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,12 +0,0 @@
# Начало работы
## Инструкции
В этом незаслуживающем оценивания задании вам следует освежить свои знания по Python и настроить свою среду, чтобы она могла запускать блокноты.
Пройдите этот [Путь изучения Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), а затем настройте свои системы, просмотрев эти вводные видео:
https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,152 +0,0 @@
# История машинного обучения
![Сводка истории машинного обучения в виде скетча](../../../../translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.ru.png)
> Скетч от [Томоми Имура](https://www.twitter.com/girlie_mac)
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/3/)
---
[![Машинное обучение для начинающих - История машинного обучения](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "Машинное обучение для начинающих - История машинного обучения")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео по этому уроку.
В этом уроке мы рассмотрим основные вехи в истории машинного обучения и искусственного интеллекта.
История искусственного интеллекта (ИИ) как области переплетена с историей машинного обучения, так как алгоритмы и вычислительные достижения, лежащие в основе МЛ, способствовали развитию ИИ. Полезно помнить, что, хотя эти области как отдельные направления начали формироваться в 1950-х годах, важные [алгоритмические, статистические, математические, вычислительные и технические открытия](https://wikipedia.org/wiki/Timeline_of_machine_learning) предшествовали и пересекались с этой эпохой. На самом деле, люди размышляли над этими вопросами на протяжении [сотен лет](https://wikipedia.org/wiki/History_of_artificial_intelligence): эта статья обсуждает исторические интеллектуальные основы идеи "мыслящей машины".
---
## Знаковые открытия
- 1763, 1812 [Теорема Байеса](https://wikipedia.org/wiki/Bayes%27_theorem) и её предшественники. Эта теорема и её приложения лежат в основе вывода, описывая вероятность события на основе имеющихся данных.
- 1805 [Теория наименьших квадратов](https://wikipedia.org/wiki/Least_squares) французского математика Адриена-Мари Лежандра. Эта теория, о которой вы узнаете в нашем модуле по регрессии, помогает в подгонке данных.
- 1913 [Цепи Маркова](https://wikipedia.org/wiki/Markov_chain), названные в честь русского математика Андрея Маркова, используются для описания последовательности возможных событий на основе предыдущего состояния.
- 1957 [Перцептрон](https://wikipedia.org/wiki/Perceptron) — это тип линейного классификатора, изобретённого американским психологом Фрэнком Розенблаттом, который лежит в основе достижений в глубоком обучении.
---
- 1967 [Метод ближайшего соседа](https://wikipedia.org/wiki/Nearest_neighbor) — алгоритм, изначально разработанный для прокладки маршрутов. В контексте МЛ он используется для обнаружения шаблонов.
- 1970 [Обратное распространение](https://wikipedia.org/wiki/Backpropagation) используется для обучения [прямых нейронных сетей](https://wikipedia.org/wiki/Feedforward_neural_network).
- 1982 [Рекуррентные нейронные сети](https://wikipedia.org/wiki/Recurrent_neural_network) — это искусственные нейронные сети, происходящие от прямых нейронных сетей, которые создают временные графы.
✅ Проведите небольшое исследование. Какие другие даты выделяются как ключевые в истории МЛ и ИИ?
---
## 1950: Машины, которые думают
Алан Тьюринг, поистине выдающаяся личность, который был признан [общественностью в 2019 году](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) величайшим учёным 20 века, считается тем, кто заложил основы концепции "машины, способной думать". Он сталкивался с противниками и своей собственной потребностью в эмпирических доказательствах этой концепции, частично создав [Тест Тьюринга](https://www.bbc.com/news/technology-18475646), который вы изучите в наших уроках по НЛП.
---
## 1956: Летний исследовательский проект в Дартмуте
"Летний исследовательский проект в Дартмуте по искусственному интеллекту стал знаковым событием для ИИ как области," и именно здесь был введён термин "искусственный интеллект" ([источник](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
> Каждый аспект обучения или любая другая характеристика интеллекта могут в принципе быть настолько точно описаны, что машина может быть создана для их имитации.
---
Ведущий исследователь, профессор математики Джон Макафи, надеялся "продолжить на основе предположения, что каждый аспект обучения или любая другая характеристика интеллекта могут в принципе быть настолько точно описаны, что машина может быть создана для их имитации." Участниками проекта были и другие выдающиеся специалисты в этой области, включая Марвина Минского.
Семинар был признан инициировавшим и способствовавшим нескольким обсуждениям, включая "возникновение символических методов, систем, ориентированных на ограниченные области (ранние экспертные системы), и дедуктивные системы против индуктивных систем." ([источник](https://wikipedia.org/wiki/Dartmouth_workshop)).
---
## 1956 - 1974: "Золотые годы"
С 1950-х до середины 70-х годов оптимизм был высок в надежде, что ИИ сможет решить множество проблем. В 1967 году Марвин Минский уверенно заявил, что "В течение одного поколения ... проблема создания 'искусственного интеллекта' будет в значительной степени решена." (Минский, Марвин (1967), Вычисления: Конечные и бесконечные машины, Энглвуд Клиффс, Нью-Джерси: Прентис-Холл)
Исследования в области обработки естественного языка процветали, поиск был усовершенствован и стал более мощным, а концепция "микромиров" была создана, где простые задачи выполнялись с помощью простых языковых инструкций.
---
Исследования хорошо финансировались государственными учреждениями, были достигнуты успехи в вычислениях и алгоритмах, и были созданы прототипы интеллектуальных машин. Некоторые из этих машин включают:
* [Шейки робот](https://wikipedia.org/wiki/Shakey_the_robot), который мог маневрировать и принимать решения о том, как выполнять задачи "умно".
![Шейки, интеллектуальный робот](../../../../translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.ru.jpg)
> Шейки в 1972 году
---
* Элиза, ранний "чат-бот", могла вести беседы с людьми и действовать как примитивный "терапевт". Вы узнаете больше об Элизе на уроках НЛП.
![Элиза, бот](../../../../translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.ru.png)
> Версия Элизы, чат-бота
---
* "Мир блоков" был примером микромира, где блоки могли быть сложены и отсортированы, и эксперименты по обучению машин принятию решений могли быть протестированы. Достижения, основанные на библиотеках, таких как [SHRDLU](https://wikipedia.org/wiki/SHRDLU), помогли продвинуть обработку языка вперёд.
[![мир блоков с SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "мир блоков с SHRDLU")
> 🎥 Нажмите на изображение выше, чтобы посмотреть видео: Мир блоков с SHRDLU
---
## 1974 - 1980: "Зима ИИ"
К середине 1970-х стало очевидно, что сложность создания "интеллектуальных машин" была недооценена и что её обещание, учитывая доступную вычислительную мощность, было преувеличено. Финансирование иссякло, и доверие к области замедлилось. Некоторые проблемы, повлиявшие на доверие, включали:
---
- **Ограничения**. Вычислительная мощность была слишком ограничена.
- **Комбинаторный взрыв**. Количество параметров, которые нужно было обучить, росло экспоненциально по мере увеличения требований к компьютерам, без параллельной эволюции вычислительной мощности и возможностей.
- **Недостаток данных**. Существовал недостаток данных, который мешал процессу тестирования, разработки и уточнения алгоритмов.
- **Задаём ли мы правильные вопросы?**. Самые вопросы, которые задавались, начали подвергаться сомнению. Исследователи начали получать критику по поводу своих подходов:
- Тесты Тьюринга стали вызывать сомнения, среди прочих идей, теорией "китайской комнаты", которая утверждала, что "программирование цифрового компьютера может создать иллюзию понимания языка, но не может обеспечить истинное понимание." ([источник](https://plato.stanford.edu/entries/chinese-room/))
- Этические вопросы о введении искусственных интеллектов, таких как "терапевт" ЭЛИЗА, в общество стали вызывать споры.
---
В то же время начали формироваться различные школы мысли в области ИИ. Была установлена дихотомия между практиками ["неаккуратного" и "аккуратного ИИ"](https://wikipedia.org/wiki/Neats_and_scruffies). _Неаккуратные_ лаборатории настраивали программы часами, пока не достигали желаемых результатов. _Аккуратные_ лаборатории "сосредоточились на логике и формальном решении проблем". ЭЛИЗА и SHRDLU были известными еаккуратными_ системами. В 1980-х, когда возникла необходимость сделать системы МЛ воспроизводимыми, _аккуратный_ подход постепенно вышел на первый план, поскольку его результаты более объяснимы.
---
## 1980-е Экспертные системы
По мере роста области её польза для бизнеса становилась всё более очевидной, и в 1980-х годах началось повсеместное распространение "экспертных систем". "Экспертные системы были одними из первых действительно успешных форм программного обеспечения искусственного интеллекта (ИИ)." ([источник](https://wikipedia.org/wiki/Expert_system)).
Этот тип системы на самом деле является _гибридным_, состоящим частично из движка правил, определяющего бизнес-требования, и движка вывода, который использует систему правил для вывода новых фактов.
В эту эпоху также увеличилось внимание к нейронным сетям.
---
## 1987 - 1993: "Охлаждение ИИ"
Распространение специализированного аппаратного обеспечения для экспертных систем имело неприятный эффект чрезмерной специализации. Появление персональных компьютеров также конкурировало с этими большими, специализированными, централизованными системами. Демократизация вычислений началась, и она в конечном итоге проложила путь к современному взрыву больших данных.
---
## 1993 - 2011
Эта эпоха ознаменовала новую эру для МЛ и ИИ, способных решать некоторые проблемы, вызванные ранее нехваткой данных и вычислительной мощности. Объём данных начал быстро увеличиваться и становиться более доступным, как к лучшему, так и к худшему, особенно с появлением смартфона около 2007 года. Вычислительная мощность расширялась экспоненциально, и алгоритмы развивались одновременно. Область начала приобретать зрелость, поскольку безудержные дни прошлого начали кристаллизоваться в настоящую дисциплину.
---
## Сегодня
Сегодня машинное обучение и ИИ затрагивают почти все аспекты нашей жизни. Эта эпоха требует внимательного понимания рисков и потенциальных последствий этих алгоритмов для человеческой жизни. Как отметил Брэд Смит из Microsoft, "Информационные технологии поднимают вопросы, которые касаются основополагающих прав человека, таких как право на личную жизнь и свободу слова. Эти вопросы увеличивают ответственность для технологических компаний, создающих эти продукты. На наш взгляд, они также требуют вдумчивого государственного регулирования и разработки норм по приемлемому использованию" ([источник](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
---
Остаётся только догадываться, что ждёт нас в будущем, но важно понимать эти компьютерные системы и программное обеспечение и алгоритмы, которые они используют. Мы надеемся, что этот курс поможет вам лучше понять, чтобы вы могли принять собственное решение.
[![История глубокого обучения](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "История глубокого обучения")
> 🎥 Нажмите на изображение выше, чтобы посмотреть видео: Ян Лекун обсуждает историю глубокого обучения в этой лекции
---
## 🚀Вызов
Изучите один из этих исторических моментов и узнайте больше о людях, стоящих за ними. Есть увлекательные персонажи, и ни одно научное открытие никогда не создавалось в культурном вакууме. Что вы обнаружите?
## [Послетест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/4/)
---
## Обзор и самообучение
Вот предметы для просмотра и прослушивания:
[Этот подкаст, где Эми Бойд обсуждает эволюцию ИИ](http://runasradio.com/Shows/Show/739)
[![История ИИ от Эми Бойд](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "История ИИ от Эми Бойд")
---
## Задание
[Создайте временную шкалу](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Создание временной шкалы
## Инструкции
Используя [этот репозиторий](https://github.com/Digital-Humanities-Toolkit/timeline-builder), создайте временную шкалу какого-либо аспекта истории алгоритмов, математики, статистики, ИИ или МЛ, или их комбинации. Вы можете сосредоточиться на одном человеке, одной идее или длительном периоде мысли. Не забудьте добавить мультимедийные элементы.
## Критерии оценки
| Критерии | Примерный | Достаточный | Требует улучшения |
| -----------| ------------------------------------------------- | ------------------------------------- | ---------------------------------------------------------------- |
| | Развернутая временная шкала представлена как страница GitHub | Код неполный и не развернут | Временная шкала неполная, плохо исследована и не развернута |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,159 +0,0 @@
# Создание решений машинного обучения с ответственным ИИ
![Сводка ответственного ИИ в машинном обучении в виде эскиза](../../../../translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.ru.png)
> Эскиз от [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
## Введение
В этом учебном курсе вы начнете узнавать, как машинное обучение влияет на нашу повседневную жизнь. Даже сейчас системы и модели участвуют в ежедневных задачах принятия решений, таких как диагностика в здравоохранении, одобрение кредитов или выявление мошенничества. Поэтому важно, чтобы эти модели работали хорошо и обеспечивали надежные результаты. Как и любое программное приложение, системы ИИ могут не соответствовать ожиданиям или приводить к нежелательным результатам. Вот почему так важно понимать и объяснять поведение модели ИИ.
Представьте, что может произойти, когда данные, которые вы используете для создания этих моделей, не охватывают определенные демографические группы, такие как раса, пол, политические взгляды, религия, или непропорционально представляют такие демографические группы. Что произойдет, если выход модели будет интерпретироваться как предвзятость в пользу какой-то демографической группы? Каковы будут последствия для приложения? Кроме того, что происходит, когда модель приводит к негативному результату и наносит вред людям? Кто несет ответственность за поведение систем ИИ? Это некоторые вопросы, которые мы будем исследовать в этом курсе.
В этом уроке вы:
- Повысите свою осведомленность о важности справедливости в машинном обучении и связанных с ней вредах.
- Ознакомитесь с практикой исследования выбросов и необычных сценариев для обеспечения надежности и безопасности.
- Поймете необходимость предоставления возможностей всем, создавая инклюзивные системы.
- Исследуете, насколько важно защищать конфиденциальность и безопасность данных и людей.
- Увидите важность подхода "стеклянной коробки" для объяснения поведения моделей ИИ.
- Осознаете, как ответственность важна для создания доверия к системам ИИ.
## Предварительные требования
В качестве предварительного требования, пожалуйста, пройдите учебный путь "Принципы ответственного ИИ" и посмотрите видео ниже на эту тему:
Узнайте больше об ответственном ИИ, следуя по этому [учебному пути](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
[![Подход Microsoft к ответственному ИИ](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Подход Microsoft к ответственному ИИ")
> 🎥 Нажмите на изображение выше для просмотра видео: Подход Microsoft к ответственному ИИ
## Справедливость
Системы ИИ должны относиться ко всем справедливо и избегать воздействия на схожие группы людей различными способами. Например, когда системы ИИ дают рекомендации по медицинскому лечению, заявкам на кредит или трудоустройству, они должны давать одинаковые рекомендации всем с похожими симптомами, финансовыми обстоятельствами или профессиональными квалификациями. Каждый из нас, как человек, несет унаследованные предвзятости, которые влияют на наши решения и действия. Эти предвзятости могут быть очевидны в данных, которые мы используем для обучения систем ИИ. Такие манипуляции иногда происходят непреднамеренно. Часто сложно осознать, когда вы вводите предвзятость в данные.
**"Несправедливость"** охватывает негативные последствия или "вред" для группы людей, таких как те, кто определяется по расе, полу, возрасту или статусу инвалидности. Основные вреды, связанные со справедливостью, можно классифицировать как:
- **Распределение**, если один пол или этническая группа, например, предпочитается перед другим.
- **Качество обслуживания**. Если вы обучаете данные для одного конкретного сценария, но реальность намного сложнее, это приводит к плохому качеству обслуживания. Например, диспенсер для мыла, который, похоже, не может обнаружить людей с темной кожей. [Ссылка](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **Уничижение**. Несправедливо критиковать и маркировать что-то или кого-то. Например, технология маркировки изображений, печально известная тем, что неверно классифицировала изображения людей с темной кожей как горилл.
- **Чрезмерное или недостаточное представительство**. Идея заключается в том, что определенная группа не представлена в определенной профессии, и любая служба или функция, которая продолжает это поддерживать, способствует вреду.
- **Стереотипизация**. Ассоциация данной группы с предопределенными атрибутами. Например, система перевода между английским и турецким языками может иметь неточности из-за слов с стереотипными ассоциациями к полу.
![перевод на турецкий](../../../../translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.ru.png)
> перевод на турецкий
![перевод обратно на английский](../../../../translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.ru.png)
> перевод обратно на английский
При проектировании и тестировании систем ИИ мы должны убедиться, что ИИ справедлив и не запрограммирован на принятие предвзятых или дискриминационных решений, которые также запрещены для человека. Гарантия справедливости в ИИ и машинном обучении остается сложной социотехнической задачей.
### Надежность и безопасность
Чтобы завоевать доверие, системы ИИ должны быть надежными, безопасными и последовательными в нормальных и неожиданных условиях. Важно знать, как системы ИИ будут вести себя в различных ситуациях, особенно когда они являются выбросами. При создании решений ИИ необходимо уделить значительное внимание тому, как справляться с широким спектром обстоятельств, с которыми могут столкнуться решения ИИ. Например, автономный автомобиль должен ставить безопасность людей в приоритет. В результате ИИ, управляющий автомобилем, должен учитывать все возможные сценарии, с которыми может столкнуться автомобиль, такие как ночь, грозы или метели, дети, бегущие через улицу, домашние животные, дорожные работы и т. д. Насколько хорошо система ИИ может надежно и безопасно справляться с широким диапазоном условий, отражает уровень предвидения, который ученый данных или разработчик ИИ учел во время проектирования или тестирования системы.
> [🎥 Нажмите здесь для просмотра видео: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
### Инклюзивность
Системы ИИ должны быть разработаны для вовлечения и предоставления возможностей всем. При проектировании и внедрении систем ИИ ученые данных и разработчики ИИ определяют и устраняют потенциальные барьеры в системе, которые могут непреднамеренно исключать людей. Например, в мире есть 1 миллиард людей с ограниченными возможностями. С развитием ИИ они могут легче получать доступ к широкому спектру информации и возможностей в своей повседневной жизни. Устранение барьеров создает возможности для инноваций и разработки ИИ-продуктов с лучшими впечатлениями, которые приносят пользу всем.
> [🎥 Нажмите здесь для просмотра видео: инклюзивность в ИИ](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
### Безопасность и конфиденциальность
Системы ИИ должны быть безопасными и уважать конфиденциальность людей. Люди меньше доверяют системам, которые ставят под угрозу их конфиденциальность, информацию или жизнь. При обучении моделей машинного обучения мы полагаемся на данные для получения наилучших результатов. При этом необходимо учитывать происхождение данных и их целостность. Например, были ли данные предоставлены пользователем или доступны публично? Далее, работая с данными, важно разрабатывать системы ИИ, которые могут защищать конфиденциальную информацию и противостоять атакам. Поскольку ИИ становится все более распространенным, защита конфиденциальности и обеспечение безопасности важной личной и бизнес-информации становятся все более критическими и сложными. Проблемы конфиденциальности и безопасности данных требуют особенно пристального внимания к ИИ, поскольку доступ к данным необходим для того, чтобы системы ИИ могли делать точные и обоснованные прогнозы и решения о людях.
> [🎥 Нажмите здесь для просмотра видео: безопасность в ИИ](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- Как отрасль, мы добились значительного прогресса в области конфиденциальности и безопасности, что было во многом обусловлено такими регламентами, как GDPR (Общий регламент по защите данных).
- Тем не менее, с системами ИИ мы должны признать напряжение между необходимостью большего количества персональных данных для создания более персонализированных и эффективных систем и конфиденциальностью.
- Точно так же, как с появлением подключенных компьютеров с интернетом, мы также наблюдаем значительное увеличение числа проблем с безопасностью, связанных с ИИ.
- В то же время мы видим, что ИИ используется для повышения безопасности. Например, большинство современных антивирусных сканеров сегодня управляются ИИ-эвристиками.
- Нам нужно убедиться, что наши процессы науки о данных гармонично сочетаются с последними практиками конфиденциальности и безопасности.
### Прозрачность
Системы ИИ должны быть понятными. Ключевой частью прозрачности является объяснение поведения систем ИИ и их компонентов. Улучшение понимания систем ИИ требует от заинтересованных сторон осознания того, как и почему они функционируют, чтобы они могли выявлять потенциальные проблемы с производительностью, проблемы безопасности и конфиденциальности, предвзятости, исключительные практики или непредвиденные результаты. Мы также считаем, что те, кто использует системы ИИ, должны быть честными и откровенными о том, когда, почему и как они выбирают их развертывание, а также о ограничениях систем, которые они используют. Например, если банк использует систему ИИ для поддержки своих потребительских кредитных решений, важно исследовать результаты и понять, какие данные влияют на рекомендации системы. Государства начинают регулировать ИИ в различных отраслях, поэтому ученые данных и организации должны объяснять, соответствует ли система ИИ регуляторным требованиям, особенно когда возникает нежелательный результат.
> [🎥 Нажмите здесь для просмотра видео: прозрачность в ИИ](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- Поскольку системы ИИ настолько сложны, трудно понять, как они работают и интерпретировать результаты.
- Этот недостаток понимания влияет на то, как эти системы управляются, операционализируются и документируются.
- Этот недостаток понимания, что более важно, влияет на решения, принимаемые с использованием результатов, которые эти системы производят.
### Ответственность
Люди, которые проектируют и внедряют системы ИИ, должны нести ответственность за то, как их системы функционируют. Необходимость ответственности особенно важна для чувствительных технологий, таких как распознавание лиц. В последнее время наблюдается растущий спрос на технологии распознавания лиц, особенно со стороны правоохранительных органов, которые видят потенциал этой технологии в таких применениях, как поиск пропавших детей. Однако эти технологии могут потенциально использоваться правительством для угрозы основным свободам граждан, например, позволяя непрерывное наблюдение за конкретными лицами. Следовательно, ученые данных и организации должны быть ответственны за то, как их система ИИ влияет на отдельных людей или общество.
[![Ведущий исследователь ИИ предупреждает о массовом наблюдении через распознавание лиц](../../../../translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.ru.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Подход Microsoft к ответственному ИИ")
> 🎥 Нажмите на изображение выше для просмотра видео: Предупреждения о массовом наблюдении через распознавание лиц
В конечном итоге одним из самых больших вопросов для нашего поколения, как для первого поколения, которое внедряет ИИ в общество, является то, как обеспечить, чтобы компьютеры оставались подотчетными людям и как гарантировать, что люди, проектирующие компьютеры, остаются подотчетными всем остальным.
## Оценка воздействия
Перед обучением модели машинного обучения важно провести оценку воздействия, чтобы понять цель системы ИИ; каково предполагаемое использование; где она будет развернута; и кто будет взаимодействовать с системой. Это полезно для рецензентов или тестировщиков, оценивающих систему, чтобы знать, какие факторы учитывать при выявлении потенциальных рисков и ожидаемых последствий.
Следующие области являются фокусом при проведении оценки воздействия:
* **Негативное воздействие на отдельных людей**. Осознание любых ограничений или требований, неподдерживаемого использования или любых известных ограничений, препятствующих работе системы, имеет жизненно важное значение для обеспечения того, чтобы система не использовалась таким образом, который мог бы нанести вред отдельным лицам.
* **Требования к данным**. Понимание того, как и где система будет использовать данные, позволяет рецензентам изучить любые требования к данным, о которых следует помнить (например, регламенты GDPR или HIPAA). Кроме того, необходимо оценить, является ли источник или количество данных достаточным для обучения.
* **Сводка воздействия**. Соберите список потенциальных вредов, которые могут возникнуть в результате использования системы. На протяжении жизненного цикла машинного обучения проверяйте, были ли выявленные проблемы смягчены или устранены.
* **Применимые цели** для каждого из шести основных принципов. Оцените, достигаются ли цели каждого из принципов и есть ли какие-либо пробелы.
## Отладка с ответственным ИИ
Подобно отладке программного приложения, отладка системы ИИ является необходимым процессом выявления и решения проблем в системе. Существует множество факторов, которые могут повлиять на то, что модель не работает так, как ожидалось или ответственно. Большинство традиционных метрик производительности модели являются количественными агрегатами производительности модели, что недостаточно для анализа того, как модель нарушает принципы ответственного ИИ. Более того, модель машинного обучения является черным ящиком, что затрудняет понимание того, что влияет на ее результат, или предоставление объяснений, когда она делает ошибку. Позже в этом курсе мы научимся использовать панель инструментов ответственного ИИ для помощи в отладке систем ИИ. Панель инструментов предоставляет целостный инструмент для ученых данных и разработчиков ИИ для выполнения:
* **Анализ ошибок**. Для выявления распределения ошибок модели, которые могут повлиять на справедливость или надежность системы.
* **Обзор модели**. Для выявления различий в производительности модели среди когорт данных.
* **Анализ данных**. Для понимания распределения данных и выявления любых потенциальных предвзятостей в данных, которые могут привести к проблемам со справедливостью, инклюзивностью и надежностью.
* **Интерпретируемость модели**. Для понимания того, что влияет на предсказания модели. Это помогает объяснить поведение модели, что важно для прозрачности и ответственности.
## 🚀 Задание
Чтобы предотвратить возникновение вреда с самого начала, мы должны:
- иметь разнообразие фонов и перспектив среди людей, работающих над системами
- инвестировать в наборы данных, которые отражают разнообразие нашего общества
- разрабатывать лучшие методы на протяжении жизненного цикла машинного обучения для выявления и исправления проблем ответственного ИИ, когда они возникают
Подумайте о реальных сценариях, где недоверие к модели очевидно в процессе создания и использования модели. Что еще мы должны учитывать?
## [Викторина после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/6/)
## Обзор и самостоятельное изучение
В этом уроке вы узнали основы понятий справедливости и несправедливости в машинном обучении.
Посмотрите этот семинар, чтобы углубиться в темы:
- В поисках ответственного ИИ: внедрение принципов на практике от Бесмиры Нуши, Мехрнуш Самеки и Амита Шармы
[![Инструменты ответственного ИИ: открытая структура для создания ответственного ИИ](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Открытая структура для создания ответственного ИИ")
> 🎥 Нажмите на изображение выше для просмотра видео: RAI Toolbox: Открытая структура для создания ответственного ИИ от Бесмиры Нуши, Мехрнуш Самеки и Амита Шармы
Также прочтите:
- Центр ресурсов RAI Microsoft: [Ресурсы ответственного ИИ Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- Исследовательская группа FATE Microsoft: [FATE: Справедливость, Ответственность, Прозрачность и Этика в ИИ - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
RAI Toolbox:
- [Репозиторий GitHub инструмента ответственного ИИ](https://github.com/microsoft/responsible-ai-toolbox)
Прочтите о инструментах Azure Machine Learning для обеспечения справедливости:
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## Задание
[Изучите RAI Toolbox](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Изучите Инструменты Ответственного ИИ
## Инструкции
На этом уроке вы узнали об Инструментах Ответственного ИИ, "проекте с открытым исходным кодом, ориентированном на сообщество, который помогает дата-сайентистам анализировать и улучшать системы ИИ." Для этого задания изучите один из [ноутбуков](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) RAI Toolbox и представьте свои выводы в виде статьи или презентации.
## Критерии оценки
| Критерии | Превосходно | Адекватно | Требует улучшения |
| --------- | ----------- | --------- | ----------------- |
| | Представлена статья или презентация PowerPoint, обсуждающая системы Fairlearn, ноутбук, который был запущен, и выводы, сделанные на основе его выполнения | Представлена статья без выводов | Статья не представлена |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,121 +0,0 @@
# Техники машинного обучения
Процесс создания, использования и поддержки моделей машинного обучения и данных, которые они используют, значительно отличается от многих других рабочих процессов разработки. В этом уроке мы развеем мифы о процессе и опишем основные техники, которые вам необходимо знать. Вы:
- Поймете процессы, лежащие в основе машинного обучения, на высоком уровне.
- Изучите основные концепции, такие как 'модели', 'предсказания' и 'обучающие данные'.
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/7/)
[![Машинное обучение для начинающих - Техники машинного обучения](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "Машинное обучение для начинающих - Техники машинного обучения")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео по этому уроку.
## Введение
На высоком уровне создание процессов машинного обучения (ML) состоит из нескольких этапов:
1. **Определите вопрос**. Большинство процессов ML начинаются с вопроса, на который нельзя ответить с помощью простой условной программы или основанного на правилах движка. Эти вопросы часто касаются предсказаний на основе собранных данных.
2. **Соберите и подготовьте данные**. Чтобы ответить на ваш вопрос, вам нужны данные. Качество и иногда количество ваших данных определят, насколько хорошо вы сможете ответить на свой первоначальный вопрос. Визуализация данных является важным аспектом этого этапа. Этот этап также включает разделение данных на обучающую и тестовую группы для создания модели.
3. **Выберите метод обучения**. В зависимости от вашего вопроса и природы ваших данных, вам нужно выбрать, как вы хотите обучить модель, чтобы она наилучшим образом отражала ваши данные и делала точные предсказания. Это часть вашего процесса ML, которая требует специфической экспертизы и часто значительного количества экспериментов.
4. **Обучите модель**. Используя ваши обучающие данные, вы будете использовать различные алгоритмы для обучения модели распознавать шаблоны в данных. Модель может использовать внутренние веса, которые можно настроить, чтобы привилегировать определенные части данных по сравнению с другими для создания более качественной модели.
5. **Оцените модель**. Вы используете ранее не виденные данные (ваши тестовые данные) из собранного набора, чтобы увидеть, как модель работает.
6. **Настройка параметров**. В зависимости от производительности вашей модели, вы можете повторить процесс, используя разные параметры или переменные, которые контролируют поведение алгоритмов, используемых для обучения модели.
7. **Предсказание**. Используйте новые входные данные, чтобы протестировать точность вашей модели.
## Какой вопрос задать
Компьютеры особенно хорошо умеют обнаруживать скрытые шаблоны в данных. Эта утилита очень полезна для исследователей, у которых есть вопросы о конкретной области, на которые нельзя легко ответить, создав условно основанный движок правил. Например, при решении актуарной задачи специалист по данным может создать вручную правила о смертности курильщиков по сравнению с некурильщиками.
Однако когда в уравнение вводится множество других переменных, модель ML может оказаться более эффективной для предсказания будущих уровней смертности на основе прошлой истории здоровья. Более оптимистичный пример может заключаться в том, чтобы делать прогнозы погоды на апрель в данном месте на основе данных, которые включают широту, долготу, изменения климата, близость к океану, паттерны струйного течения и многое другое.
✅ Эта [презентация](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) о погодных моделях предлагает историческую перспективу использования ML в анализе погоды.
## Предварительные задачи
Перед тем как начать строить вашу модель, вам необходимо выполнить несколько задач. Чтобы протестировать ваш вопрос и сформировать гипотезу на основе предсказаний модели, вам нужно определить и настроить несколько элементов.
### Данные
Чтобы ответить на ваш вопрос с какой-либо степенью уверенности, вам нужно хорошее количество данных правильного типа. На этом этапе вам нужно сделать две вещи:
- **Собрать данные**. Учитывая предыдущий урок о справедливости в анализе данных, собирайте ваши данные с осторожностью. Обратите внимание на источники этих данных, на любые присущие им предвзятости и задокументируйте их происхождение.
- **Подготовить данные**. В процессе подготовки данных есть несколько этапов. Вам может понадобиться собрать данные и нормализовать их, если они поступают из различных источников. Вы можете улучшить качество и количество данных с помощью различных методов, таких как преобразование строк в числа (как мы делаем в [Кластеризации](../../5-Clustering/1-Visualize/README.md)). Вы также можете генерировать новые данные на основе оригинала (как мы делаем в [Классификации](../../4-Classification/1-Introduction/README.md)). Вы можете очистить и отредактировать данные (как мы сделаем перед уроком [Веб-приложение](../../3-Web-App/README.md)). Наконец, вам также может понадобиться рандомизировать и перемешать их, в зависимости от ваших методов обучения.
✅ После сбора и обработки ваших данных, уделите время, чтобы посмотреть, позволит ли их форма решить ваш предполагаемый вопрос. Возможно, что данные не будут хорошо работать в вашей задаче, как мы обнаруживаем в наших уроках по [Кластеризации](../../5-Clustering/1-Visualize/README.md)!
### Признаки и цель
[Признак](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) — это измеримое свойство ваших данных. Во многих наборах данных он выражается в виде заголовка столбца, такого как 'дата', 'размер' или 'цвет'. Ваш признак, обычно представленный как `X` в коде, представляет собой входную переменную, которая будет использоваться для обучения модели.
Цель — это то, что вы пытаетесь предсказать. Цель обычно представлена как `y` в коде и представляет собой ответ на вопрос, который вы пытаетесь задать вашим данным: в декабре, какие **цвет** тыквы будут самыми дешевыми? в Сан-Франциско, в каких районах будет лучшая **цена** на недвижимость? Иногда цель также называется атрибутом метки.
### Выбор вашей переменной признака
🎓 **Выбор признаков и извлечение признаков** Как вы знаете, какую переменную выбрать при построении модели? Вы, вероятно, пройдете процесс выбора признаков или извлечения признаков, чтобы выбрать правильные переменные для самой производительной модели. Однако это не одно и то же: "Извлечение признаков создает новые признаки из функций оригинальных признаков, тогда как выбор признаков возвращает подмножество признаков." ([источник](https://wikipedia.org/wiki/Feature_selection))
### Визуализация ваших данных
Важным аспектом инструментов специалиста по данным является возможность визуализировать данные с помощью нескольких отличных библиотек, таких как Seaborn или MatPlotLib. Визуальное представление ваших данных может позволить вам выявить скрытые корреляции, которые вы можете использовать. Ваши визуализации также могут помочь вам выявить предвзятости или несбалансированные данные (как мы обнаруживаем в [Классификации](../../4-Classification/2-Classifiers-1/README.md)).
### Разделите ваш набор данных
Перед обучением вам нужно разделить ваш набор данных на две или более частей неравного размера, которые все еще хорошо представляют данные.
- **Обучение**. Эта часть набора данных подходит для вашей модели, чтобы обучить ее. Этот набор составляет большинство оригинального набора данных.
- **Тестирование**. Тестовый набор данных — это независимая группа данных, часто собранная из оригинальных данных, которую вы используете для подтверждения производительности построенной модели.
- **Валидация**. Валидационный набор — это меньшая независимая группа примеров, которую вы используете для настройки гиперпараметров модели или ее архитектуры, чтобы улучшить модель. В зависимости от размера ваших данных и вопроса, который вы задаете, вам может не понадобиться создавать этот третий набор (как мы отмечаем в [Прогнозировании временных рядов](../../7-TimeSeries/1-Introduction/README.md)).
## Создание модели
Используя ваши обучающие данные, ваша цель состоит в том, чтобы построить модель или статистическое представление ваших данных, используя различные алгоритмы для **обучения** ее. Обучение модели подвергает ее воздействию данных и позволяет ей делать предположения о воспринимаемых шаблонах, которые она обнаруживает, проверяет и принимает или отвергает.
### Выберите метод обучения
В зависимости от вашего вопроса и природы ваших данных вы выберете метод для ее обучения. Просматривая [документацию Scikit-learn](https://scikit-learn.org/stable/user_guide.html) — которую мы используем в этом курсе — вы можете изучить множество способов обучения модели. В зависимости от вашего опыта вам, возможно, придется попробовать несколько различных методов, чтобы построить лучшую модель. Вы, вероятно, пройдете процесс, в котором специалисты по данным оценивают производительность модели, подавая ей невидимые данные, проверяя точность, предвзятость и другие проблемы, ухудшающие качество, и выбирая наиболее подходящий метод обучения для поставленной задачи.
### Обучите модель
Вооружившись вашими обучающими данными, вы готовы 'подогнать' их, чтобы создать модель. Вы заметите, что во многих библиотеках ML вы найдете код 'model.fit' — в это время вы передаете вашу переменную признака в виде массива значений (обычно 'X') и переменную цели (обычно 'y').
### Оцените модель
После завершения процесса обучения (он может занять много итераций или 'эпох', чтобы обучить большую модель) вы сможете оценить качество модели, используя тестовые данные для оценки ее производительности. Эти данные — это подмножество оригинальных данных, которые модель ранее не анализировала. Вы можете распечатать таблицу метрик о качестве вашей модели.
🎓 **Подгонка модели**
В контексте машинного обучения подгонка модели относится к точности основной функции модели, когда она пытается анализировать данные, с которыми ей не знакомо.
🎓 **Недообучение** и **переобучение** — это распространенные проблемы, которые ухудшают качество модели, так как модель подгоняется либо недостаточно хорошо, либо слишком хорошо. Это приводит к тому, что модель делает предсказания либо слишком близко, либо слишком свободно по отношению к своим обучающим данным. Переобученная модель слишком хорошо предсказывает обучающие данные, потому что она слишком хорошо изучила детали и шум данных. Недообученная модель неточная, так как она не может точно анализировать свои обучающие данные или данные, которые она еще не 'видела'.
![переобученная модель](../../../../translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.ru.png)
> Инфографика от [Jen Looper](https://twitter.com/jenlooper)
## Настройка параметров
После завершения вашего первоначального обучения наблюдайте за качеством модели и подумайте о том, как улучшить ее, изменив ее 'гиперпараметры'. Узнайте больше о процессе [в документации](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott).
## Прогнозирование
Это момент, когда вы можете использовать совершенно новые данные для проверки точности вашей модели. В 'практическом' ML контексте, где вы создаете веб-ресурсы для использования модели в производстве, этот процесс может включать сбор пользовательского ввода (например, нажатие кнопки), чтобы установить переменную и отправить ее модели для вывода или оценки.
В этих уроках вы узнаете, как использовать эти шаги для подготовки, создания, тестирования, оценки и прогнозирования — все жесты специалиста по данным и многое другое, пока вы продвигаетесь в своем пути к становлению 'полностековым' ML инженером.
---
## 🚀Задача
Нарисуйте блок-схему, отражающую шаги практикующего ML. Где вы сейчас видите себя в процессе? Где вы предсказываете, что столкнетесь с трудностями? Что вам кажется легким?
## [Постлекционный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/8/)
## Обзор и самообучение
Поиск в интернете интервью с учеными данных, которые обсуждают свою повседневную работу. Вот [одно](https://www.youtube.com/watch?v=Z3IjgbbCEfs).
## Задание
[Интервью с ученым данных](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Интервью с дата-сайентистом
## Инструкции
В вашей компании, в группе пользователей или среди ваших друзей или однокурсников поговорите с кем-то, кто профессионально работает в качестве дата-сайентиста. Напишите короткую статью (500 слов) о их повседневной деятельности. Являются ли они специалистами или работают в формате 'full stack'?
## Критерии оценки
| Критерии | Примерно | Достаточно | Требуется улучшение |
| --------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------- | ----------------------- |
| | Эссе нужной длины с указанными источниками представлено в формате .doc | Эссе плохо оформлено или короче требуемой длины | Эссе не представлено |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,26 +0,0 @@
# Введение в машинное обучение
В этом разделе учебного плана вы познакомитесь с основными концепциями, лежащими в основе области машинного обучения, узнаете, что это такое, а также изучите его историю и техники, которые используют исследователи для работы с ним. Давайте вместе исследовать этот новый мир ML!
![глобус](../../../translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.ru.jpg)
> Фото от <a href="https://unsplash.com/@bill_oxford?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Bill Oxford</a> на <a href="https://unsplash.com/s/photos/globe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
### Уроки
1. [Введение в машинное обучение](1-intro-to-ML/README.md)
1. [История машинного обучения и ИИ](2-history-of-ML/README.md)
1. [Справедливость и машинное обучение](3-fairness/README.md)
1. [Техники машинного обучения](4-techniques-of-ML/README.md)
### Авторы
"Введение в машинное обучение" было написано с ♥️ командой, в которую входят [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) и [Jen Looper](https://twitter.com/jenlooper)
"История машинного обучения" было написано с ♥️ [Jen Looper](https://twitter.com/jenlooper) и [Amy Boyd](https://twitter.com/AmyKateNicho)
"Справедливость и машинное обучение" было написано с ♥️ [Tomomi Imura](https://twitter.com/girliemac)
"Техники машинного обучения" было написано с ♥️ [Jen Looper](https://twitter.com/jenlooper) и [Chris Noring](https://twitter.com/softchris)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,228 +0,0 @@
# Начало работы с Python и Scikit-learn для регрессионных моделей
![Сводка регрессий в скетчноте](../../../../translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.ru.png)
> Скетчнот от [Томоми Имура](https://www.twitter.com/girlie_mac)
## [Тест перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/9/)
> ### [Этот урок доступен на R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
## Введение
В этих четырех уроках вы узнаете, как строить регрессионные модели. Мы вскоре обсудим, для чего они нужны. Но прежде чем вы начнете, убедитесь, что у вас есть все необходимые инструменты для начала процесса!
В этом уроке вы научитесь:
- Настраивать ваш компьютер для локальных задач машинного обучения.
- Работать с Jupyter-ноутбуками.
- Использовать Scikit-learn, включая установку.
- Исследовать линейную регрессию с практическим заданием.
## Установки и настройки
[![ML для начинающих - Настройте свои инструменты для создания моделей машинного обучения](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML для начинающих - Настройте свои инструменты для создания моделей машинного обучения")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о настройке вашего компьютера для машинного обучения.
1. **Установите Python**. Убедитесь, что [Python](https://www.python.org/downloads/) установлен на вашем компьютере. Вы будете использовать Python для многих задач в области науки о данных и машинного обучения. Большинство компьютерных систем уже включают установку Python. Также доступны полезные [пакеты Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) для упрощения настройки для некоторых пользователей.
Однако некоторые применения Python требуют одной версии программного обеспечения, тогда как другие требуют другой версии. По этой причине полезно работать в [виртуальной среде](https://docs.python.org/3/library/venv.html).
2. **Установите Visual Studio Code**. Убедитесь, что Visual Studio Code установлен на вашем компьютере. Следуйте этим инструкциям, чтобы [установить Visual Studio Code](https://code.visualstudio.com/) для базовой установки. Вы будете использовать Python в Visual Studio Code в этом курсе, поэтому вам может понадобиться освежить свои знания о том, как [настроить Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) для разработки на Python.
> Освойте Python, пройдя через эту коллекцию [модулей обучения](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)
>
> [![Настройка Python с Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Настройка Python с Visual Studio Code")
>
> 🎥 Нажмите на изображение выше, чтобы посмотреть видео: использование Python в VS Code.
3. **Установите Scikit-learn**, следуя [этим инструкциям](https://scikit-learn.org/stable/install.html). Поскольку вам нужно убедиться, что вы используете Python 3, рекомендуется использовать виртуальную среду. Обратите внимание, что если вы устанавливаете эту библиотеку на Mac с процессором M1, на странице по ссылке выше есть специальные инструкции.
1. **Установите Jupyter Notebook**. Вам нужно [установить пакет Jupyter](https://pypi.org/project/jupyter/).
## Ваша среда для авторинга в ML
Вы будете использовать **ноутбуки** для разработки вашего кода на Python и создания моделей машинного обучения. Этот тип файла является общим инструментом для специалистов в области данных и может быть идентифицирован по своему суффиксу или расширению `.ipynb`.
Ноутбуки представляют собой интерактивную среду, которая позволяет разработчику как писать код, так и добавлять заметки и писать документацию вокруг кода, что очень полезно для экспериментальных или исследовательских проектов.
[![ML для начинающих - Настройка Jupyter Notebooks для начала построения регрессионных моделей](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML для начинающих - Настройка Jupyter Notebooks для начала построения регрессионных моделей")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео, работая над этим упражнением.
### Упражнение - работа с ноутбуком
В этой папке вы найдете файл _notebook.ipynb_.
1. Откройте _notebook.ipynb_ в Visual Studio Code.
Запустится сервер Jupyter с Python 3+. Вы найдете области ноутбука, которые могут быть `run`, куски кода. Вы можете запустить блок кода, выбрав значок, который выглядит как кнопка воспроизведения.
1. Выберите значок `md` и добавьте немного markdown, а также следующий текст **# Добро пожаловать в ваш ноутбук**.
Затем добавьте немного кода на Python.
1. Введите **print('hello notebook')** в блоке кода.
1. Выберите стрелку, чтобы запустить код.
Вы должны увидеть напечатанное сообщение:
```output
hello notebook
```
![VS Code с открытым ноутбуком](../../../../translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.ru.jpg)
Вы можете вставлять комментарии в свой код, чтобы самодокументировать ноутбук.
✅ Подумайте минуту, насколько отличается рабочая среда веб-разработчика от среды специалиста в области данных.
## Запуск Scikit-learn
Теперь, когда Python настроен в вашей локальной среде, и вы уверенно работаете с Jupyter-ноутбуками, давайте также уверенно разберемся с Scikit-learn (произносится как `sci` as in `science`). Scikit-learn предоставляет [обширный API](https://scikit-learn.org/stable/modules/classes.html#api-ref), который поможет вам выполнять задачи машинного обучения.
Согласно их [веб-сайту](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn - это библиотека машинного обучения с открытым исходным кодом, которая поддерживает как контролируемое, так и неконтролируемое обучение. Она также предоставляет различные инструменты для подгонки моделей, предварительной обработки данных, выбора и оценки моделей, а также многие другие утилиты."
В этом курсе вы будете использовать Scikit-learn и другие инструменты для создания моделей машинного обучения для выполнения того, что мы называем "традиционными задачами машинного обучения". Мы намеренно избегали нейронных сетей и глубокого обучения, так как они лучше освещены в нашей предстоящей программе "Искусственный интеллект для начинающих".
Scikit-learn упрощает процесс построения моделей и их оценки для использования. Он в основном ориентирован на использование числовых данных и содержит несколько готовых наборов данных для использования в качестве обучающих инструментов. Он также включает предварительно созданные модели для студентов, чтобы попробовать. Давайте исследуем процесс загрузки упакованных данных и использования встроенного оценщика для первой модели машинного обучения с Scikit-learn на основе некоторых базовых данных.
## Упражнение - ваш первый ноутбук Scikit-learn
> Этот учебник был вдохновлен [примером линейной регрессии](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) на веб-сайте Scikit-learn.
[![ML для начинающих - Ваш первый проект линейной регрессии на Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML для начинающих - Ваш первый проект линейной регрессии на Python")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео, работая над этим упражнением.
В файле _notebook.ipynb_, связанном с этим уроком, очистите все ячейки, нажав на значок "мусорной корзины".
В этом разделе вы будете работать с небольшим набором данных о диабете, который встроен в Scikit-learn для учебных целей. Представьте, что вы хотите протестировать лечение для диабетиков. Модели машинного обучения могут помочь вам определить, какие пациенты лучше отреагируют на лечение, основываясь на комбинациях переменных. Даже очень базовая регрессионная модель, визуализированная, может показать информацию о переменных, которая поможет вам организовать ваши теоретические клинические испытания.
✅ Существует много типов методов регрессии, и выбор зависит от ответа, который вы ищете. Если вы хотите предсказать вероятный рост человека определенного возраста, вам следует использовать линейную регрессию, так как вы ищете **числовое значение**. Если вас интересует, следует ли считать определенный тип кухни веганским или нет, вы ищете **категориальную принадлежность**, поэтому вам следует использовать логистическую регрессию. Вы узнаете больше о логистической регрессии позже. Подумайте о некоторых вопросах, которые вы можете задать данным, и о том, какой из этих методов будет более подходящим.
Давайте начнем с этой задачи.
### Импорт библиотек
Для этой задачи мы импортируем несколько библиотек:
- **matplotlib**. Это полезный [инструмент для графиков](https://matplotlib.org/), который мы будем использовать для создания линейного графика.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) - полезная библиотека для работы с числовыми данными в Python.
- **sklearn**. Это библиотека [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
Импортируйте некоторые библиотеки, чтобы помочь с вашими задачами.
1. Добавьте импорты, введя следующий код:
```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
```
Выше вы импортируете `matplotlib`, `numpy` and you are importing `datasets`, `linear_model` and `model_selection` from `sklearn`. `model_selection` is used for splitting data into training and test sets.
### The diabetes dataset
The built-in [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) includes 442 samples of data around diabetes, with 10 feature variables, some of which include:
- age: age in years
- bmi: body mass index
- bp: average blood pressure
- s1 tc: T-Cells (a type of white blood cells)
✅ This dataset includes the concept of 'sex' as a feature variable important to research around diabetes. Many medical datasets include this type of binary classification. Think a bit about how categorizations such as this might exclude certain parts of a population from treatments.
Now, load up the X and y data.
> 🎓 Remember, this is supervised learning, and we need a named 'y' target.
In a new code cell, load the diabetes dataset by calling `load_diabetes()`. The input `return_X_y=True` signals that `X` will be a data matrix, and `y`, который будет целевым значением для регрессии.
1. Добавьте несколько команд print, чтобы показать форму матрицы данных и ее первый элемент:
```python
X, y = datasets.load_diabetes(return_X_y=True)
print(X.shape)
print(X[0])
```
Что вы получаете в ответ, это кортеж. Вы присваиваете первые два значения кортежа переменным `X` and `y` соответственно. Узнайте больше [о кортежах](https://wikipedia.org/wiki/Tuple).
Вы можете видеть, что эти данные содержат 442 элемента, оформленных в массивы по 10 элементов:
```text
(442, 10)
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ Подумайте немного о связи между данными и целевым значением регрессии. Линейная регрессия предсказывает взаимосвязи между признаком X и целевой переменной y. Можете ли вы найти [целевое значение](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) для набора данных о диабете в документации? Что демонстрирует этот набор данных, учитывая целевое значение?
2. Далее выберите часть этого набора данных для построения графика, выбрав 3-й столбец набора данных. Вы можете сделать это, используя `:` operator to select all rows, and then selecting the 3rd column using the index (2). You can also reshape the data to be a 2D array - as required for plotting - by using `reshape(n_rows, n_columns)`. Если один из параметров равен -1, соответствующее измерение рассчитывается автоматически.
```python
X = X[:, 2]
X = X.reshape((-1,1))
```
В любое время выводите данные, чтобы проверить их форму.
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. Теперь вы готовы обучить свою модель! Загрузите модель линейной регрессии и обучите ее с помощью ваших обучающих наборов X и y, используя `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` is a function you'll see in many ML libraries such as TensorFlow
5. Then, create a prediction using test data, using the function `predict()`. Это будет использовано для рисования линии между группами данных
```python
y_pred = model.predict(X_test)
```
6. Теперь пора показать данные на графике. Matplotlib - очень полезный инструмент для этой задачи. Создайте диаграмму рассеяния всех тестовых данных X и y и используйте предсказание, чтобы нарисовать линию в наиболее подходящем месте, между группировками данных модели.
```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()
```
![диаграмма рассеяния, показывающая точки данных о диабете](../../../../translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.ru.png)
✅ Подумайте немного о том, что здесь происходит. Прямая линия проходит через множество мелких точек данных, но что именно она делает? Можете ли вы увидеть, как вы должны быть в состоянии использовать эту линию, чтобы предсказать, где новая, невиданная точка данных должна вписаться в отношении к оси y графика? Попробуйте сформулировать практическое использование этой модели.
Поздравляем, вы создали свою первую модель линейной регрессии, создали предсказание с ее помощью и отобразили его на графике!
---
## 🚀Задача
Постройте график другой переменной из этого набора данных. Подсказка: отредактируйте эту строку: `X = X[:,2]`. Учитывая целевое значение этого набора данных, что вы можете узнать о прогрессии диабета как болезни?
## [Тест после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/10/)
## Обзор и самообучение
В этом учебнике вы работали с простой линейной регрессией, а не с унивариантной или множественной линейной регрессией. Прочитайте немного о различиях между этими методами или посмотрите [это видео](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
Узнайте больше о концепции регрессии и подумайте, какие вопросы можно решить с помощью этой техники. Пройдите этот [учебник](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott), чтобы углубить свои знания.
## Задание
[Другой набор данных](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных переводческих сервисов на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,16 +0,0 @@
# Регрессия с использованием Scikit-learn
## Инструкции
Посмотрите на [набор данных Linnerud](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) в Scikit-learn. Этот набор данных имеет несколько [целей](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'Он состоит из трех переменных упражнений (данные) и трех физиологических (цели), собранных у двадцати мужчин среднего возраста в фитнес-клубе'.
Сформулируйте своими словами, как создать модель регрессии, которая будет отображать взаимосвязь между размером талии и количеством выполненных подтягиваний. Сделайте то же самое для других данных в этом наборе.
## Критерии оценки
| Критерии | Превосходно | Удовлетворительно | Требует улучшения |
| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- |
| Отправить описательный абзац | Отправлен хорошо написанный абзац | Отправлено несколько предложений | Описание не предоставлено |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, напишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,215 +0,0 @@
# Построение регрессионной модели с использованием Scikit-learn: подготовка и визуализация данных
![Инфографика по визуализации данных](../../../../translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.ru.png)
Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/11/)
> ### [Этот урок доступен на R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## Введение
Теперь, когда у вас есть все необходимые инструменты для начала работы с построением моделей машинного обучения с использованием Scikit-learn, вы готовы начать задавать вопросы своим данным. В процессе работы с данными и применения решений на основе машинного обучения очень важно понимать, как задать правильный вопрос, чтобы правильно раскрыть потенциал вашего набора данных.
В этом уроке вы узнаете:
- Как подготовить ваши данные для построения модели.
- Как использовать Matplotlib для визуализации данных.
## Задавание правильного вопроса вашим данным
Вопрос, на который вам нужно получить ответ, определит, какие алгоритмы машинного обучения вы будете использовать. А качество полученного ответа будет сильно зависеть от природы ваших данных.
Взгляните на [данные](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), предоставленные для этого урока. Вы можете открыть этот .csv файл в VS Code. Быстрый обзор сразу показывает, что есть пустые ячейки и смешение строковых и числовых данных. Также есть странный столбец под названием 'Package', где данные представляют собой смесь 'sacks', 'bins' и других значений. Данные, на самом деле, немного запутанные.
[![ML для начинающих - Как проанализировать и очистить набор данных](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML для начинающих - Как проанализировать и очистить набор данных")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о подготовке данных для этого урока.
На самом деле, не так уж часто бывает, что вам предоставляют набор данных, который полностью готов к использованию для создания модели машинного обучения. В этом уроке вы научитесь, как подготовить сырой набор данных с использованием стандартных библиотек Python. Вы также узнаете различные техники визуализации данных.
## Кейс-стадия: 'рынок тыкв'
В этой папке вы найдете .csv файл в корневом `data` каталоге под названием [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), который содержит 1757 строк данных о рынке тыкв, отсортированных по группам по городам. Это сырье, извлеченное из [Стандартных отчетов терминальных рынков специализированных культур](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), распространяемых Министерством сельского хозяйства США.
### Подготовка данных
Эти данные находятся в общественном достоянии. Их можно загрузить в виде множества отдельных файлов по городам с веб-сайта USDA. Чтобы избежать слишком большого количества отдельных файлов, мы объединили все городские данные в одну таблицу, таким образом, мы уже немного _подготовили_ данные. Далее давайте более внимательно взглянем на данные.
### Данные о тыквах - первые выводы
Что вы замечаете в этих данных? Вы уже видели, что есть смешение строк, чисел, пустых значений и странных данных, которые нужно понять.
Какой вопрос вы можете задать этим данным, используя технику регрессии? Как насчет "Предсказать цену тыквы на продажу в течение определенного месяца". Снова взглянув на данные, вы увидите, что необходимо внести некоторые изменения, чтобы создать необходимую структуру данных для этой задачи.
## Упражнение - проанализировать данные о тыквах
Давайте используем [Pandas](https://pandas.pydata.org/), (это название обозначает `Python Data Analysis`), инструмент, который очень полезен для обработки данных, чтобы проанализировать и подготовить эти данные о тыквах.
### Сначала проверьте на наличие пропущенных дат
Сначала вам нужно предпринять шаги для проверки на наличие пропущенных дат:
1. Преобразуйте даты в формат месяца (это американские даты, поэтому формат - `MM/DD/YYYY`).
2. Извлеките месяц в новый столбец.
Откройте файл _notebook.ipynb_ в Visual Studio Code и импортируйте таблицу в новый DataFrame Pandas.
1. Используйте функцию `head()`, чтобы просмотреть первые пять строк.
```python
import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
pumpkins.head()
```
✅ Какую функцию вы бы использовали, чтобы просмотреть последние пять строк?
1. Проверьте, есть ли пропущенные данные в текущем DataFrame:
```python
pumpkins.isnull().sum()
```
Пропущенные данные есть, но, возможно, это не будет иметь значения для текущей задачи.
1. Чтобы упростить работу с вашим DataFrame, выберите только те столбцы, которые вам нужны, используя `loc` function which extracts from the original dataframe a group of rows (passed as first parameter) and columns (passed as second parameter). The expression `:` в данном случае означает "все строки".
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]
```
### Во-вторых, определите среднюю цену тыквы
Подумайте, как определить среднюю цену тыквы в заданном месяце. Какие столбцы вы бы выбрали для этой задачи? Подсказка: вам понадобятся 3 столбца.
Решение: возьмите среднее значение столбцов `Low Price` and `High Price`, чтобы заполнить новый столбец Price, и преобразуйте столбец Date, чтобы он показывал только месяц. К счастью, согласно проверке выше, нет пропущенных данных по датам или ценам.
1. Чтобы рассчитать среднее значение, добавьте следующий код:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
```
Не стесняйтесь выводить любые данные, которые хотите проверить, используя `print(month)`.
2. Теперь скопируйте ваши преобразованные данные в новый DataFrame Pandas:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
Вывод вашего DataFrame покажет вам чистый, аккуратный набор данных, на основе которого вы можете построить свою новую регрессионную модель.
### Но подождите! Здесь что-то странное
Если вы посмотрите на столбец `Package` column, pumpkins are sold in many different configurations. Some are sold in '1 1/9 bushel' measures, and some in '1/2 bushel' measures, some per pumpkin, some per pound, and some in big boxes with varying widths.
> Pumpkins seem very hard to weigh consistently
Digging into the original data, it's interesting that anything with `Unit of Sale` equalling 'EACH' or 'PER BIN' also have the `Package` type per inch, per bin, or 'each'. Pumpkins seem to be very hard to weigh consistently, so let's filter them by selecting only pumpkins with the string 'bushel' in their `Package`.
1. Добавьте фильтр в верхней части файла, под первоначальным импортом .csv:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
Если вы сейчас выведете данные, вы увидите, что получаете только около 415 строк данных, содержащих тыквы в бушелях.
### Но подождите! Есть еще одно дело
Вы заметили, что количество бушелей варьируется от строки к строке? Вам нужно нормализовать цены, чтобы показать цену за бушель, поэтому сделайте некоторые вычисления, чтобы стандартизировать это.
1. Добавьте эти строки после блока, создающего новый DataFrame 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), вес бушеля зависит от типа продукции, так как это измерение объема. "Бушель помидоров, например, должен весить 56 фунтов... Листья и зелень занимают больше места с меньшим весом, поэтому бушель шпината весит всего 20 фунтов." Все это довольно сложно! Давайте не будем заморачиваться с преобразованием бушелей в фунты, а просто установим цену за бушель. Однако все это изучение бушелей тыкв показывает, насколько важно понимать природу ваших данных!
Теперь вы можете проанализировать цену за единицу на основе их измерения в бушелях. Если вы снова выведете данные, вы увидите, как они стандартизированы.
✅ Вы заметили, что тыквы, продаваемые по полубушелю, очень дорогие? Можете ли вы понять, почему? Подсказка: маленькие тыквы намного дороже больших, вероятно, потому что их гораздо больше на бушель, учитывая неиспользуемое пространство, занимаемое одной большой пустой тыквой.
## Стратегии визуализации
Часть работы дата-сайентиста заключается в демонстрации качества и природы данных, с которыми они работают. Для этого они часто создают интересные визуализации, или графики, диаграммы и схемы, показывающие различные аспекты данных. Таким образом, они могут визуально показать взаимосвязи и пробелы, которые иначе сложно обнаружить.
[![ML для начинающих - Как визуализировать данные с Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML для начинающих - Как визуализировать данные с Matplotlib")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о визуализации данных для этого урока.
Визуализации также могут помочь определить наиболее подходящую технику машинного обучения для данных. Например, точечный график, который кажется следящим за линией, указывает на то, что данные являются хорошим кандидатом для упражнения по линейной регрессии.
Одна из библиотек визуализации данных, которая хорошо работает в Jupyter notebooks, - это [Matplotlib](https://matplotlib.org/) (которую вы также видели в предыдущем уроке).
> Получите больше опыта в визуализации данных в [этих учебниках](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
## Упражнение - поэкспериментируйте с Matplotlib
Попробуйте создать несколько основных графиков для отображения нового DataFrame, который вы только что создали. Что покажет базовый линейный график?
1. Импортируйте Matplotlib в верхней части файла, под импортом Pandas:
```python
import matplotlib.pyplot as plt
```
1. Перезапустите весь блокнот, чтобы обновить.
1. Внизу блокнота добавьте ячейку для построения графика данных в виде бокса:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![Точечный график, показывающий зависимость цены от месяца](../../../../translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.ru.png)
Полезен ли этот график? Удивляет ли вас что-то в нем?
Он не особенно полезен, так как просто отображает ваши данные в виде разбросанных точек за определенный месяц.
### Сделайте его полезным
Чтобы графики отображали полезные данные, обычно нужно сгруппировать данные каким-то образом. Давайте попробуем создать график, где по оси y будут месяцы, а данные будут показывать распределение данных.
1. Добавьте ячейку для создания сгруппированной столбчатой диаграммы:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![Столбчатая диаграмма, показывающая зависимость цены от месяца](../../../../translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.ru.png)
Это более полезная визуализация данных! Похоже, что самая высокая цена на тыквы приходится на сентябрь и октябрь. Соответствует ли это вашим ожиданиям? Почему или почему нет?
---
## 🚀Задача
Изучите различные типы визуализаций, которые предлагает Matplotlib. Какие из них наиболее подходят для задач регрессии?
## [Викторина после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/12/)
## Обзор и самостоятельное изучение
Посмотрите на множество способов визуализации данных. Составьте список различных доступных библиотек и отметьте, какие из них лучше всего подходят для определенных типов задач, например, 2D визуализаций против 3D визуализаций. Что вы обнаружите?
## Задание
[Изучение визуализации](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,11 +0,0 @@
# Исследование визуализаций
Существует несколько различных библиотек, доступных для визуализации данных. Создайте несколько визуализаций, используя данные о тыквах в этом уроке с помощью matplotlib и seaborn в образцовом блокноте. Какие библиотеки проще использовать?
## Критерии оценивания
| Критерии | Превосходно | Удовлетворительно | Требует улучшения |
| --------- | ----------- | ----------------- | ----------------- |
| | Блокнот представлен с двумя исследованиями/визуализациями | Блокнот представлен с одним исследованием/визуализацией | Блокнот не представлен |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, пишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,370 +0,0 @@
# Построение регрессионной модели с использованием Scikit-learn: регрессия четырьмя способами
![Инфографика линейной и полиномиальной регрессии](../../../../translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.ru.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/13/)
> ### [Этот урок доступен на R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### Введение
До сих пор вы изучали, что такое регрессия, на примере данных о ценах на тыквы, которые мы будем использовать на протяжении всего этого урока. Вы также визуализировали данные с помощью Matplotlib.
Теперь вы готовы углубиться в регрессию для машинного обучения. Хотя визуализация позволяет понять данные, истинная сила машинного обучения заключается в _обучении моделей_. Модели обучаются на исторических данных, чтобы автоматически захватывать зависимости в данных, и позволяют предсказывать результаты для новых данных, которые модель не видела ранее.
В этом уроке вы узнаете больше о двух типах регрессии: _базовой линейной регрессии_ и _полиномиальной регрессии_, а также о некоторых математических основах этих техник. Эти модели позволят нам предсказать цены на тыквы в зависимости от различных входных данных.
[![Машинное обучение для начинающих - Понимание линейной регрессии](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "Машинное обучение для начинающих - Понимание линейной регрессии")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о линейной регрессии.
> На протяжении этого учебного курса мы предполагаем минимальные знания математики и стремимся сделать его доступным для студентов из других областей, поэтому обращайте внимание на заметки, 🧮 выделения, диаграммы и другие инструменты для обучения, которые помогут в понимании.
### Предварительные требования
Вы уже должны быть знакомы со структурой данных о тыквах, которую мы рассматриваем. Вы можете найти ее предварительно загруженной и очищенной в файле _notebook.ipynb_ этого урока. В файле цена на тыквы отображается за бушель в новом датафрейме. Убедитесь, что вы можете запускать эти блокноты в ядрах в Visual Studio Code.
### Подготовка
Напоминаем, что вы загружаете эти данные для того, чтобы задавать вопросы.
- Когда лучше всего покупать тыквы?
- Какую цену я могу ожидать за ящик миниатюрных тыкв?
- Должен ли я покупать их в полубушельных корзинах или в коробках по 1 1/9 бушеля?
Давайте продолжим углубляться в эти данные.
На предыдущем уроке вы создали датафрейм Pandas и заполнили его частью оригинального набора данных, стандартизировав цены по бушелю. Однако, делая это, вы смогли собрать только около 400 точек данных и только за осенние месяцы.
Посмотрите на данные, которые мы предварительно загрузили в сопровождающем блокноте этого урока. Данные загружены, и начальный рассеянный график построен, чтобы показать данные по месяцам. Возможно, мы сможем получить немного больше деталей о природе данных, очистив их более тщательно.
## Линейная регрессионная линия
Как вы узнали на Уроке 1, цель линейной регрессии состоит в том, чтобы построить линию для:
- **Показать взаимосвязи переменных**. Показать взаимосвязь между переменными
- **Сделать прогнозы**. Сделать точные прогнозы о том, где новая точка данных окажется относительно этой линии.
Для **метода наименьших квадратов** типично проводить такую линию. Термин «наименьшие квадраты» означает, что все точки данных, окружающие регрессионную линию, возводятся в квадрат, а затем складываются. В идеале эта конечная сумма должна быть как можно меньше, потому что мы хотим получить низкое количество ошибок, или `least-squares`.
Мы это делаем, поскольку хотим смоделировать линию, которая имеет наименьшее общее расстояние от всех наших точек данных. Мы также возводим в квадрат термины перед их сложением, так как нас интересует их величина, а не направление.
> **🧮 Покажите мне математику**
>
> Эта линия, называемая _линией наилучшего соответствия_, может быть выражена [по уравнению](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
> ```
> Y = a + bX
> ```
>
> `X` is the 'explanatory variable'. `Y` is the 'dependent variable'. The slope of the line is `b` and `a` is the y-intercept, which refers to the value of `Y` when `X = 0`.
>
>![calculate the slope](../../../../translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.ru.png)
>
> First, calculate the slope `b`. Infographic by [Jen Looper](https://twitter.com/jenlooper)
>
> In other words, and referring to our pumpkin data's original question: "predict the price of a pumpkin per bushel by month", `X` would refer to the price and `Y` would refer to the month of sale.
>
>![complete the equation](../../../../translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.ru.png)
>
> Calculate the value of Y. If you're paying around $4, it must be April! Infographic by [Jen Looper](https://twitter.com/jenlooper)
>
> The math that calculates the line must demonstrate the slope of the line, which is also dependent on the intercept, or where `Y` is situated when `X = 0`.
>
> You can observe the method of calculation for these values on the [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) web site. Also visit [this Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html) to watch how the numbers' values impact the line.
## Correlation
One more term to understand is the **Correlation Coefficient** between given X and Y variables. Using a scatterplot, you can quickly visualize this coefficient. A plot with datapoints scattered in a neat line have high correlation, but a plot with datapoints scattered everywhere between X and Y have a low correlation.
A good linear regression model will be one that has a high (nearer to 1 than 0) Correlation Coefficient using the Least-Squares Regression method with a line of regression.
✅ Run the notebook accompanying this lesson and look at the Month to Price scatterplot. Does the data associating Month to Price for pumpkin sales seem to have high or low correlation, according to your visual interpretation of the scatterplot? Does that change if you use more fine-grained measure instead of `Month`, eg. *day of the year* (i.e. number of days since the beginning of the year)?
In the code below, we will assume that we have cleaned up the data, and obtained a data frame called `new_pumpkins`, similar to the following:
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
---|-------|-----------|---------|------|---------|-----------|------------|-------
70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> The code to clean the data is available in [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). We have performed the same cleaning steps as in the previous lesson, and have calculated `DayOfYear` столбца с использованием следующего выражения:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
Теперь, когда вы понимаете математику, стоящую за линейной регрессией, давайте создадим регрессионную модель, чтобы увидеть, сможем ли мы предсказать, какой пакет тыкв будет иметь лучшие цены. Кто-то, покупающий тыквы для праздничной тыквенной плантации, может захотеть иметь эту информацию, чтобы оптимизировать свои покупки пакетов тыкв для плантации.
## Поиск корреляции
[![Машинное обучение для начинающих - Поиск корреляции: Ключ к линейной регрессии](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "Машинное обучение для начинающих - Поиск корреляции: Ключ к линейной регрессии")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о корреляции.
На предыдущем уроке вы, вероятно, видели, что средняя цена за разные месяцы выглядит так:
<img alt="Средняя цена по месяцам" src="../2-Data/images/barchart.png" width="50%"/>
Это предполагает, что должна быть какая-то корреляция, и мы можем попробовать обучить модель линейной регрессии, чтобы предсказать взаимосвязь между `Month` and `Price`, or between `DayOfYear` and `Price`. Here is the scatter plot that shows the latter relationship:
<img alt="Scatter plot of Price vs. Day of Year" src="images/scatter-dayofyear.png" width="50%" />
Let's see if there is a correlation using the `corr` функцией:
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
Похоже, что корреляция довольно мала, -0.15, с помощью функции `Month` and -0.17 by the `DayOfMonth`, but there could be another important relationship. It looks like there are different clusters of prices corresponding to different pumpkin varieties. To confirm this hypothesis, let's plot each pumpkin category using a different color. By passing an `ax` parameter to the `scatter`, мы можем отобразить все точки на одном графике:
```python
ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="Диаграмма рассеяния цен по дням года" src="images/scatter-dayofyear-color.png" width="50%" />
Наше исследование предполагает, что сорт имеет большее влияние на общую цену, чем фактическая дата продажи. Мы можем увидеть это на столбчатой диаграмме:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="Столбчатая диаграмма цены по сортам" src="images/price-by-variety.png" width="50%" />
Давайте на данный момент сосредоточимся только на одной сортировке тыквы, 'пироговой', и посмотрим, какое влияние дата оказывает на цену:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="Диаграмма рассеяния цен по дням года" src="images/pie-pumpkins-scatter.png" width="50%" />
Если мы теперь рассчитаем корреляцию между `Price` and `DayOfYear` using `corr` function, we will get something like `-0.27` - это означает, что обучение предсказательной модели имеет смысл.
> Прежде чем обучать модель линейной регрессии, важно убедиться, что наши данные чистые. Линейная регрессия плохо работает с отсутствующими значениями, поэтому имеет смысл избавиться от всех пустых ячеек:
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
Другой подход состоит в том, чтобы заполнить эти пустые значения средними значениями из соответствующего столбца.
## Простая линейная регрессия
[![Машинное обучение для начинающих - Линейная и полиномиальная регрессия с использованием Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "Машинное обучение для начинающих - Линейная и полиномиальная регрессия с использованием Scikit-learn")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о линейной и полиномиальной регрессии.
Для обучения нашей модели линейной регрессии мы будем использовать библиотеку **Scikit-learn**.
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
Мы начинаем с разделения входных значений (признаков) и ожидаемого вывода (метки) на отдельные массивы numpy:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> Обратите внимание, что нам пришлось выполнить `reshape` на входных данных, чтобы пакет линейной регрессии правильно его понял. Линейная регрессия ожидает 2D-массив в качестве входных данных, где каждая строка массива соответствует вектору входных признаков. В нашем случае, поскольку у нас только один вход - нам нужен массив с формой N×1, где N - это размер набора данных.
Затем нам нужно разделить данные на обучающие и тестовые наборы данных, чтобы мы могли проверить нашу модель после обучения:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
Наконец, обучение фактической модели линейной регрессии занимает всего две строки кода. Мы определяем метод `LinearRegression` object, and fit it to our data using the `fit`:
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
`LinearRegression` object after `fit`-ting contains all the coefficients of the regression, which can be accessed using `.coef_` property. In our case, there is just one coefficient, which should be around `-0.017`. It means that prices seem to drop a bit with time, but not too much, around 2 cents per day. We can also access the intersection point of the regression with Y-axis using `lin_reg.intercept_` - it will be around `21` в нашем случае, указывая на цену в начале года.
Чтобы увидеть, насколько точна наша модель, мы можем предсказать цены на тестовом наборе данных, а затем измерить, насколько близки наши прогнозы к ожидаемым значениям. Это можно сделать с помощью метрики среднеквадратичной ошибки (MSE), которая является средним всех квадратов разностей между ожидаемым и предсказанным значением.
```python
pred = lin_reg.predict(X_test)
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
```
Наша ошибка, похоже, составляет около 2 пунктов, что составляет ~17%. Не очень хорошо. Другим показателем качества модели является **коэффициент детерминации**, который можно получить следующим образом:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
Если значение равно 0, это означает, что модель не учитывает входные данные и действует как *худший линейный предсказатель*, который просто является средним значением результата. Значение 1 означает, что мы можем идеально предсказать все ожидаемые выходы. В нашем случае коэффициент составляет около 0.06, что довольно низко.
Мы также можем отобразить тестовые данные вместе с регрессионной линией, чтобы лучше увидеть, как работает регрессия в нашем случае:
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
<img alt="Линейная регрессия" src="images/linear-results.png" width="50%" />
## Полиномиальная регрессия
Другим типом линейной регрессии является полиномиальная регрессия. Хотя иногда существует линейная зависимость между переменными - чем больше тыква по объему, тем выше цена - иногда эти зависимости нельзя изобразить как плоскость или прямую линию.
✅ Вот [некоторые дополнительные примеры](https://online.stat.psu.edu/stat501/lesson/9/9.8) данных, которые могут использовать полиномиальную регрессию.
Посмотрите еще раз на взаимосвязь между датой и ценой. Кажется ли вам, что этот график рассеяния обязательно нужно анализировать с помощью прямой линии? Не могут ли цены колебаться? В этом случае вы можете попробовать полиномиальную регрессию.
✅ Полиномы - это математические выражения, которые могут состоять из одной или нескольких переменных и коэффициентов.
Полиномиальная регрессия создает кривую линию, чтобы лучше соответствовать нелинейным данным. В нашем случае, если мы включим переменную `DayOfYear`, возведенную в квадрат, в входные данные, мы должны быть в состоянии подогнать наши данные с помощью параболической кривой, которая будет иметь минимум в определенной точке в течение года.
Scikit-learn включает полезный [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline), чтобы объединить различные этапы обработки данных вместе. **Pipeline** - это цепочка **оценщиков**. В нашем случае мы создадим pipeline, который сначала добавит полиномиальные признаки в нашу модель, а затем обучит регрессию:
```python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
Используя `PolynomialFeatures(2)` means that we will include all second-degree polynomials from the input data. In our case it will just mean `DayOfYear`<sup>2</sup>, but given two input variables X and Y, this will add X<sup>2</sup>, XY and Y<sup>2</sup>. We may also use higher degree polynomials if we want.
Pipelines can be used in the same manner as the original `LinearRegression` object, i.e. we can `fit` the pipeline, and then use `predict` to get the prediction results. Here is the graph showing test data, and the approximation curve:
<img alt="Polynomial regression" src="images/poly-results.png" width="50%" />
Using Polynomial Regression, we can get slightly lower MSE and higher determination, but not significantly. We need to take into account other features!
> You can see that the minimal pumpkin prices are observed somewhere around Halloween. How can you explain this?
🎃 Congratulations, you just created a model that can help predict the price of pie pumpkins. You can probably repeat the same procedure for all pumpkin types, but that would be tedious. Let's learn now how to take pumpkin variety into account in our model!
## Categorical Features
In the ideal world, we want to be able to predict prices for different pumpkin varieties using the same model. However, the `Variety` column is somewhat different from columns like `Month`, because it contains non-numeric values. Such columns are called **categorical**.
[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 Click the image above for a short video overview of using categorical features.
Here you can see how average price depends on variety:
<img alt="Average price by variety" src="images/price-by-variety.png" width="50%" />
To take variety into account, we first need to convert it to numeric form, or **encode** it. There are several way we can do it:
* Simple **numeric encoding** will build a table of different varieties, and then replace the variety name by an index in that table. This is not the best idea for linear regression, because linear regression takes the actual numeric value of the index, and adds it to the result, multiplying by some coefficient. In our case, the relationship between the index number and the price is clearly non-linear, even if we make sure that indices are ordered in some specific way.
* **One-hot encoding** will replace the `Variety` column by 4 different columns, one for each variety. Each column will contain `1` if the corresponding row is of a given variety, and `0`, иначе. Это означает, что в линейной регрессии будет четыре коэффициента, по одному для каждой сорта тыквы, отвечающего за "начальную цену" (или скорее "дополнительную цену") для этого конкретного сорта.
Код ниже показывает, как мы можем закодировать сорт с помощью one-hot:
```python
pd.get_dummies(new_pumpkins['Variety'])
```
ID | СКАЗКА | МИНИАТЮРА | СМЕСЬ СТАРИННЫХ СОРТОВ | ПИРОГ
----|-----------|-----------|--------------------------|----------
70 | 0 | 0 | 0 | 1
71 | 0 | 0 | 0 | 1
... | ... | ... | ... | ...
1738 | 0 | 1 | 0 | 0
1739 | 0 | 1 | 0 | 0
1740 | 0 | 1 | 0 | 0
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
Чтобы обучить линейную регрессию, используя закодированную сортировку как входные данные, нам просто нужно правильно инициализировать данные `X` and `y`:
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
Остальная часть кода такая же, как и та, которую мы использовали выше для обучения линейной регрессии. Если вы попробуете, вы увидите, что среднеквадратичная ошибка примерно такая же, но мы получаем гораздо более высокий коэффициент детерминации (~77%). Чтобы получить еще более точные прогнозы, мы можем учитывать больше категориальных признаков, а также числовые признаки, такие как `Month` or `DayOfYear`. To get one large array of features, we can use `join`:
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
```
Здесь мы также учитываем тип `City` and `Package`, что дает нам MSE 2.84 (10%) и детерминацию 0.94!
## Объединение всего воедино
Чтобы создать лучшую модель, мы можем использовать объединенные (one-hot закодированные категориальные + числовые) данные из приведенного выше примера вместе с полиномиальной регрессией. Вот полный код для вашего удобства:
```python
# set up training data
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# make train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# setup and train the pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# predict results for test data
pred = pipeline.predict(X_test)
# calculate MSE and determination
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
Это должно дать нам лучший коэффициент детерминации почти 97%, и MSE=2.23 (~8% ошибка предсказания).
| Модель | MSE | Детерминация |
|-------|-----|---------------|
| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 |
| `DayOfYear` Polynomial | 2.73 (17.0%) | 0.08 |
| `Variety` Линейная | 5.24 (19.7%) | 0.77 |
| Все признаки Линейная | 2.84 (10.5%) | 0.94 |
| Все признаки Полиномиальная | 2.23 (8.25%) | 0.97 |
🏆 Отлично! Вы создали четыре регрессионные модели за один урок и улучшили качество модели до 97%. В последнем разделе о регрессии вы узнаете о логистической регрессии для определения категорий.
---
## 🚀Задача
Протестируйте несколько различных переменных в этом блокноте, чтобы увидеть, как корреляция соответствует точности модели.
## [Викторина после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)
## Обзор и самостоятельное изучение
В этом уроке мы узнали о линейной регрессии. Существуют и другие важные типы регрессии. Ознакомьтесь с техниками пошаговой, гребневой, лассо и эластичной сетки. Хороший курс для изучения, чтобы узнать больше, это [курс Стэнфордского университета по статистическому обучению](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).
## Задание
[Построить модель](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Создание модели регрессии
## Инструкции
В этом уроке вам показали, как построить модель с использованием как линейной, так и полиномиальной регрессии. Используя эти знания, найдите набор данных или воспользуйтесь одним из встроенных наборов Scikit-learn, чтобы создать новую модель. Объясните в своем ноутбуке, почему вы выбрали именно эту технику, и продемонстрируйте точность вашей модели. Если модель не точна, объясните, почему.
## Критерии оценки
| Критерии | Превосходно | Достаточно | Требует улучшения |
| ----------- | ------------------------------------------------------------ | ------------------------- | ------------------------------- |
| | представляет собой полный ноутбук с хорошо документированным решением | решение неполное | решение имеет недостатки или ошибки |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен рассматриваться как авторитетный источник. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временное заполнительПожалуйста, напишите вывод слева направо.
Это временное заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,350 +0,0 @@
# Логистическая регрессия для предсказания категорий
![Инфографика логистической и линейной регрессии](../../../../translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.ru.png)
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)
> ### [Этот урок доступен на R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
## Введение
В этом последнем уроке по регрессии, одной из основных _классических_ методов машинного обучения, мы рассмотрим логистическую регрессию. Вы будете использовать эту технику для обнаружения паттернов, чтобы предсказать бинарные категории. Является ли этот конфетой шоколадом или нет? Является ли это заболевание заразным или нет? Выберет ли этот клиент этот продукт или нет?
В этом уроке вы узнаете:
- Новую библиотеку для визуализации данных
- Техники для логистической регрессии
✅ Углубите свои знания о работе с этим типом регрессии в этом [модуле обучения](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott)
## Предварительные требования
Работая с данными о тыквах, мы уже достаточно с ними знакомы, чтобы понять, что есть одна бинарная категория, с которой мы можем работать: `Color`.
Давайте построим модель логистической регрессии, чтобы предсказать, акого цвета, скорее всего, будет данная тыква_ (оранжевая 🎃 или белая 👻).
> Почему мы говорим о бинарной классификации в уроке о регрессии? Только для удобства, так как логистическая регрессия на самом деле является [методом классификации](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), хотя и основанным на линейных методах. Узнайте о других способах классификации данных в следующей группе уроков.
## Определите вопрос
Для наших целей мы выразим это как бинарное: 'Белая' или 'Не белая'. В нашем наборе данных также есть категория 'полосатая', но случаев с ней мало, поэтому мы не будем ее использовать. Она исчезнет, как только мы удалим нулевые значения из набора данных.
> 🎃 Забавный факт: иногда мы называем белые тыквы 'призрачными' тыквами. Их не очень легко вырезать, поэтому они не так популярны, как оранжевые, но выглядят они круто! Так что мы могли бы также переформулировать наш вопрос как: 'Призрак' или 'Не призрак'. 👻
## О логистической регрессии
Логистическая регрессия отличается от линейной регрессии, о которой вы узнали ранее, несколькими важными способами.
[![Машинное обучение для начинающих - Понимание логистической регрессии для классификации машинного обучения](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "Машинное обучение для начинающих - Понимание логистической регрессии для классификации машинного обучения")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткий видеоролик о логистической регрессии.
### Бинарная классификация
Логистическая регрессия не предлагает тех же функций, что и линейная регрессия. Первая предлагает предсказание о бинарной категории ("белая или не белая"), в то время как последняя способна предсказывать непрерывные значения, например, учитывая происхождение тыквы и время сбора урожая, асколько вырастет ее цена_.
![Модель классификации тыквы](../../../../translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.ru.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
### Другие классификации
Существуют и другие типы логистической регрессии, включая многономиальную и порядковую:
- **Многономиальная**, которая включает более одной категории - "Оранжевая, Белая и Полосатая".
- **Порядковая**, которая включает упорядоченные категории, полезные, если мы хотим логически упорядочить наши результаты, как наши тыквы, которые упорядочены по конечному числу размеров (мини, см, мед, лг, хл, ххл).
![Многономиальная против порядковой регрессии](../../../../translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.ru.png)
### Переменные НЕ должны коррелировать
Помните, как линейная регрессия лучше работала с более коррелированными переменными? Логистическая регрессия - это противоположность - переменные не обязательно должны совпадать. Это работает для этих данных, которые имеют довольно слабые корреляции.
### Вам нужно много чистых данных
Логистическая регрессия даст более точные результаты, если вы используете больше данных; наш маленький набор данных не оптимален для этой задачи, так что имейте это в виду.
[![Машинное обучение для начинающих - Анализ данных и подготовка для логистической регрессии](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "Машинное обучение для начинающих - Анализ данных и подготовка для логистической регрессии")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткий видеоролик о подготовке данных для линейной регрессии.
✅ Подумайте о типах данных, которые хорошо подходят для логистической регрессии.
## Упражнение - очистите данные
Сначала немного очистите данные, удалив нулевые значения и выбрав только некоторые столбцы:
1. Добавьте следующий код:
```python
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
pumpkins = full_pumpkins.loc[:, columns_to_select]
pumpkins.dropna(inplace=True)
```
Вы всегда можете заглянуть в ваш новый датафрейм:
```python
pumpkins.info
```
### Визуализация - категориальный график
К этому моменту вы снова загрузили [стартовый блокнот](../../../../2-Regression/4-Logistic/notebook.ipynb) с данными о тыквах и очистили его, чтобы сохранить набор данных, содержащий несколько переменных, включая `Color`. Давайте визуализируем датафрейм в блокноте, используя другую библиотеку: [Seaborn](https://seaborn.pydata.org/index.html), которая построена на Matplotlib, которую мы использовали ранее.
Seaborn предлагает несколько интересных способов визуализировать ваши данные. Например, вы можете сравнить распределения данных для каждой `Variety` и `Color` в категориальном графике.
1. Создайте такой график, используя `catplot` function, using our pumpkin data `pumpkins`, и указав цветовую карту для каждой категории тыквы (оранжевая или белая):
```python
import seaborn as sns
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
sns.catplot(
data=pumpkins, y="Variety", hue="Color", kind="count",
palette=palette,
)
```
![Сетка визуализированных данных](../../../../translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.ru.png)
Наблюдая за данными, вы можете увидеть, как данные о цвете соотносятся с сортом.
✅ Учитывая этот категориальный график, какие интересные исследования вы можете представить?
### Предобработка данных: кодирование признаков и меток
Наш набор данных о тыквах содержит строковые значения для всех своих столбцов. Работа с категориальными данными интуитивно понятна для людей, но не для машин. Алгоритмы машинного обучения хорошо работают с числами. Поэтому кодирование - это очень важный шаг на этапе предобработки данных, так как оно позволяет нам преобразовать категориальные данные в числовые, не теряя никакой информации. Хорошее кодирование приводит к созданию хорошей модели.
Для кодирования признаков существует два основных типа кодировщиков:
1. Порядковый кодировщик: он хорошо подходит для порядковых переменных, которые являются категориальными переменными, где их данные следуют логическому порядку, как столбец `Item Size` в нашем наборе данных. Он создает отображение, так что каждая категория представлена числом, которое соответствует порядку категории в столбце.
```python
from sklearn.preprocessing import OrdinalEncoder
item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
ordinal_features = ['Item Size']
ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
```
2. Категориальный кодировщик: он хорошо подходит для номинальных переменных, которые являются категориальными переменными, где их данные не следуют логическому порядку, как все характеристики, отличные от `Item Size` в нашем наборе данных. Это одноразовое кодирование, что означает, что каждая категория представлена бинарным столбцом: закодированная переменная равна 1, если тыква принадлежит этой разновидности, и 0 в противном случае.
```python
from sklearn.preprocessing import OneHotEncoder
categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
categorical_encoder = OneHotEncoder(sparse_output=False)
```
Затем `ColumnTransformer` используется для объединения нескольких кодировщиков в один шаг и применения их к соответствующим столбцам.
```python
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
```
С другой стороны, для кодирования метки мы используем класс `LabelEncoder` из scikit-learn, который является утилитным классом для нормализации меток, чтобы они содержали только значения от 0 до n_classes-1 (в данном случае, 0 и 1).
```python
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])
```
Как только мы закодируем признаки и метку, мы можем объединить их в новый датафрейм `encoded_pumpkins`.
```python
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
```
✅ Каковы преимущества использования порядкового кодировщика для `Item Size` column?
### Analyse relationships between variables
Now that we have pre-processed our data, we can analyse the relationships between the features and the label to grasp an idea of how well the model will be able to predict the label given the features.
The best way to perform this kind of analysis is plotting the data. We'll be using again the Seaborn `catplot` function, to visualize the relationships between `Item Size`, `Variety` и `Color` в категориальном графике. Чтобы лучше отобразить данные, мы будем использовать закодированный столбец `Item Size` column and the unencoded `Variety`.
```python
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")
```
![Категориальный график визуализированных данных](../../../../translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.ru.png)
### Используйте график роя
Поскольку Цвет является бинарной категорией (Белый или Не белый), он требует 'специализированного подхода к визуализации'. Есть и другие способы визуализировать взаимосвязь этой категории с другими переменными.
Вы можете визуализировать переменные бок о бок с графиками Seaborn.
1. Попробуйте график 'роя', чтобы показать распределение значений:
```python
palette = {
0: 'orange',
1: 'wheat'
}
sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
```
![Рой визуализированных данных](../../../../translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.ru.png)
**Будьте осторожны**: код выше может вызвать предупреждение, поскольку Seaborn не может отобразить такое количество точек данных на графике роя. Возможным решением является уменьшение размера маркера, используя параметр 'size'. Однако имейте в виду, что это влияет на читаемость графика.
> **🧮 Покажите мне математику**
>
> Логистическая регрессия основывается на концепции 'максимального правдоподобия', используя [сигмоидные функции](https://wikipedia.org/wiki/Sigmoid_function). 'Сигмоидная функция' на графике выглядит как 'S'-образная форма. Она принимает значение и отображает его где-то между 0 и 1. Ее кривая также называется 'логистической кривой'. Ее формула выглядит так:
>
> ![логистическая функция](../../../../translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.ru.png)
>
> где средняя точка сигмоида находится на нулевой отметке x, L - максимальное значение кривой, а k - крутизна кривой. Если результат функции больше 0.5, метка в вопросе будет отнесена к классу '1' бинарного выбора. Если нет, она будет классифицирована как '0'.
## Постройте свою модель
Создание модели для нахождения этих бинарных классификаций удивительно просто в Scikit-learn.
[![Машинное обучение для начинающих - Логистическая регрессия для классификации данных](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "Машинное обучение для начинающих - Логистическая регрессия для классификации данных")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткий видеоролик о создании модели линейной регрессии.
1. Выберите переменные, которые вы хотите использовать в своей модели классификации, и разделите обучающий и тестовый наборы, вызвав `train_test_split()`:
```python
from sklearn.model_selection import train_test_split
X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
y = encoded_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
2. Теперь вы можете обучить свою модель, вызвав `fit()` с вашими обучающими данными, и напечатать ее результат:
```python
from sklearn.metrics import f1_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('F1-score: ', f1_score(y_test, predictions))
```
Посмотрите на табло вашей модели. Это неплохо, учитывая, что у вас всего около 1000 строк данных:
```output
precision recall f1-score support
0 0.94 0.98 0.96 166
1 0.85 0.67 0.75 33
accuracy 0.92 199
macro avg 0.89 0.82 0.85 199
weighted avg 0.92 0.92 0.92 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 1 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 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 1 0 0 0 0 0 0 0 0 1 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 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
0 0 0 0 1 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 1
0 0 0 1 0 0 0 0 0 0 0 0 1 1]
F1-score: 0.7457627118644068
```
## Лучшее понимание через матрицу путаницы
Хотя вы можете получить отчет о табло [условий](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report), распечатав вышеуказанные элементы, вам может быть проще понять вашу модель, используя [матрицу путаницы](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix), чтобы помочь нам понять, как модель работает.
> 🎓 '[Матрица путаницы](https://wikipedia.org/wiki/Confusion_matrix)' (или 'ошибочная матрица') - это таблица, которая выражает истинные и ложные положительные и отрицательные значения вашей модели, таким образом оценивая точность предсказаний.
1. Чтобы использовать метрики путаницы, вызовите `confusion_matrix()`:
```python
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, predictions)
```
Посмотрите на матрицу путаницы вашей модели:
```output
array([[162, 4],
[ 11, 22]])
```
В Scikit-learn строки матриц путаницы (ось 0) - это фактические метки, а столбцы (ось 1) - предсказанные метки.
| | 0 | 1 |
| :---: | :---: | :---: |
| 0 | TN | FP |
| 1 | FN | TP |
Что здесь происходит? Допустим, наша модель должна классифицировать тыквы между двумя бинарными категориями: категория 'белая' и категория 'не белая'.
- Если ваша модель предсказывает тыкву как не белую, и она на самом деле принадлежит категории 'не белая', мы называем это истинно отрицательным значением, которое отображается верхним левым числом.
- Если ваша модель предсказывает тыкву как белую, и она на самом деле принадлежит категории 'не белая', мы называем это ложно отрицательным значением, которое отображается нижним левым числом.
- Если ваша модель предсказывает тыкву как не белую, и она на самом деле принадлежит категории 'белая', мы называем это ложно положительным значением, которое отображается верхним правым числом.
- Если ваша модель предсказывает тыкву как белую, и она на самом деле принадлежит категории 'белая', мы называем это истинно положительным значением, которое отображается нижним правым числом.
Как вы могли догадаться, предпочтительно иметь большее количество истинно положительных и истинно отрицательных значений и меньшее количество ложно положительных и ложно отрицательных значений, что подразумевает, что модель работает лучше.
Как матрица путаницы соотносится с точностью и полнотой? Помните, что отчет о классификации, напечатанный выше, показал точность (0.85) и полноту (0.67).
Точность = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
Полнота = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
✅ Вопрос: Как модель справилась, согласно матрице путаницы? Ответ: Неплохо; есть хорошее количество истинно отрицательных значений, но также и несколько ложно отрицательных.
Давайте вернемся к терминам, которые мы видели ранее, с помощью отображения матрицы путаницы TP/TN и FP/FN:
🎓 Точность: TP/(TP + FP) Доля релевантных случаев среди извлеченных случаев (например, какие метки были правильно обозначены)
🎓 Полнота: TP/(TP + FN) Доля релевантных случаев, которые были извлечены, независимо от того, были ли они хорошо обозначены или нет
🎓 f1-оценка: (2 * точность * полнота)/(точность + полнота) Взвешенное среднее значение точности и полноты, где лучше всего 1, а хуже всего 0
🎓 Поддержка: Количество случаев каждой метки, извлеченных
🎓 Точность: (TP + TN)/(TP + TN + FP + FN) Процент меток, предсказанных точно для образца.
🎓 Макро-среднее: Вычисление невзвешенного среднего показателя для каждой метки, не принимая во внимание дисбаланс меток.
🎓 Взвешенное среднее: Вычисление среднего показателя для каждой метки, учитывающее дисбаланс меток, взвешивая их по их поддержке (количеству истинных случаев для каждой метки).
✅ Можете ли вы подумать, какой метрикой следует следить, если вы хотите, чтобы ваша модель уменьшила количество ложно отрицательных значений?
## Визуализируйте ROC-кривую этой модели
[![Машинное обучение для начинающих - Анализ производительности логистической регрессии с помощью ROC-кривых](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "Машинное обучение для начинающих - Анализ производительности логистической регрессии с помощью ROC-кривых")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткий видеоролик о ROC-кривых.
Давайте сделаем еще одну визуализацию, чтобы увидеть так называемую 'ROC' крив
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Повторное выполнение регрессии
## Инструкции
На уроке вы использовали подмножество данных о тыквах. Теперь вернитесь к оригинальным данным и постарайтесь использовать все из них, очищенные и стандартизированные, для построения модели логистической регрессии.
## Критерии оценки
| Критерии | Примерный | Адекватный | Требует улучшения |
|------------|---------------------------------------------------------------------|------------------------------------------------------------|-----------------------------------------------------------|
| | Представлен блокнот с хорошо объясненной и хорошо работающей моделью | Представлен блокнот с моделью, которая работает минимально | Представлен блокнот с недостаточно работающей моделью или отсутствует |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временная заглушкаПожалуйста, напишите вывод слева направо.
Это временная заглушка
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,43 +0,0 @@
# Регрессионные модели для машинного обучения
## Региональная тема: Регрессионные модели для цен на тыквы в Северной Америке 🎃
В Северной Америке тыквы часто вырезаются в страшные лица на Хэллоуин. Давайте узнаем больше об этих увлекательных овощах!
![jack-o-lanterns](../../../translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.ru.jpg)
> Фото <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Бет Тойчман</a> на <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Что вы узнаете
[![Введение в регрессию](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Видео введение в регрессию - нажмите, чтобы посмотреть!")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое вводное видео к этому уроку
Уроки в этом разделе охватывают типы регрессии в контексте машинного обучения. Регрессионные модели могут помочь определить _взаимосвязь_ между переменными. Этот тип модели может предсказывать значения, такие как длина, температура или возраст, тем самым выявляя взаимосвязи между переменными, анализируя данные.
В этой серии уроков вы узнаете о различиях между линейной и логистической регрессией, а также о том, когда следует предпочесть одну из них другой.
[![Машинное обучение для начинающих - Введение в регрессионные модели для машинного обучения](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "Машинное обучение для начинающих - Введение в регрессионные модели для машинного обучения")
> 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео, вводящее в регрессионные модели.
В этой группе уроков вы подготовитесь к выполнению задач машинного обучения, включая настройку Visual Studio Code для работы с ноутбуками, общая среда для дата-сайентистов. Вы познакомитесь с Scikit-learn, библиотекой для машинного обучения, и создадите свои первые модели, сосредоточившись на регрессионных моделях в этой главе.
> Существуют полезные инструменты с низким кодом, которые могут помочь вам изучить работу с регрессионными моделями. Попробуйте [Azure ML для этой задачи](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
### Уроки
1. [Инструменты профессии](1-Tools/README.md)
2. [Управление данными](2-Data/README.md)
3. [Линейная и полиномиальная регрессия](3-Linear/README.md)
4. [Логистическая регрессия](4-Logistic/README.md)
---
### Авторы
"Машинное обучение с регрессией" было написано с ♥️ [Джен Лупер](https://twitter.com/jenlooper)
♥️ Участники квиза: [Мухаммад Сакіб Хан Инан](https://twitter.com/Sakibinan) и [Орнелла Алтунян](https://twitter.com/ornelladotcom)
Набор данных о тыквах предложен [этим проектом на Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices), а его данные получены из [Стандартных отчетов по терминальным рынкам специализированных культур](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), распространяемых Министерством сельского хозяйства США. Мы добавили некоторые данные о цвете на основе сорта для нормализации распределения. Эти данные находятся в общественном достоянии.
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,348 +0,0 @@
# Создание веб-приложения для использования ML модели
В этом уроке вы обучите ML модель на наборе данных, который просто невероятен: аблюдения НЛО за последний век_, собранные из базы данных NUFORC.
Вы узнаете:
- Как "заквасить" обученную модель
- Как использовать эту модель в приложении Flask
Мы продолжим использовать ноутбуки для очистки данных и обучения нашей модели, но вы можете сделать шаг вперед, исследуя использование модели "в дикой природе", так сказать: в веб-приложении.
Для этого вам нужно создать веб-приложение с использованием Flask.
## [Предварительный опрос](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/17/)
## Создание приложения
Существует несколько способов создания веб-приложений для работы с моделями машинного обучения. Ваша веб-архитектура может повлиять на то, как ваша модель будет обучена. Представьте, что вы работаете в компании, где группа специалистов по данным обучила модель, которую они хотят, чтобы вы использовали в приложении.
### Условия
Существует множество вопросов, которые вам нужно задать:
- **Это веб-приложение или мобильное приложение?** Если вы создаете мобильное приложение или вам нужно использовать модель в контексте IoT, вы можете использовать [TensorFlow Lite](https://www.tensorflow.org/lite/) и использовать модель в приложении Android или iOS.
- **Где будет находиться модель?** В облаке или локально?
- **Поддержка оффлайн.** Должно ли приложение работать в оффлайн-режиме?
- **Какая технология использовалась для обучения модели?** Выбранная технология может повлиять на инструменты, которые вам нужно использовать.
- **Использование TensorFlow.** Если вы обучаете модель с помощью TensorFlow, например, эта экосистема предоставляет возможность конвертировать модель TensorFlow для использования в веб-приложении с помощью [TensorFlow.js](https://www.tensorflow.org/js/).
- **Использование PyTorch.** Если вы создаете модель с использованием библиотеки, такой как [PyTorch](https://pytorch.org/), у вас есть возможность экспортировать ее в формате [ONNX](https://onnx.ai/) (Open Neural Network Exchange) для использования в JavaScript веб-приложениях, которые могут использовать [Onnx Runtime](https://www.onnxruntime.ai/). Эта опция будет рассмотрена в будущем уроке для модели, обученной с помощью Scikit-learn.
- **Использование Lobe.ai или Azure Custom Vision.** Если вы используете систему ML SaaS (Программное обеспечение как услуга), такую как [Lobe.ai](https://lobe.ai/) или [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) для обучения модели, это программное обеспечение предоставляет способы экспорта модели для многих платформ, включая создание индивидуального API, который можно запрашивать в облаке вашим онлайн-приложением.
У вас также есть возможность создать целое веб-приложение Flask, которое будет способно обучать модель прямо в веб-браузере. Это также можно сделать с помощью TensorFlow.js в контексте JavaScript.
Для наших целей, поскольку мы работали с ноутбуками на Python, давайте рассмотрим шаги, которые вам нужно предпринять, чтобы экспортировать обученную модель из такого ноутбука в формат, читаемый веб-приложением на Python.
## Инструменты
Для этой задачи вам понадобятся два инструмента: Flask и Pickle, оба из которых работают на Python.
✅ Что такое [Flask](https://palletsprojects.com/p/flask/)? Определяемый его создателями как "микрофреймворк", Flask предоставляет основные функции веб-фреймворков с использованием Python и движка шаблонов для создания веб-страниц. Ознакомьтесь с [этим учебным модулем](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott), чтобы попрактиковаться в создании приложений с помощью Flask.
✅ Что такое [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 — это модуль Python, который сериализует и десериализует структуру объекта Python. Когда вы "заквашиваете" модель, вы сериализуете или упрощаете ее структуру для использования в вебе. Будьте осторожны: pickle не является intrinsically безопасным, поэтому будьте осторожны, если вас попросят "распаковать" файл. У файла, созданного с помощью pickle, есть суффикс `.pkl`.
## Упражнение - очистите ваши данные
В этом уроке вы будете использовать данные о 80,000 наблюдениях НЛО, собранных [NUFORC](https://nuforc.org) (Национальным центром отчетности по НЛО). Эти данные содержат интересные описания наблюдений НЛО, например:
- **Длинное примерное описание.** "Человек выходит из луча света, который светит на травяное поле ночью, и бежит к парковке Texas Instruments".
- **Короткое примерное описание.** "огни преследовали нас".
Электронная таблица [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) включает столбцы о `city`, `state` и `country`, где произошло наблюдение, `shape` объекта и его `latitude` и `longitude`.
В пустом [ноутбуке](../../../../3-Web-App/1-Web-App/notebook.ipynb), включенном в этот урок:
1. импортируйте `pandas`, `matplotlib` и `numpy`, как вы делали в предыдущих уроках, и импортируйте таблицу ufos. Вы можете взглянуть на образец набора данных:
```python
import pandas as pd
import numpy as np
ufos = pd.read_csv('./data/ufos.csv')
ufos.head()
```
1. Преобразуйте данные ufos в небольшой dataframe с новыми заголовками. Проверьте уникальные значения в поле `Country`.
```python
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
ufos.Country.unique()
```
1. Теперь вы можете уменьшить объем данных, с которыми нам нужно работать, удалив любые нулевые значения и импортировав только наблюдения от 1 до 60 секунд:
```python
ufos.dropna(inplace=True)
ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
ufos.info()
```
1. Импортируйте библиотеку `LabelEncoder` из Scikit-learn, чтобы преобразовать текстовые значения для стран в числа:
✅ 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, а вектор y будет `Country`. You want to be able to input `Seconds`, `Latitude` and `Longitude`, и получите идентификатор страны для возврата.
```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. Обучите вашу модель, используя логистическую регрессию:
```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))
```
Точность неплохая **(около 95%)**, как и следовало ожидать, поскольку `Country` and `Latitude/Longitude` correlate.
The model you created isn't very revolutionary as you should be able to infer a `Country` from its `Latitude` and `Longitude`, но это хорошее упражнение, чтобы попытаться обучить модель на очищенных, экспортированных данных, а затем использовать эту модель в веб-приложении.
## Упражнение - "заквасите" вашу модель
Теперь пришло время аквасить_ вашу модель! Вы можете сделать это всего за несколько строк кода. Как только она будет аквашена_, загрузите вашу заквашенную модель и протестируйте ее на образце массива данных, содержащем значения для секунд, широты и долготы,
```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'**, что является кодом страны для Великобритании. Дико! 👽
## Упражнение - создайте приложение Flask
Теперь вы можете создать приложение Flask, чтобы вызвать вашу модель и вернуть аналогичные результаты, но в более визуально привлекательном виде.
1. Начните с создания папки **web-app** рядом с файлом _notebook.ipynb_, где находится ваш файл _ufo-model.pkl_.
1. В этой папке создайте еще три папки: **static**, с папкой **css** внутри, и **templates**. Теперь у вас должны быть следующие файлы и каталоги:
```output
web-app/
static/
css/
templates/
notebook.ipynb
ufo-model.pkl
```
✅ Обратитесь к папке с решением, чтобы увидеть готовое приложение
1. Первый файл, который нужно создать в папке _web-app_, это файл **requirements.txt**. Как _package.json_ в приложении JavaScript, этот файл перечисляет зависимости, необходимые приложению. В **requirements.txt** добавьте строки:
```text
scikit-learn
pandas
numpy
flask
```
1. Теперь запустите этот файл, перейдя в _web-app_:
```bash
cd web-app
```
1. В вашем терминале введите `pip install`, чтобы установить библиотеки, перечисленные в _requirements.txt_:
```bash
pip install -r requirements.txt
```
1. Теперь вы готовы создать еще три файла, чтобы завершить приложение:
1. Создайте **app.py** в корне.
2. Создайте **index.html** в каталоге _templates_.
3. Создайте **styles.css** в каталоге _static/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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>🛸 UFO Appearance Prediction! 👽</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<div class="grid">
<div class="box">
<p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p>
<form action="{{ url_for('predict')}}" method="post">
<input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" />
<input type="text" name="latitude" placeholder="Latitude" required="required" />
<input type="text" name="longitude" placeholder="Longitude" required="required" />
<button type="submit" class="btn">Predict country where the UFO is seen</button>
</form>
<p>{{ prediction_text }}</p>
</div>
</div>
</body>
</html>
```
Обратите внимание на шаблонизирование в этом файле. Заметьте синтаксис "мустанг" вокруг переменных, которые будут предоставлены приложением, таких как текст предсказания: `{{}}`. There's also a form that posts a prediction to the `/predict` route.
Finally, you're ready to build the python file that drives the consumption of the model and the display of predictions:
1. In `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) while running the web app using Flask, any changes you make to your application will be reflected immediately without the need to restart the server. Beware! Don't enable this mode in a production app.
If you run `python app.py` or `python3 app.py` - your web server starts up, locally, and you can fill out a short form to get an answer to your burning question about where UFOs have been sighted!
Before doing that, take a look at the parts of `app.py`:
1. First, dependencies are loaded and the app starts.
1. Then, the model is imported.
1. Then, index.html is rendered on the home route.
On the `/predict` route, several things happen when the form is posted:
1. The form variables are gathered and converted to a numpy array. They are then sent to the model and a prediction is returned.
2. The Countries that we want displayed are re-rendered as readable text from their predicted country code, and that value is sent back to index.html to be rendered in the template.
Using a model this way, with Flask and a pickled model, is relatively straightforward. The hardest thing is to understand what shape the data is that must be sent to the model to get a prediction. That all depends on how the model was trained. This one has three data points to be input in order to get a prediction.
In a professional setting, you can see how good communication is necessary between the folks who train the model and those who consume it in a web or mobile app. In our case, it's only one person, you!
---
## 🚀 Challenge
Instead of working in a notebook and importing the model to the Flask app, you could train the model right within the Flask app! Try converting your Python code in the notebook, perhaps after your data is cleaned, to train the model from within the app on a route called `train`. Каковы плюсы и минусы использования этого метода?
## [Пост-лекционный опрос](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/18/)
## Обзор и самостоятельное изучение
Существует множество способов создания веб-приложения для работы с ML моделями. Составьте список способов, с помощью которых вы можете использовать JavaScript или Python для создания веб-приложения, чтобы использовать машинное обучение. Рассмотрите архитектуру: должна ли модель оставаться в приложении или находиться в облаке? Если последнее, то как бы вы к ней обращались? Нарисуйте архитектурную модель для прикладного ML веб-решения.
## Задание
[Попробуйте другую модель](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Попробуйте другую модель
## Инструкции
Теперь, когда вы создали одно веб-приложение с использованием обученной модели регрессии, используйте одну из моделей из предыдущего урока по регрессии, чтобы заново создать это веб-приложение. Вы можете сохранить стиль или изменить его, чтобы отразить данные о тыквах. Будьте осторожны, изменяя входные данные, чтобы они соответствовали методу обучения вашей модели.
## Критерии оценки
| Критерии | Превосходно | Достаточно | Требуется улучшение |
| ------------------------- | --------------------------------------------------------- | ------------------------------------------------------- | -------------------------------------- |
| | Веб-приложение работает как ожидалось и развернуто в облаке | В веб-приложении есть недостатки или оно демонстрирует неожиданные результаты | Веб-приложение не функционирует должным образом |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,24 +0,0 @@
# Создание веб-приложения для использования вашей модели ML
В этом разделе учебного плана вы познакомитесь с прикладной темой машинного обучения: как сохранить вашу модель Scikit-learn в файл, который можно использовать для прогнозирования в веб-приложении. После того как модель будет сохранена, вы узнаете, как использовать ее в веб-приложении, созданном с помощью Flask. Сначала вы создадите модель, используя данные о наблюдениях НЛО! Затем вы построите веб-приложение, которое позволит вам ввести количество секунд с широтой и долготой, чтобы предсказать, какая страна сообщила о наблюдении НЛО.
![Парковка НЛО](../../../translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.ru.jpg)
Фото от <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Майкла Херрена</a> на <a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Уроки
1. [Создание веб-приложения](1-Web-App/README.md)
## Авторы
"Создание веб-приложения" было написано с ♥️ [Джен Лупер](https://twitter.com/jenlooper).
♥️ Викторины были написаны Роханом Раджем.
Датасет был получен с [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings).
Архитектура веб-приложения была предложена частично в [этой статье](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) и [этом репозитории](https://github.com/abhinavsagar/machine-learning-deployment) Абхинава Сагара.
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-переводческих сервисов. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,302 +0,0 @@
# Введение в классификацию
В этих четырех уроках вы исследуете основное направление классического машинного обучения - _классификацию_. Мы рассмотрим использование различных алгоритмов классификации с набором данных о всех замечательных кухнях Азии и Индии. Надеюсь, вы голодны!
![просто щепотка!](../../../../translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.ru.png)
> Празднуйте паназиатские кухни в этих уроках! Изображение от [Jen Looper](https://twitter.com/jenlooper)
Классификация - это форма [обучения с учителем](https://wikipedia.org/wiki/Supervised_learning), которая имеет много общего с регрессионными техниками. Если машинное обучение связано с предсказанием значений или названий вещей с использованием наборов данных, то классификация обычно делится на две группы: _бинарная классификация_ и _многоклассовая классификация_.
[![Введение в классификацию](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Введение в классификацию")
> 🎥 Нажмите на изображение выше для просмотра видео: Джон Гуттаг из MIT представляет классификацию
Помните:
- **Линейная регрессия** помогла вам предсказать взаимосвязи между переменными и сделать точные прогнозы о том, где новая точка данных будет находиться относительно этой линии. Например, вы могли предсказать, _сколько будет стоить тыква в сентябре по сравнению с декабрем_.
- **Логистическая регрессия** помогла вам открыть "бинарные категории": по этой цене, _является ли эта тыква оранжевой или не оранжевой_?
Классификация использует различные алгоритмы для определения других способов определения метки или класса точки данных. Давайте поработаем с этими данными о кухне, чтобы выяснить, можем ли мы, наблюдая за группой ингредиентов, определить ее кухню происхождения.
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)
> ### [Этот урок доступен на R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### Введение
Классификация является одной из основных задач исследователя машинного обучения и специалиста по данным. От базовой классификации бинарного значения ("является ли это письмо спамом или нет?") до сложной классификации и сегментации изображений с использованием компьютерного зрения, всегда полезно уметь сортировать данные по классам и задавать им вопросы.
Чтобы выразить процесс более научным языком, ваш метод классификации создает предсказательную модель, которая позволяет вам сопоставить взаимосвязь между входными переменными и выходными переменными.
![бинарная против многоклассовой классификации](../../../../translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.ru.png)
> Бинарные и многоклассовые задачи для алгоритмов классификации. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
Прежде чем начать процесс очистки наших данных, визуализации и подготовки их для наших задач машинного обучения, давайте немного узнаем о различных способах, которыми машинное обучение может быть использовано для классификации данных.
Производная от [статистики](https://wikipedia.org/wiki/Statistical_classification), классификация с использованием классического машинного обучения использует такие характеристики, как `smoker`, `weight` и `age` для определения ероятности развития X заболевания_. Как метод обучения с учителем, аналогичный выполненным вами ранее регрессионным упражнениям, ваши данные имеют метки, и алгоритмы машинного обучения используют эти метки для классификации и предсказания классов (или 'характеристик') набора данных и назначения их группе или результату.
✅ Потратьте минутку, чтобы представить набор данных о кухнях. На какие вопросы мог бы ответить многоклассовый модель? На какие вопросы мог бы ответить бинарный модель? Что, если вы хотите определить, вероятно ли, что данная кухня использует пажитник? Что, если вы хотите узнать, сможете ли вы создать типичное индийское блюдо, имея в наличии пакет с полным набором аниса, артишоков, цветной капусты и хрена?
[![Сумасшедшие загадочные корзины](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Сумасшедшие загадочные корзины")
> 🎥 Нажмите на изображение выше для просмотра видео. Основная идея шоу 'Chopped' - это 'загадочная корзина', где повара должны приготовить какое-то блюдо из случайного выбора ингредиентов. Конечно, модель машинного обучения могла бы помочь!
## Привет, 'классификатор'
Вопрос, который мы хотим задать этому набору данных о кухне, на самом деле является **многоклассовым вопросом**, так как у нас есть несколько потенциальных национальных кухонь, с которыми можно работать. Учитывая набор ингредиентов, какой из этих классов подходит для данных?
Scikit-learn предлагает несколько различных алгоритмов для классификации данных, в зависимости от того, какую задачу вы хотите решить. В следующих двух уроках вы узнаете о нескольких из этих алгоритмов.
## Упражнение - очистите и сбалансируйте ваши данные
Первой задачей перед началом этого проекта является очистка и **балансировка** ваших данных для получения лучших результатов. Начните с пустого файла _notebook.ipynb_ в корне этой папки.
Первое, что нужно установить - это [imblearn](https://imbalanced-learn.org/stable/). Это пакет Scikit-learn, который позволит вам лучше сбалансировать данные (вы узнаете больше об этой задаче через минуту).
1. Чтобы установить `imblearn`, выполните `pip install`, вот так:
```python
pip install imblearn
```
1. Импортируйте пакеты, которые вам нужны для импорта данных и их визуализации, также импортируйте `SMOTE` из `imblearn`.
```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()` will read the content of the csv file _cusines.csv_ and place it in the variable `df`.
1. Проверьте форму данных:
```python
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 | 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
<class 'pandas.core.frame.DataFrame'>
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()`:
```python
df.cuisine.value_counts().plot.barh()
```
![распределение данных по кухне](../../../../translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.ru.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. Создайте функцию `create_ingredient()` на Python для создания датафрейма ингредиентов. Эта функция начнет с удаления ненужного столбца и отсортирует ингредиенты по их количеству:
```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
```
Теперь вы можете использовать эту функцию, чтобы получить представление о десяти самых популярных ингредиентах по кухне.
1. Вызовите `create_ingredient()` and plot it calling `barh()`:
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![тайская](../../../../translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.ru.png)
1. Сделайте то же самое для японских данных:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![японская](../../../../translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.ru.png)
1. Теперь для китайских ингредиентов:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![китайская](../../../../translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.ru.png)
1. Постройте график индийских ингредиентов:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![индийская](../../../../translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.ru.png)
1. Наконец, постройте график корейских ингредиентов:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![корейская](../../../../translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.ru.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) - "Техника синтетического увеличения выборки для меньшинств" - для их балансировки.
1. Вызовите `fit_resample()`, эта стратегия генерирует новые образцы путем интерполяции.
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
Сбалансировав ваши данные, вы получите лучшие результаты при их классификации. Подумайте о бинарной классификации. Если большинство ваших данных принадлежит одному классу, модель машинного обучения будет чаще предсказывать этот класс, просто потому, что для него больше данных. Балансировка данных помогает устранить этот дисбаланс.
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. Последний шаг - сохранить ваши сбалансированные данные, включая метки и характеристики, в новый датафрейм, который можно экспортировать в файл:
```python
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. Вы можете еще раз взглянуть на данные, используя `transformed_df.head()` and `transformed_df.info()`. Сохраните копию этих данных для использования в будущих уроках:
```python
transformed_df.head()
transformed_df.info()
transformed_df.to_csv("../data/cleaned_cuisines.csv")
```
Этот свежий CSV теперь можно найти в корневой папке данных.
---
## 🚀Задача
Этот курс содержит несколько интересных наборов данных. Просмотрите папки `data` и посмотрите, есть ли среди них наборы данных, которые подойдут для бинарной или многоклассовой классификации? Какие вопросы вы бы задали этому набору данных?
## [Пост-лекционный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)
## Обзор и самостоятельное изучение
Изучите API SMOTE. Для каких случаев его лучше всего использовать? Какие проблемы он решает?
## Задание
[Изучите методы классификации](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Изучение методов классификации
## Инструкции
В [документации Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) вы найдете большой список способов классификации данных. Проведите небольшую охоту за сокровищами в этих документах: ваша задача — найти методы классификации и сопоставить их с набором данных из этой учебной программы, вопросом, который вы можете задать, и техникой классификации. Создайте таблицу или таблицу в .doc файле и объясните, как набор данных будет работать с алгоритмом классификации.
## Критерии оценки
| Критерии | Превосходно | Адекватно | Требуется улучшение |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| | представлен документ, в котором рассматриваются 5 алгоритмов вместе с техникой классификации. Обзор хорошо объяснен и детализирован. | представлен документ, в котором рассматриваются 3 алгоритма вместе с техникой классификации. Обзор хорошо объяснен и детализирован. | представлен документ, в котором рассматриваются менее трех алгоритмов вместе с техникой классификации, и обзор не является ни хорошо объясненным, ни детализированным. |
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недопонимания или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, напишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,244 +0,0 @@
# Классификаторы кухонь 1
На этом уроке вы будете использовать набор данных, который вы сохранили с последнего урока, заполненный сбалансированными, чистыми данными о кухнях.
Вы будете использовать этот набор данных с различными классификаторами, чтобы _предсказать определенную национальную кухню на основе группы ингредиентов_. В процессе вы узнаете больше о том, как алгоритмы могут быть использованы для задач классификации.
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/21/)
# Подготовка
Предполагая, что вы завершили [Урок 1](../1-Introduction/README.md), убедитесь, что файл _cleaned_cuisines.csv_ существует в корневом `/data` каталоге для этих четырех уроков.
## Упражнение - предсказать национальную кухню
1. Работая в папке _notebook.ipynb_ этого урока, импортируйте этот файл вместе с библиотекой Pandas:
```python
import pandas as pd
cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
cuisines_df.head()
```
Данные выглядят так:
| | 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. Разделите координаты 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. Удалите `Unnamed: 0` column and the `cuisine` column, calling `drop()`. Сохраните остальные данные как обучаемые признаки:
```python
cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
cuisines_feature_df.head()
```
Ваши признаки выглядят так:
| | 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 |
Теперь вы готовы обучить свою модель!
## Выбор классификатора
Теперь, когда ваши данные чисты и готовы к обучению, вам нужно решить, какой алгоритм использовать для этой задачи.
Scikit-learn группирует классификацию в рамках Обучения с учителем, и в этой категории вы найдете множество способов классификации. [Разнообразие](https://scikit-learn.org/stable/supervised_learning.html) может показаться довольно запутанным с первого взгляда. Следующие методы включают в себя классификационные техники:
- Линейные модели
- Метод опорных векторов
- Стохастический градиентный спуск
- Ближайшие соседи
- Гауссовские процессы
- Деревья решений
- Ансамблевые методы (классификатор голосования)
- Алгоритмы для многоклассовой и многовыходной классификации (многоклассовая и многометочная классификация, многоклассовая многовыходная классификация)
> Вы также можете использовать [нейронные сети для классификации данных](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), но это выходит за рамки данного урока.
### Какой классификатор выбрать?
Итак, какой классификатор вам следует выбрать? Часто полезно протестировать несколько и искать хороший результат. Scikit-learn предлагает [сравнение бок о бок](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) на созданном наборе данных, сравнивая KNeighbors, SVC двумя способами, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB и QuadraticDiscriminantAnalysis, показывая результаты в визуализированном виде:
![сравнение классификаторов](../../../../translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.ru.png)
> Графики, созданные в документации Scikit-learn
> AutoML аккуратно решает эту проблему, проводя эти сравнения в облаке, позволяя вам выбрать лучший алгоритм для ваших данных. Попробуйте это [здесь](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
### Лучший подход
Однако лучший способ, чем просто угадывать, - это следовать идеям на этом загружаемом [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Здесь мы обнаруживаем, что для нашей многоклассовой задачи у нас есть несколько вариантов:
![чек-лист для многоклассовых задач](../../../../translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.ru.png)
> Раздел Чек-листа алгоритмов Microsoft, описывающий варианты многоклассовой классификации
✅ Скачайте этот чек-лист, распечатайте его и повесьте на стену!
### Рассуждения
Давайте посмотрим, сможем ли мы рассуждать о различных подходах, учитывая имеющиеся ограничения:
- **Нейронные сети слишком громоздки**. Учитывая наш чистый, но минимальный набор данных и то, что мы проводим обучение локально через ноутбуки, нейронные сети слишком тяжелы для этой задачи.
- **Нет двухклассового классификатора**. Мы не используем двухклассовый классификатор, поэтому это исключает один-против-всех.
- **Дерево решений или логистическая регрессия могут сработать**. Дерево решений может сработать, или логистическая регрессия для многоклассовых данных.
- **Многоклассовые усиленные деревья решений решают другую задачу**. Многоклассовое усиленное дерево решений наиболее подходит для непараметрических задач, например, задач, предназначенных для построения рейтингов, поэтому это не полезно для нас.
### Использование Scikit-learn
Мы будем использовать Scikit-learn для анализа наших данных. Однако существует множество способов использовать логистическую регрессию в Scikit-learn. Ознакомьтесь с [параметрами для передачи](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
В сущности, есть два важных параметра - `multi_class` and `solver` - that we need to specify, when we ask Scikit-learn to perform a logistic regression. The `multi_class` value applies a certain behavior. The value of the solver is what algorithm to use. Not all solvers can be paired with all `multi_class` values.
According to the docs, in the multiclass case, the training algorithm:
- **Uses the one-vs-rest (OvR) scheme**, if the `multi_class` option is set to `ovr`
- **Uses the cross-entropy loss**, if the `multi_class` option is set to `multinomial`. (Currently the `multinomial` option is supported only by the lbfgs, sag, saga and newton-cg solvers.)"
> 🎓 The 'scheme' here can either be 'ovr' (one-vs-rest) or 'multinomial'. Since logistic regression is really designed to support binary classification, these schemes allow it to better handle multiclass classification tasks. [source](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 The 'solver' is defined as "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 offers this table to explain how solvers handle different challenges presented by different kinds of data structures:
![solvers](../../../../translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.ru.png)
## Exercise - split the data
We can focus on logistic regression for our first training trial since you recently learned about the latter in a previous lesson.
Split your data into training and testing groups by calling `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)
```
## Упражнение - применить логистическую регрессию
Поскольку вы используете многоклассовый случай, вам нужно выбрать, какую _схему_ использовать и какой _решатель_ установить. Используйте LogisticRegression с многоклассовой настройкой и решателем **liblinear** для обучения.
1. Создайте логистическую регрессию с multi_class, установленным на `ovr` and the solver set to `liblinear`:
```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`, which is often set as default
> Note, use 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. Получите больше информации, распечатав отчет о классификации, как вы делали на уроках регрессии:
```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 предоставляет для классификации данных. Углубитесь в концепцию 'решателя', чтобы понять, что происходит за кулисами.
## [Викторина после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/22/)
## Обзор и самостоятельное изучение
Углубитесь немного больше в математику логистической регрессии в [этом уроке](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## Задание
[Изучите решатели](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,12 +0,0 @@
# Изучение решателей
## Инструкции
На этом уроке вы узнали о различных решателях, которые связывают алгоритмы с процессом машинного обучения для создания точной модели. Пройдитесь по решателям, перечисленным в уроке, и выберите два. Сравните и сопоставьте эти два решателя своими словами. Какую проблему они решают? Как они работают с различными структурами данных? Почему вы выбрали один из них, а не другой?
## Критерии оценки
| Критерии | Превосходно | Достаточно | Требуется улучшение |
| --------- | ----------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------ |
| | Файл .doc представлен с двумя абзацами, по одному на каждый решатель, с продуманным сравнением. | Файл .doc представлен только с одним абзацем | Задание не завершено |
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, напишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,238 +0,0 @@
# Классификаторы кухни 2
На этом втором уроке классификации вы изучите больше способов классификации числовых данных. Вы также узнаете о последствиях выбора одного классификатора вместо другого.
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)
### Предварительные требования
Мы предполагаем, что вы завершили предыдущие уроки и у вас есть очищенный набор данных в папке `data`, названный _cleaned_cuisines.csv_ в корне этой папки из 4 уроков.
### Подготовка
Мы загрузили ваш файл _notebook.ipynb_ с очищенным набором данных и разделили его на датафреймы X и y, готовые к процессу построения модели.
## Карта классификации
Ранее вы узнали о различных вариантах, которые у вас есть при классификации данных, используя шпаргалку от Microsoft. Scikit-learn предлагает аналогичную, но более детализированную шпаргалку, которая может помочь вам уточнить ваши оценщики (другое название для классификаторов):
![ML Карта от Scikit-learn](../../../../translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.ru.png)
> Совет: [посетите эту карту онлайн](https://scikit-learn.org/stable/tutorial/machine_learning_map/) и щелкайте по пути, чтобы прочитать документацию.
### План
Эта карта очень полезна, когда у вас есть четкое представление о ваших данных, так как вы можете «идти» по ее путям к решению:
- У нас >50 образцов
- Мы хотим предсказать категорию
- У нас есть размеченные данные
- У нас менее 100K образцов
- ✨ Мы можем выбрать Линейный SVC
- Если это не сработает, поскольку у нас числовые данные
- Мы можем попробовать ✨ KNeighbors Classifier
- Если это не сработает, попробуйте ✨ SVC и ✨ Ensemble Classifiers
Это очень полезный маршрут для следования.
## Упражнение - разделите данные
Следуя этому пути, мы должны начать с импорта некоторых библиотек для использования.
1. Импортируйте необходимые библиотеки:
```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
```
2. Разделите свои обучающие и тестовые данные:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## Классификатор линейного SVC
Кластеризация на основе опорных векторов (SVC) является частью семейства методов машинного обучения на основе опорных векторов (узнайте больше об этих методах ниже). В этом методе вы можете выбрать «ядро», чтобы решить, как кластеризовать метки. Параметр «C» относится к «регуляризации», которая регулирует влияние параметров. Ядро может быть одним из [нескольких](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); здесь мы устанавливаем его на «линейное», чтобы убедиться, что мы используем линейный SVC. Вероятность по умолчанию равна «ложь»; здесь мы устанавливаем ее на «истина», чтобы собрать оценки вероятности. Мы устанавливаем случайное состояние на «0», чтобы перемешать данные и получить вероятности.
### Упражнение - примените линейный SVC
Начните с создания массива классификаторов. Вы будете постепенно добавлять в этот массив по мере тестирования.
1. Начните с линейного SVC:
```python
C = 10
# Create different classifiers.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
}
```
2. Обучите свою модель, используя линейный 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-соседей
K-соседи являются частью семейства методов машинного обучения «соседей», которые могут использоваться как для контролируемого, так и для неконтролируемого обучения. В этом методе создается предопределенное количество точек, и данные собираются вокруг этих точек таким образом, чтобы можно было предсказать обобщенные метки для данных.
### Упражнение - примените классификатор K-соседей
Предыдущий классификатор был хорош и хорошо работал с данными, но, возможно, мы можем добиться большей точности. Попробуйте классификатор K-соседей.
1. Добавьте строку в свой массив классификаторов (добавьте запятую после элемента линейного 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-соседях](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)
## Классификатор опорных векторов
Классификаторы опорных векторов являются частью семейства [методов опорных векторов](https://wikipedia.org/wiki/Support-vector_machine) машинного обучения, которые используются для задач классификации и регрессии. SVM «отображают обучающие примеры в точки в пространстве», чтобы максимизировать расстояние между двумя категориями. Последующие данные отображаются в это пространство, чтобы можно было предсказать их категорию.
### Упражнение - примените классификатор опорных векторов
Давайте попробуем добиться немного большей точности с помощью классификатора опорных векторов.
1. Добавьте запятую после элемента K-соседей, а затем добавьте эту строку:
```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
```
✅ Узнайте о [опорных векторах](https://scikit-learn.org/stable/modules/svm.html#svm)
## Ансамблевые классификаторы
Давайте следовать пути до самого конца, даже если предыдущий тест был довольно хорош. Попробуем некоторые «ансамблевые классификаторы», в частности 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
```
✅ Узнайте о [ансамблевых классификаторах](https://scikit-learn.org/stable/modules/ensemble.html)
Этот метод машинного обучения «объединяет прогнозы нескольких базовых оценщиков», чтобы улучшить качество модели. В нашем примере мы использовали случайные деревья и AdaBoost.
- [Случайный лес](https://scikit-learn.org/stable/modules/ensemble.html#forest), метод усреднения, строит «лес» из «деревьев решений», infused with randomness, чтобы избежать переобучения. Параметр n_estimators устанавливается на количество деревьев.
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) подгоняет классификатор к набору данных, а затем подгоняет копии этого классификатора к тому же набору данных. Он сосредоточен на весах неправильно классифицированных элементов и корректирует подгонку для следующего классификатора.
---
## 🚀Задача
Каждый из этих методов имеет множество параметров, которые вы можете настраивать. Изучите параметры по умолчанию для каждого из них и подумайте о том, что означает изменение этих параметров для качества модели.
## [Посттест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)
## Обзор и самообучение
В этих уроках много специализированной терминологии, поэтому уделите минуту, чтобы ознакомиться с [этим списком](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) полезных терминов!
## Задание
[Игра с параметрами](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный перевод, выполненный человеком. Мы не несем ответственности за любые недопонимания или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Параметры игры
## Инструкции
Существует множество параметров, которые устанавливаются по умолчанию при работе с этими классификаторами. Intellisense в VS Code может помочь вам разобраться в них. Примените одну из техник классификации машинного обучения в этом уроке и повторно обучите модели, изменяя различные значения параметров. Создайте блокнот, объясняющий, почему некоторые изменения улучшают качество модели, в то время как другие ухудшают его. Будьте подробными в своем ответе.
## Критерии оценки
| Критерии | Примерный | Адекватный | Требует улучшения |
| ------------ | -------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ----------------------------- |
| | Представлен блокнот с полностью собранным классификатором, параметры которого изменены, и изменения объяснены в текстовых блоках | Блокнот частично представлен или плохо объяснен | Блокнот содержит ошибки или недостатки |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, напишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,317 +0,0 @@
# Создание веб-приложения для рекомендации кухни
В этом уроке вы создадите классификационную модель, используя некоторые из техник, которые вы изучили на предыдущих уроках, и с помощью вкусного набора данных о кухне, используемого на протяжении всей этой серии. Кроме того, вы создадите небольшое веб-приложение для использования сохраненной модели, используя веб-исполнение Onnx.
Одно из самых полезных практических применений машинного обучения — это создание систем рекомендаций, и сегодня вы можете сделать первый шаг в этом направлении!
[![Презентация этого веб-приложения](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Прикладное ML")
> 🎥 Нажмите на изображение выше для просмотра видео: Джен Лупер создает веб-приложение, используя классифицированные данные о кухне
## [Тест перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/25/)
В этом уроке вы узнаете:
- Как построить модель и сохранить ее в формате Onnx
- Как использовать Netron для инспекции модели
- Как использовать вашу модель в веб-приложении для вывода
## Постройте свою модель
Создание прикладных ML-систем является важной частью использования этих технологий для ваших бизнес-систем. Вы можете использовать модели в ваших веб-приложениях (и, таким образом, использовать их в оффлайн-контексте, если это необходимо), используя Onnx.
В [предыдущем уроке](../../3-Web-App/1-Web-App/README.md) вы создали модель регрессии о наблюдениях НЛО, "засолили" ее и использовали в приложении Flask. Хотя эта архитектура очень полезна для понимания, это полностековое Python-приложение, и ваши требования могут включать использование JavaScript-приложения.
В этом уроке вы можете создать базовую систему на основе JavaScript для вывода. Однако сначала вам нужно обучить модель и конвертировать ее для использования с Onnx.
## Упражнение - обучите классификационную модель
Сначала обучите классификационную модель, используя очищенный набор данных о кухнях, который мы использовали.
1. Начните с импорта полезных библиотек:
```python
!pip install skl2onnx
import pandas as pd
```
Вам нужен '[skl2onnx](https://onnx.ai/sklearn-onnx/)', чтобы помочь конвертировать вашу модель Scikit-learn в формат Onnx.
1. Затем работайте с вашими данными так же, как вы делали это в предыдущих уроках, прочитав CSV-файл с помощью `read_csv()`:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. Удалите первые два ненужных столбца и сохраните оставшиеся данные как 'X':
```python
X = data.iloc[:,2:]
X.head()
```
1. Сохраните метки как 'y':
```python
y = data[['cuisine']]
y.head()
```
### Начните рутинное обучение
Мы будем использовать библиотеку 'SVC', которая имеет хорошую точность.
1. Импортируйте соответствующие библиотеки из Scikit-learn:
```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 так, как вы делали это в предыдущем уроке:
```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. Выведите отчет о классификации, чтобы проверить качество модели:
```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
Убедитесь, что вы выполняете конвертацию с правильным числом тензоров. В этом наборе данных перечислено 380 ингредиентов, поэтому вам нужно указать это число в `FloatTensorType`:
1. Конвертируйте, используя число тензоров 380.
```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())
```
> Обратите внимание, что вы можете передавать [опции](https://onnx.ai/sklearn-onnx/parameterized.html) в вашем скрипте конвертации. В этом случае мы передали 'nocl' как True и 'zipmap' как False. Поскольку это классификационная модель, у вас есть возможность удалить ZipMap, который создает список словарей (не обязательно). `nocl` refers to class information being included in the model. Reduce your model's size by setting `nocl` to 'True'.
Running the entire notebook will now build an Onnx model and save it to this folder.
## View your model
Onnx models are not very visible in Visual Studio code, but there's a very good free software that many researchers use to visualize the model to ensure that it is properly built. Download [Netron](https://github.com/lutzroeder/Netron) and open your model.onnx file. You can see your simple model visualized, with its 380 inputs and classifier listed:
![Netron visual](../../../../translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.ru.png)
Netron is a helpful tool to view your models.
Now you are ready to use this neat model in a web app. Let's build an app that will come in handy when you look in your refrigerator and try to figure out which combination of your leftover ingredients you can use to cook a given cuisine, as determined by your model.
## Build a recommender web application
You can use your model directly in a web app. This architecture also allows you to run it locally and even offline if needed. Start by creating an `index.html` file in the same folder where you stored your `model.onnx` файл.
1. В этом файле _index.html_ добавьте следующий разметку:
```html
<!DOCTYPE html>
<html>
<header>
<title>Cuisine Matcher</title>
</header>
<body>
...
</body>
</html>
```
1. Теперь, работая внутри тегов `body`, добавьте немного разметки, чтобы показать список флажков, отражающих некоторые ингредиенты:
```html
<h1>Check your refrigerator. What can you create?</h1>
<div id="wrapper">
<div class="boxCont">
<input type="checkbox" value="4" class="checkbox">
<label>apple</label>
</div>
<div class="boxCont">
<input type="checkbox" value="247" class="checkbox">
<label>pear</label>
</div>
<div class="boxCont">
<input type="checkbox" value="77" class="checkbox">
<label>cherry</label>
</div>
<div class="boxCont">
<input type="checkbox" value="126" class="checkbox">
<label>fenugreek</label>
</div>
<div class="boxCont">
<input type="checkbox" value="302" class="checkbox">
<label>sake</label>
</div>
<div class="boxCont">
<input type="checkbox" value="327" class="checkbox">
<label>soy sauce</label>
</div>
<div class="boxCont">
<input type="checkbox" value="112" class="checkbox">
<label>cumin</label>
</div>
</div>
<div style="padding-top:10px">
<button onClick="startInference()">What kind of cuisine can you make?</button>
</div>
```
Обратите внимание, что каждому флажку присвоено значение. Это отражает индекс, где ингредиент находится в соответствии с набором данных. Например, яблоко в этом алфавитном списке занимает пятый столбец, поэтому его значение '4', так как мы начинаем считать с 0. Вы можете обратиться к [таблице ингредиентов](../../../../4-Classification/data/ingredient_indexes.csv), чтобы узнать индекс данного ингредиента.
Продолжая вашу работу в файле index.html, добавьте блок скрипта, где модель вызывается после последнего закрывающего `</div>`.
1. Сначала импортируйте [Onnx Runtime](https://www.onnxruntime.ai/):
```html
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
```
> Onnx Runtime используется для запуска ваших моделей Onnx на широком спектре аппаратных платформ, включая оптимизации и API для использования.
1. После того как Runtime установлен, вы можете вызвать его:
```html
<script>
const ingredients = Array(380).fill(0);
const checks = [...document.querySelectorAll('.checkbox')];
checks.forEach(check => {
check.addEventListener('change', function() {
// toggle the state of the ingredient
// based on the checkbox's value (1 or 0)
ingredients[check.value] = check.checked ? 1 : 0;
});
});
function testCheckboxes() {
// validate if at least one checkbox is checked
return checks.some(check => check.checked);
}
async function startInference() {
let atLeastOneChecked = testCheckboxes()
if (!atLeastOneChecked) {
alert('Please select at least one ingredient.');
return;
}
try {
// create a new session and load the model.
const session = await ort.InferenceSession.create('./model.onnx');
const input = new ort.Tensor(new Float32Array(ingredients), [1, 380]);
const feeds = { float_input: input };
// feed inputs and run
const results = await session.run(feeds);
// read from results
alert('You can enjoy ' + results.label.data[0] + ' cuisine today!')
} catch (e) {
console.log(`failed to inference ONNX model`);
console.error(e);
}
}
</script>
```
В этом коде происходит несколько вещей:
1. Вы создали массив из 380 возможных значений (1 или 0), которые будут установлены и отправлены в модель для вывода, в зависимости от того, отмечен ли флажок ингредиента.
2. Вы создали массив флажков и способ определить, были ли они отмечены в `init` function that is called when the application starts. When a checkbox is checked, the `ingredients` array is altered to reflect the chosen ingredient.
3. You created a `testCheckboxes` function that checks whether any checkbox was checked.
4. You use `startInference` function when the button is pressed and, if any checkbox is checked, you start inference.
5. The inference routine includes:
1. Setting up an asynchronous load of the model
2. Creating a Tensor structure to send to the model
3. Creating 'feeds' that reflects the `float_input` input that you created when training your model (you can use Netron to verify that name)
4. Sending these 'feeds' to the model and waiting for a response
## Test your application
Open a terminal session in Visual Studio Code in the folder where your index.html file resides. Ensure that you have [http-server](https://www.npmjs.com/package/http-server) installed globally, and type `http-server` на приглашении. Должен открыться localhost, и вы сможете увидеть ваше веб-приложение. Проверьте, какая кухня рекомендована на основе различных ингредиентов:
![веб-приложение для ингредиентов](../../../../translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.ru.png)
Поздравляем, вы создали веб-приложение для 'рекомендаций' с несколькими полями. Потратьте время на доработку этой системы!
## 🚀Задача
Ваше веб-приложение очень минималистично, поэтому продолжайте его развивать, используя ингредиенты и их индексы из данных [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv). Какие сочетания вкусов помогают создать национальное блюдо?
## [Тест после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/26/)
## Обзор и самообучение
Хотя этот урок лишь затронул полезность создания системы рекомендаций для ингредиентов пищи, эта область применения 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/
## Задание
[Создайте новый рекомендатель](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных переводческих сервисов на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные истолкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Создание рекомендателя
## Инструкции
Учитывая ваши упражнения в этом уроке, теперь вы знаете, как создать веб-приложение на JavaScript с использованием Onnx Runtime и преобразованной модели Onnx. Поэкспериментируйте с созданием нового рекомендателя, используя данные из этих уроков или взятые из других источников (не забудьте указать источник). Вы можете создать рекомендателя для домашних животных, основываясь на различных личностных характеристиках, или рекомендателя музыкальных жанров в зависимости от настроения человека. Проявите креативность!
## Критерии оценки
| Критерии | Примерно | Приемлемо | Нуждается в улучшении |
| --------- | --------------------------------------------------------------------- | -------------------------------------- | ------------------------------------- |
| | Веб-приложение и блокнот представлены, оба хорошо задокументированы и работают | Одно из этих двух отсутствует или имеет недостатки | Оба отсутствуют или имеют недостатки |
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,30 +0,0 @@
# Начало работы с классификацией
## Региональная тема: Вкусные азиатские и индийские кухни 🍜
В Азии и Индии кулинарные традиции чрезвычайно разнообразны и очень вкусны! Давайте посмотрим на данные о региональных кухнях, чтобы попытаться понять их ингредиенты.
![Продавец тайской еды](../../../translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.ru.jpg)
> Фото от <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Лишенга Чанга</a> на <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Чему вы научитесь
В этом разделе вы продолжите изучение регрессии и узнаете о других классификаторах, которые можно использовать для лучшего понимания данных.
> Существуют полезные инструменты с низким кодом, которые могут помочь вам научиться работать с моделями классификации. Попробуйте [Azure ML для этой задачи](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## Уроки
1. [Введение в классификацию](1-Introduction/README.md)
2. [Больше классификаторов](2-Classifiers-1/README.md)
3. [Еще классификаторы](3-Classifiers-2/README.md)
4. [Прикладное машинное обучение: создание веб-приложения](4-Applied/README.md)
## Авторы
"Начало работы с классификацией" написано с ♥️ [Кэсси Бревиу](https://www.twitter.com/cassiebreviu) и [Джен Лупер](https://www.twitter.com/jenlooper)
Набор данных о вкусных кухнях был получен с [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines).
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных переводческих сервисов на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,215 +0,0 @@
# Введение в кластеризацию
Кластеризация — это тип [неконтролируемого обучения](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")
> 🎥 Нажмите на изображение выше для просмотра видео. Пока вы изучаете машинное обучение с помощью кластеризации, насладитесь некоторыми нигерийскими танцевальными треками — это высоко оцененная песня 2014 года от PSquare.
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)
### Введение
[Кластеризация](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) очень полезна для исследования данных. Давайте посмотрим, может ли она помочь выявить тенденции и паттерны в том, как нигерийская аудитория потребляет музыку.
✅ Потратьте минуту, чтобы подумать о применении кластеризации. В реальной жизни кластеризация происходит всякий раз, когда у вас есть куча белья, и вам нужно отсортировать одежду членов вашей семьи 🧦👕👖🩲. В науке о данных кластеризация происходит при попытке проанализировать предпочтения пользователя или определить характеристики любого неразмеченного набора данных. Кластеризация, по сути, помогает разобраться в хаосе, как ящик для носок.
[![Введение в машинное обучение](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Введение в кластеризацию")
> 🎥 Нажмите на изображение выше для просмотра видео: Джон Гуттаг из MIT представляет кластеризацию.
В профессиональной среде кластеризация может использоваться для определения таких вещей, как сегментация рынка, определение возрастных групп, которые покупают те или иные товары. Другим примером использования может быть обнаружение аномалий, возможно, для выявления мошенничества по набору данных кредитных карточек. Или вы можете использовать кластеризацию для определения опухолей в партии медицинских сканирований.
✅ Подумайте минуту о том, как вы могли столкнуться с кластеризацией в реальной жизни, в банковской, электронной коммерции или бизнесе.
> 🎓 Интересно, что кластерный анализ возник в областях антропологии и психологии в 1930-х годах. Можете ли вы представить, как он мог быть использован?
Кроме того, вы можете использовать его для группировки результатов поиска — по ссылкам для покупок, изображениям или отзывам, например. Кластеризация полезна, когда у вас есть большой набор данных, который вы хотите сократить и на котором хотите провести более детальный анализ, поэтому эта техника может быть использована для изучения данных перед тем, как будут построены другие модели.
✅ После того как ваши данные организованы в кластеры, вы присваиваете им идентификатор кластера, и эта техника может быть полезна для сохранения конфиденциальности набора данных; вы можете вместо этого ссылаться на точку данных по ее идентификатору кластера, а не по более раскрывающим идентифицируемым данным. Можете ли вы подумать о других причинах, почему вы бы ссылались на идентификатор кластера, а не на другие элементы кластера для его идентификации?
Углубите свои знания о техниках кластеризации в этом [учебном модуле](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)
## Начало работы с кластеризацией
[Scikit-learn предлагает широкий выбор](https://scikit-learn.org/stable/modules/clustering.html) методов для выполнения кластеризации. Тип, который вы выберете, будет зависеть от вашего случая использования. Согласно документации, каждый метод имеет различные преимущества. Вот упрощенная таблица методов, поддерживаемых Scikit-learn, и их соответствующих случаев использования:
| Название метода | Случай использования |
| :---------------------------- | :--------------------------------------------------------------------- |
| K-Means | общего назначения, индуктивный |
| Пропаганда сродства | много, неравномерные кластеры, индуктивный |
| Mean-shift | много, неравномерные кластеры, индуктивный |
| Спектральная кластеризация | немного, равномерные кластеры, трансдуктивный |
| Иерархическая кластеризация | много, ограниченные кластеры, трансдуктивный |
| Агломеративная кластеризация | много, ограниченные, неевклидовые расстояния, трансдуктивный |
| DBSCAN | неравномерная геометрия, неравномерные кластеры, трансдуктивный |
| OPTICS | неравномерная геометрия, неравномерные кластеры с переменной плотностью, трансдуктивный |
| Гауссовские смеси | плоская геометрия, индуктивный |
| BIRCH | большой набор данных с выбросами, индуктивный |
> 🎓 То, как мы создаем кластеры, во многом зависит от того, как мы собираем точки данных в группы. Давайте разберем некоторые термины:
>
> 🎓 ['Трансдуктивный' против 'индуктивного'](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> Трансдуктивное вывод — это вывод, основанный на наблюдаемых обучающих случаях, которые соответствуют конкретным тестовым случаям. Индуктивное вывод — это вывод, основанный на обучающих случаях, которые соответствуют общим правилам, которые затем применяются к тестовым случаям.
>
> Пример: представьте, что у вас есть набор данных, который частично размечен. Некоторые элементы — это 'пластинки', некоторые — 'CD', а некоторые — пустые. Ваша задача — предоставить метки для пустых. Если вы выберете индуктивный подход, вы будете обучать модель, ищущую 'пластинки' и 'CD', и примените эти метки к вашим неразмеченным данным. Этот подход будет иметь проблемы с классификацией вещей, которые на самом деле являются 'кассетами'. Трансдуктивный подход, с другой стороны, более эффективно обрабатывает эти неизвестные данные, так как он работает над группировкой похожих элементов вместе, а затем применяет метку к группе. В этом случае кластеры могут отражать 'круглые музыкальные вещи' и 'квадратные музыкальные вещи'.
>
> 🎓 ['Не плоская' против 'плоской' геометрии](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
>
> Происходя из математической терминологии, не плоская и плоская геометрия относится к измерению расстояний между точками с помощью либо 'плоских' ([евклидовых](https://wikipedia.org/wiki/Euclidean_geometry)), либо 'неплоских' (неевклидовых) геометрических методов.
>
> 'Плоская' в этом контексте относится к евклидовой геометрии (части которой преподаются как 'плоскостная' геометрия), а неплоская относится к неевклидовой геометрии. Какое отношение имеет геометрия к машинному обучению? Что ж, как две области, основанные на математике, должно быть общее средство измерения расстояний между точками в кластерах, и это можно сделать 'плоским' или 'неплоским' способом, в зависимости от природы данных. [Евклидовы расстояния](https://wikipedia.org/wiki/Euclidean_distance) измеряются как длина отрезка между двумя точками. [Неевклидовы расстояния](https://wikipedia.org/wiki/Non-Euclidean_geometry) измеряются вдоль кривой. Если ваши данные, визуализированные, кажутся не существующими на плоскости, вам может потребоваться использовать специализированный алгоритм для их обработки.
>
![Плоская и неплоская геометрия Инфографика](../../../../translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.ru.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
>
> 🎓 ['Расстояния'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
>
> Кластеры определяются их матрицей расстояний, т.е. расстояниями между точками. Это расстояние можно измерять несколькими способами. Евклидовы кластеры определяются средним значением значений точек и содержат 'центроид' или центральную точку. Таким образом, расстояния измеряются по отношению к этому центроиду. Неевклидовы расстояния относятся к 'кластроидам', точке, ближайшей к другим точкам. Кластроиды, в свою очередь, могут быть определены различными способами.
>
> 🎓 ['Ограниченные'](https://wikipedia.org/wiki/Constrained_clustering)
>
> [Ограниченная кластеризация](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) вводит 'полу-контролируемое' обучение в этот неконтролируемый метод. Связи между точками помечаются как 'не могут быть связаны' или 'должны быть связаны', поэтому на набор данных накладываются некоторые правила.
>
> Пример: если алгоритм запускается на партии неразмеченных или полуразмеченных данных, кластеры, которые он производит, могут быть низкого качества. В приведенном выше примере кластеры могут группировать 'круглые музыкальные вещи', 'квадратные музыкальные вещи' и 'треугольные вещи' и 'печенье'. Если задать некоторые ограничения или правила ("предмет должен быть сделан из пластика", "предмет должен уметь производить музыку"), это может помочь 'ограничить' алгоритм, чтобы он делал лучшие выборы.
>
> 🎓 'Плотность'
>
> Данные, которые являются 'шумными', считаются 'плотными'. Расстояния между точками в каждом из кластеров могут оказаться, при проверке, более или менее плотными или 'переполненными', и поэтому эти данные необходимо анализировать с использованием соответствующего метода кластеризации. [Эта статья](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) демонстрирует разницу между использованием алгоритмов K-Means и HDBSCAN для изучения шумного набора данных с неравномерной плотностью кластеров.
## Алгоритмы кластеризации
Существует более 100 алгоритмов кластеризации, и их использование зависит от природы имеющихся данных. Давайте обсудим некоторые из основных:
- **Иерархическая кластеризация**. Если объект классифицируется по близости к близлежащему объекту, а не к более удаленному, кластеры формируются на основе расстояния их членов к другим объектам. Агломеративная кластеризация Scikit-learn является иерархической.
![Инфографика иерархической кластеризации](../../../../translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.ru.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **Кластеризация по центроиду**. Этот популярный алгоритм требует выбора 'k', или количества кластеров, которые нужно сформировать, после чего алгоритм определяет центральную точку кластера и собирает данные вокруг этой точки. [Кластеризация K-средних](https://wikipedia.org/wiki/K-means_clustering) является популярной версией кластеризации по центроиду. Центр определяется ближайшим средним значением, отсюда и название. Квадрат расстояния от кластера минимизируется.
![Инфографика кластеризации по центроиду](../../../../translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.ru.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **Кластеризация на основе распределения**. Основанная на статистическом моделировании, кластеризация на основе распределения сосредотачивается на определении вероятности того, что точка данных принадлежит кластеру, и присвоении ее соответственно. Методы гауссовских смесей относятся к этому типу.
- **Кластеризация на основе плотности**. Точки данных присваиваются кластерам на основе их плотности или их группировки друг вокруг друга. Точки данных, находящиеся далеко от группы, считаются выбросами или шумом. DBSCAN, Mean-shift и OPTICS относятся к этому типу кластеризации.
- **Кластеризация на основе сетки**. Для многомерных наборов данных создается сетка, и данные распределяются между ячейками сетки, тем самым создавая кластеры.
## Упражнение - кластеризуйте ваши данные
Кластеризация как техника значительно выигрывает от надлежащей визуализации, поэтому давайте начнем с визуализации наших музыкальных данных. Это упражнение поможет нам решить, какой из методов кластеризации мы должны использовать наиболее эффективно для данного набора данных.
1. Откройте файл [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) в этой папке.
1. Импортируйте пакет `Seaborn` для хорошей визуализации данных.
```python
!pip install seaborn
```
1. Добавьте данные о песнях из [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/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
<class 'pandas.core.frame.DataFrame'>
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:
```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 |
## [Викторина после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)
## Обзор и самостоятельное изучение
Прежде чем применять алгоритмы кластеризации, как мы уже узнали, полезно понять природу вашего набора данных. Подробнее об этом можно прочитать [здесь](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
[Эта полезная статья](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) знакомит вас с различными способами поведения различных алгоритмов кластеризации в зависимости от форм данных.
## Задание
[Исследуйте другие визуализации для кластеризации](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Исследуйте другие визуализации для кластеризации
## Инструкции
В этом уроке вы работали с некоторыми техниками визуализации, чтобы понять, как визуализировать ваши данные в подготовке к их кластеризации. В частности, диаграммы рассеяния полезны для нахождения групп объектов. Исследуйте различные способы и библиотеки для создания диаграмм рассеяния и документируйте свою работу в блокноте. Вы можете использовать данные из этого урока, других уроков или данные, которые вы соберете сами (пожалуйста, укажите источник в вашем блокноте). Постройте несколько диаграмм рассеяния и объясните, что вы обнаружили.
## Критерии оценки
| Критерии | Превосходно | Достаточно | Требуется улучшение |
|------------|--------------------------------------------------------------|------------------------------------------------------------------------------------------|------------------------------------|
| | Блокнот представлен с пятью хорошо документированными диаграммами рассеяния | Блокнот представлен с менее чем пятью диаграммами рассеяния, и он менее хорошо документирован | Представлен неполный блокнот |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, пишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных переводческих сервисов на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недопонимания или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,250 +0,0 @@
# Кластеризация K-Means
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)
На этом уроке вы узнаете, как создавать кластеры с помощью Scikit-learn и набора данных о нигерийской музыке, который вы импортировали ранее. Мы рассмотрим основы K-Means для кластеризации. Имейте в виду, что, как вы узнали на предыдущем уроке, существует множество способов работы с кластерами, и метод, который вы используете, зависит от ваших данных. Мы попробуем K-Means, так как это наиболее распространенная техника кластеризации. Давайте начнем!
Термины, о которых вы узнаете:
- Оценка силуэта
- Метод локтя
- Инерция
- Дисперсия
## Введение
[Кластеризация K-Means](https://wikipedia.org/wiki/K-means_clustering) — это метод, полученный из области обработки сигналов. Он используется для деления и разделения групп данных на 'k' кластеров с использованием серии наблюдений. Каждое наблюдение помогает сгруппировать данный объект данных ближе к его ближайшему 'среднему' значению, или центру кластера.
Кластеры можно визуализировать в виде [диаграмм Вороного](https://wikipedia.org/wiki/Voronoi_diagram), которые включают точку (или 'семя') и соответствующий ей регион.
![диаграмма Вороного](../../../../translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.ru.png)
> Инфографика от [Jen Looper](https://twitter.com/jenlooper)
Процесс кластеризации K-Means [выполняется в три этапа](https://scikit-learn.org/stable/modules/clustering.html#k-means):
1. Алгоритм выбирает k-число центров, выбирая из набора данных. После этого он зацикливается:
1. Он присваивает каждому образцу ближайший центроид.
2. Он создает новые центроиды, беря среднее значение всех образцов, присвоенных предыдущим центроидам.
3. Затем он вычисляет разницу между новыми и старыми центроидами и повторяет процесс, пока центроиды не стабилизируются.
Одним из недостатков использования K-Means является то, что вам нужно установить 'k', то есть количество центроидов. К счастью, 'метод локтя' помогает оценить хорошее начальное значение для 'k'. Вы попробуете это через минуту.
## Предварительные требования
Вы будете работать в файле [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) этого урока, который включает импорт данных и предварительную очистку, которую вы сделали на последнем уроке.
## Упражнение - подготовка
Начните с того, чтобы еще раз взглянуть на данные о песнях.
1. Создайте боксплот, вызвав `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)
```
Эти данные немного шумные: наблюдая за каждым столбцом в виде боксплота, вы можете увидеть выбросы.
![выбросы](../../../../translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.ru.png)
Вы могли бы просмотреть набор данных и удалить эти выбросы, но это сделает данные довольно минимальными.
1. На данный момент выберите, какие столбцы вы будете использовать для вашего упражнения по кластеризации. Выберите столбцы с похожими диапазонами и закодируйте столбец `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. Используйте этот массив, чтобы рассчитать 'оценку силуэта':
```python
from sklearn import metrics
score = metrics.silhouette_score(X, y_cluster_kmeans)
score
```
## Оценка силуэта
Ищите оценку силуэта, ближе к 1. Эта оценка варьируется от -1 до 1, и если оценка равна 1, кластер плотный и хорошо отделен от других кластеров. Значение около 0 представляет собой перекрывающиеся кластеры с образцами, очень близкими к границе решения соседних кластеров. [(Источник)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
Наша оценка **.53**, что означает, что она находится посередине. Это указывает на то, что наши данные не очень хорошо подходят для этого типа кластеризации, но давайте продолжим.
### Упражнение - создание модели
1. Импортируйте `KMeans` и начните процесс кластеризации.
```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_)
```
Здесь есть несколько частей, которые требуют объяснения.
> 🎓 диапазон: Это итерации процесса кластеризации
> 🎓 random_state: "Определяет генерацию случайных чисел для инициализации центроидов." [Источник](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 WCSS: "суммы квадратов внутри кластера" измеряют среднее квадратное расстояние всех точек внутри кластера до центроида кластера. [Источник](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce).
> 🎓 Инерция: Алгоритмы K-Means пытаются выбрать центроиды, чтобы минимизировать 'инерцию', "меру того, насколько внутренне согласованны кластеры." [Источник](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++', которая "инициализирует центроиды так, чтобы они (в целом) были далеки друг от друга, что приводит к, вероятно, лучшим результатам, чем случайная инициализация."
### Метод локтя
Ранее вы предположили, что, поскольку вы нацелились на 3 музыкальных жанра, вам следует выбрать 3 кластера. Но так ли это?
1. Используйте 'метод локтя', чтобы убедиться.
```python
plt.figure(figsize=(10,5))
sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red')
plt.title('Elbow')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
```
Используйте переменную `wcss`, которую вы создали на предыдущем шаге, чтобы создать график, показывающий, где находится 'изгиб' в локте, что указывает на оптимальное количество кластеров. Может быть, это **и есть** 3!
![метод локтя](../../../../translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.ru.png)
## Упражнение - отображение кластеров
1. Попробуйте процесс снова, на этот раз установив три кластера, и отобразите кластеры в виде точечного графика:
```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)))
```
Точность этой модели не очень хороша, и форма кластеров подсказывает вам, почему.
![кластеры](../../../../translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.ru.png)
Эти данные слишком несбалансированы, слишком слабо коррелированы, и между значениями столбцов слишком велика дисперсия для хорошей кластеризации. На самом деле, кластеры, которые формируются, вероятно, сильно влияют или искажены тремя жанровыми категориями, которые мы определили выше. Это был процесс обучения!
В документации Scikit-learn вы можете увидеть, что модель, подобная этой, с плохо очерченными кластерами, имеет проблему 'дисперсии':
![проблемные модели](../../../../translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.ru.png)
> Инфографика от Scikit-learn
## Дисперсия
Дисперсия определяется как "среднее квадратных отклонений от среднего" [(Источник)](https://www.mathsisfun.com/data/standard-deviation.html). В контексте этой проблемы кластеризации это относится к данным, которые имеют тенденцию сильно отклоняться от среднего.
✅ Это отличный момент, чтобы подумать обо всех способах, которыми вы могли бы исправить эту проблему. Попробуйте немного изменить данные? Используйте другие столбцы? Используйте другой алгоритм? Подсказка: попробуйте [масштабировать ваши данные](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/), чтобы нормализовать их и протестировать другие столбцы.
> Попробуйте этот '[калькулятор дисперсии](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', чтобы лучше понять концепцию.
---
## 🚀Вызов
Проведите некоторое время с этим ноутбуком, изменяя параметры. Можете ли вы улучшить точность модели, очистив данные больше (например, удаляя выбросы)? Вы можете использовать веса, чтобы придать большее значение определенным образцам данных. Что еще вы можете сделать, чтобы создать лучшие кластеры?
Подсказка: попробуйте масштабировать ваши данные. В ноутбуке есть закомментированный код, который добавляет стандартное масштабирование, чтобы столбцы данных больше походили друг на друга по диапазону. Вы заметите, что, хотя оценка силуэта снижается, 'изгиб' на графике локтя сглаживается. Это связано с тем, что оставление данных несмасштабированными позволяет данным с меньшей дисперсией иметь больший вес. Прочитайте немного больше об этой проблеме [здесь](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).
## [Посттест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)
## Обзор и самостоятельное изучение
Посмотрите на симулятор K-Means [например, этот](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Вы можете использовать этот инструмент для визуализации образцов данных и определения их центроидов. Вы можете редактировать случайность данных, количество кластеров и количество центроидов. Помогает ли это вам понять, как данные могут быть сгруппированы?
Также посмотрите на [этот раздаточный материал о K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) от Стэнфорда.
## Задание
[Попробуйте разные методы кластеризации](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных переводческих сервисов на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Попробуйте разные методы кластеризации
## Инструкции
На этом уроке вы узнали о кластеризации K-Means. Иногда K-Means не подходит для ваших данных. Создайте блокнот, используя данные либо из этих уроков, либо из другого источника (укажите источник), и продемонстрируйте другой метод кластеризации, не используя K-Means. Что вы узнали?
## Критерии оценки
| Критерии | Превосходно | Достаточно | Требует доработки |
|------------|------------------------------------------------------------------|---------------------------------------------------------------------|------------------------------|
| | Блокнот представлен с хорошо задокументированной моделью кластеризации | Блокнот представлен без хорошей документации и/или неполный | Представлена неполная работа |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временное заполнительПожалуйста, напишите вывод слева направо.
Это временное заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-переводческих сервисов. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,31 +0,0 @@
# Модели кластеризации для машинного обучения
Кластеризация — это задача машинного обучения, в которой необходимо найти объекты, похожие друг на друга, и сгруппировать их в группы, называемые кластерами. То, что отличает кластеризацию от других подходов в машинном обучении, заключается в том, что всё происходит автоматически; по сути, это можно считать противоположностью контролируемого обучения.
## Региональная тема: модели кластеризации для музыкальных предпочтений аудитории Нигерии 🎧
Разнообразная аудитория Нигерии имеет разнообразные музыкальные вкусы. Используя данные, собранные из Spotify (вдохновленные [этой статьей](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), давайте посмотрим на некоторые популярные в Нигерии музыкальные произведения. Этот набор данных включает информацию о таких характеристиках песен, как 'танцевальность', 'акустичность', громкость, 'речевое содержание', популярность и энергия. Будет интересно обнаружить закономерности в этих данных!
![Виниловый проигрыватель](../../../translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.ru.jpg)
> Фото от <a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Марсела Ласкоски</a> на <a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
В этой серии уроков вы откроете новые способы анализа данных с использованием методов кластеризации. Кластеризация особенно полезна, когда в вашем наборе данных отсутствуют метки. Если метки присутствуют, то методы классификации, такие как те, которые вы изучали на предыдущих уроках, могут быть более полезными. Но в случаях, когда вы хотите сгруппировать немаркированные данные, кластеризация является отличным способом обнаружить закономерности.
> Существуют полезные инструменты с низким кодом, которые могут помочь вам узнать о работе с моделями кластеризации. Попробуйте [Azure ML для этой задачи](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## Уроки
1. [Введение в кластеризацию](1-Visualize/README.md)
2. [Кластеризация K-Means](2-K-Means/README.md)
## Благодарности
Эти уроки были написаны с 🎶 [Джен Лупер](https://www.twitter.com/jenlooper) с полезными отзывами от [Ришита Дагли](https://rishit_dagli) и [Мухаммада Сакиба Хана Ирана](https://twitter.com/Sakibinan).
Набор данных [Нигерийские песни](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) был получен из Kaggle, собранный из Spotify.
Полезные примеры K-Means, которые помогли в создании этого урока, включают [исследование ирисов](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), этот [вводный ноутбук](https://www.kaggle.com/prashant111/k-means-clustering-with-python) и этот [гипотетический пример НПО](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering).
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,168 +0,0 @@
# Введение в обработку естественного языка
Этот урок охватывает краткую историю и важные концепции *обработки естественного языка*, подполе *компьютерной лингвистики*.
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/31/)
## Введение
NLP, как его обычно называют, является одной из самых известных областей, в которых машинное обучение было применено и использовано в программном обеспечении на производстве.
✅ Можете ли вы вспомнить программное обеспечение, которое вы используете каждый день и которое, вероятно, имеет встроенные элементы NLP? Как насчет ваших текстовых процессоров или мобильных приложений, которые вы используете регулярно?
Вы узнаете о:
- **Идее языков**. Как развивались языки и какие основные области изучения существовали.
- **Определениях и концепциях**. Вы также узнаете определения и концепции о том, как компьютеры обрабатывают текст, включая парсинг, грамматику и определение существительных и глаголов. В этом уроке есть несколько задач по программированию, и будут представлены несколько важных концепций, которые вы научитесь кодировать позже в следующих уроках.
## Компьютерная лингвистика
Компьютерная лингвистика — это область исследований и разработок на протяжении многих десятилетий, которая изучает, как компьютеры могут работать с языками, а также понимать, переводить и общаться на них. Обработка естественного языка (NLP) — это смежная область, сосредоточенная на том, как компьютеры могут обрабатывать «естественные», или человеческие, языки.
### Пример — диктовка на телефоне
Если вы когда-либо диктовали своему телефону вместо того, чтобы печатать, или задавали вопрос виртуальному помощнику, ваша речь была преобразована в текстовый формат, а затем обработана или *разобрана* на языке, на котором вы говорили. Обнаруженные ключевые слова затем обрабатывались в формате, который телефон или помощник могли понять и на который могли реагировать.
![comprehension](../../../../translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.ru.png)
> Реальное лингвистическое понимание — это сложно! Изображение от [Jen Looper](https://twitter.com/jenlooper)
### Как эта технология становится возможной?
Это возможно, потому что кто-то написал компьютерную программу для этого. Несколько десятилетий назад некоторые писатели научной фантастики предсказывали, что люди в основном будут разговаривать со своими компьютерами, и компьютеры всегда будут точно понимать, что они имеют в виду. К сожалению, оказалось, что это более сложная проблема, чем многие предполагали, и хотя сегодня это гораздо лучше понимаемая проблема, существуют значительные трудности в достижении «совершенной» обработки естественного языка, когда дело доходит до понимания смысла предложения. Это особенно трудная задача, когда речь идет о понимании юмора или распознавании эмоций, таких как сарказм, в предложении.
На этом этапе вы, возможно, вспоминаете школьные занятия, на которых учитель разбирал части грамматики в предложении. В некоторых странах студентам преподают грамматику и лингвистику как отдельный предмет, но во многих эти темы включены в процесс изучения языка: либо вашего родного языка в начальной школе (обучение чтению и письму), либо, возможно, второго языка в средней школе. Не беспокойтесь, если вы не являетесь экспертом в различении существительных и глаголов или наречий и прилагательных!
Если вы испытываете трудности с различием между *простым настоящим* и *настоящим продолженным*, вы не одиноки. Это сложная задача для многих людей, даже для носителей языка. Хорошая новость в том, что компьютеры действительно хорошо применяют формальные правила, и вы научитесь писать код, который может *разбирать* предложение так же, как и человек. Более серьезной задачей, которую вы рассмотрите позже, будет понимание *смысла* и *настроения* предложения.
## Предварительные требования
Для этого урока основным предварительным требованием является возможность читать и понимать язык этого урока. Нет математических задач или уравнений для решения. Хотя оригинальный автор написал этот урок на английском, он также переведен на другие языки, поэтому вы можете читать перевод. Есть примеры, в которых используется несколько разных языков (для сравнения различных грамматических правил разных языков). Эти примеры *не* переведены, но пояснительный текст переведен, поэтому смысл должен быть понятен.
Для задач по программированию вы будете использовать Python, и примеры используют Python 3.8.
В этом разделе вам потребуется и вы будете использовать:
- **Понимание Python 3**. Понимание языка программирования Python 3, этот урок использует ввод, циклы, чтение файлов, массивы.
- **Visual Studio Code + расширение**. Мы будем использовать Visual Studio Code и его расширение для Python. Вы также можете использовать IDE для Python на ваш выбор.
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) — это упрощенная библиотека для обработки текста на Python. Следуйте инструкциям на сайте TextBlob, чтобы установить его на свою систему (установите также корпуса, как показано ниже):
```bash
pip install -U textblob
python -m textblob.download_corpora
```
> 💡 Совет: Вы можете запускать Python напрямую в средах VS Code. Ознакомьтесь с [документацией](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) для получения дополнительной информации.
## Общение с машинами
История попыток заставить компьютеры понимать человеческий язык насчитывает десятилетия, и одним из первых ученых, который рассматривал обработку естественного языка, был *Алан Тьюринг*.
### 'Тест Тьюринга'
Когда Тьюринг исследовал *искусственный интеллект* в 1950-х годах, он рассматривал возможность проведения разговорного теста с человеком и компьютером (через текстовую переписку), где человек в разговоре не был уверен, общается ли он с другим человеком или с компьютером.
Если после определенной длины разговора человек не мог определить, были ли ответы от компьютера или нет, можно ли сказать, что компьютер *думает*?
### Вдохновение - 'игра в подражание'
Идея для этого пришла из игры на вечеринке под названием *Игра в подражание*, где допросчик один в комнате и должен определить, кто из двух человек (в другой комнате) является мужчиной, а кто женщиной. Допросчик может отправлять записки и должен попытаться придумать вопросы, на которые письменные ответы раскрывают пол загадочного человека. Конечно, игроки в другой комнате пытаются обмануть допросчика, отвечая на вопросы так, чтобы сбить его с толку, одновременно создавая видимость честного ответа.
### Разработка Элизы
В 1960-х годах ученый MIT *Джозеф Вайзенбаум* разработал [*Элизу*](https://wikipedia.org/wiki/ELIZA), компьютерного 'терапевта', который задавал человеку вопросы и создавал видимость понимания их ответов. Однако, хотя Элиза могла разбирать предложение и определять определенные грамматические конструкции и ключевые слова, чтобы дать разумный ответ, нельзя было сказать, что она *понимает* предложение. Если Элизе представили предложение формата "**Я** <u>грустный</u>", она могла бы переставить и заменить слова в предложении, чтобы сформировать ответ "Как долго **ты был** <u>грустным</u>?".
Это создавало впечатление, что Элиза понимает утверждение и задает последующий вопрос, тогда как на самом деле она меняла время и добавляла некоторые слова. Если Элиза не могла определить ключевое слово, на которое у нее был ответ, она бы вместо этого дала случайный ответ, который мог бы подойти ко многим различным утверждениям. Элизу можно было легко обмануть, например, если пользователь написал "**Ты** <u>велосипед</u>", она могла бы ответить "Как долго **я был** <u>велосипедом</u>?", вместо более разумного ответа.
[![Чат с Элизой](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Чат с Элизой")
> 🎥 Нажмите на изображение выше, чтобы посмотреть видео о оригинальной программе ЭЛИЗА
> Примечание: Вы можете прочитать оригинальное описание [Элизы](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract), опубликованное в 1966 году, если у вас есть аккаунт ACM. В противном случае прочитайте о Элизе на [википедии](https://wikipedia.org/wiki/ELIZA)
## Упражнение - кодирование базового разговорного бота
Разговорный бот, подобный Элизе, — это программа, которая вызывает ввод пользователя и кажется, что понимает и отвечает разумно. В отличие от Элизы, наш бот не будет иметь нескольких правил, создающих видимость ведения разумного разговора. Вместо этого наш бот будет иметь только одну способность — поддерживать разговор с помощью случайных ответов, которые могут подойти почти к любому тривиальному разговору.
### План
Ваши шаги при создании разговорного бота:
1. Вывести инструкции, advising пользователя, как взаимодействовать с ботом
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!
```
Один из возможных решений задачи можно найти [здесь](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py)
✅ Остановитесь и подумайте
1. Как вы думаете, случайные ответы могли бы 'обмануть' кого-то, заставив его думать, что бот на самом деле понимал их?
2. Какие функции нужны боту, чтобы быть более эффективным?
3. Если бот действительно мог бы 'понимать' смысл предложения, нужно ли ему 'помнить' смысл предыдущих предложений в разговоре тоже?
---
## 🚀Задача
Выберите один из элементов "остановитесь и подумайте" выше и попробуйте реализовать его в коде или напишите решение на бумаге, используя псевдокод.
В следующем уроке вы узнаете о ряде других подходов к парсингу естественного языка и машинному обучению.
## [Пост-тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/32/)
## Обзор и самообучение
Посмотрите на ссылки ниже как на дополнительные возможности для чтения.
### Ссылки
1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010.
## Задание
[Поиск бота](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Найдите бота
## Инструкции
Боты повсюду. Ваша задача: найдите одного и примите его! Вы можете встретить их на веб-сайтах, в банковских приложениях и по телефону, например, когда звоните в компании финансовых услуг за советом или информацией по счету. Проанализируйте бота и посмотрите, сможете ли вы его запутать. Если вам удастся запутать бота, как вы думаете, почему это произошло? Напишите короткую статью о вашем опыте.
## Критерии оценки
| Критерии | Примерный уровень | Удовлетворительный уровень | Требует улучшения |
| --------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- |
| | Написана полная статья, объясняющая предполагаемую архитектуру бота и описывающая ваш опыт с ним | Статья неполная или недостаточно исследована | Статья не представлена |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,217 +0,0 @@
# Общие задачи и методы обработки естественного языка
Для большинства задач *обработки естественного языка* текст, который нужно обработать, должен быть разбит на части, проанализирован, а результаты сохранены или сопоставлены с правилами и наборами данных. Эти задачи позволяют программисту извлечь _значение_ или амерение_, или только астоту_ терминов и слов в тексте.
## [Предварительный тест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/33/)
Давайте исследуем общие методы, используемые в обработке текста. В сочетании с машинным обучением эти методы помогают эффективно анализировать большие объемы текста. Однако перед тем, как применять ML к этим задачам, давайте разберемся с проблемами, с которыми сталкиваются специалисты по NLP.
## Задачи, общие для NLP
Существует множество способов анализа текста, над которым вы работаете. Есть задачи, которые вы можете выполнять, и через эти задачи вы можете оценить понимание текста и сделать выводы. Обычно вы выполняете эти задачи в последовательности.
### Токенизация
Вероятно, первой задачей, которую должны решить большинство алгоритмов NLP, является разделение текста на токены или слова. Хотя это звучит просто, учет пунктуации и разделителей слов и предложений в разных языках может усложнить задачу. Вам, возможно, придется использовать различные методы для определения границ.
![токенизация](../../../../translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.ru.png)
> Токенизация предложения из **Гордость и предубеждение**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
### Встраивания
[Встраивания слов](https://wikipedia.org/wiki/Word_embedding) — это способ числового преобразования ваших текстовых данных. Встраивания выполняются так, чтобы слова с похожим значением или слова, используемые вместе, сгруппировались.
![встраивания слов](../../../../translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.ru.png)
> "Я испытываю величайшее уважение к вашим нервам, они мои старые друзья." - Встраивания слов для предложения из **Гордость и предубеждение**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
✅ Попробуйте [этот интересный инструмент](https://projector.tensorflow.org/), чтобы поэкспериментировать с встраиваниями слов. Нажатие на одно слово показывает кластеры похожих слов: 'игрушка' группируется с 'дисней', 'лего', 'плейстейшен' и 'консоль'.
### Парсинг и тегирование частей речи
Каждое слово, которое было токенизировано, может быть помечено как часть речи — существительное, глагол или прилагательное. Предложение `the quick red fox jumped over the lazy brown dog` может быть помечено как fox = существительное, jumped = глагол.
![парсинг](../../../../translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.ru.png)
> Парсинг предложения из **Гордость и предубеждение**. Инфографика от [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 для the.
Давайте рассмотрим пример текста, в котором мы подсчитываем частоту слов. Стихотворение Редьярда Киплинга "Победители" содержит следующие строки:
```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` has a frequency of 2 and `the` has a frequency of 6, and `travels` равна 2.
### N-граммы
Текст можно разбить на последовательности слов заданной длины: одно слово (униграмма), два слова (биграммы), три слова (триграммы) или любое количество слов (n-граммы).
Например, `the quick red fox jumped over the lazy brown dog` с n-граммным значением 2 производит следующие n-граммы:
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
Визуализировать это может быть проще в виде скользящего окна над предложением. Вот пример для n-грамм из 3 слов, n-грамма выделена жирным шрифтом в каждом предложении:
1. <u>**the quick red**</u> fox jumped over the lazy brown dog
2. the **<u>quick red fox</u>** jumped over the lazy brown dog
3. the quick **<u>red fox jumped</u>** over the lazy brown dog
4. the quick red **<u>fox jumped over</u>** the lazy brown dog
5. the quick red fox **<u>jumped over the</u>** lazy brown dog
6. the quick red fox jumped **<u>over the lazy</u>** brown dog
7. the quick red fox jumped over <u>**the lazy brown**</u> dog
8. the quick red fox jumped over the **<u>lazy brown dog</u>**
![скользящее окно n-грамм](../../../../6-NLP/2-Tasks/images/n-grams.gif)
> Значение n-граммы 3: Инфографика от [Jen Looper](https://twitter.com/jenlooper)
### Извлечение именных фраз
В большинстве предложений есть существительное, которое является подлежащим или дополнением. В английском языке его часто можно идентифицировать по наличию перед ним 'a', 'an' или 'the'. Определение подлежащего или дополнения в предложении путем 'извлечения именной фразы' является распространенной задачей в NLP, когда пытаются понять значение предложения.
В предложении "Я не могу определить час, или место, или взгляд, или слова, которые положили начало. Это было слишком давно. Я был в середине, прежде чем узнал, что я начал." можете ли вы определить именные фразы?
В предложении `the quick red fox jumped over the lazy brown dog` есть 2 именные фразы: **quick red fox** и **lazy brown dog**.
### Анализ настроений
Предложение или текст могут быть проанализированы на предмет настроения, или насколько *позитивными* или *негативными* они являются. Настроение измеряется по *полярности* и *объективности/субъективности*. Полярность измеряется от -1.0 до 1.0 (от негативного к позитивному) и от 0.0 до 1.0 (от наиболее объективного к наиболее субъективному).
✅ Позже вы узнаете, что существуют различные способы определения настроения с использованием машинного обучения, но один из способов заключается в наличии списка слов и фраз, которые классифицируются как положительные или отрицательные человеческим экспертом, и применении этой модели к тексту для вычисления полярного значения. Можете ли вы увидеть, как это будет работать в некоторых обстоятельствах и менее эффективно в других?
### Флексия
Флексия позволяет вам взять слово и получить его единственное или множественное число.
### Лемматизация
*Лемма* — это корень или основное слово для набора слов, например *flew*, *flies*, *flying* имеют лемму глагола *fly*.
Также существуют полезные базы данных, доступные для исследователей NLP, в частности:
### WordNet
[WordNet](https://wordnet.princeton.edu/) — это база данных слов, синонимов, антонимов и многих других деталей для каждого слова на многих разных языках. Это невероятно полезно при попытке построить переводы, проверку правописания или языковые инструменты любого типа.
## Библиотеки NLP
К счастью, вам не нужно разрабатывать все эти методы самостоятельно, поскольку существуют отличные библиотеки Python, которые делают их гораздо более доступными для разработчиков, не специализирующихся на обработке естественного языка или машинном обучении. В следующих уроках будут приведены дополнительные примеры этих библиотек, но здесь вы узнаете несколько полезных примеров, которые помогут вам с следующей задачей.
### Упражнение - использование `TextBlob` library
Let's use a library called TextBlob as it contains helpful APIs for tackling these types of tasks. TextBlob "stands on the giant shoulders of [NLTK](https://nltk.org) and [pattern](https://github.com/clips/pattern), and plays nicely with both." It has a considerable amount of ML embedded in its API.
> Note: A useful [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) guide is available for TextBlob that is recommended for experienced Python developers
When attempting to identify *noun phrases*, TextBlob offers several options of extractors to find noun phrases.
1. Take a look at `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) — это "Извлекатель именных фраз, который использует парсинг чанков, обученный на тренировочном корпусе ConLL-2000." ConLL-2000 относится к 2000 году, когда проходила Конференция по вычислительному обучению естественного языка. Каждый год на конференции проводился семинар для решения сложной проблемы NLP, и в 2000 году это была задача извлечения именных фраз. Модель была обучена на Wall Street Journal, с "разделами 15-18 в качестве обучающих данных (211727 токенов) и разделом 20 в качестве тестовых данных (47377 токенов)". Вы можете ознакомиться с процедурами, использованными [здесь](https://www.clips.uantwerpen.be/conll2000/chunking/), и с [результатами](https://ifarm.nl/erikt/research/np-chunking.html).
### Задача - улучшение вашего бота с помощью NLP
В предыдущем уроке вы создали очень простой бот для вопросов и ответов. Теперь вы сделаете Марвина немного более отзывчивым, анализируя ваш ввод на предмет настроения и выводя ответ, соответствующий этому настроению. Вам также нужно будет определить `noun_phrase` и задать вопрос о нем.
Ваши шаги при создании лучшего разговорного бота:
1. Выведите инструкции, сообщающие пользователю, как взаимодействовать с ботом
2. Начните цикл
1. Примите ввод пользователя
2. Если пользователь запросил выход, то выходите
3. Обработайте ввод пользователя и определите подходящий ответ на основе настроения
4. Если в настроении обнаружена именная фраза, сделайте ее множественной и спросите дополнительную информацию на эту тему
5. Выведите ответ
3. вернитесь к шагу 2
Вот фрагмент кода для определения настроения с использованием TextBlob. Обратите внимание, что существует только четыре *градиента* ответа на настроение (вы можете добавить больше, если хотите):
```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!
```
Одно из возможных решений задачи можно найти [здесь](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py)
✅ Проверка знаний
1. Думаете ли вы, что отзывчивые ответы могут 'обмануть' кого-то, заставив их думать, что бот действительно их понимает?
2. Делает ли определение именной фразы бота более 'убедительным'?
3. Почему извлечение 'именной фразы' из предложения может быть полезным?
---
Реализуйте бота в рамках проверки знаний и протестируйте его на друге. Может ли он обмануть их? Можете ли вы сделать вашего бота более 'убедительным'?
## 🚀Задача
Возьмите задачу из проверки знаний и попробуйте реализовать ее. Протестируйте бота на друге. Может ли он обмануть их? Можете ли вы сделать вашего бота более 'убедительным'?
## [Посттест](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/34/)
## Обзор и самостоятельное изучение
В следующих уроках вы узнаете больше о анализе настроений. Изучите эту интересную технику в статьях, таких как эти на [KDNuggets](https://www.kdnuggets.com/tag/nlp)
## Задание
[Заставьте бота отвечать](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных переводческих сервисов на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Заставьте бота отвечать
## Инструкции
В последних нескольких уроках вы запрограммировали базового бота, с которым можно общаться. Этот бот дает случайные ответы, пока вы не скажете "пока". Можете сделать ответы менее случайными и вызывать ответы, если вы скажете что-то конкретное, например "почему" или "как"? Подумайте, как машинное обучение может сделать этот процесс менее ручным, когда вы будете развивать своего бота. Вы можете использовать библиотеки NLTK или TextBlob, чтобы упростить свои задачи.
## Критерии оценки
| Критерии | Примерно | Приемлемо | Требует улучшения |
| --------- | ------------------------------------------- | ------------------------------------------------- | ----------------------- |
| | Представлен новый файл bot.py и задокументирован | Представлен новый файл бота, но он содержит ошибки | Файл не представлен |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,190 +0,0 @@
# Перевод и анализ настроений с помощью ML
На предыдущих уроках вы узнали, как создать базового бота, используя `TextBlob`, библиотеку, которая использует машинное обучение за кулисами для выполнения базовых задач обработки естественного языка, таких как извлечение именных фраз. Еще одной важной задачей в вычислительной лингвистике является точный _перевод_ предложения с одного устного или письменного языка на другой.
## [Тест перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/35/)
Перевод — это очень сложная задача, усугубленная тем фактом, что существует тысячи языков, и у каждого могут быть очень разные грамматические правила. Один из подходов заключается в том, чтобы преобразовать формальные грамматические правила одного языка, например, английского, в структуру, независимую от языка, а затем перевести ее, преобразовав обратно на другой язык. Этот подход подразумевает выполнение следующих шагов:
1. **Идентификация**. Определите или отметьте слова на входном языке как существительные, глаголы и т. д.
2. **Создание перевода**. Произведите прямой перевод каждого слова в формате целевого языка.
### Пример предложения, английский на ирландский
В 'английском' языке предложение _I feel happy_ состоит из трех слов в следующем порядке:
- **подлежащее** (I)
- **глагол** (feel)
- **прилагательное** (happy)
Однако в 'ирландском' языке то же самое предложение имеет совершенно другую грамматическую структуру — эмоции, такие как "*happy*" или "*sad*", выражаются как *на* вас.
Английская фраза `I feel happy` на ирландском будет `Tá athas orm`. *Буквальный* перевод будет `Happy is upon me`.
Ирландский носитель языка, переводя на английский, скажет `I feel happy`, а не `Happy is upon me`, потому что он понимает смысл предложения, даже если слова и структура предложения различны.
Формальный порядок для предложения на ирландском языке таков:
- **глагол** (Tá или is)
- **прилагательное** (athas, или happy)
- **подлежащее** (orm, или upon me)
## Перевод
Наивная программа перевода может переводить только слова, игнорируя структуру предложения.
✅ Если вы изучали второй (или третий и более) язык во взрослом возрасте, вы могли начать с того, что думали на своем родном языке, переводя концепцию слово за словом в своей голове на второй язык, а затем произнося свой перевод. Это похоже на то, что делают наивные компьютерные программы перевода. Важно преодолеть эту фазу, чтобы достичь беглости!
Наивный перевод приводит к плохим (а иногда и смешным) ошибкам перевода: `I feel happy` переводится буквально как `Mise bhraitheann athas` на ирландском. Это значит (буквально) `me feel happy` и не является действительным ирландским предложением. Несмотря на то, что английский и ирландский являются языками, на которых говорят на двух соседних островах, они очень разные языки с различными грамматическими структурами.
> Вы можете посмотреть несколько видео о ирландских лингвистических традициях, например, [это](https://www.youtube.com/watch?v=mRIaLSdRMMs)
### Подходы машинного обучения
До сих пор вы узнали о подходе формальных правил к обработке естественного языка. Другой подход заключается в том, чтобы игнорировать смысл слов и _вместо этого использовать машинное обучение для выявления шаблонов_. Это может сработать в переводе, если у вас есть много текста (корпус) или текстов (корпуса) как на исходном, так и на целевом языках.
Например, рассмотрим случай *Гордости и предубеждения*, известного английского романа, написанного Джейн Остин в 1813 году. Если вы обратитесь к книге на английском и человеческому переводу книги на *французский*, вы сможете выявить фразы в одном, которые _идоматически_ переведены на другой. Вы сделаете это через минуту.
Например, когда английская фраза `I have no money` переводится буквально на французский, она может стать `Je n'ai pas de monnaie`. "Monnaie" — это сложное французское 'ложное созвучие', так как 'money' и 'monnaie' не являются синонимами. Лучший перевод, который мог бы сделать человек, был бы `Je n'ai pas d'argent`, потому что он лучше передает смысл того, что у вас нет денег (в отличие от 'мелочи', что является значением 'monnaie').
![monnaie](../../../../translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.ru.png)
> Изображение от [Jen Looper](https://twitter.com/jenlooper)
Если у модели ML достаточно человеческих переводов для построения модели, она может улучшить точность переводов, выявляя общие шаблоны в текстах, которые ранее были переведены экспертными носителями обоих языков.
### Упражнение - перевод
Вы можете использовать `TextBlob` для перевода предложений. Попробуйте знаменитую первую строку **Гордости и предубеждения**:
```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!".
Можно утверждать, что перевод TextBlob гораздо более точен, чем французский перевод книги 1932 года В. Леконта и Ш. Прессуара:
"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet égard, lorsqu'il arrive dans une nouvelle résidence, эта идея так прочно укоренена в сознании его соседей, что они немедленно считают его законной собственностью одной из их дочерей."
В этом случае перевод, основанный на ML, делает лучшую работу, чем человеческий переводчик, который ненужным образом вставляет слова в уста оригинального автора для 'ясности'.
> Что здесь происходит? И почему TextBlob так хорош в переводе? Ну, за кулисами он использует Google Translate, сложный ИИ, способный анализировать миллионы фраз, чтобы предсказать лучшие строки для поставленной задачи. Здесь ничего ручного не происходит, и вам нужно подключение к интернету, чтобы использовать `blob.translate`.
✅ Try some more sentences. Which is better, ML or human translation? In which cases?
## Sentiment analysis
Another area where machine learning can work very well is sentiment analysis. A non-ML approach to sentiment is to identify words and phrases which are 'positive' and 'negative'. Then, given a new piece of text, calculate the total value of the positive, negative and neutral words to identify the overall sentiment.
This approach is easily tricked as you may have seen in the Marvin task - the sentence `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` — это саркастическое предложение с негативным настроением, но простой алгоритм обнаруживает 'great', 'wonderful', 'glad' как положительные, а 'waste', 'lost' и 'dark' как негативные. Общий настрой подвержен влиянию этих противоречивых слов.
✅ Остановитесь на секунду и подумайте о том, как мы передаем сарказм как носители языка. Интонация играет большую роль. Попробуйте произнести фразу "Что ж, этот фильм был потрясающим" по-разному, чтобы выяснить, как ваш голос передает смысл.
### Подходы ML
Подход ML будет заключаться в том, чтобы вручную собрать негативные и положительные тексты — твиты, рецензии на фильмы или что угодно, где человек дал оценку *и* написанное мнение. Затем можно применить техники NLP к мнениям и оценкам, чтобы выявить шаблоны (например, положительные рецензии на фильмы, как правило, содержат фразу 'Oscar worthy' чаще, чем негативные рецензии на фильмы, или положительные рецензии на рестораны говорят 'gourmet' гораздо чаще, чем 'disgusting').
> ⚖️ **Пример**: Если бы вы работали в офисе политика и обсуждался какой-то новый закон, избиратели могли бы писать в офис письма с поддержкой или против конкретного нового закона. Предположим, вам поручено читать письма и сортировать их на 2 кучи, *за* и *против*. Если бы писем было много, вы могли бы быть перегружены, пытаясь прочитать их все. Не было бы здорово, если бы бот мог прочитать их все за вас, понять их и сказать вам, в какую кучу попало каждое письмо?
>
> Один из способов достичь этого — использовать машинное обучение. Вы бы обучили модель на части писем *против* и части писем *за*. Модель бы, как правило, ассоциировала фразы и слова с противной и поддерживающей стороной, *но она не понимала бы никакого содержания*, только то, что определенные слова и шаблоны с большей вероятностью встречаются в письмах *против* или *за*. Вы могли бы протестировать ее на некоторых письмах, которые не использовали для обучения модели, и посмотреть, пришла ли она к такому же выводу, как и вы. Затем, когда вы будете довольны точностью модели, вы сможете обрабатывать будущие письма, не читая каждое из них.
✅ Звучит ли этот процесс как процессы, которые вы использовали на предыдущих уроках?
## Упражнение - сентиментальные предложения
Сентимент измеряется по *полярности* от -1 до 1, где -1 — это самый негативный сентимент, а 1 — самый позитивный. Сентимент также измеряется по шкале от 0 до 1 для объективности (0) и субъективности (1).
Еще раз посмотрите на *Гордость и предубеждение* Джейн Остин. Текст доступен здесь на [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). Пример ниже показывает короткую программу, которая анализирует сентимент первых и последних предложений из книги и отображает его полярность сентимента и оценку субъективности/объективности.
Вы должны использовать библиотеку `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)
```
## Задача - проверьте полярность сентимента
Ваша задача — определить, используя полярность сентимента, имеет ли *Гордость и предубеждение* больше абсолютно позитивных предложений, чем абсолютно негативных. Для этой задачи вы можете предположить, что полярность 1 или -1 является абсолютно позитивной или негативной соответственно.
**Шаги:**
1. Скачайте [копию Гордости и предубеждения](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) с Project Gutenberg в виде .txt файла. Удалите метаданные в начале и в конце файла, оставив только оригинальный текст.
2. Откройте файл в Python и извлеките содержимое как строку.
3. Создайте TextBlob, используя строку книги.
4. Анализируйте каждое предложение в книге в цикле.
1. Если полярность равна 1 или -1, сохраните предложение в массиве или списке положительных или негативных сообщений.
5. В конце распечатайте все положительные и негативные предложения (по отдельности) и количество каждого.
Вот пример [решения](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb).
✅ Проверка знаний
1. Сентимент основан на словах, используемых в предложении, но понимает ли код *слова*?
2. Считаете ли вы, что полярность сентимента точна, или, другими словами, вы *согласны* с оценками?
1. В частности, вы согласны или не согласны с абсолютной **позитивной** полярностью следующих предложений?
* “Какой отличный отец у вас, девочки!” — сказала она, когда дверь закрылась.
* “Ваше исследование мистера Дарси завершено, я полагаю,” — сказала мисс Бингли; “и каков результат?” “Я совершенно убеждена в том, что у мистера Дарси нет недостатков.”
* Как замечательно происходят такие вещи!
* У меня самая большая неприязнь к таким вещам.
* Шарлотта — отличный менеджер, я осмелюсь сказать.
* “Это действительно восхитительно!”
* Я так счастлива!
* Ваша идея о пони замечательна.
2. Следующие 3 предложения были оценены с абсолютным позитивным сентиментом, но при близком чтении они не являются позитивными предложениями. Почему анализ сентимента счел их позитивными предложениями?
* "Я буду так счастлива, когда его пребывание в Нетерфилде закончится!" "Я wish I could say anything to comfort you," replied Elizabeth; "but it is wholly out of my power."
* "Если бы я только могла видеть вас таким счастливым!"
* "Наше бедственное положение, дорогая Лиззи, очень велико."
3. Вы согласны или не согласны с абсолютной **негативной** полярностью следующих предложений?
- Все недовольны его гордостью.
- "Мне бы хотелось знать, как он ведет себя среди незнакомцев." "Вы тогда услышите — но приготовьтесь к чему-то очень ужасному."
- Пауза была для чувств Элизабеты ужасной.
- Это было бы ужасно!
✅ Любой поклонник Джейн Остин поймет, что она часто использует свои книги для критики более абсурдных аспектов английского общества регентства. Элизабет Беннет, главная героиня *Гордости и предубеждения*, является внимательным социальным наблюдателем (как и автор), и ее язык часто сильно нюансирован. Даже мистер Дарси (возлюбленный в истории) отмечает игривое и насмешливое использование языка Элизабет: "Я имел удовольствие вашего знакомства достаточно долго, чтобы знать, что вы получаете огромное удовольствие от того, чтобы время от времени высказывать мнения, которые на самом деле не являются вашими."
---
## 🚀Задача
Можете ли вы сделать Марвина еще лучше, извлекая другие характеристики из пользовательского ввода?
## [Тест после лекции](https://gray-sand-07a10f403.1.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-77952-leestott). Протестируйте некоторые из предложений *Гордости и предубеждения* выше и посмотрите, сможет ли она обнаружить нюансы.
## Задание
[Поэтическая лицензия](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,13 +0,0 @@
# Поэтическая лицензия
## Инструкции
В [этом ноутбуке](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) вы можете найти более 500 стихотворений Эмили Дикинсон, которые ранее были проанализированы на предмет настроения с использованием аналитики текста Azure. Используя этот набор данных, проанализируйте его с помощью техник, описанных в уроке. Соответствует ли предполагаемое настроение стихотворения более сложному решению сервиса Azure? Почему или почему нет, по вашему мнению? Есть ли что-то, что вас удивляет?
## Критерии оценки
| Критерии | Примерно | Адекватно | Требуется улучшение |
|------------|---------------------------------------------------------------------------|---------------------------------------------------------|----------------------------|
| | Ноутбук представлен с солидным анализом выборки автора | Ноутбук неполный или не выполняет анализ | Ноутбук не представлен |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные толкования, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, напишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неверные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
это временный заполнительПожалуйста, напишите вывод слева направо.
это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,294 +0,0 @@
# Анализ настроений на основе отзывов о гостиницах - обработка данных
В этом разделе вы будете использовать техники, изученные на предыдущих уроках, для проведения разведочного анализа данных большого набора. Как только вы получите хорошее представление о полезности различных столбцов, вы узнаете:
- как удалить ненужные столбцы
- как рассчитать новые данные на основе существующих столбцов
- как сохранить полученный набор данных для использования в финальном задании
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/37/)
### Введение
До сих пор вы узнали о том, как текстовые данные значительно отличаются от числовых типов данных. Если это текст, написанный или произнесенный человеком, его можно проанализировать для поиска шаблонов и частот, настроений и значений. Этот урок знакомит вас с реальным набором данных и реальной задачей: **[515K отзывов о гостиницах в Европе](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)**, который включает в себя [лицензию CC0: Public Domain](https://creativecommons.org/publicdomain/zero/1.0/). Данные были собраны с сайта Booking.com из публичных источников. Создателем набора данных является Цзяшень Лю.
### Подготовка
Вам потребуется:
* Возможность запускать .ipynb блокноты с использованием Python 3
* pandas
* NLTK, [который вы должны установить локально](https://www.nltk.org/install.html)
* Набор данных, доступный на Kaggle [515K отзывов о гостиницах в Европе](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). Он занимает около 230 МБ после распаковки. Скачайте его в корневую папку `/data`, связанную с этими уроками по NLP.
## Разведочный анализ данных
Эта задача предполагает, что вы создаете бота для рекомендаций гостиниц с использованием анализа настроений и оценок отзывов гостей. Набор данных, который вы будете использовать, включает отзывы о 1493 различных гостиницах в 6 городах.
Используя Python, набор данных отзывов о гостиницах и анализ настроений NLTK, вы можете выяснить:
* Какие слова и фразы наиболее часто используются в отзывах?
* Соответствуют ли официальные *теги*, описывающие гостиницу, оценкам отзывов (например, более негативные отзывы о конкретной гостинице от *Семей с маленькими детьми* по сравнению с *Путешественниками-одиночками*, возможно, указывая на то, что она лучше подходит для *Путешественников-одиночек*?)
* Согласуются ли оценки настроений NLTK с числовой оценкой рецензента гостиницы?
#### Набор данных
Давайте исследуем набор данных, который вы скачали и сохранили локально. Откройте файл в редакторе, таком как VS Code или даже Excel.
Заголовки в наборе данных следующие:
*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_Name`, `Hotel_Address`, `lat` (широта), `lng` (долгота)
* Используя *lat* и *lng*, вы можете построить карту с помощью Python, показывающую расположение гостиниц (возможно, с цветовой кодировкой для негативных и позитивных отзывов)
* Hotel_Address явно не полезен для нас, и мы, вероятно, заменим его на страну для более удобной сортировки и поиска
**Столбцы мета-отзывов гостиницы**
* `Average_Score`
* Согласно создателю набора данных, этот столбец представляет собой *Среднюю оценку гостиницы, рассчитанную на основе последнего комментария за последний год*. Это кажется необычным способом расчета оценки, но это данные, собранные с сайта, так что мы можем принять это за чистую правду на данный момент.
На основе других столбцов в этих данных, можете ли вы придумать другой способ расчета средней оценки?
* `Total_Number_of_Reviews`
* Общее количество отзывов, полученных этой гостиницей - неясно (без написания кода), относится ли это к отзывам в наборе данных.
* `Additional_Number_of_Scoring`
* Это означает, что оценка отзыва была дана, но рецензент не написал ни положительного, ни негативного отзыва.
**Столбцы отзывов**
- `Reviewer_Score`
- Это числовое значение с максимумом в 1 десятичное место между минимальными и максимальными значениями 2.5 и 10
- Не объясняется, почему 2.5 - это самая низкая возможная оценка
- `Negative_Review`
- Если рецензент ничего не написал, это поле будет содержать "**No Negative**"
- Обратите внимание, что рецензент может написать положительный отзыв в столбце Negative review (например, "в этом отеле нет ничего плохого")
- `Review_Total_Negative_Word_Counts`
- Более высокие значения негативных слов указывают на более низкую оценку (без проверки настроения)
- `Positive_Review`
- Если рецензент ничего не написал, это поле будет содержать "**No Positive**"
- Обратите внимание, что рецензент может написать негативный отзыв в столбце Positive review (например, "в этом отеле нет ничего хорошего")
- `Review_Total_Positive_Word_Counts`
- Более высокие значения положительных слов указывают на более высокую оценку (без проверки настроения)
- `Review_Date` и `days_since_review`
- Может быть применена мера свежести или устаревания к отзыву (старые отзывы могут быть не такими точными, как новые, из-за изменений в управлении гостиницей, проведенных ремонтов или добавления бассейна и т.д.)
- `Tags`
- Это короткие дескрипторы, которые рецензент может выбрать, чтобы описать тип гостя, которым он был (например, одиночка или семья), тип номера, который у него был, продолжительность пребывания и способ, которым был представлен отзыв.
- К сожалению, использование этих тегов вызывает проблемы, смотрите раздел ниже, который обсуждает их полезность.
**Столбцы рецензентов**
- `Total_Number_of_Reviews_Reviewer_Has_Given`
- Это может быть фактором в модели рекомендаций, например, если вы сможете определить, что более активные рецензенты с сотнями отзывов чаще дают негативные оценки. Однако рецензент любого конкретного отзыва не идентифицируется уникальным кодом, и, следовательно, не может быть связан с набором отзывов. Есть 30 рецензентов с 100 и более отзывами, но трудно увидеть, как это может помочь модели рекомендаций.
- `Reviewer_Nationality`
- Некоторые люди могут считать, что определенные национальности более склонны оставлять положительные или негативные отзывы из-за национальной предрасположенности. Будьте осторожны, строя такие анекдотические взгляды в своих моделях. Это национальные (а иногда и расовые) стереотипы, и каждый рецензент был индивидуумом, который написал отзыв на основе своего опыта. Это могло быть отфильтровано через множество факторов, таких как их предыдущие гостиничные остановки, расстояние, которое они преодолели, и их личный темперамент. Сложно оправдать мнение, что их национальность была причиной оценки отзыва.
##### Примеры
| Средняя оценка | Общее количество отзывов | Оценка рецензента | Негативный <br />Отзыв | Положительный отзыв | Теги |
| -------------- | ----------------------- | ------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------- |
| 7.8 | 1945 | 2.5 | В данный момент это не гостиница, а строительная площадка. Я был запуган с раннего утра и весь день неприемлемым строительным шумом, пока отдыхал после долгой поездки и работал в номере. Люди работали весь день, т.е. с отбойными молотками в соседних номерах. Я просил сменить номер, но тихого номера не было доступно. Усложняя ситуацию, меня обманули с ценой. Я выехал вечером, так как мне нужно было покинуть отель очень рано, и получил соответствующий счет. На следующий день отель снова снял с меня деньги без моего согласия сверх забронированной цены. Это ужасное место. Не наказывайте себя, бронируя здесь. | Ничего. Ужасное место. Держитесь подальше. | Деловая поездка Пара. Стандартный двухместный номер. Пробыл 2 ночи. |
Как видите, этот гость не остался доволен своим пребыванием в этой гостинице. У гостиницы хорошая средняя оценка 7.8 и 1945 отзывов, но этот рецензент дал ей 2.5 и написал 115 слов о том, как негативно прошло его пребывание. Если бы он вообще ничего не написал в столбце Positive_Review, можно было бы предположить, что ничего положительного не было, но, увы, он написал 7 слов предупреждения. Если бы мы просто считали слова вместо их смысла или настроения, мы могли бы получить искаженное представление о намерениях рецензента. Странно, что его оценка 2.5 вызывает недоумение, потому что если пребывание в гостинице было таким плохим, почему бы не дать ей ни одного балла? Тщательно исследуя набор данных, вы увидите, что самая низкая возможная оценка составляет 2.5, а самая высокая - 10.
##### Теги
Как упоминалось выше, на первый взгляд, идея использовать `Tags` для категоризации данных кажется разумной. К сожалению, эти теги не стандартизированы, что означает, что в одной гостинице варианты могут быть *Одноместный номер*, *Двухместный номер* и *Стандартный номер*, а в следующей гостинице - *Делюкс Одноместный Номер*, *Классический Королевский Номер* и *Исполнительный Королевский Номер*. Это могут быть одни и те же вещи, но существует так много вариаций, что выбор становится:
1. Попытаться изменить все термины на единственный стандарт, что очень сложно, потому что неясно, каким будет путь преобразования в каждом случае (например, *Классический одноместный номер* соответствует *Одноместному номеру*, но *Улучшенный Королевский Номер с Видом на Двор или Город* намного сложнее сопоставить).
2. Мы можем использовать подход NLP и измерить частоту определенных терминов, таких как *Одиночка*, *Деловой путешественник* или *Семья с маленькими детьми*, применительно к каждой гостинице и учесть это в рекомендации.
Теги обычно (но не всегда) представляют собой одно поле, содержащее список из 5-6 значений, разделенных запятыми, соответствующих *Типу поездки*, *Типу гостей*, *Типу номера*, *Количество ночей* и *Типу устройства, на котором был представлен отзыв*. Однако из-за того, что некоторые рецензенты не заполняют каждое поле (они могут оставить одно пустым), значения не всегда находятся в одном и том же порядке.
В качестве примера возьмите *Тип группы*. В этом поле в столбце `Tags` есть 1025 уникальных возможностей, и, к сожалению, только некоторые из них относятся к группе (некоторые относятся к типу номера и т.д.). Если отфильтровать только те, которые упоминают семью, результаты содержат множество результатов типа *Семейный номер*. Если включить термин *с*, т.е. подсчитать значения *Семья с*, результаты становятся лучше, более 80,000 из 515,000 результатов содержат фразу "Семья с маленькими детьми" или "Семья с взрослыми детьми".
Это означает, что столбец тегов не полностью бесполезен для нас, но потребуется немного работы, чтобы сделать его полезным.
##### Средняя оценка гостиницы
С набором данных есть несколько странностей или несоответствий, которые я не могу выяснить, но они иллюстрируются здесь, чтобы вы были в курсе, когда будете строить свои модели. Если вы это поймете, пожалуйста, дайте нам знать в разделе обсуждений!
Набор данных содержит следующие столбцы, относящиеся к средней оценке и количеству отзывов:
1. Hotel_Name
2. Additional_Number_of_Scoring
3. Average_Score
4. Total_Number_of_Reviews
5. Reviewer_Score
Единственная гостиница с наибольшим количеством отзывов в этом наборе данных - *Britannia International Hotel Canary Wharf* с 4789 отзывами из 515,000. Но если мы посмотрим на значение `Total_Number_of_Reviews` для этой гостиницы, оно составляет 9086. Вы можете предположить, что есть много других оценок без отзывов, так что, возможно, нам следует добавить значение из столбца `Additional_Number_of_Scoring`. Это значение составляет 2682, и добавление его к 4789 дает нам 7471, что все еще на 1615 меньше, чем `Total_Number_of_Reviews`.
Если вы возьмете столбцы `Average_Score`, вы можете предположить, что это среднее значение отзывов в наборе данных, но описание от Kaggle звучит как "*Средняя оценка гостиницы, рассчитанная на основе последнего комментария за последний год*". Это не кажется полезным, но мы можем рассчитать собственную среднюю оценку на основе оценок отзывов в наборе данных. Используя ту же гостиницу в качестве примера, средняя оценка гостиницы указана как 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 - интерпретация смысла или настроения без необходимости, чтобы это делал человек. Однако возможно, что вы прочитаете некоторые негативные отзывы. Я бы настоятельно рекомендовал вам этого не делать, потому что вам не нужно. Некоторые из них абсурдны или неуместны, например, "Погода была не очень", что находится вне контроля гостиницы или, действительно, кого-либо. Но есть и темная сторона некоторых отзывов. Иногда негативные отзывы являются расистскими, сексистскими или дискриминационными по отношению к возрасту. Это, к сожалению, ожидаемо в наборе данных, собранном с публичного сайта. Некоторые рецензенты оставляют отзывы, которые вы могли бы посчитать неприятными, неудобными или тревожными. Лучше позволить коду измерить настроение, чем читать их самим и расстраиваться. Тем не менее, это меньшинство, которое пишет такие вещи, но они все равно существуют.
## Упражнение - Исследование данных
### Загрузка данных
На этом достаточно визуального анализа данных, теперь вы напишете немного кода и получите некоторые ответы! Этот раздел использует библиотеку pandas. Ваша первая задача - убедиться, что вы можете загрузить и прочитать данные CSV. Библиотека pandas имеет быстрый загрузчик CSV, и результат помещается в dataframe, как и в предыдущих уроках. CSV, который мы загружаем, содержит более полумиллиона строк, но только 17 столбцов. Pandas предоставляет множество мощных способов взаимодействия с dataframe, включая возможность выполнять операции над каждой строкой.
С этого момента в этом уроке будут приведены фрагменты кода и некоторые объяснения кода, а также обсуждение того, что означают результаты. Используйте включенный _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")
```
Теперь, когда данные загружены, мы можем выполнять некоторые операции над ними. Сохраните этот код в верхней части вашей программы для следующей части.
## Исследование данных
В этом случае данные уже *чистые*, это означает, что они готовы к работе и не содержат символов на других языках, которые могут помешать алгоритмам, ожидающим только английские символы.
строки имеют значения в столбце `Positive_Review` "Нет положительного" 9. Рассчитайте и выведите, сколько строк имеют значения в столбце `Positive_Review` "Нет положительного" **и** значения в `Negative_Review` "Нет отрицательного" ### Ответы к коду 1. Выведите *размер* загруженного вами датафрейма (размер - это количество строк и столбцов) ```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. Каковы следующие 10 наиболее часто встречающихся национальностей и их частота? ```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 | Вы можете заметить, что результаты *подсчитанные в наборе данных* не совпадают со значением в `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. Рассчитайте и выведите, сколько строк имеют значения в столбце `Negative_Review` "Нет отрицательного" 7. Рассчитайте и выведите, сколько строк имеют значения в столбце `Positive_Review` "Нет положительного" 8. Рассчитайте и выведите, сколько строк имеют значения в столбце `Positive_Review` "Нет положительного" **и** значения в `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
``` ## Другой способ Другой способ подсчета элементов без Лямбд и использования 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
``` Вы могли заметить, что есть 127 строк, которые имеют как "Нет отрицательного", так и "Нет положительного" значения для столбцов `Negative_Review` и `Positive_Review` соответственно. Это означает, что рецензент дал отелю числовую оценку, но отказался писать либо положительный, либо отрицательный отзыв. К счастью, это небольшое количество строк (127 из 515738, или 0,02%), поэтому это, вероятно, не исказит нашу модель или результаты в каком-либо конкретном направлении, но вы могли не ожидать, что набор данных отзывов будет содержать строки без отзывов, поэтому стоит исследовать данные, чтобы обнаружить такие строки. Теперь, когда вы исследовали набор данных, на следующем уроке вы отфильтруете данные и добавите некоторый анализ настроений. --- ## 🚀Вызов Этот урок демонстрирует, как мы видели в предыдущих уроках, насколько критически важно понимать ваши данные и их особенности перед выполнением операций с ними. Данные на основе текста, в частности, требуют тщательного анализа. Исследуйте различные наборы данных с большим количеством текста и посмотрите, сможете ли вы обнаружить области, которые могут ввести предвзятость или искаженное восприятие в модель. ## [Викторина после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/38/) ## Обзор и самостоятельное изучение Пройдите [этот учебный путь по NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott), чтобы узнать о инструментах, которые можно попробовать при создании моделей на основе речи и текста. ## Задание [NLTK](assignment.md) Пожалуйста, напишите вывод слева направо.
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,8 +0,0 @@
# NLTK
## Инструкции
NLTK — это известная библиотека для использования в вычислительной лингвистике и обработке естественного языка (NLP). Воспользуйтесь этой возможностью, чтобы ознакомиться с '[книгой NLTK](https://www.nltk.org/book/)' и попробовать выполнить ее упражнения. В этом незачетном задании вы сможете более глубоко узнать эту библиотеку.
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-сервисов перевода. Хотя мы стремимся к точности, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
Это временный заполнительПожалуйста, напишите вывод слева направо.
Это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных переводческих сервисов на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,6 +0,0 @@
это временный заполнительПожалуйста, напишите вывод слева направо.
это временный заполнитель
**Отказ от ответственности**:
Этот документ был переведен с использованием машинных AI-переводческих сервисов. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

@ -1,377 +0,0 @@
# Анализ настроений по отзывам об отелях
Теперь, когда вы подробно изучили набор данных, пришло время отфильтровать столбцы, а затем использовать методы обработки естественного языка (NLP) для получения новых сведений о отелях.
## [Викторина перед лекцией](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/39/)
### Операции фильтрации и анализа настроений
Как вы, вероятно, заметили, в наборе данных есть несколько проблем. Некоторые столбцы заполнены бесполезной информацией, другие кажутся некорректными. Если они правильные, неясно, как они были рассчитаны, и ответы не могут быть независимо проверены с помощью ваших собственных расчетов.
## Упражнение: немного больше обработки данных
Очистите данные еще немного. Добавьте столбцы, которые будут полезны позже, измените значения в других столбцах и полностью удалите некоторые столбцы.
1. Первичная обработка столбцов
1. Удалите `lat` и `lng`
2. Замените значения `Hotel_Address` следующими значениями (если адрес содержит название города и страны, измените его на просто город и страну).
Вот единственные города и страны в наборе данных:
Амстердам, Нидерланды
Барселона, Испания
Лондон, Великобритания
Милан, Италия
Париж, Франция
Вена, Австрия
```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 |
| :--------------------- | :--------: |
| Амстердам, Нидерланды | 105 |
| Барселона, Испания | 211 |
| Лондон, Великобритания | 400 |
| Милан, Италия | 162 |
| Париж, Франция | 458 |
| Вена, Австрия | 158 |
2. Обработка столбцов мета-отзывов об отелях
1. Удалите `Additional_Number_of_Scoring`
1. Replace `Total_Number_of_Reviews` with the total number of reviews for that hotel that are actually in the dataset
1. Replace `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` and `days_since_review`
2. Keep `Reviewer_Score`, `Negative_Review`, and `Positive_Review` as they are,
3. Keep `Tags` for now
- We'll be doing some additional filtering operations on the tags in the next section and then tags will be dropped
4. Process reviewer columns
1. Drop `Total_Number_of_Reviews_Reviewer_Has_Given`
2. Keep `Reviewer_Nationality`
### Tag columns
The `Tag` column is problematic as it is a list (in text form) stored in the column. Unfortunately the order and number of sub sections in this column are not always the same. It's hard for a human to identify the correct phrases to be interested in, because there are 515,000 rows, and 1427 hotels, and each has slightly different options a reviewer could choose. This is where NLP shines. You can scan the text and find the most common phrases, and count them.
Unfortunately, we are not interested in single words, but multi-word phrases (e.g. *Business trip*). Running a multi-word frequency distribution algorithm on that much data (6762646 words) could take an extraordinary amount of time, but without looking at the data, it would seem that is a necessary expense. This is where exploratory data analysis comes in useful, because you've seen a sample of the tags such as `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']`, вы можете начать задаваться вопросом, возможно ли значительно сократить объем обработки, которую вам нужно выполнить. К счастью, это возможно - но сначала вам нужно пройти несколько шагов, чтобы определить интересующие теги.
### Фильтрация тегов
Помните, что цель набора данных - добавить настроения и столбцы, которые помогут вам выбрать лучший отель (для себя или, возможно, для клиента, который поручил вам создать бота для рекомендаций по отелям). Вам нужно задать себе вопрос, полезны ли теги в конечном наборе данных или нет. Вот одно из толкований (если вам нужен был набор данных по другим причинам, разные теги могут остаться в/вне выбора):
1. Тип поездки имеет значение, и он должен остаться
2. Тип группы гостей важен, и он должен остаться
3. Тип номера, люкса или студии, в котором остановился гость, не имеет значения (все отели, по сути, имеют одни и те же номера)
4. Устройство, на котором был представлен отзыв, не имеет значения
5. Количество ночей, которые гость провел в отеле, *может* быть актуальным, если вы считаете, что более длительное пребывание связано с тем, что им понравился отель больше, но это натяжка и, вероятно, неуместно
В итоге, **оставьте 2 типа тегов и удалите остальные**.
Сначала вы не хотите подсчитывать теги, пока они не будут в лучшем формате, поэтому это означает удаление квадратных скобок и кавычек. Вы можете сделать это несколькими способами, но вам нужен самый быстрый, так как это может занять много времени для обработки большого объема данных. К счастью, в 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`.
Next we find a problem. Some reviews, or rows, have 5 columns, some 3, some 6. This is a result of how the dataset was created, and hard to fix. You want to get a frequency count of each phrase, but they are in different order in each review, so the count might be off, and a hotel might not get a tag assigned to it that it deserved.
Instead you will use the different order to our advantage, because each tag is multi-word but also separated by a comma! The simplest way to do this is to create 6 temporary columns with each tag inserted in to the column corresponding to its order in the tag. You can then merge the 6 columns into one big column and run the `value_counts()` method on the resulting column. Printing that out, you'll see there was 2428 unique tags. Here is a small sample:
| 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 |
Some of the common tags like `Submitted from a mobile device` are of no use to us, so it might be a smart thing to remove them before counting phrase occurrence, but it is such a fast operation you can leave them in and ignore them.
### Removing the length of stay tags
Removing these tags is step 1, it reduces the total number of tags to be considered slightly. Note you do not remove them from the dataset, just choose to remove them from consideration as values to count/keep in the reviews dataset.
| 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 |
| ... | ... |
There are a huge variety of rooms, suites, studios, apartments and so on. They all mean roughly the same thing and not relevant to you, so remove them from consideration.
| 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 |
Finally, and this is delightful (because it didn't take much processing at all), you will be left with the following *useful* tags:
| 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 |
You could argue that `Travellers with friends` is the same as `Group` more or less, and that would be fair to combine the two as above. The code for identifying the correct tags is [the Tags notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb).
The final step is to create new columns for each of these tags. Then, for every review row, if the `Tag` столбец совпадает с одним из новых столбцов, добавьте 1, если нет, добавьте 0. Конечный результат будет подсчетом того, сколько рецензентов выбрали этот отель (в совокупности), например, для деловой поездки против отдыха или для того, чтобы взять с собой питомца, и это полезная информация при рекомендации отеля.
```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)
```
### Удаление стоп-слов
Если вы собираетесь провести анализ настроений по столбцам негативных и позитивных отзывов, это может занять много времени. На мощном тестовом ноутбуке с быстрым процессором это заняло 12 - 14 минут в зависимости от используемой библиотеки для анализа настроений. Это (относительно) долго, поэтому стоит выяснить, можно ли ускорить этот процесс.
Удаление стоп-слов, или общих английских слов, которые не изменяют смысл предложения, - это первый шаг. Удалив их, анализ настроений должен проходить быстрее, но не менее точно (поскольку стоп-слова не влияют на настроение, но замедляют анализ).
Самый длинный негативный отзыв содержал 395 слов, но после удаления стоп-слов он стал 195 словами.
Удаление стоп-слов также является быстрой операцией: удаление стоп-слов из 2 столбцов отзывов на 515,000 строк заняло 3.3 секунды на тестовом устройстве. Для вас это может занять немного больше или меньше времени в зависимости от скорости процессора вашего устройства, объема ОЗУ, есть ли у вас 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, но рецензент поставил отелю наименьшую возможную оценку, то либо текст отзыва не соответствует оценке, либо анализатор настроений не смог правильно распознать настроение. Вы должны ожидать, что некоторые оценки настроения будут совершенно неверными, и это часто можно объяснить, например, отзыв может быть крайне саркастичным: "Конечно, мне ОЧЕНЬ понравилось спать в комнате без отопления", и анализатор настроений считает, что это положительное настроение, хотя человек, читающий это, поймет, что это сарказм.
NLTK предоставляет различные анализаторы настроений для обучения, и вы можете заменить их и посмотреть, будет ли настроение более или менее точным. Здесь используется анализ настроений VADER.
> 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). Анн Арбор, Мичиган, июнь 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)
```
Вы должны запустить весь код для [ноутбука анализа](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (после того как вы запустили [ноутбук фильтрации](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), чтобы сгенерировать файл Hotel_Reviews_Filtered.csv).
Чтобы подвести итоги, шаги следующие:
1. Оригинальный файл набора данных **Hotel_Reviews.csv** был изучен на предыдущем уроке с помощью [ноутбука исследователя](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb)
2. Hotel_Reviews.csv был отфильтрован с помощью [ноутбука фильтрации](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), в результате чего получился **Hotel_Reviews_Filtered.csv**
3. Hotel_Reviews_Filtered.csv был обработан с помощью [ноутбука анализа настроений](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb), в результате чего получился **Hotel_Reviews_NLP.csv**
4. Используйте Hotel_Reviews_NLP.csv в NLP Challenge ниже
### Заключение
Когда вы начали, у вас был набор данных со столбцами и данными, но не все из них могли быть проверены или использованы. Вы изучили данные, отфильтровали то, что вам не нужно, преобразовали теги во что-то полезное, рассчитали свои собственные средние значения, добавили несколько столбцов настроений и, надеюсь, узнали интересные вещи о обработке естественного текста.
## [Викторина после лекции](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/40/)
## Задание
Теперь, когда у вас есть набор данных, проанализированный на предмет настроений, посмотрите, сможете ли вы использовать стратегии, которые вы изучили в этой программе (например, кластеризацию?), чтобы определить закономерности вокруг настроений.
## Обзор и самообучение
Пройдите [этот учебный модуль](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott), чтобы узнать больше и использовать различные инструменты для изучения настроений в тексте.
## Задание
[Попробуйте другой набор данных](assignment.md)
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке должен считаться авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.

@ -1,14 +0,0 @@
# Попробуйте другой набор данных
## Инструкции
Теперь, когда вы узнали, как использовать NLTK для присвоения сентимента тексту, попробуйте другой набор данных. Вам, вероятно, потребуется провести некоторую обработку данных, поэтому создайте блокнот и задокументируйте свой мыслительный процесс. Что вы обнаружите?
## Критерии оценки
| Критерии | Примерный | Достаточный | Требует улучшения |
| -------- | ----------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ---------------------- |
| | Полный блокнот и набор данных представлены с хорошо задокументированными ячейками, объясняющими, как присваивается сентимент | В блокноте отсутствуют хорошие объяснения | Блокнот содержит ошибки |
**Отказ от ответственности**:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования этого перевода.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save