Merge branch 'microsoft:main' into main

pull/211/head
Charles Emmanuel S. Ndiaye 3 years ago committed by GitHub
commit 2166fb3c84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,117 @@
# Histoire du Machine Learning (apprentissage automatique)
![Résumé de l'histoire du machine learning dans un sketchnote](../../../sketchnotes/ml-history.png)
> Sketchnote de [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Quizz préalable](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/3/)
Dans cette leçon, nous allons parcourir les principales étapes de l'histoire du machine learning et de l'intelligence artificielle.
L'histoire de l'intelligence artificielle, l'IA, en tant que domaine est étroitement liée à l'histoire du machine learning, car les algorithmes et les avancées informatiques qui sous-tendent le ML alimentent le développement de l'IA. Bien que ces domaines en tant que domaines de recherches distincts ont commencé à se cristalliser dans les années 1950, il est important de rappeler que les [découvertes algorithmiques, statistiques, mathématiques, informatiques et techniques](https://wikipedia.org/wiki/Timeline_of_machine_learning) ont précédé et chevauchait cette époque. En fait, le monde réfléchit à ces questions depuis [des centaines d'années](https://fr.wikipedia.org/wiki/Histoire_de_l%27intelligence_artificielle) : cet article traite des fondements intellectuels historiques de l'idée d'une « machine qui pense ».
## Découvertes notables
- 1763, 1812 [théorème de Bayes](https://wikipedia.org/wiki/Bayes%27_theorem) et ses prédécesseurs. Ce théorème et ses applications sous-tendent l'inférence, décrivant la probabilité qu'un événement se produise sur la base de connaissances antérieures.
- 1805 [Théorie des moindres carrés](https://wikipedia.org/wiki/Least_squares) par le mathématicien français Adrien-Marie Legendre. Cette théorie, que vous découvrirez dans notre unité Régression, aide à l'ajustement des données.
- 1913 [Chaînes de Markov](https://wikipedia.org/wiki/Markov_chain) du nom du mathématicien russe Andrey Markov sont utilisées pour décrire une séquence d'événements possibles basée sur un état antérieur.
- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) est un type de classificateur linéaire inventé par le psychologue américain Frank Rosenblatt qui sous-tend les progrès de l'apprentissage en profondeur.
- 1967 [Nearest Neighbor](https://wikipedia.org/wiki/Nearest_neighbor) est un algorithme conçu à l'origine pour cartographier les itinéraires. Dans un contexte ML, il est utilisé pour détecter des modèles.
- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) est utilisé pour former des [réseaux de neurones feedforward (propagation avant)](https://fr.wikipedia.org/wiki/R%C3%A9seau_de_neurones_%C3%A0_propagation_avant).
- 1982 [Réseaux de neurones récurrents](https://wikipedia.org/wiki/Recurrent_neural_network) sont des réseaux de neurones artificiels dérivés de réseaux de neurones à réaction qui créent des graphes temporels.
✅ Faites une petite recherche. Quelles autres dates sont marquantes dans l'histoire du ML et de l'IA ?
## 1950 : Des machines qui pensent
Alan Turing, une personne vraiment remarquable qui a été élue [par le public en 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) comme le plus grand scientifique du 20e siècle, est reconnu pour avoir aidé à jeter les bases du concept d'une "machine qui peut penser". Il a lutté avec ses opposants et son propre besoin de preuves empiriques de sa théorie en créant le [Test de Turing] (https://www.bbc.com/news/technology-18475646), que vous explorerez dans nos leçons de NLP (TALN en français).
## 1956 : Projet de recherche d'été à Dartmouth
« Le projet de recherche d'été de Dartmouth sur l'intelligence artificielle a été un événement fondateur pour l'intelligence artificielle en tant que domaine », et c'est ici que le terme « intelligence artificielle » a été inventé ([source](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
> Chaque aspect de l'apprentissage ou toute autre caractéristique de l'intelligence peut en principe être décrit si précisément qu'une machine peut être conçue pour les simuler.
Le chercheur en tête, le professeur de mathématiques John McCarthy, espérait « procéder sur la base de la conjecture selon laquelle chaque aspect de l'apprentissage ou toute autre caractéristique de l'intelligence peut en principe être décrit avec une telle précision qu'une machine peut être conçue pour les simuler ». Les participants comprenaient une autre sommité dans le domaine, Marvin Minsky.
L'atelier est crédité d'avoir initié et encouragé plusieurs discussions, notamment « l'essor des méthodes symboliques, des systèmes spécialisés sur des domaines limités (premiers systèmes experts) et des systèmes déductifs par rapport aux systèmes inductifs ». ([source](https://fr.wikipedia.org/wiki/Conf%C3%A9rence_de_Dartmouth)).
## 1956 - 1974 : "Les années d'or"
Des années 50 au milieu des années 70, l'optimisme était au rendez-vous en espérant que l'IA puisse résoudre de nombreux problèmes. En 1967, Marvin Minsky a déclaré avec assurance que « Dans une génération... le problème de la création d'"intelligence artificielle" sera substantiellement résolu. » (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall)
La recherche sur le Natural Language Processing (traitement du langage naturel en français) a prospéré, la recherche a été affinée et rendue plus puissante, et le concept de « micro-mondes » a été créé, où des tâches simples ont été effectuées en utilisant des instructions en langue naturelle.
La recherche a été bien financée par les agences gouvernementales, des progrès ont été réalisés dans le calcul et les algorithmes, et des prototypes de machines intelligentes ont été construits. Certaines de ces machines incluent :
* [Shakey le robot](https://fr.wikipedia.org/wiki/Shakey_le_robot), qui pouvait manœuvrer et décider comment effectuer des tâches « intelligemment ».
![Shakey, un robot intelligent](../images/shakey.jpg)
> Shaky en 1972
* Eliza, une des premières « chatbot », pouvait converser avec les gens et agir comme une « thérapeute » primitive. Vous en apprendrez plus sur Eliza dans les leçons de NLP.
![Eliza, un bot](../images/eliza.png)
> Une version d'Eliza, un chatbot
* Le « monde des blocs » était un exemple de micro-monde où les blocs pouvaient être empilés et triés, et où des expériences d'apprentissages sur des machines, dans le but qu'elles prennent des décisions, pouvaient être testées. Les avancées réalisées avec des bibliothèques telles que [SHRDLU](https://fr.wikipedia.org/wiki/SHRDLU) ont contribué à faire avancer le natural language processing.
[![Monde de blocs avec SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "Monde de blocs avec SHRDLU" )
> 🎥 Cliquez sur l'image ci-dessus pour une vidéo : Blocks world with SHRDLU
## 1974 - 1980 : « l'hiver de l'IA »
Au milieu des années 1970, il était devenu évident que la complexité de la fabrication de « machines intelligentes » avait été sous-estimée et que sa promesse, compte tenu de la puissance de calcul disponible, avait été exagérée. Les financements se sont taris et la confiance dans le domaine s'est ralentie. Parmi les problèmes qui ont eu un impact sur la confiance, citons :
- **Restrictions**. La puissance de calcul était trop limitée.
- **Explosion combinatoire**. Le nombre de paramètres à former augmentait de façon exponentielle à mesure que l'on en demandait davantage aux ordinateurs, sans évolution parallèle de la puissance et de la capacité de calcul.
- **Pénurie de données**. Il y avait un manque de données qui a entravé le processus de test, de développement et de raffinement des algorithmes.
- **Posions-nous les bonnes questions ?**. Les questions mêmes, qui étaient posées, ont commencé à être remises en question. Les chercheurs ont commencé à émettre des critiques sur leurs approches :
- Les tests de Turing ont été remis en question au moyen, entre autres, de la « théorie de la chambre chinoise » qui postulait que « la programmation d'un ordinateur numérique peut faire croire qu'il comprend le langage mais ne peut pas produire une compréhension réelle ». ([source](https://plato.stanford.edu/entries/chinese-room/))
- L'éthique de l'introduction d'intelligences artificielles telles que la "thérapeute" ELIZA dans la société a été remise en cause.
Dans le même temps, diverses écoles de pensée sur l'IA ont commencé à se former. Une dichotomie a été établie entre les pratiques IA ["scruffy" et "neat"](https://wikipedia.org/wiki/Neats_and_scruffies). Les laboratoires _Scruffy_ peaufinaient leurs programmes pendant des heures jusqu'à ce qu'ils obtiennent les résultats souhaités. Les laboratoires _Neat_ "se concentraient sur la logique et la résolution formelle de problèmes". ELIZA et SHRDLU étaient des systèmes _scruffy_ bien connus. Dans les années 1980, alors qu'émergeait la demande de rendre les systèmes ML reproductibles, l'approche _neat_ a progressivement pris le devant de la scène car ses résultats sont plus explicables.
## 1980 : Systèmes experts
Au fur et à mesure que le domaine s'est développé, ses avantages pour les entreprises sont devenus plus clairs, particulièrement via les « systèmes experts » dans les années 1980. "Les systèmes experts ont été parmi les premières formes vraiment réussies de logiciels d'intelligence artificielle (IA)." ([source](https://fr.wikipedia.org/wiki/Syst%C3%A8me_expert)).
Ce type de système est en fait _hybride_, composé en partie d'un moteur de règles définissant les exigences métier et d'un moteur d'inférence qui exploite le système de règles pour déduire de nouveaux faits.
Cette époque a également vu une attention croissante accordée aux réseaux de neurones.
## 1987 - 1993 : IA « Chill »
La prolifération du matériel spécialisé des systèmes experts a eu pour effet malheureux de devenir trop spécialisée. L'essor des ordinateurs personnels a également concurrencé ces grands systèmes spécialisés et centralisés. La démocratisation de l'informatique a commencé et a finalement ouvert la voie à l'explosion des mégadonnées.
## 1993 - 2011
Cette époque a vu naître une nouvelle ère pour le ML et l'IA afin de résoudre certains des problèmes qui n'avaient pu l'être plus tôt par le manque de données et de puissance de calcul. La quantité de données a commencé à augmenter rapidement et à devenir plus largement disponibles, pour le meilleur et pour le pire, en particulier avec l'avènement du smartphone vers 2007. La puissance de calcul a augmenté de façon exponentielle et les algorithmes ont évolué parallèlement. Le domaine a commencé à gagner en maturité alors que l'ingéniosité a commencé à se cristalliser en une véritable discipline.
## À présent
Aujourd'hui, le machine learning et l'IA touchent presque tous les aspects de notre vie. Cette ère nécessite une compréhension approfondie des risques et des effets potentiels de ces algorithmes sur les vies humaines. Comme l'a déclaré Brad Smith de Microsoft, « les technologies de l'information soulèvent des problèmes qui vont au cœur des protections fondamentales des droits de l'homme comme la vie privée et la liberté d'expression. Ces problèmes accroissent la responsabilité des entreprises technologiques qui créent ces produits. À notre avis, ils appellent également à une réglementation gouvernementale réfléchie et au développement de normes autour des utilisations acceptables" ([source](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
Reste à savoir ce que l'avenir nous réserve, mais il est important de comprendre ces systèmes informatiques ainsi que les logiciels et algorithmes qu'ils exécutent. Nous espérons que ce programme vous aidera à mieux les comprendre afin que vous puissiez décider par vous-même.
[![L'histoire du Deep Learning](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "L'histoire du Deep Learning")
> 🎥 Cliquez sur l'image ci-dessus pour une vidéo : Yann LeCun discute de l'histoire du deep learning dans cette conférence
---
## 🚀Challenge
Plongez dans l'un de ces moments historiques et apprenez-en plus sur les personnes derrière ceux-ci. Il y a des personnalités fascinantes, et aucune découverte scientifique n'a jamais été créée avec un vide culturel. Que découvrez-vous ?
## [Quiz de validation des connaissances](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/4/)
## Révision et auto-apprentissage
Voici quelques articles à regarder et à écouter :
[Ce podcast où Amy Boyd discute de l'évolution de l'IA](http://runasradio.com/Shows/Show/739)
[![L'histoire de l'IA par Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "L'histoire de l'IA par Amy Boyd")
## Devoir
[Créer une frise chronologique](assignment.fr.md)

@ -0,0 +1,11 @@
# Créer une frise chronologique
## Instructions
Utiliser [ce repo](https://github.com/Digital-Humanities-Toolkit/timeline-builder), créer une frise chronologique de certains aspects de l'histoire des algorithmes, des mathématiques, des statistiques, de l'IA ou du machine learning, ou une combinaison de ceux-ci. Vous pouvez vous concentrer sur une personne, une idée ou une longue période d'innovations. Assurez-vous d'ajouter des éléments multimédias.
## Rubrique
| Critères | Exemplaire | Adéquate | A améliorer |
| -------- | ---------------------------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------ |
| | Une chronologie déployée est présentée sous forme de page GitHub | Le code est incomplet et non déployé | La chronologie est incomplète, pas bien recherchée et pas déployée |

@ -72,7 +72,7 @@
训练过程完成后(训练大型模型可能需要多次迭代或“时期”),你将能够通过使用测试数据来衡量模型的性能来评估模型的质量。此数据是模型先前未分析的原始数据的子集。 你可以打印出有关模型质量的指标表。
🎓 **模型拟合 **
🎓 **模型拟合**
在机器学习的背景下,模型拟合是指模型在尝试分析不熟悉的数据时其底层功能的准确性。

@ -0,0 +1,211 @@
# Iniziare con Python e Scikit-learn per i modelli di regressione
![Sommario delle regressioni in uno sketchnote](../../../sketchnotes/ml-regression.png)
> Sketchnote di [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Qui Pre-lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/9/)
## Introduzione
In queste quattro lezioni, si scoprirà come costruire modelli di regressione. Si discuterà di cosa siano fra breve.
Prima di tutto, ci si deve assicurare di avere a disposizione gli strumenti adatti per far partire il processo!
In questa lezione, si imparerà come:
- Configurare il proprio computer per attività locali di machine learning.
- Lavorare con i Jupyter notebook.
- Usare Scikit-learn, compresa l'installazione.
- Esplorare la regressione lineare con un esercizio pratico.
## Installazioni e configurazioni
[![Usare Python con Visual Studio Code](https://img.youtube.com/vi/7EXd4_ttIuw/0.jpg)](https://youtu.be/7EXd4_ttIuw "Using Python with Visual Studio Code")
> 🎥 Fare click sull'immagine qui sopra per un video: usare Python all'interno di VS Code.
1. **Installare Python**. Assicurarsi che [Python](https://www.python.org/downloads/) sia installato nel proprio computer. Si userà Python for per molte attività di data science e machine learning. La maggior parte dei sistemi già include una installazione di Python. Ci sono anche utili [Pacchetti di Codice Python](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-15963-cxa) disponbili, per facilitare l'installazione per alcuni utenti.
Alcuni utilizzi di Python, tuttavia, richiedono una versione del software, laddove altri ne richiedono un'altra differente. Per questa ragione, è utile lavorare con un [ambiente virtuale](https://docs.python.org/3/library/venv.html).
2. **Installare Visual Studio Code**. Assicurarsi di avere installato Visual Studio Code sul proprio computer. Si seguano queste istruzioni per [installare Visual Studio Code](https://code.visualstudio.com/) per l'installazione basica. Si userà Python in Visual Studio Code in questo corso, quindi meglio rinfrescarsi le idee su come [configurare Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-15963-cxa) per lo sviluppo in Python.
> Si prenda confidenza con Python tramite questa collezione di [moduli di apprendimento](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-15963-cxa)
3. **Installare Scikit-learn**, seguendo [queste istruzioni](https://scikit-learn.org/stable/install.html). Visto che ci si deve assicurare di usare Python 3, ci si raccomanda di usare un ambiente virtuale. Si noti che se si installa questa libreria in un M1 Mac, ci sono istruzioni speciali nella pagina di cui al riferimento qui sopra.
1. **Installare Jupyter Notebook**. Servirà [installare il pacchetto Jupyter](https://pypi.org/project/jupyter/).
## Ambiente di creazione ML
Si useranno **notebook** per sviluppare il codice Python e creare modelli di machine learning. Questo tipo di file è uno strumento comune per i data scientist, e viene identificato dal suffisso o estensione `.ipynb`.
I notebook sono un ambiente interattivo che consente allo sviluppatore di scrivere codice, aggiungere note e scrivere documentazione attorno al codice il che è particolarmente utile per progetti sperimentali o orientati alla ricerca.
### Esercizio - lavorare con un notebook
In questa cartella, si troverà il file _notebook.ipynb_.
1. Aprire _notebook.ipynb_ in Visual Studio Code.
Un server Jupyter verrà lanciato con Python 3+. Si troveranno aree del notebook che possono essere `eseguite`, pezzi di codice. Si può eseguire un blocco di codice selezionando l'icona che assomiglia a un bottone di riproduzione.
1. Selezionare l'icona `md` e aggiungere un poco di markdown, e il seguente testo **# Benvenuto nel tuo notebook**.
Poi, aggiungere un blocco di codice Python.
1. Digitare **print('hello notebook')** nell'area riservata al codice.
1. Selezionare la freccia per eseguire il codice.
Si dovrebbe vedere stampata la seguente frase:
```output
hello notebook
```
![VS Code con un notebook aperto](../images/notebook.png)
Si può inframezzare il codice con commenti per auto documentare il notebook.
✅ Si pensi per un minuto all'ambiente di lavoro di uno sviluppatore web rispetto a quello di un data scientist.
## Scikit-learn installato e funzionante
Adesso che Python è impostato nel proprio ambiente locale, e si è familiari con i notebook Jupyter, si acquisterà ora confidenza con Scikit-learn (si pronuncia con la `si` della parola inglese `science`). Scikit-learn fornisce una [API estensiva](https://scikit-learn.org/stable/modules/classes.html#api-ref) che aiuta a eseguire attività ML.
Stando al loro [sito web](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn è una libreria di machine learning open source che supporta l'apprendimento assistito (supervised learning) e non assistito (unsuperivised learnin). Fornisce anche strumenti vari per l'adattamento del modello, la pre-elaborazione dei dati, la selezione e la valutazione dei modelli e molte altre utilità."
In questo corso, si userà Scikit-learn e altri strumenti per costruire modelli di machine learning per eseguire quelle che vengono chiamate attività di 'machine learning tradizionale'. Si sono deliberamente evitate le reti neurali e il deep learning visto che saranno meglio trattati nel prossimo programma di studi 'AI per Principianti'.
Scikit-learn rende semplice costruire modelli e valutarli per l'uso. Si concentra principalmente sull'utilizzo di dati numerici e contiene diversi insiemi di dati già pronti per l'uso come strumenti di apprendimento. Include anche modelli pre-costruiti per gli studenti da provare. Si esplora ora il processo di caricamento dei dati preconfezionati, e, utilizzando un modello di stimatore incorporato, un primo modello ML con Scikit-Learn con alcuni dati di base.
## Esercizio - Il Primo notebook Scikit-learn
> Questo tutorial è stato ispirato dall'[esempio di regressione lineare](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) nel sito web di Scikit-learn.
Nel file _notebook.ipynb_ associato a questa lezione, svuotare tutte le celle usando l'icona cestino ('trash can').
In questa sezione, di lavorerà con un piccolo insieme di dati sul diabete che è incorporato in Scikit-learn per scopi di apprendimento. Si immagini di voler testare un trattamento per i pazienti diabetici. I modelli di machine learning potrebbero essere di aiuto nel determinare quali pazienti risponderebbero meglio al trattamento, in base a combinazioni di variabili. Anche un modello di regressione molto semplice, quando visualizzato, potrebbe mostrare informazioni sulle variabili che aiuteranno a organizzare le sperimentazioni cliniche teoriche.
✅ Esistono molti tipi di metodi di regressione e quale scegliere dipende dalla risposta che si sta cercando. Se si vuole prevedere l'altezza probabile per una persona di una data età, si dovrebbe usare la regressione lineare, visto che si sta cercando un **valore numerico**. Se si è interessati a scoprire se un tipo di cucina dovrebbe essere considerato vegano o no, si sta cercando un'**assegnazione di categoria** quindi si dovrebbe usare la regressione logistica. Si imparerà di più sulla regressione logistica in seguito. Si pensi ad alcune domande che si possono chiedere ai dati e quale di questi metodi sarebbe più appropriato.
Si inizia con questa attività.
### Importare le librerie
Per questo compito verranno importate alcune librerie:
- **matplotlib**. E' un utile [strumento grafico](https://matplotlib.org/) e verrà usato per creare una trama a linee.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) è una libreira utile per gestire i dati numerici in Python.
- **sklearn**. Questa è la libreria Scikit-learn.
Importare alcune librerie che saranno di aiuto per le proprie attività.
1. Con il seguente codice si aggiungono le importazioni:
```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
```
Qui sopra vengono importati `matplottlib`, e `numpy`, da `sklearn` si importa `datasets`, `linear_model` e `model_selection`. `model_selection` viene usato per dividere i dati negli insiemi di addestramento e test.
### L'insieme di dati riguardante il diabete
L'[insieme dei dati sul diabete](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) include 442 campioni di dati sul diabete, con 10 variabili caratteristiche, alcune delle quali includono:
- age (età): età in anni
- bmi: indice di massa corporea (body mass index)
- bp: media pressione sanguinea
- s1 tc: Cellule T (un tipo di leucocito)
✅ Questo insieme di dati include il concetto di "sesso" come caratteristica variabile importante per la ricerca sul diabete. Molti insiemi di dati medici includono questo tipo di classificazione binaria. Si rifletta su come categorizzazioni come questa potrebbe escludere alcune parti di una popolazione dai trattamenti.
Ora si caricano i dati di X e y.
> 🎓 Si ricordi, questo è apprendimento supervisionato (supervised learning), e serve dare un nome all'obiettivo 'y'.
In una nuova cella di codice, caricare l'insieme di dati sul diabete chiamando `load_diabetes()`. Il parametro `return_X_y=True` segnala che `X` sarà una matrice di dati e `y` sarà l'obiettivo della regressione.
1. Si aggiungono alcuni comandi di stampa per msotrare la forma della matrice di dati e i suoi primi elementi:
```python
X, y = datasets.load_diabetes(return_X_y=True)
print(X.shape)
print(X[0])
```
Quella che viene ritornata è una tuple. Quello che si sta facento è assegnare i primi due valori della tupla a `X` e `y` rispettivamente. Per saperne di più sulle [tuples](https://wikipedia.org/wiki/Tuple).
Si può vedere che questi dati hanno 442 elementi divisi in array di 10 elementi:
```text
(442, 10)
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ Si rifletta sulla relazione tra i dati e l'obiettivo di regressione. La regressione lineare prevede le relazioni tra la caratteristica X e la variabile di destinazione y. Si può trovare l'[obiettivo](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) per l'insieme di dati sul diabete nella documentazione? Cosa dimostra questo insieme di dati, dato quell'obiettivo?
2. Successivamente, selezionare una porzione di questo insieme di dati da tracciare sistemandola in un nuovo array usando la funzione di numpy's `newaxis`. Verrà usata la regressione lineare per generare una linea tra i valori in questi dati secondo il modello che determina.
```python
X = X[:, np.newaxis, 2]
```
✅ A piacere, stampare i dati per verificarne la forma.
3. Ora che si hanno dei dati pronti per essere tracciati, è possibile vedere se una macchina può aiutare a determinare una divisione logica tra i numeri in questo insieme di dati. Per fare ciò, è necessario dividere sia i dati (X) che l'obiettivo (y) in insiemi di test e addestamento. Scikit-learn ha un modo semplice per farlo; si possono dividere i dati di prova in un determinato punto.
```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
```
4. Ora si è pronti ad addestare il modello! Caricare il modello di regressione lineare e addestrarlo con i propri insiemi di addestramento X e y usando `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` è una funzione che si vedrà in molte librerie ML tipo TensorFlow
5. Successivamente creare una previsione usando i dati di test, con la funzione `predict()`. Questo servirà per tracciare la linea tra i gruppi di dati
```python
y_pred = model.predict(X_test)
```
6. Ora è il momento di mostrare i dati in un tracciato. Matplotlib è uno strumento molto utile per questo compito. Si crei un grafico a dispersione (scatterplot) di tutti i dati del test X e y e si utilizzi la previsione per disegnare una linea nel luogo più appropriato, tra i raggruppamenti dei dati del modello.
```python
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.show()
```
![un grafico a dispersione che mostra i punti dati sul diabete](../images/scatterplot.png)
✅ Si pensi a cosa sta succedendo qui. Una linea retta scorre attraverso molti piccoli punti dati, ma cosa sta facendo esattamente? Si può capire come si dovrebbe utilizzare questa linea per prevedere dove un nuovo punto di dati non noto dovrebbe adattarsi alla relazione con l'asse y del tracciato? Si cerchi di mettere in parole l'uso pratico di questo modello.
Congratulazioni, si è costruito il primo modello di regressione lineare, creato una previsione con esso, e visualizzata in una tracciato!
---
## 🚀Sfida
Tracciare una variabile diversa da questo insieme di dati. Suggerimento: modificare questa riga: `X = X[:, np.newaxis, 2]`. Dato l'obiettivo di questo insieme di dati, cosa si potrebbe riuscire a scoprire circa la progressione del diabete come matattia?
## [Qui post-lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/10/)
## Riepilogo e Auto Apprendimento
In questo tutorial, si è lavorato con una semplice regressione lineare, piuttosto che una regressione univariata o multipla. Ci so informi circa le differenze tra questi metodi oppure si dia uno sguardo a [questo video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef)
Si legga di più sul concetto di regressione e si pensi a quale tipo di domande potrebbero trovare risposta con questa tecnica. Seguire questo [tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-15963-cxa) per approfondire la propria conoscenza.
## Compito
[Un insieme di dati diverso](assignment.it.md)

@ -46,7 +46,7 @@ Notebooks是一个交互式环境允许开发人员编写代码并添加注
Jupyter服务器将以python3+启动。你会发现notebook可以“运行”的区域、代码块。你可以通过选择看起来像播放按钮的图标来运行代码块。
2. 选择`md`图标并添加一点markdown输入文字**#Welcome to your notebook**。
2. 选择`md`图标并添加一点markdown输入文字 **# Welcome to your notebook**。
接下来添加一些Python代码。
@ -80,7 +80,7 @@ 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)。
在与本课程相关的_notebook.ipynb_文件中通过点击“垃圾桶”图标清除所有单元格。
在与本课程相关的 _notebook.ipynb_ 文件中,通过点击“垃圾桶”图标清除所有单元格。
在本节中你将使用一个关于糖尿病的小数据集该数据集内置于Scikit-learn中以用于学习目的。想象一下你想为糖尿病患者测试一种治疗方法。机器学习模型可能会帮助你根据变量组合确定哪些患者对治疗反应更好。即使是非常基本的回归模型在可视化时也可能会显示有助于组织理论临床试验的变量信息。

@ -0,0 +1,13 @@
# Regressione con Scikit-learn
## Istruzioni
Dare un'occhiata all'[insieme di dati Linnerud](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) in Scikit-learn. Questo insieme di dati ha [obiettivi](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset) multipli: "Consiste di tre variabili di esercizio (dati) e tre variabili fisiologiche (obiettivo) raccolte da venti uomini di mezza età in un fitness club".
Con parole proprie, descrivere come creare un modello di Regressione che tracci la relazione tra il punto vita e il numero di addominali realizzati. Fare lo stesso per gli altri punti dati in questo insieme di dati.
## Rubrica
| Criteri | Ottimo | Adeguato | Necessita miglioramento |
| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- |
| Inviare un paragrafo descrittivo | Viene presentato un paragrafo ben scritto | Vengono inviate alcune frasi | Non viene fornita alcuna descrizione |

@ -0,0 +1,201 @@
# Costruire un modello di regressione usando Scikit-learn: preparare e visualizzare i dati
> ![Infografica sulla visualizzazione dei dati](../images/data-visualization.png)
> Infografica di [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Quiz Pre-Lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/11/)
## Introduzione
Ora che si hanno a disposizione gli strumenti necessari per iniziare ad affrontare la creazione di modelli di machine learning con Scikit-learn, si è pronti per iniziare a porre domande sui propri dati. Mentre si lavora con i dati e si applicano soluzioni ML, è molto importante capire come porre la domanda giusta per sbloccare correttamente le potenzialità del proprio insieme di dati.
In questa lezione, si imparerà:
- Come preparare i dati per la creazione del modello.
- Come utilizzare Matplotlib per la visualizzazione dei dati.
## Fare la domanda giusta ai propri dati
La domanda a cui si deve rispondere determinerà il tipo di algoritmi ML che verranno utilizzati. La qualità della risposta che si riceverà dipenderà fortemente dalla natura dei propri dati.
Si dia un'occhiata ai [dati](../../data/US-pumpkins.csv) forniti per questa lezione. Si può aprire questo file .csv in VS Code. Una rapida scrematura mostra immediatamente che ci sono spazi vuoti e un mix di stringhe e dati numerici. C'è anche una strana colonna chiamata "Package" (pacchetto) in cui i dati sono un mix tra "sacks" (sacchi), "bins" (contenitori) e altri valori. I dati, infatti, sono un po' un pasticcio.
In effetti, non è molto comune ricevere un insieme di dati completamente pronto per creare un modello ML pronto all'uso. In questa lezione si imparerà come preparare un insieme di dati non elaborato utilizzando le librerie standard di Python. Si impareranno anche varie tecniche per visualizzare i dati.
## Caso di studio: 'il mercato della zucca'
In questa cartella si troverà un file .csv nella cartella `data` radice chiamato [US-pumpkins.csv](../../data/US-pumpkins.csv) che include 1757 righe di dati sul mercato delle zucche, ordinate in raggruppamenti per città. Si tratta di dati grezzi estratti dai [Report Standard dei Mercati Terminali delle Colture Speciali](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuiti dal Dipartimento dell'Agricoltura degli Stati Uniti.
### Preparazione dati
Questi dati sono di pubblico dominio. Possono essere scaricati in molti file separati, per città, dal sito web dell'USDA. Per evitare troppi file separati, sono stati concatenati tutti i dati della città in un unico foglio di calcolo, quindi un po' i dati sono già stati _preparati_ . Successivamente, si darà un'occhiata più da vicino ai dati.
### I dati della zucca - prime conclusioni
Cosa si nota riguardo a questi dati? Si è già visto che c'è un mix di stringhe, numeri, spazi e valori strani a cui occorre dare un senso.
Che domanda si puà fare a questi dati, utilizzando una tecnica di Regressione? Che dire di "Prevedere il prezzo di una zucca in vendita durante un dato mese". Esaminando nuovamente i dati, ci sono alcune modifiche da apportare per creare la struttura dati necessaria per l'attività.
## Esercizio: analizzare i dati della zucca
Si usa [Pandas](https://pandas.pydata.org/), (il nome sta per `Python Data Analysis`) uno strumento molto utile per dare forma ai dati, per analizzare e preparare questi dati sulla zucca.
### Innanzitutto, controllare le date mancanti
Prima si dovranno eseguire i passaggi per verificare le date mancanti:
1. Convertire le date in un formato mensile (queste sono date statunitensi, quindi il formato è `MM/GG/AAAA`).
2. Estrarre il mese in una nuova colonna.
Aprire il file _notebook.ipynb_ in Visual Studio Code e importare il foglio di calcolo in un nuovo dataframe Pandas.
1. Usare la funzione `head()` per visualizzare le prime cinque righe.
```python
import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
pumpkins.head()
```
✅ Quale funzione si userebbe per visualizzare le ultime cinque righe?
1. Controllare se mancano dati nel dataframe corrente:
```python
pumpkins.isnull().sum()
```
Ci sono dati mancanti, ma forse non avrà importanza per l'attività da svolgere.
1. Per rendere più facile lavorare con il dataframe, si scartano molte delle sue colonne, usando `drop()`, mantenendo solo le colonne di cui si ha bisogno:
```python
new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)
```
### Secondo, determinare il prezzo medio della zucca
Si pensi a come determinare il prezzo medio di una zucca in un dato mese. Quali colonne si sceglierebbero per questa attività? Suggerimento: serviranno 3 colonne.
Soluzione: prendere la media delle colonne `Low Price` e `High Price` per popolare la nuova colonna Price e convertire la colonna Date per mostrare solo il mese. Fortunatamente, secondo il controllo di cui sopra, non mancano dati per date o prezzi.
1. Per calcolare la media, aggiungere il seguente codice:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
```
✅ Si possono di stampare tutti i dati che si desidera controllare utilizzando `print(month)`.
2. Ora copiare i dati convertiti in un nuovo dataframe Pandas:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
La stampa del dataframe mostrerà un insieme di dati pulito e ordinato su cui si può costruire il nuovo modello di regressione.
### Ma non è finita qui! C'è qualcosa di strano qui.
Osservando la colonna `Package`, le zucche sono vendute in molte configurazioni diverse. Alcune sono venduti in misure '1 1/9 bushel' (bushel = staio) e alcuni in misure '1/2 bushel', alcuni per zucca, alcuni per libbra e alcuni in grandi scatole con larghezze variabili.
> Le zucche sembrano molto difficili da pesare in modo coerente
Scavando nei dati originali, è interessante notare che qualsiasi cosa con `Unit of Sale` (Unità di vendita) uguale a 'EACH' o 'PER BIN' ha anche il tipo di `Package` per 'inch' (pollice), per 'bin' (contenitore) o 'each' (entrambi). Le zucche sembrano essere molto difficili da pesare in modo coerente, quindi si filtrano selezionando solo zucche con la stringa "bushel" nella colonna `Package`.
1. Aggiungere un filtro nella parte superiore del file, sotto l'importazione .csv iniziale:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
Se si stampano i dati ora, si può vedere che si stanno ricevendo solo le circa 415 righe di dati contenenti zucche per bushel.
### Ma non è finita qui! C'è un'altra cosa da fare.
Si è notato che la quantità di bushel varia per riga? Si deve normalizzare il prezzo in modo da mostrare il prezzo per bushel, quindi si facciano un po' di calcoli per standardizzarlo.
1. Aggiungere queste righe dopo il blocco che crea il 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)
```
✅ Secondo [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), il peso di un bushel dipende dal tipo di prodotto, poiché è una misura di volume. "Un bushel di pomodori, per esempio, dovrebbe pesare 56 libbre... Foglie e verdure occupano più spazio con meno peso, quindi un bushel di spinaci è solo 20 libbre". È tutto piuttosto complicato! Non occorre preoccuparsi di fare una conversione da bushel a libbra, e invece si valuta a bushel. Tutto questo studio sui bushel di zucche, però, dimostra quanto sia importante capire la natura dei propri dati!
Ora si può analizzare il prezzo per unità in base alla misurazione del bushel. Se si stampano i dati ancora una volta, si può vedere come sono standardizzati.
✅ Si è notato che le zucche vendute a metà bushel sono molto costose? Si riesce a capire perché? Suggerimento: le zucche piccole sono molto più costose di quelle grandi, probabilmente perché ce ne sono molte di più per bushel, dato lo spazio inutilizzato occupato da una grande zucca cava.
## Strategie di Visualizzazione
Parte del ruolo del data scientist è dimostrare la qualità e la natura dei dati con cui sta lavorando. Per fare ciò, si creano spesso visualizzazioni interessanti o tracciati, grafici e diagrammi, che mostrano diversi aspetti dei dati. In questo modo, sono in grado di mostrare visivamente relazioni e lacune altrimenti difficili da scoprire.
Le visualizzazioni possono anche aiutare a determinare la tecnica di machine learning più appropriata per i dati. Un grafico a dispersione che sembra seguire una linea, ad esempio, indica che i dati sono un buon candidato per un esercizio di regressione lineare.
Una libreria di visualizzazione dei dati che funziona bene nei notebook Jupyter è [Matplotlib](https://matplotlib.org/) (che si è visto anche nella lezione precedente).
> Per fare più esperienza con la visualizzazione dei dati si seguano [questi tutorial](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-15963-cxa).
## Esercizio - sperimentare con Matplotlib
Provare a creare alcuni grafici di base per visualizzare il nuovo dataframe appena creato. Cosa mostrerebbe un grafico a linee di base?
1. Importare Matplotlib nella parte superiore del file, sotto l'importazione di Pandas:
```python
import matplotlib.pyplot as plt
```
1. Rieseguire l'intero notebook per aggiornare.
1. Nella parte inferiore del notebook, aggiungere una cella per tracciare i dati come una casella:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![Un grafico a dispersione che mostra la relazione tra prezzo e mese](../images/scatterplot.png)
È un tracciato utile? C'è qualcosa che sorprende?
Non è particolarmente utile in quanto tutto ciò che fa è visualizzare nei propri dati come una diffusione di punti in un dato mese.
### Renderlo utile
Per fare in modo che i grafici mostrino dati utili, di solito è necessario raggruppare i dati in qualche modo. Si prova a creare un grafico che mostra la distribuzione dei dati dove l'asse x mostra i mesi.
1. Aggiungere una cella per creare un grafico a barre raggruppato:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![Un grafico a barre che mostra la relazione tra prezzo e mese](../images/barchart.png)
Questa è una visualizzazione dei dati più utile! Sembra indicare che il prezzo più alto per le zucche si verifica a settembre e ottobre. Questo soddisfa le proprie aspettative? Perché o perché no?
---
## 🚀 Sfida
Esplorare i diversi tipi di visualizzazione offerti da Matplotlib. Quali tipi sono più appropriati per i problemi di regressione?
## [Quiz post-lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/12/)
## Revisione e Auto Apprendimento
Dare un'occhiata ai molti modi per visualizzare i dati. Fare un elenco delle varie librerie disponibili e annotare quali sono le migliori per determinati tipi di attività, ad esempio visualizzazioni 2D rispetto a visualizzazioni 3D. Cosa si è scoperto?
## Compito
[Esplorazione della visualizzazione](assignment.it.md)

@ -0,0 +1,9 @@
# Esplorazione delle visualizzazioni
Sono disponibili diverse librerie per la visualizzazione dei dati. Creare alcune visualizzazioni utilizzando i dati della zucca in questa lezione con matplotlib e seaborn in un notebook di esempio. Con quali librerie è più facile lavorare?
## Rubrica
| Criteri | Ottimo | Adeguato | Necessita miglioramento |
| -------- | --------- | -------- | ----------------- |
| | Viene inviato un notebook con due esplorazioni/visualizzazioni | Viene inviato un notebook con una esplorazione/visualizzazione | Non è stato inviato un notebook |

@ -0,0 +1,339 @@
# Costruire un modello di regressione usando Scikit-learn: regressione in due modi
![Infografica di regressione lineare e polinomiale](../images/linear-polynomial.png)
> Infografica di [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Quiz Pre-Lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/13/)
### Introduzione
Finora si è esplorato cos'è la regressione con dati di esempio raccolti dall'insieme di dati relativo ai prezzi della zucca, che verrà usato in questa lezione. Lo si è anche visualizzato usando Matplotlib.
Ora si è pronti per approfondire la regressione per machine learning. In questa lezione si imparerà di più su due tipi di regressione: _regressione lineare di base_ e _regressione polinomiale_, insieme ad alcuni dei calcoli alla base di queste tecniche.
> In questo programma di studi, si assume una conoscenza minima della matematica, e si cerca di renderla accessibile agli studenti provenienti da altri campi, quindi si faccia attenzione a note, 🧮 didascalie, diagrammi e altri strumenti di apprendimento che aiutano la comprensione.
### Prerequisito
Si dovrebbe ormai avere familiarità con la struttura dei dati della zucca che si sta esaminando. Lo si può trovare precaricato e prepulito nel file _notebook.ipynb_ di questa lezione. Nel file, il prezzo della zucca viene visualizzato per bushel (staio) in un nuovo dataframe. Assicurasi di poter eseguire questi notebook nei kernel in Visual Studio Code.
### Preparazione
Come promemoria, si stanno caricando questi dati in modo da porre domande su di essi.
- Qual è il momento migliore per comprare le zucche?
- Che prezzo ci si può aspettare da una cassa di zucche in miniatura?
- Si devono acquistare in cestini da mezzo bushel o a scatola da 1 1/9 bushel? Si continua a scavare in questi dati.
Nella lezione precedente, è stato creato un dataframe Pandas e si è popolato con parte dell'insieme di dati originale, standardizzando il prezzo per lo bushel. In questo modo, tuttavia, si sono potuti raccogliere solo circa 400 punti dati e solo per i mesi autunnali.
Si dia un'occhiata ai dati precaricati nel notebook di accompagnamento di questa lezione. I dati sono precaricati e viene tracciato un grafico a dispersione iniziale per mostrare i dati mensili. Forse si può ottenere qualche dettaglio in più sulla natura dei dati pulendoli ulteriormente.
## Una linea di regressione lineare
Come si è appreso nella lezione 1, l'obiettivo di un esercizio di regressione lineare è essere in grado di tracciare una linea per:
- **Mostrare le relazioni tra variabili**.
- **Fare previsioni**. Fare previsioni accurate su dove cadrebbe un nuovo punto dati in relazione a quella linea.
È tipico della **Regressione dei Minimi Quadrati** disegnare questo tipo di linea. Il termine "minimi quadrati" significa che tutti i punti dati che circondano la linea di regressione sono elevati al quadrato e quindi sommati. Idealmente, quella somma finale è la più piccola possibile, perché si vuole un basso numero di errori, o `minimi quadrati`.
Lo si fa perché si vuole modellare una linea che abbia la distanza cumulativa minima da tutti i punti dati. Si esegue anche il quadrato dei termini prima di aggiungerli poiché interessa la grandezza piuttosto che la direzione.
> **🧮 Mostrami la matematica**
>
> Questa linea, chiamata _linea di miglior adattamento_ , può essere espressa da [un'equazione](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
> ```
> Y = a + bX
> ```
>
> `X` è la "variabile esplicativa". `Y` è la "variabile dipendente". La pendenza della linea è `b` e `a` è l'intercetta di y, che si riferisce al valore di `Y` quando `X = 0`.
>
> ![calcolare la pendenza](../images/slope.png)
>
> Prima, calcolare la pendenza `b`. Infografica di [Jen Looper](https://twitter.com/jenlooper)
>
> In altre parole, facendo riferimento alla domanda originale per i dati sulle zucche: "prevedere il prezzo di una zucca per bushel per mese", `X` si riferisce al prezzo e `Y` si riferirisce al mese di vendita.
>
> ![completare l'equazione](../images/calculation.png)
>
> Si calcola il valore di Y. Se si sta pagando circa $4, deve essere aprile! Infografica di [Jen Looper](https://twitter.com/jenlooper)
>
> La matematica che calcola la linea deve dimostrare la pendenza della linea, che dipende anche dall'intercetta, o dove `Y` si trova quando `X = 0`.
>
> Si può osservare il metodo di calcolo per questi valori sul sito web [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) . Si visiti anche [questo calcolatore dei minimi quadrati](https://www.mathsisfun.com/data/least-squares-calculator.html) per vedere come i valori dei numeri influiscono sulla linea.
## Correlazione
Un altro termine da comprendere è il **Coefficiente di Correlazione** tra determinate variabili X e Y. Utilizzando un grafico a dispersione, è possibile visualizzare rapidamente questo coefficiente. Un grafico con punti dati sparsi in una linea ordinata ha un'alta correlazione, ma un grafico con punti dati sparsi ovunque tra X e Y ha una bassa correlazione.
Un buon modello di regressione lineare sarà quello che ha un Coefficiente di Correlazione alto (più vicino a 1 rispetto a 0) utilizzando il Metodo di Regressione dei Minimi Quadrati con una linea di regressione.
✅ Eseguire il notebook che accompagna questa lezione e guardare il grafico a dispersione City to Price. I dati che associano la città al prezzo per le vendite di zucca sembrano avere una correlazione alta o bassa, secondo la propria interpretazione visiva del grafico a dispersione?
## Preparare i dati per la regressione
Ora che si ha una comprensione della matematica alla base di questo esercizio, si crea un modello di regressione per vedere se si può prevedere quale pacchetto di zucche avrà i migliori prezzi per zucca. Qualcuno che acquista zucche per una festa con tema un campo di zucche potrebbe desiderare che queste informazioni siano in grado di ottimizzare i propri acquisti di pacchetti di zucca per il campo.
Dal momento che si utilizzerà Scikit-learn, non c'è motivo di farlo a mano (anche se si potrebbe!). Nel blocco di elaborazione dati principale del notebook della lezione, aggiungere una libreria da Scikit-learn per convertire automaticamente tutti i dati di tipo stringa in numeri:
```python
from sklearn.preprocessing import LabelEncoder
new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform)
```
Se si guarda ora il dataframe new_pumpkins, si vede che tutte le stringhe ora sono numeriche. Questo rende più difficile la lettura per un umano ma molto più comprensibile per Scikit-learn!
Ora si possono prendere decisioni più consapevoli (non solo basate sull'osservazione di un grafico a dispersione) sui dati più adatti alla regressione.
Si provi a trovare una buona correlazione tra due punti nei propri dati per costruire potenzialmente un buon modello predittivo. A quanto pare, c'è solo una debole correlazione tra la città e il prezzo:
```python
print(new_pumpkins['City'].corr(new_pumpkins['Price']))
0.32363971816089226
```
Tuttavia, c'è una correlazione leggermente migliore tra il pacchetto e il suo prezzo. Ha senso, vero? Normalmente, più grande è la scatola dei prodotti, maggiore è il prezzo.
```python
print(new_pumpkins['Package'].corr(new_pumpkins['Price']))
0.6061712937226021
```
Una buona domanda da porre a questi dati sarà: "Che prezzo posso aspettarmi da un determinato pacchetto di zucca?"
Si costruisce questo modello di regressione
## Costruire un modello lineare
Prima di costruire il modello, si esegue un altro riordino dei dati. Si eliminano tutti i dati nulli e si controlla ancora una volta che aspetto hanno i dati.
```python
new_pumpkins.dropna(inplace=True)
new_pumpkins.info()
```
Quindi, si crea un nuovo dataframe da questo set minimo e lo si stampa:
```python
new_columns = ['Package', 'Price']
lin_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns')
lin_pumpkins
```
```output
Package Price
70 0 13.636364
71 0 16.363636
72 0 16.363636
73 0 15.454545
74 0 13.636364
... ... ...
1738 2 30.000000
1739 2 28.750000
1740 2 25.750000
1741 2 24.000000
1742 2 24.000000
415 rows × 2 columns
```
1. Ora si possono assegnare i dati delle coordinate X e y:
```python
X = lin_pumpkins.values[:, :1]
y = lin_pumpkins.values[:, 1:2]
```
Cosa sta succedendo qui? Si sta usando [la notazione slice Python](https://stackoverflow.com/questions/509211/understanding-slice-notation/509295#509295) per creare array per popolare `X` e `y`.
2. Successivamente, si avvia le routine di creazione del modello di regressione:
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
pred = lin_reg.predict(X_test)
accuracy_score = lin_reg.score(X_train,y_train)
print('Model Accuracy: ', accuracy_score)
```
Poiché la correlazione non è particolarmente buona, il modello prodotto non è molto accurato.
```output
Model Accuracy: 0.3315342327998987
```
3. Si può visualizzare la linea tracciata nel processo:
```python
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, pred, color='blue', linewidth=3)
plt.xlabel('Package')
plt.ylabel('Price')
plt.show()
```
![Un grafico a dispersione che mostra il rapporto tra pacchetto e prezzo](../images/linear.png)
4. Si testa il modello contro una varietà ipotetica:
```python
lin_reg.predict( np.array([ [2.75] ]) )
```
Il prezzo restituito per questa varietà mitologica è:
```output
array([[33.15655975]])
```
Quel numero ha senso, se la logica della linea di regressione è vera.
🎃 Congratulazioni, si è appena creato un modello che può aiutare a prevedere il prezzo di alcune varietà di zucche. La zucca per le festività sarà bellissima. Ma probabilmente si può creare un modello migliore!
## Regressione polinomiale
Un altro tipo di regressione lineare è la regressione polinomiale. Mentre a volte c'è una relazione lineare tra le variabili - più grande è il volume della zucca, più alto è il prezzo - a volte queste relazioni non possono essere tracciate come un piano o una linea retta.
✅ Ecco [alcuni altri esempi](https://online.stat.psu.edu/stat501/lesson/9/9.8) di dati che potrebbero utilizzare la regressione polinomiale
Si dia un'altra occhiata alla relazione tra Varietà e Prezzo nel tracciato precedente. Questo grafico a dispersione deve essere necessariamente analizzato da una linea retta? Forse no. In questo caso, si può provare la regressione polinomiale.
✅ I polinomi sono espressioni matematiche che possono essere costituite da una o più variabili e coefficienti
La regressione polinomiale crea una linea curva per adattare meglio i dati non lineari.
1. Viene ricreato un dataframe popolato con un segmento dei dati della zucca originale:
```python
new_columns = ['Variety', 'Package', 'City', 'Month', 'Price']
poly_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns')
poly_pumpkins
```
Un buon modo per visualizzare le correlazioni tra i dati nei dataframe è visualizzarli in un grafico "coolwarm":
2. Si usa il metodo `Background_gradient()` con `coolwarm` come valore dell'argomento:
```python
corr = poly_pumpkins.corr()
corr.style.background_gradient(cmap='coolwarm')
```
Questo codice crea una mappa di calore:
![Una mappa di calore che mostra la correlazione dei dati](../images/heatmap.png)
Guardando questo grafico, si può visualizzare la buona correlazione tra Pacchetto e Prezzo. Quindi si dovrebbe essere in grado di creare un modello un po' migliore dell'ultimo.
### Creare una pipeline
Scikit-learn include un'API utile per la creazione di modelli di regressione polinomiale: l'[API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) `make_pipeline`. Viene creata una 'pipeline' che è una catena di stimatori. In questo caso, la pipeline include caratteristiche polinomiali o previsioni che formano un percorso non lineare.
1. Si costruiscono le colonne X e y:
```python
X=poly_pumpkins.iloc[:,3:4].values
y=poly_pumpkins.iloc[:,4:5].values
```
2. Si crea la pipeline chiamando il metodo `make_pipeline()` :
```python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(4), LinearRegression())
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
pipeline.fit(np.array(X_train), y_train)
y_pred=pipeline.predict(X_test)
```
### Creare una sequenza
A questo punto, è necessario creare un nuovo dataframe con dati _ordinati_ in modo che la pipeline possa creare una sequenza.
Si aggiunge il seguente codice:
```python
df = pd.DataFrame({'x': X_test[:,0], 'y': y_pred[:,0]})
df.sort_values(by='x',inplace = True)
points = pd.DataFrame(df).to_numpy()
plt.plot(points[:, 0], points[:, 1],color="blue", linewidth=3)
plt.xlabel('Package')
plt.ylabel('Price')
plt.scatter(X,y, color="black")
plt.show()
```
Si è creato un nuovo dataframe chiamato `pd.DataFrame`. Quindi si sono ordinati i valori chiamando `sort_values()`. Alla fine si è creato un grafico polinomiale:
![Un grafico polinomiale che mostra la relazione tra pacchetto e prezzo](../images/polynomial.png)
Si può vedere una linea curva che si adatta meglio ai dati.
Si verifica la precisione del modello:
```python
accuracy_score = pipeline.score(X_train,y_train)
print('Model Accuracy: ', accuracy_score)
```
E voilà!
```output
Model Accuracy: 0.8537946517073784
```
Ecco, meglio! Si prova a prevedere un prezzo:
### Fare una previsione
E possibile inserire un nuovo valore e ottenere una previsione?
Si chiami `predict()` per fare una previsione:
```python
pipeline.predict( np.array([ [2.75] ]) )
```
Viene data questa previsione:
```output
array([[46.34509342]])
```
Ha senso, visto il tracciato! Se questo è un modello migliore del precedente, guardando gli stessi dati, si deve preventivare queste zucche più costose!
Ben fatto! Sono stati creati due modelli di regressione in una lezione. Nella sezione finale sulla regressione, si imparerà a conoscere la regressione logistica per determinare le categorie.
---
## 🚀 Sfida
Testare diverse variabili in questo notebook per vedere come la correlazione corrisponde all'accuratezza del modello.
## [Quiz post-lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/14/)
## Revisione e Auto Apprendimento
In questa lezione si è appreso della regressione lineare. Esistono altri tipi importanti di regressione. Leggere le tecniche Stepwise, Ridge, Lazo ed Elasticnet. Un buon corso per studiare per saperne di più è il [corso Stanford Statistical Learning](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## Compito
[Costruire un modello](assignment.it.md)

@ -0,0 +1,11 @@
# Creare un Modello di Regressione
## Istruzioni
In questa lezione è stato mostrato come costruire un modello utilizzando sia la Regressione Lineare che Polinomiale. Usando questa conoscenza, trovare un insieme di dati o utilizzare uno degli insiemi integrati di Scikit-Learn per costruire un modello nuovo. Spiegare nel proprio notebook perché si è scelto una determinata tecnica e dimostrare la precisione del modello. Se non è accurato, spiegare perché.
## Rubrica
| Criteri | Ottimo | Adeguato | Necessita miglioramento |
| -------- | ------------------------------------------------------------ | -------------------------- | ------------------------------- |
| | presenta un notebook completo con una soluzione ben documentata | La soluzione è incompleta | La soluzione è difettosa o contiene bug |

@ -0,0 +1,299 @@
# Regressione logistica per prevedere le categorie
![Infografica di regressione lineare e logistica](../images/logistic-linear.png)
> Infografica di [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Quiz Pre-Lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/15/)
## Introduzione
In questa lezione finale sulla Regressione, una delle tecniche _classiche_ di base di machine learning, si darà un'occhiata alla Regressione Logistica. Si dovrebbe utilizzare questa tecnica per scoprire modelli per prevedere le categorie binarie. Questa caramella è al cioccolato o no? Questa malattia è contagiosa o no? Questo cliente sceglierà questo prodotto o no?
In questa lezione, si imparerà:
- Una nuova libreria per la visualizzazione dei dati
- Tecniche per la regressione logistica
✅ Con questo [modulo di apprendimento](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-15963-cxa) si potrà approfondire la comprensione del lavoro con questo tipo di regressione
## Prerequisito
Avendo lavorato con i dati della zucca, ora si ha abbastanza familiarità con essi per rendersi conto che esiste una categoria binaria con cui è possibile lavorare: `Color` (Colore).
Si costruisce un modello di regressione logistica per prevedere, date alcune variabili, di _che colore sarà probabilmente una data zucca_ (arancione 🎃 o bianca 👻).
> Perché si parla di classificazione binaria in un gruppo di lezioni sulla regressione? Solo per comodità linguistica, poiché la regressione logistica è in [realtà un metodo di classificazione](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), anche se lineare. Si scopriranno altri modi per classificare i dati nel prossimo gruppo di lezioni.
## Definire la domanda
Allo scopo, verrà espressa come binaria: 'Arancio' o 'Non Arancio'. C'è anche una categoria "striped" (a strisce) nell'insieme di dati, ma ci sono pochi casi, quindi non verrà presa in considerazione. Comunque scompare una volta rimossi i valori null dall'insieme di dati.
> 🎃 Fatto divertente, a volte le zucche bianche vengono chiamate zucche "fantasma" Non sono molto facili da intagliare, quindi non sono così popolari come quelle arancioni ma hanno un bell'aspetto!
## Informazioni sulla regressione logistica
La regressione logistica differisce dalla regressione lineare, che si è appresa in precedenza, in alcuni importanti modi.
### Classificazione Binaria
La regressione logistica non offre le stesse caratteristiche della regressione lineare. La prima offre una previsione su una categoria binaria ("arancione o non arancione") mentre la seconda è in grado di prevedere valori continui, ad esempio data l'origine di una zucca e il momento del raccolto, di _quanto aumenterà il suo prezzo_.
![Modello di classificazione della zucca](../images/pumpkin-classifier.png)
> Infografica di [Dasani Madipalli](https://twitter.com/dasani_decoded)
### Altre classificazioni:
Esistono altri tipi di regressione logistica, inclusi multinomiale e ordinale:
- **Multinomiale**, che implica avere più di una categoria: "arancione, bianco e a strisce".
- **Ordinale**, che coinvolge categorie ordinate, utile se si volessero ordinare i risultati in modo logico, come le zucche che sono ordinate per un numero finito di dimensioni (mini,sm,med,lg,xl,xxl).
![Regressione multinomiale contro ordinale](../images/multinomial-ordinal.png)
> Infografica di [Dasani Madipalli](https://twitter.com/dasani_decoded)
### È ancora lineare
Anche se questo tipo di Regressione riguarda le "previsioni di categoria", funziona ancora meglio quando esiste una chiara relazione lineare tra la variabile dipendente (colore) e le altre variabili indipendenti (il resto dell'insieme di dati, come il nome della città e le dimensioni) . È bene avere un'idea se c'è qualche linearità che divide queste variabili o meno.
### Le variabili NON devono essere correlate
Si ricorda come la regressione lineare ha funzionato meglio con più variabili correlate? La regressione logistica è l'opposto: le variabili non devono essere allineate. Funziona per questi dati che hanno correlazioni alquanto deboli.
### Servono molti dati puliti
La regressione logistica fornirà risultati più accurati se si utilizzano più dati; quindi si tenga a mente che, essendo l'insieme di dati sulla zucca piccolo, non è ottimale per questo compito
✅ Si pensi ai tipi di dati che si prestano bene alla regressione logistica
## Esercizio: riordinare i dati
Innanzitutto, si puliscono un po 'i dati, eliminando i valori null e selezionando solo alcune delle colonne:
1. Aggiungere il seguente codice:
```python
from sklearn.preprocessing import LabelEncoder
new_columns = ['Color','Origin','Item Size','Variety','City Name','Package']
new_pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)
new_pumpkins.dropna(inplace=True)
new_pumpkins = new_pumpkins.apply(LabelEncoder().fit_transform)
```
Si può sempre dare un'occhiata al nuovo dataframe:
```python
new_pumpkins.info
```
### Visualizzazione - griglia affiancata
A questo punto si è caricato di nuovo il [notebook iniziale](../notebook.ipynb) con i dati della zucca e lo si è pulito in modo da preservare un insieme di dati contenente alcune variabili, incluso `Color`. Si visualizza il dataframe nel notebook utilizzando una libreria diversa: [Seaborn](https://seaborn.pydata.org/index.html), che è costruita su Matplotlib, usata in precedenza.
Seaborn offre alcuni modi accurati per visualizzare i dati. Ad esempio, si possono confrontare le distribuzioni dei dati per ogni punto in una griglia affiancata.
1. Si crea una griglia di questo tipo istanziando `PairGrid`, usando i dati della zucca `new_pumpkins`, poi chiamando `map()`:
```python
import seaborn as sns
g = sns.PairGrid(new_pumpkins)
g.map(sns.scatterplot)
```
![Una griglia di dati visualizzati](../images/grid.png)
Osservando i dati fianco a fianco, si può vedere come i dati di Color si riferiscono alle altre colonne.
✅ Data questa griglia del grafico a dispersione, quali sono alcune esplorazioni interessanti che si possono immaginare?
### Usare un grafico a sciame
Poiché Color è una categoria binaria (arancione o no), viene chiamata "dati categoriali" e richiede "un [approccio più specializzato](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) alla visualizzazione". Esistono altri modi per visualizzare la relazione di questa categoria con altre variabili.
È possibile visualizzare le variabili fianco a fianco con i grafici di Seaborn.
1. Si provi un grafico a "sciame" per mostrare la distribuzione dei valori:
```python
sns.swarmplot(x="Color", y="Item Size", data=new_pumpkins)
```
![Uno sciame di dati visualizzati](../images/swarm.png)
### Grafico violino
Un grafico di tipo "violino" è utile in quanto è possibile visualizzare facilmente il modo in cui sono distribuiti i dati nelle due categorie. I grafici di tipo violino non funzionano così bene con insieme di dati più piccoli poiché la distribuzione viene visualizzata in modo più "liscio".
1. Chiamare `catplot()` passando i parametri `x=Color`, `kind="violin"` :
```python
sns.catplot(x="Color", y="Item Size",
kind="violin", data=new_pumpkins)
```
![una tabella di un grafico di tipo violino](../images/violin.png)
✅ Provare a creare questo grafico e altri grafici Seaborn, utilizzando altre variabili.
Ora che si ha un'idea della relazione tra le categorie binarie di colore e il gruppo più ampio di dimensioni, si esplora la regressione logistica per determinare il probabile colore di una data zucca.
> **🧮 Mostrami la matematica**
>
> Si ricorda come la regressione lineare usava spesso i minimi quadrati ordinari per arrivare a un valore? La regressione logistica si basa sul concetto di "massima verosimiglianza" utilizzando [le funzioni sigmoidi](https://wikipedia.org/wiki/Sigmoid_function). Una "Funzione Sigmoide" su un grafico ha l'aspetto di una forma a "S". Prende un valore e lo mappa da qualche parte tra 0 e 1. La sua curva è anche chiamata "curva logistica". La sua formula si presenta così:
>
> ![funzione logistica](../images/sigmoid.png)
>
> dove il punto medio del sigmoide si trova nel punto 0 di x, L è il valore massimo della curva e k è la pendenza della curva. Se l'esito della funzione è maggiore di 0,5, all'etichetta in questione verrà assegnata la classe '1' della scelta binaria. In caso contrario, sarà classificata come '0'.
## Costruire il modello
Costruire un modello per trovare queste classificazioni binarie è sorprendentemente semplice in Scikit-learn.
1. Si selezionano le variabili da utilizzare nel modello di classificazione e si dividono gli insiemi di training e test chiamando `train_test_split()`:
```python
from sklearn.model_selection import train_test_split
Selected_features = ['Origin','Item Size','Variety','City Name','Package']
X = new_pumpkins[Selected_features]
y = new_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
1. Ora si può addestrare il modello, chiamando `fit()` con i dati di addestramento e stamparne il risultato:
```python
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('Accuracy: ', accuracy_score(y_test, predictions))
```
Si dia un'occhiata al tabellone segnapunti del modello. Non è male, considerando che si hanno solo circa 1000 righe di dati:
```output
precision recall f1-score support
0 0.85 0.95 0.90 166
1 0.38 0.15 0.22 33
accuracy 0.82 199
macro avg 0.62 0.55 0.56 199
weighted avg 0.77 0.82 0.78 199
Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 0 1 0 0 0 1 0]
```
## Migliore comprensione tramite una matrice di confusione
Sebbene si possano ottenere [i termini](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) del rapporto dei punteggi stampando gli elementi di cui sopra, si potrebbe essere in grado di comprendere più facilmente il modello utilizzando una [matrice di confusione](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) che aiuti a capire come lo stesso sta funzionando.
> 🎓 Una '[matrice di confusione](https://it.wikipedia.org/wiki/Matrice_di_confusione)' (o 'matrice di errore') è una tabella che esprime i veri contro i falsi positivi e negativi del modello, misurando così l'accuratezza delle previsioni.
1. Per utilizzare una metrica di confusione, si `chiama confusion_matrix()`:
```python
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, predictions)
```
Si dia un'occhiata alla matrice di confusione del modello:
```output
array([[162, 4],
[ 33, 0]])
```
Cosa sta succedendo qui? Si supponga che al modello venga chiesto di classificare gli elementi tra due categorie binarie, la categoria "zucca" e la categoria "non una zucca".
- Se il modello prevede qualcosa come una zucca e appartiene alla categoria 'zucca' in realtà lo si chiama un vero positivo, mostrato dal numero in alto a sinistra.
- Se il modello prevede qualcosa come non una zucca e appartiene alla categoria 'zucca' in realtà si chiama falso positivo, mostrato dal numero in alto a destra.
- Se il modello prevede qualcosa come una zucca e appartiene alla categoria 'non-una-zucca' in realtà si chiama falso negativo, mostrato dal numero in basso a sinistra.
- Se il modello prevede qualcosa come non una zucca e appartiene alla categoria 'non-una-zucca' in realtà lo si chiama un vero negativo, mostrato dal numero in basso a destra.
![Matrice di Confusione](../images/confusion-matrix.png)
> Infografica di [Jen Looper](https://twitter.com/jenlooper)
Come si sarà intuito, è preferibile avere un numero maggiore di veri positivi e veri negativi e un numero inferiore di falsi positivi e falsi negativi, il che implica che il modello funziona meglio.
✅ Domanda: Secondo la matrice di confusione, come si è comportato il modello? Risposta: Non male; ci sono un buon numero di veri positivi ma anche diversi falsi negativi.
I termini visti in precedenza vengono rivisitati con l'aiuto della mappatura della matrice di confusione di TP/TN e FP/FN:
🎓 Precisione: TP/(TP + FN) La frazione di istanze rilevanti tra le istanze recuperate (ad es. quali etichette erano ben etichettate)
🎓 Richiamo: TP/(TP + FP) La frazione di istanze rilevanti che sono state recuperate, ben etichettate o meno
🎓 f1-score: (2 * precisione * richiamo)/(precisione + richiamo) Una media ponderata della precisione e del richiamo, dove il migliore è 1 e il peggiore è 0
🎓 Supporto: il numero di occorrenze di ciascuna etichetta recuperata
🎓 Accuratezza: (TP + TN)/(TP + TN + FP + FN) La percentuale di etichette prevista accuratamente per un campione.
🎓 Macro Media: il calcolo delle metriche medie non ponderate per ciascuna etichetta, senza tener conto dello squilibrio dell'etichetta.
🎓 Media ponderata: il calcolo delle metriche medie per ogni etichetta, tenendo conto dello squilibrio dell'etichetta pesandole in base al loro supporto (il numero di istanze vere per ciascuna etichetta).
✅ Si riesce a pensare a quale metrica si dovrebbe guardare se si vuole che il modello riduca il numero di falsi negativi?
## Visualizzare la curva ROC di questo modello
Questo non è un cattivo modello; la sua precisione è nell'intervallo dell'80%, quindi idealmente si potrebbe usare per prevedere il colore di una zucca dato un insieme di variabili.
Si rende un'altra visualizzazione per vedere il cosiddetto punteggio 'ROC':
```python
from sklearn.metrics import roc_curve, roc_auc_score
y_scores = model.predict_proba(X_test)
# calculate ROC curve
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
sns.lineplot([0, 1], [0, 1])
sns.lineplot(fpr, tpr)
```
Usando di nuovo Seaborn, si traccia la [Caratteristica Operativa di Ricezione](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) o il ROC del modello. Le curve ROC vengono spesso utilizzate per ottenere una visualizzazione dell'output di un classificatore in termini di veri e falsi positivi. "Le curve ROC in genere presentano un tasso di veri positivi sull'asse Y e un tasso di falsi positivi sull'asse X". Pertanto, la ripidità della curva e lo spazio tra la linea del punto medio e la curva contano: si vuole una curva che si sposti rapidamente verso l'alto e oltre la linea. In questo caso, ci sono falsi positivi con cui iniziare, quindi la linea si dirige correttamente:
![ROC](../images/ROC.png)
Infine, si usa l'[`API roc_auc_score`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) di Scikit-learn per calcolare l'effettiva "Area sotto la curva" (AUC):
```python
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
```
Il risultato è `0.6976998904709748`. Dato che l'AUC varia da 0 a 1, si desidera un punteggio elevato, poiché un modello corretto al 100% nelle sue previsioni avrà un AUC di 1; in questo caso, il modello è _abbastanza buono_.
Nelle lezioni future sulle classificazioni si imparerà come eseguire l'iterazione per migliorare i punteggi del modello. Ma per ora, congratulazioni! Si sono completate queste lezioni di regressione!
---
## 🚀 Sfida
C'è molto altro da svelare riguardo alla regressione logistica! Ma il modo migliore per imparare è sperimentare. Trovare un insieme di dati che si presti a questo tipo di analisi e costruire un modello con esso. Cosa si è appreso? suggerimento: provare [Kaggle](https://kaggle.com) per ottenere insiemi di dati interessanti.
## [Quiz post-lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/16/)
## Revisione e Auto Apprendimento
Leggere le prime pagine di [questo articolo da Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) su alcuni usi pratici della regressione logistica. Si pensi alle attività più adatte per l'uno o l'altro tipo di attività di regressione studiate fino a questo punto. Cosa funzionerebbe meglio?
## Compito
[Ritentare questa regressione](assignment.it.md)

@ -0,0 +1,10 @@
# Riprovare un po' di Regressione
## Istruzioni
Nella lezione è stato usato un sottoinsieme dei dati della zucca. Ora si torna ai dati originali e si prova a usarli tutti, puliti e standardizzati, per costruire un modello di regressione logistica.
## Rubrica
| Criteri | Ottimo | Adeguato | Necessita miglioramento |
| -------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- |
| | Un notebook viene presentato con un modello ben spiegato con buone prestazioni | Un notebook viene presentato con un modello dalle prestazioni minime | Un notebook viene presentato con un modello con scarse o nessuna prestazione |

@ -0,0 +1,34 @@
# Modelli di regressione per machine learning
## Argomento regionale: modelli di Regressione per i prezzi della zucca in Nord America 🎃
In Nord America, le zucche sono spesso intagliate in facce spaventose per Halloween. Si scoprirà di più su queste affascinanti verdure!
![jack-o-lantern](../images/jack-o-lanterns.jpg)
> Foto di <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> su <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Cosa si imparerà
Le lezioni in questa sezione riguardano i tipi di regressione nel contesto di machine learning. I modelli di regressione possono aiutare a determinare la _relazione_ tra le variabili. Questo tipo di modello può prevedere valori come lunghezza, temperatura o età, scoprendo così le relazioni tra le variabili mentre analizza i punti dati.
In questa serie di lezioni si scoprirà la differenza tra regressione lineare e regressione logistica e quando si dovrebbe usare l'una o l'altra.
In questo gruppo di lezioni si imposterà una configurazione per iniziare le attività di machine learning, inclusa la configurazione di Visual Studio Code per gestire i notebook, l'ambiente comune per i data scientist. Si scoprirà Scikit-learn, una libreria per machine learning, e si creeranno i primi modelli, concentrandosi in questo capitolo sui modelli di Regressione.
> Esistono utili strumenti a basso codice che possono aiutare a imparare a lavorare con i modelli di regressione. Si provi [Azure Machine Learning per questa attività](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-15963-cxa)
### Lezioni
1. [Gli Attrezzi Necessari](1-Tools/README.md)
2. [Gestione dati](2-Data/README.md)
3. [Regressione lineare e polinomiale](3-Linear/README.md)
4. [Regressione logistica](4-Logistic/README.md)
---
### Crediti
"ML con regressione" scritto con ♥️ da [Jen Looper](https://twitter.com/jenlooper)
♥️ I collaboratori del quiz includono: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) e [Ornella Altunyan](https://twitter.com/ornelladotcom)
L'insieme di dati relativi alla zucca è suggerito da [questo progetto su](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) Kaggle e i suoi dati provengono dai [Rapporti Standard sui Mercati Terminali delle Colture Speciali](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuiti dal Dipartimento dell'Agricoltura degli Stati Uniti. Sono stati aggiunti alcuni punti intorno al colore in base alla varietà per normalizzare la distribuzione. Questi dati sono di pubblico dominio.

@ -6,7 +6,7 @@
![jack-o-lantern](../images/jack-o-lanterns.jpg)
> Foto oleh <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> di <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
##你会学到什么
## 你会学到什么
这节的课程包括机器学习领域中的多种回归模型。回归模型可以明确多种变量间的_关系_。这种模型可以用来预测类似长度、温度和年龄之类的值 通过分析数据点来揭示变量之间的关系。

@ -0,0 +1,347 @@
# Crearere un'app web per utilizzare un modello ML
In questa lezione, si addestrerà un modello ML su un insieme di dati fuori dal mondo: _avvistamenti di UFO nel secolo scorso_, provenienti dal [database di NUFORC](https://www.nuforc.org).
Si imparerà:
- Come "scapigliare" un modello addestrato
- Come usare quel modello in un'app Flask
Si continuerà a utilizzare i notebook per pulire i dati e addestrare il modello, ma si può fare un ulteriore passo avanti esplorando il processo utilizzando un modello "in the wild", per così dire: in un'app web.
Per fare ciò, è necessario creare un'app Web utilizzando Flask.
## [Quiz Pre-Lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/17/)
## Costruire un'app
Esistono diversi modi per creare app Web per utilizzare modelli di machine learning. L'architettura web può influenzare il modo in cui il modello viene addestrato. Si immagini di lavorare in un'azienda in cui il gruppo di data science ha addestrato un modello che vogliono che venga utilizzato in un'app.
### Considerazioni
Ci sono molte domande da porsi:
- **È un'app Web o un'app mobile?** Se si sta creando un'app mobile o si deve usare il modello in un contesto IoT, ci si può avvalere [di TensorFlow Lite](https://www.tensorflow.org/lite/) e usare il modello in un'app Android o iOS.
- **Dove risiederà il modello**? E' utilizzato in cloud o in locale?
- **Supporto offline**. L'app deve funzionare offline?
- **Quale tecnologia è stata utilizzata per addestrare il modello?** La tecnologia scelta può influenzare gli strumenti che è necessario utilizzare.
- **Utilizzare** TensorFlow Se si sta addestrando un modello utilizzando TensorFlow, ad esempio, tale ecosistema offre la possibilità di convertire un modello TensorFlow per l'utilizzo in un'app Web utilizzando [TensorFlow.js](https://www.tensorflow.org/js/).
- **Utilizzare PyTorch**. Se stai costruendo un modello utilizzando una libreria come PyTorch[,](https://pytorch.org/) si ha la possibilità di esportarlo in formato [ONNX](https://onnx.ai/) ( Open Neural Network Exchange) per l'utilizzo in app Web JavaScript che possono utilizzare il motore di esecuzione [Onnx](https://www.onnxruntime.ai/). Questa opzione verrà esplorata in una lezione futura per un modello addestrato da Scikit-learn
- **Utilizzo di Lobe.ai o Azure Custom vision**. Se si sta usando un sistema ML SaaS (Software as a Service) come [Lobe.ai](https://lobe.ai/) o [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-15963-cxa) per addestrare un modello, questo tipo di software fornisce modi per esportare il modello per molte piattaforme, inclusa la creazione di un'API su misura da interrogare nel cloud dalla propria applicazione online.
Si hai anche l'opportunità di creare un'intera app Web Flask in grado di addestrare il modello stesso in un browser Web. Questo può essere fatto anche usando TensorFlow.js in un contesto JavaScript.
Per i nostri scopi, poiché si è lavorato con i notebook basati su Python, verranno esplorati i passaggi necessari per esportare un modello addestrato da un tale notebook in un formato leggibile da un'app Web creata in Python.
## Strumento
Per questa attività sono necessari due strumenti: Flask e Pickle, entrambi eseguiti su Python.
✅ Cos'è [Flask](https://palletsprojects.com/p/flask/)? Definito come un "micro-framework" dai suoi creatori, Flask fornisce le funzionalità di base dei framework web utilizzando Python e un motore di modelli per creare pagine web. Si dia un'occhiata a [questo modulo di apprendimento](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-15963-cxa) per esercitarsi a costruire con Flask.
✅ Cos'è [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 è un modulo Python che serializza e de-serializza una struttura di oggetti Python. Quando si utilizza pickle in un modello, si serializza o si appiattisce la sua struttura per l'uso sul web. Cautela: pickle non è intrinsecamente sicuro, quindi si faccia attenzione se viene chiesto di de-serializzare un file. Un file creato con pickle ha il suffisso `.pkl`.
## Esercizio: pulire i dati
In questa lezione verranno utilizzati i dati di 80.000 avvistamenti UFO, raccolti da [NUFORC](https://nuforc.org) (The National UFO Reporting Center). Questi dati hanno alcune descrizioni interessanti di avvistamenti UFO, ad esempio:
- **Descrizione di esempio lunga**. "Un uomo emerge da un raggio di luce che di notte brilla su un campo erboso e corre verso il parcheggio della Texas Instruments".
- **Descrizione di esempio breve**. "le luci ci hanno inseguito".
Il [foglio](./data/ufos.csv) di calcolo ufos.csv include colonne sulla `città`, `lo stato` e il `paese` in cui è avvenuto l'avvistamento, la `forma dell'oggetto e la` sua `latitudine` e `longitudine`.
Nel [notebook](notebook.ipynb) vuoto incluso in questa lezione:
1. importare `pandas`, `matplotlib` e numpy `come` fatto nelle lezioni precedenti e importare il foglio di calcolo ufos. Si può dare un'occhiata a un insieme di dati di esempio:
```python
import pandas as pd
import numpy as np
ufos = pd.read_csv('../data/ufos.csv')
ufos.head()
```
1. Convertire i dati ufos in un piccolo dataframe con nuove intestazioni Controllare i valori univoci nel campo `Country` .
```python
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
ufos.Country.unique()
```
1. Ora si può ridurre la quantità di dati da gestire eliminando qualsiasi valore nullo e importando solo avvistamenti tra 1-60 secondi:
```python
ufos.dropna(inplace=True)
ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
ufos.info()
```
1. Importare la libreria LabelEncoder `di` Scikit-learn per convertire i valori di testo per i paesi in un numero:
✅ LabelEncoder codifica i dati in ordine alfabetico
```python
from sklearn.preprocessing import LabelEncoder
ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])
ufos.head()
```
I dati dovrebbero assomigliare a questo:
```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
```
## Esercizio: costruire il proprio modello
Ora ci si può preparare per addestrare un modello portando i dati nel gruppo di addestramento e test.
1. Selezionare le tre caratteristiche su cui lo si vuole allenare come vettore X mentre il vettore y sarà `Country` Se deve essere in grado di inserire `Secondi`, `Latitudine` e `Longitudine` e ottenere un ID nazione da restituire.
```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. Addestrare il modello usando la regressione logistica:
```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))
```
La precisione non è male **(circa il 95%)**, non sorprende che `Country` e `Latitude/Longitude` siano correlati.
Il modello creato non è molto rivoluzionario in quanto si dovrebbe essere in grado di dedurre una `nazione` dalla sua `latitudine` e `longitudine`, ma è un buon esercizio provare ad allenare dai dati grezzi che sono stati puliti ed esportati, e quindi utilizzare questo modello in una app web.
## Esercizio: usare pickle con il modello
Ora è il momento di utilizzare pickle _con_ il modello! Lo si può fare in poche righe di codice. Una volta che è stato serializzato con pickle_,_ caricare il modello e testarlo rispetto a un array di dati di esempio contenente valori per secondi, latitudine e longitudine,
```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]]))
```
Il modello restituisce **"3"**, che è il codice paese per il Regno Unito. Jolly 👽
## Esercizio: creare un'app Flask
Ora si può creare un'app Flask per chiamare il modello e restituire risultati simili, ma in un modo visivamente più gradevole.
1. Iniziare creando una cartella chiamata web-app **a** livello del _file_ notebook.ipynb dove risiede _il_ file ufo-model.pkl.
1. In quella cartella creare altre tre cartelle: **static**, con una cartella **css** al suo interno e **templates**. Ora si dovrebbero avere i seguenti file e directory:
```output
web-app/
static/
css/
templates/
notebook.ipynb
ufo-model.pkl
```
✅ Fare riferimento alla cartella della soluzione per una visualizzazione dell'app finita
1. Il primo file da creare nella cartella dell'_app_ Web è **il** file requirements.txt. Come _package.json_ in un'app JavaScript, questo file elenca le dipendenze richieste dall'app. In **requirements.txt** aggiungere le righe:
```text
scikit-learn
pandas
numpy
flask
```
1. Ora, eseguire questo file portandosi su _web-app_:
```bash
cd web-app
```
1. Aprire una finestra di terminale dove risiede requirements.txt e digitare `pip install`, per installare le librerie elencate in _reuirements.txt_:
```bash
pip install -r requirements.txt
```
1. Ora si è pronti per creare altri tre file per completare l'app:
1. Crea **app.py** nella directory radice
2. Creare **index.html** nella directory _templates_ .
3. Crea **sytles.css** nella directory _static/css_ .
1. Inserire nel _file_ styles.css alcuni stili:
```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. Quindi, creare il file _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>
```
Dare un'occhiata al modello in questo file. Notare la sintassi con le parentesi graffe attorno alle variabili che verranno fornite dall'app, come il testo di previsione: `{{}}`. C'è anche un modulo che invia una previsione al percorso `/` predict.
Infine, si è pronti per creare il file python che guida il consumo del modello e la visualizzazione delle previsioni:
1. In `app.py` aggiungere:
```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)
```
> 💡 Suggerimento: quando si aggiunge [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) durante l'esecuzione dell'app Web utilizzando Flask, qualsiasi modifica apportata all'applicazione verrà applicata immediatamente senza la necessità di riavviare il server. Attenzione! Non abilitare questa modalità in un'app di produzione.
Se si esegue `python app.py` o `python3 app.py` , il server web si avvia, localmente, e si può compilare un breve modulo per ottenere una risposta alla domanda scottante su dove sono stati avvistati gli UFO!
Prima di farlo, dare un'occhiata alle parti di `app.py`:
1. Innanzitutto, le dipendenze vengono caricate e l'app si avvia.
1. Quindi, il modello viene importato.
1. Quindi, index.html viene visualizzato sulla rotta home.
Sulla rotta `/predict` , accadono diverse cose quando il modulo viene inviato:
1. Le variabili del modulo vengono raccolte e convertite in un array numpy. Vengono quindi inviati al modello e viene restituita una previsione.
2. Le nazioni che si vogliono visualizzare vengono nuovamente esposte come testo leggibile dal loro codice paese previsto e tale valore viene inviato a index.html per essere visualizzato nel modello.
Usare un modello in questo modo, con Flask e un modello serializzato è relativamente semplice. La cosa più difficile è capire che forma hanno i dati che devono essere inviati al modello per ottenere una previsione. Tutto dipende da come è stato addestrato il modello. Questo ha tre punti dati da inserire per ottenere una previsione.
In un ambiente professionale, si può vedere quanto sia necessaria una buona comunicazione tra le persone che addestrano il modello e coloro che lo consumano in un'app Web o mobile. In questo caso, si ricoprono entrambi i ruoli!
---
## 🚀 Sfida
Invece di lavorare su un notebook e importare il modello nell'app Flask, si può addestrare il modello direttamente nell'app Flask! Provare a convertire il codice Python nel notebook, magari dopo che i dati sono stati puliti, per addestrare il modello dall'interno dell'app su un percorso chiamato /`train`. Quali sono i pro e i contro di seguire questo metodo?
## [Quiz post-lezione](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/18/)
## Revisione e Auto Apprendimento
Esistono molti modi per creare un'app Web per utilizzare i modelli ML. Elencare dei modi in cui si potrebbe utilizzare JavaScript o Python per creare un'app Web per sfruttare machine learning. Considerare l'architettura: il modello dovrebbe rimanere nell'app o risiedere nel cloud? Se quest'ultimo, come accedervi? Disegnare un modello architettonico per una soluzione web ML applicata.
## Compito
[Provare un modello diverso](assignment.md)

@ -0,0 +1,11 @@
# Provare un modello diverso
## Istruzioni
Ora che si è creato un'app Web utilizzando un modello di regressione addestrato, usare uno dei modelli di una lezione precedente sulla regressione per ripetere questa app Web. Si può mantenere lo stile o progettarla in modo diverso per riflettere i dati della zucca. Fare attenzione a modificare gli input in modo che riflettano il metodo di addestramento del proprio modello.
## Rubrica
| Criteri | Ottimo | Adeguato | Necessita miglioramento |
| -------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------- |
| | L'app Web funziona come previsto e viene distribuita nel cloud | L'app Web contiene difetti o mostra risultati imprevisti | L'app web non funziona correttamente |

@ -0,0 +1,22 @@
# Creare un'app Web per utilizzare il modello ML
In questa sezione del programma di studi, verrà presentato un argomento ML applicato: come salvare il modello di Scikit-learn come file che può essere utilizzato per fare previsioni all'interno di un'applicazione web. Una volta salvato il modello, si imparerà come utilizzarlo in un'app Web integrata in Flask. Per prima cosa si creerà un modello utilizzando alcuni dati che riguardano gli avvistamenti di UFO! Quindi, si creerà un'app Web che consentirà di inserire un numero di secondi con un valore di latitudine e longitudine per prevedere quale paese ha riferito di aver visto un UFO.
![Parcheggio UFO](images/ufo.jpg)
Foto di <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Michael Herren</a> su <a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Lezioni
1. [Costruire un'app Web](1-Web-App/README.md)
## Crediti
"Costruire un'app web" è stato scritto con ♥️ da [Jen Looper](https://twitter.com/jenlooper).
♥️ I quiz sono stati scritti da Rohan Raj.
L'insieme di dati proviene da [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings).
L'architettura dell'app web è stata suggerita in parte da [questo articolo](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) e da [questo](https://github.com/abhinavsagar/machine-learning-deployment) repository di Abhinav Sagar.

@ -0,0 +1,297 @@
# Sınıflandırmaya giriş
Bu dört derste klasik makine öğreniminin temel bir odağı olan _sınıflandırma_ konusunu keşfedeceksiniz. Asya ve Hindistan'ın nefis mutfağının tamamı üzerine hazırlanmış bir veri setiyle çeşitli sınıflandırma algoritmalarını kullanmanın üzerinden geçeceğiz. Umarız açsınızdır!
![sadece bir tutam!](../images/pinch.png)
> Bu derslerede Pan-Asya mutfağını kutlayın! Fotoğraf [Jen Looper](https://twitter.com/jenlooper) tarafından çekilmiştir.
Sınıflandırma, regresyon yöntemleriyle birçok ortak özelliği olan bir [gözetimli öğrenme](https://wikipedia.org/wiki/Supervised_learning) biçimidir. Eğer makine öğrenimi tamamen veri setleri kullanarak değerleri veya nesnelere verilecek isimleri öngörmekse, sınıflandırma genellikle iki gruba ayrılır: _ikili sınıflandırma_ ve _çok sınıflı sınıflandırma_.
[![Sınıflandırmaya giriş](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduction to classification")
> :movie_camera: Video için yukarıdaki fotoğrafa tıklayın: MIT's John Guttag introduces classification (MIT'den John Guttag sınıflandırmayı tanıtıyor)
Hatırlayın:
- **Doğrusal regresyon** değişkenler arasındaki ilişkileri öngörmenize ve o doğruya ilişkili olarak yeni bir veri noktasının nereye düşeceğine dair doğru öngörülerde bulunmanıza yardımcı oluyordu. Yani, _bir balkabağının fiyatının aralık ayına göre eylül ayında ne kadar olabileceğini_ öngörebilirsiniz örneğin.
- **Lojistik regresyon** "ikili kategoriler"i keşfetmenizi sağlamıştı: bu fiyat noktasında, _bu balkabağı turuncu mudur, turuncu-değil midir?_
Sınıflandırma, bir veri noktasının etiketini veya sınıfını belirlemek için farklı yollar belirlemek üzere çeşitli algoritmalar kullanır. Bir grup malzemeyi gözlemleyerek kökeninin hangi mutfak olduğunu belirleyip belirleyemeyeceğimizi görmek için bu mutfak verisiyle çalışalım.
## [Ders öncesi kısa sınavı](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/19/?loc=tr)
### Giriş
Sınıflandırma, makine öğrenimi araştırmacısının ve veri bilimcisinin temel işlerinden biridir. İkili bir değerin temel sınıflandırmasından ("Bu e-posta gereksiz (spam) midir yoksa değil midir?") bilgisayarla görüden yararlanarak karmaşık görüntü sınıflandırma ve bölütlemeye kadar, veriyi sınıf sınıf sıralayabilmek ve soru sorabilmek daima faydalıdır.
Süreci daha bilimsel bir yolla ifade etmek gerekirse, sınıflandırma yönteminiz, girdi bilinmeyenlerinin arasındaki ilişkiyi çıktı bilinmeyenlerine eşlemenizi sağlayan öngörücü bir model oluşturur.
![ikili ve çok sınıflı sınıflandırma karşılaştırması](../images/binary-multiclass.png)
> Sınıflandırma algoritmalarının başa çıkması gereken ikili ve çok sınıflı problemler. Bilgilendirme grafiği [Jen Looper](https://twitter.com/jenlooper) tarafından hazırlanmıştır.
Verimizi temizleme, görselleştirme ve makine öğrenimi görevleri için hazırlama süreçlerine başlamadan önce, veriyi sınıflandırmak için makine öğreniminin leveraj edilebileceği çeşitli yolları biraz öğrenelim.
[İstatistikten](https://wikipedia.org/wiki/Statistical_classification) türetilmiş olarak, klasik makine öğrenimi kullanarak sınıflandırma, _X hastalığının gelişmesi ihtimalini_ belirlemek için `smoker`, `weight`, ve `age` gibi öznitelikler kullanır. Daha önce yaptığınız regresyon alıştırmalarına benzeyen bir gözetimli öğrenme yöntemi olarak, veriniz etiketlenir ve makine öğrenimi algoritmaları o etiketleri, sınıflandırmak ve veri setinin sınıflarını (veya 'özniteliklerini') öngörmek ve onları bir gruba veya bir sonuca atamak için kullanır.
:white_check_mark: Mutfaklarla ilgili bir veri setini biraz düşünün. Çok sınıflı bir model neyi cevaplayabilir? İkili bir model neyi cevaplayabilir? Farz edelim ki verilen bir mutfağın çemen kullanmasının muhtemel olup olmadığını belirlemek istiyorsunuz. Farzedelim ki yıldız anason, enginar, karnabahar ve bayır turpu ile dolu bir alışveriş poşetinden tipik bir Hint yemeği yapıp yapamayacağınızı görmek istiyorsunuz.
[![Çılgın gizem sepetleri](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Crazy mystery baskets")
> :movie_camera: Video için yukarıdaki fotoğrafa tıklayın. Aşçıların rastgele malzeme seçeneklerinden yemek yaptığı 'Chopped' programının tüm olayı 'gizem sepetleri'dir. Kuşkusuz, bir makine öğrenimi modeli onlara yardımcı olurdu!
## Merhaba 'sınıflandırıcı'
Bu mutfak veri setiyle ilgili sormak istediğimiz soru aslında bir **çok sınıflı soru**dur çünkü elimizde farklı potansiyel ulusal mutfaklar var. Verilen bir grup malzeme için, veri bu sınıflardan hangisine uyacak?
Scikit-learn, veriyi sınıflandırmak için kullanmak üzere, çözmek istediğiniz problem çeşidine bağlı olarak, çeşitli farklı algoritmalar sunar. Önümüzdeki iki derste, bu algoritmalardan birkaçını öğreneceksiniz.
## Alıştırma - verinizi temizleyip dengeleyin
Bu projeye başlamadan önce elinizdeki ilk görev, daha iyi sonuçlar almak için, verinizi temizlemek ve **dengelemek**. Bu klasördeki boş _notebook.ipynb_ dosyasıyla başlayın.
Kurmanız gereken ilk şey [imblearn](https://imbalanced-learn.org/stable/). Bu, veriyi daha iyi dengelemenizi sağlayacak bir Scikit-learn paketidir. (Bu görev hakkında birazdan daha fazla bilgi göreceksiniz.)
1. `imblearn` kurun, `pip install` çalıştırın, şu şekilde:
```python
pip install imblearn
```
1. Verinizi almak ve görselleştirmek için ihtiyaç duyacağınız paketleri alın (import edin), ayrıca `imblearn` paketinden `SMOTE` alın.
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE
```
Şimdi okumak için hazırsınız, sonra veriyi alın.
1. Sonraki görev veriyi almak olacak:
```python
df = pd.read_csv('../../data/cuisines.csv')
```
`read_csv()` kullanmak _cusines.csv_ csv dosyasının içeriğini okuyacak ve `df` değişkenine yerleştirecek.
1. Verinin şeklini kontrol edin:
```python
df.head()
```
İlk beş satır şöyle görünüyor:
```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()` fonksiyonunu çağırarak bu veri hakkında bilgi edinin:
```python
df.info()
```
Çıktınız şuna benzer:
```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
```
## Alıştırma - mutfaklar hakkında bilgi edinmek
Şimdi, işimiz daha da ilginçleşmeye başlıyor. Mutfak mutfak verinin dağılımını keşfedelim
1. `barh()` fonksiyonunu çağırarak veriyi sütunlarla çizdirin:
```python
df.cuisine.value_counts().plot.barh()
```
![mutfak veri dağılımı](../images/cuisine-dist.png)
Sonlu sayıda mutfak var, ancak verinin dağılımı düzensiz. Bunu düzeltebilirsiniz! Bunu yapmadan önce, biraz daha keşfedelim.
1. Her mutfak için ne kadar verinin mevcut olduğunu bulun ve yazdırın:
```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}')
```
çıktı şöyle görünür:
```output
thai df: (289, 385)
japanese df: (320, 385)
chinese df: (442, 385)
indian df: (598, 385)
korean df: (799, 385)
```
## Malzemeleri keşfetme
Şimdi veriyi daha derinlemesine inceleyebilirsiniz ve her mutfak için tipik malzemelerin neler olduğunu öğrenebilirsiniz. Mutfaklar arasında karışıklık yaratan tekrar eden veriyi temizlemelisiniz, dolayısıyla şimdi bu problemle ilgili bilgi edinelim.
1. Python'da, malzeme veri iskeleti yaratmak için `create_ingredient()` diye bir fonksiyon oluşturun. Bu fonksiyon, yardımcı olmayan bir sütunu temizleyerek ve sayılarına göre malzemeleri sıralayarak başlar:
```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
```
Şimdi bu fonksiyonu, her mutfağın en yaygın ilk on malzemesi hakkında hakkında fikir edinmek için kullanabilirsiniz.
1. `create_ingredient()` fonksiyonunu çağırın ve `barh()` fonksiyonunu çağırarak çizdirin:
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![Tayland](../images/thai.png)
1. Japon verisi için de aynısını yapın:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![Japon](../images/japanese.png)
1. Şimdi Çin malzemeleri için yapın:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![Çin](../images/chinese.png)
1. Hint malzemelerini çizdirin:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![Hint](../images/indian.png)
1. Son olarak, Kore malzemelerini çizdirin:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![Kore](../images/korean.png)
1. Şimdi, `drop()` fonksiyonunu çağırarak, farklı mutfaklar arasında karışıklığa sebep olan en çok ortaklık taşıyan malzemeleri temizleyelim:
Herkes pirinci, sarımsağı ve zencefili seviyor!
```python
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
labels_df = df.cuisine #.unique()
feature_df.head()
```
## Veri setini dengeleyin
Veriyi temizlediniz, şimdi [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" ("Sentetik Azınlık Aşırı-Örnekleme/Örneklem-Artırma Tekniği") kullanarak dengeleyelim.
1. `fit_resample()` fonksiyonunu çağırın, bu strateji ara değerlemeyle yeni örnekler üretir.
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
Verinizi dengeleyerek, sınıflandırırken daha iyi sonuçlar alabileceksiniz. Bir ikili sınıflandırma düşünün. Eğer verimizin çoğu tek bir sınıfsa, bir makine öğrenimi modeli, sırf onun için daha fazla veri olduğundan o sınıfı daha sık tahmin edecektir. Veriyi dengelemek herhangi eğri veriyi alır ve bu dengesizliğin ortadan kaldırılmasına yardımcı olur.
1. Şimdi, her bir malzeme için etiket sayısını kontrol edebilirsiniz:
```python
print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {df.cuisine.value_counts()}')
```
Çıktınız şöyle görünür:
```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
```
Veri şimdi tertemiz, dengeli ve çok lezzetli!
1. Son adım, dengelenmiş verinizi, etiket ve özniteliklerle beraber, yeni bir dosyaya gönderilebilecek yeni bir veri iskeletine kaydetmek:
```python
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. `transformed_df.head()` ve `transformed_df.info()` fonksiyonlarını kullanarak verinize bir kez daha göz atabilirsiniz. Gelecek derslerde kullanabilmek için bu verinin bir kopyasını kaydedin:
```python
transformed_df.head()
transformed_df.info()
transformed_df.to_csv("../../data/cleaned_cuisine.csv")
```
Bu yeni CSV şimdi kök data (veri) klasöründe görülebilir.
---
## :rocket: Meydan okuma
Bu öğretim programı farklı ilgi çekici veri setleri içermekte. `data` klasörlerini inceleyin ve ikili veya çok sınıflı sınıflandırma için uygun olabilecek veri setleri bulunduran var mı, bakın. Bu veri seti için hangi soruları sorabilirdiniz?
## [Ders sonrası kısa sınavı](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/20/?loc=tr)
## Gözden Geçirme & Kendi Kendine Çalışma
SMOTE'nin API'ını keşfedin. En iyi hangi durumlar için kullanılıyor? Hangi problemleri çözüyor?
## Ödev
[Sınıflandırma yöntemlerini keşfedin](assignment.tr.md)

@ -0,0 +1,11 @@
# Sınıflandırma yöntemlerini keşfedin
## Yönergeler
[Scikit-learn dokümentasyonunda](https://scikit-learn.org/stable/supervised_learning.html) veriyi sınıflandırma yöntemlerini içeren büyük bir liste göreceksiniz. Bu dokümanlar arasında ufak bir çöpçü avı yapın: Hedefiniz, sınıflandırma yöntemleri aramak ve bu eğitim programındaki bir veri seti, sorabileceğiniz bir soru ve bir sınıflandırma yöntemi eşleştirmek. Bir .doc dosyasında elektronik çizelge veya tablo hazırlayın ve veri setinin sınıflandırma algoritmasıyla nasıl çalışacağınııklayın.
## Rubrik
| Ölçüt | Örnek Alınacak Nitelikte | Yeterli | Geliştirme Gerekli |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| | Bir sınıflandırma yönteminin yanısıra 5 algoritmayı inceleyen bir doküman sunulmuş. İnceleme iyi açıklanmış ve detaylı. | Bir sınıflandırma yönteminin yanısıra 5 algoritmayı inceleyen bir doküman sunulmuş. İnceleme iyi açıklanmış ve detaylı. | Bir sınıflandırma yönteminin yanısıra 3'ten az algoritmayı inceleyen bir doküman sunulmuş ve inceleme iyi açıklanmış veya detaylı değil. |

@ -0,0 +1,25 @@
# Sınıflandırmaya başlarken
## Bölgesel konu: Leziz Asya ve Hint Mutfağı :ramen:
Asya ve Hindistan'da yemek gelenekleri fazlaca çeşitlilik gösterir ve çok lezzetlidir! Malzemelerini anlamaya çalışmak için bölgesel mutfak hakkındaki verilere bakalım.
![Taylandlı yemek satıcısı](../images/thai-food.jpg)
> Fotoğraf <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lisheng Chang</a> tarafından çekilmiştir ve <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>'tadır.
## Öğrenecekleriniz
Bu bölümde, bu eğitim programının tamamen regresyon üzerine olan ilk bölümünde öğrendiğiniz becerilere dayanıp onların üstüne beceriler ekleyeceksiniz ve verileriniz hakkında bilgi sahibi olmanızı sağlayacak diğer sınıflandırıcıları öğreneceksiniz.
> Sınıflandırma modelleriyle çalışmayı öğrenmenizi sağlayacak faydalı düşük kodlu araçlar vardır. [Bu görev için Azure ML](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-15963-cxa)'i deneyin.
## Dersler
1. [Sınıflandırmaya giriş](../1-Introduction/translations/README.tr.md)
2. [Daha fazla sınıflandırıcı](../2-Classifiers-1/README.md)
3. [Hatta daha fazla sınıflandırıcı](../3-Classifiers-2/README.md)
4. [Uygulamalı Makine Öğrenimi: bir web uygulaması oluşturun](../4-Applied/README.md)
## Katkıda bulunanlar
"Sınıflandırmaya başlarken" [Cassie Breviu](https://www.twitter.com/cassieview) ve [Jen Looper](https://www.twitter.com/jenlooper) tarafından :hearts: ile yazılmıştır.
Leziz mutfak veri seti [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines)'dan alınmıştır.

@ -1,97 +1,103 @@
# 自然语言处理介绍
这节课讲解了*自然语言处理*简要历史和重要概念,*自然语言处理*是计算语言学的一个子领域。
这节课讲解了 *自然语言处理*简要历史和重要概念,*自然语言处理*是计算语言学的一个子领域。
## [课前测验](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/31/)
## 介绍
众所周知,自然语言处理(Natural Language Processing, NLP)是机器学习在生产软件中应用最广泛的领域之一。
众所周知,自然语言处理 (Natural Language Processing, NLP) 是机器学习在生产软件中应用最广泛的领域之一。
✅你能想到哪些你日常生活中使用的软件嵌入了某些自然语言处理技术呢?你经常使用的文字处理程序或移动应用程序是否嵌入了自然语言处理技术呢?
你能想到哪些你日常生活中使用的软件可能嵌入了自然语言处理技术呢?或者,你经常使用的文字处理程序或移动应用程序是否嵌入了自然语言处理技术呢?
你将会学习到:
- **语言的思想**. 语言的发展历程及主要研究领域.
- **定义和概念**. 你还将学习到有关计算机如何处理文本的定义和概念,包括解析、语法以及名词和动词的识别。本节课程包含一些编码任务并介绍了几个重要的概念,你将在下一节课中学习编码实现这些概念。
- **什么是「语言」**。语言的发展历程,以及相关研究的主要领域。
- **定义和概念**。你还将了解关于计算机文本处理的概念。包括解析 (parsing)、语法 (grammar) 以及识别名词与动词。这节课中有一些编程任务;还有一些重要概念将在以后的课程中被引入,届时你也会练习通过编程实现其它概念。
## 计算语言学
计算语言学是一个经过几十年研究和发展的领域,它研究计算机如何使用语言、理解语言、翻译语言及使用语言交流。自然语言处理(NLP)是计算语言学中一个专注于计算机如何处理“自然”或人类语言的相关领域,
### 例子 - 电话号码识别
计算语言学 (Computational Linguistics) 是一个经过几十年研究和发展的领域,它研究如何让计算机能使用、理解、翻译语言并使用语言交流。自然语言处理 (NLP) 是计算语言学中一个专注于计算机如何处理「自然的」(或者说,人类的)语言的相关领域。
### 举例:电话号码识别
如果你曾经在手机上使用语音输入替代键盘输入或者向语音助手小娜提问,那么你的语音将被转录为文本形式后进行处理或者叫*解析*。被检测到的关键字最后将被处理成手机或语音助手可以理解并采取行动的格式。
如果你曾经在手机上使用语音输入替代键盘输入,或者使用过虚拟语音助手,那么你的语音将被转录(或者叫*解析*)为文本形式后进行处理。被检测到的关键字最后将被处理成手机或语音助手可以理解并可以依此做出行为的格式。
![comprehension](../images/comprehension.png)
> 真实的语言理解十分困难!图源:[Jen Looper](https://twitter.com/jenlooper)
> 真正意义上的语言理解很难!图源:[Jen Looper](https://twitter.com/jenlooper)
### 这项技术是如何实现的?
有人编写了一个计算机程序来实现这项技术。几十年前,一些科幻作家预测人类很大可能会和他们的电脑对话,而电脑总是能准确地理解人类的意思。可惜的是,事实证明这是一个比许多人想象中更难实现的问题,虽然今天这个问题已经被初步解决,但在理解句子的含义时,要实现“完美”的自然语言处理仍然存在重大挑战。句子中的幽默理解或讽刺等情绪的检测是一个特别困难的问题。
我们之所以可能完成这样的任务,是因为有人编写了一个计算机程序来实现它。几十年前,一些科幻作家预测,在未来,人类很大可能会能够他们的电脑对话,而电脑总是能准确地理解人类的意思。可惜的是,事实证明这个问题的解决比我们想象的更困难。虽然今天这个问题已经被初步解决,但在理解句子的含义时,要实现 “完美” 的自然语言处理仍然存在重大挑战 —— 理解幽默或是检测感情(比如讽刺)对于计算机来说尤其困难。
现在,你可能会想起课堂上老师讲解的语法。在某些国家/地区,语法和语言学知识是学生的专题课内容。但在另一些国家/地区,不管是从小学习的第一语言(学习阅读和写作),还是之后学习的第二语言中,语法及语言学知识都是作为语言的一部分教学的。所以,如果你不能很好地区分名词与动词或者区分副词与形容词,请不要担心!
此时,你可能会想起学校课堂上老师讲解的部分句子语法。在某些国家/地区,语法和语言学知识是学生的专题课内容。但在另一些国家/地区,不管是在小学时的第一语言(学习阅读和写作),或者在高年级及高中时学习的第二语言中,语法及语言学知识是作为学习语言的一部分教学的。如果你不能很好地区分名词与动词或者区分副词与形容词,请不要担心!
你还为难以区分*一般现在时*与*现在进行时*而烦恼吗?没关系的,即使是对以这门语言为母语的人在内的大多数人来说,区分它们都很有挑战性。但是,计算机非常善于应用标准的规则,你将学会编写可以像人一样"解析"句子的代码。稍后你将面对的更大挑战是理解句子的*语义*和*情绪*。
如果你还为区分*一般现在时*与*现在进行时*而烦恼,你并不是一个人。即使是对以这门语言为母语的人在内的很多人来说这都是一项有挑战性的任务。好消息是,计算机非常善于应用标准的规则,你将学会编写可以像人一样"解析"句子的代码。稍后你将面对的更大挑战是理解句子的*语义*和*情绪*。
## 前提
本节教程的主要先决条件是能够阅读和理解本节教程的语言。本节中没有数学问题或方程需要解决。虽然原作者用英文写了这教程,但它也被翻译成其他语言,所以你可能在阅读翻译内容。有使用多种不同语言的示例(以比较不同语言的不同语法规则)。这些是*未*翻译的,但解释性文本是翻译内容,所以表义应当是清晰的
本节教程的主要先决条件是能够阅读和理解本节教程的语言。本节中没有数学问题或方程需要解决。虽然原作者用英文写了这教程,但它也被翻译成其他语言,所以你可能在阅读翻译内容。这节课的示例中涉及到很多语言种类(以比较不同语言的不同语法规则)。这些是*未*翻译的,但对它们的解释是翻译过的,所以你应该能理解它在讲什么
编程任务中你将会使用Python语言示例使用的是Python 3.8版本。
编程任务中,你将会使用 Python 语言,示例使用的是 Python 3.8 版本。
在本节中你将需要并使用:
在本节中你将需要并使用如下技能
- **Python 3 理解**. Python 3中的编程语言理解本课使用输入、循环、文件读取、数组
- **Visual Studio Code + 扩展**. 我们将使用 Visual Studio Code 及其 Python 扩展。你还可以使用你选择的 Python IDE。
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob)是一个简的 Python 文本处理库。按照 TextBlob 网站上的说明在您的系统上安装它(也安装语料库,如下所示):
- **Python 3**。你需要能够理解并使用 Python 3. 本课将会使用输入、循环、文件读取、数组功能
- **Visual Studio Code + 扩展**. 我们将使用 Visual Studio Code 及其 Python 扩展。你也可以使用你喜欢的 Python IDE。
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob)是一个简的 Python 文本处理库。按照 TextBlob 网站上的说明在您的系统上安装它(也需要安装语料库,安装代码如下所示):
-
```bash
pip install -U textblob
python -m textblob.download_corpora
```
> 💡 提示:可以在 VS Code 环境中直接运行 Python。 点击[docs](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-15963-cxa)查看更多信息。
> 💡 提示:可以在 VS Code 环境中直接运行 Python。 点击[docs](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-15963-cxa)查看更多信息。
## 与机器对话
试图让计算机理解人类语言的历史可以追溯到几十年前,最早考虑自然语言处理的科学家之一是 *Alan Turing*
试图让计算机理解人类语言的尝试最早可以追溯到几十年前。*Alan Turing* 是最早研究自然语言处理问题的科学家之一。
### 图灵测试
当图灵在1950年代研究*人工智能*时,他考虑是否可以对人和计算机进行对话测试(通过打字对应),其中对话中的人不确定他们是在与另一个人交谈还是与计算机交谈.
当图灵在 1950 年代研究*人工智能*时,他想出了这个思维实验:让人类和计算机通过打字的方式来交谈,其中人类并不知道对方是人类还是计算机。
如果经过一定时间的交谈,人类无法确定对方是否是计算机,那么是否可以认为计算机正在“思考”?
如果经过一定时间的交谈,人类无法确定答案是否来自计算机,那么是否可以说计算机正在“思考”?
### 灵感 - “模仿游戏”
这个想法来自一个名为 *模仿游戏* 的派对游戏,其中一名审讯者独自一人在一个房间里,负责确定两个人(在另一个房间里)是男性还是女性。审讯者可以传递笔记,并且需要想出能够揭示神秘人性别的问题。当然,另一个房间的玩家试图通过回答问题的方式来欺骗审讯者,例如误导或迷惑审讯者,同时表现出诚实回答的样子
这个想法来自一个名为 *模仿游戏* 的派对游戏,其中一名审讯者独自一人在一个房间里,负责确定在另一个房间里的两人的性别(男性或女性)。审讯者可以传递笔记,并且需要想出能够揭示神秘人性别的问题。当然,另一个房间的玩家也可以通过回答问题的方式来欺骗审讯者,例如用看似真诚的方式误导或迷惑审讯者。
### Eliza的研发
### Eliza 的研发
在 1960 年代,一位名叫 *Joseph Weizenbaum*麻省理工学院科学家开发了[*Eliza*](https:/wikipedia.org/wiki/ELIZA)Eliza是一位计算机“治疗师”它可以向人类提出问题并表现出理解他们的答案。然而,虽然 Eliza 可以解析句子并识别某些语法结构和关键字以给出合理的答案,但不能说它*理解*了句子。如果 Eliza 看到的句子格式为“**I am** <u>sad</u>”,它可能会重新排列并替换句子中的单词以形成响应“How long have **you been** <u>sad</u>"。
在 1960 年代的麻省理工学院,一位名叫 *Joseph Weizenbaum* 的科学家开发了[*Eliza*](https:/wikipedia.org/wiki/ELIZA)。Eliza 是一位计算机“治疗师”,它可以向人类提出问题并让人类觉得它能理解人类的回答。然而,虽然 Eliza 可以解析句子并识别某些语法结构和关键字以给出合理的答案,但不能说它*理解*了句子。如果 Eliza 看到的句子格式为“**I am** <u>sad</u>**我很** <u>难过</u>,它可能会重新排列并替换句子中的单词,回答 “How long have **you been** <u>sad</u>"**你已经** <u>难过</u> 多久了)
这给人的印象是伊丽莎理解了这句话,并在问一个后续问题,而实际上,它是在改变时态并添加一些词。如果 Eliza 无法识别它有响应的关键字,它会给出一个随机响应,该响应可以适用于许多不同的语句。 Eliza 很容易被欺骗,例如,如果用户写了**You are** a <u>bicycle</u>",它可能会回复"How long have **I been** a <u>bicycle</u>?",而不是更合理的回答。
看起来像是 Eliza 理解了这句话,还在询问关于这句话的问题,而实际上,它只是在改变时态和添加词语。如果 Eliza 没有在回答中发现它知道如何响应的词汇,它会给出一个随机响应,该响应可以适用于许多不同的语句。 Eliza 很容易被欺骗,例如,如果用户写了 "**You are** a <u>bicycle</u>"**你是** 个 <u>自行车</u>,它可能会回复 "How long have **I been** a <u>bicycle</u>?"**我已经是** 一个 <u>自行车</u> 多久了?,而不是更合理的回答。
[![Chatting with Eliza](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Chatting with Eliza")
[![跟 Eliza 聊天](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "跟 Eliza 聊天")
> 🎥 点击上方的图片查看真实的ELIZA程序视频
> 🎥 点击上方的图片查看关于 Eliza 原型的视频
> 注意:如果你拥有ACM账户你可以阅读1996年发表的[Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract)的原始介绍。或者,在[wikipedia](https://wikipedia.org/wiki/ELIZA)阅读有关 Eliza 的信息
> 旁注:如果你拥有 ACM 账户,你可以阅读 1996 年发表的 [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract)的原始介绍。或者,在[维基百科](https://wikipedia.org/wiki/ELIZA)上阅读有关 Eliza 的信息。
## 联系 - 编码实现一个基础的对话机器人
## 练习 - 编程实现一个基础的对话机器人
像 Eliza 一样的对话机器人是一个似乎可以智能地理解和响应用户输入的程序。与 Eliza 不同的是,我们的机器人不会用规则让它看起来像是在进行智能对话。取而代之的是,我们的对话机器人将只有一种能力,通过几乎在所有琐碎对话中都适用的随机响应保持对话的进行。
像 Eliza 一样的对话机器人是一个看起来可以智能地理解和响应用户输入的程序。与 Eliza 不同的是,我们的机器人不会用规则让它看起来像是在进行智能对话。我们的对话机器人将只有一种能力:它只会通过基本上可以糊弄所有普通对话的句子来随机回答,使得谈话能够继续进行。
### 计划
搭建聊天机器人的步骤
1. 打印指导用户如何与机器人交互的说明
1. 打印用户与机器人交互的使用说明
2. 开启循环
1. 获取用户输入
2. 如果用户要求退出,就退出
3. 处理用户输入并选择一个回答(在这个例子中,回答一个可能的通用回答列表中随机选择)
3. 处理用户输入并选择一个回答(在这个例子中,从回答列表中随机选择一个回答
4. 打印回答
3. 重复步骤2
### 构建聊天机器人
接下来让我们建聊天机器人。我们将从定义一些短语开始。
接下来让我们建一个聊天机器人。我们将从定义一些短语开始。
1. 使用以下随机响应在 Python 中自己创建此机器人:
1. 使用以下随机的回复(`random_responses`在 Python 中自己创建此机器人:
```python
random_responses = ["That is quite interesting, please tell me more.",
@ -102,7 +108,7 @@
"Did you catch the game last night?"]
```
以下是一些指导你的示例输出(用户输入位于以 `>` 开头的行上)
程序运行看起来应该是这样:(用户输入位于以 `>` 开头的行上)
```output
Hello, I am Marvin, the simple robot.
@ -125,18 +131,18 @@
It was nice talking to you, goodbye!
```
该任务的一种可能解决方案在[这里](../solution/bot.py)
示例程序在[这里](../solution/bot.py)。这只是一种可能的解决方案。
✅ 停止并思考
✅ 停下来,思考一下
1. 你认为随机响应会“欺骗”某人认为机器人实际上理解他们吗?
2. 机器人需要哪些功能才能更有效?
3. 如果机器人真的可以“理解”一个句子的意思,它是否也需要“记住”对话中前面句子的意思?
1. 你认为这些随机响应能够“欺骗”人类,使人类认为机器人实际上理解了他们的意思吗?
2. 机器人需要哪些功能才能更有效的回应
3. 如果机器人真的可以“理解”一个句子的意思,它是否也需要“记住”前面句子的意思?
---
## 🚀挑战
选择上面的“停止并思考”元素之一,然后尝试在代码中实现它们或使用伪代码在纸上编写解决方案。
在上面的「停下来,思考一下」板块中选择一个问题,尝试编程实现它们,或使用伪代码在纸上编写解决方案。
在下一课中,您将了解解析自然语言和机器学习的许多其他方法。
@ -144,7 +150,8 @@
## 复习与自学
看看下面的参考资料作为进一步的阅读机会。
看看下面的参考资料作为进一步的参考阅读。
### 参考
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/>.

@ -0,0 +1,24 @@
# 自然语言处理入门
自然语言处理 (NLP) 是人工智能的一个子领域,主要研究如何让机器理解和处理人类语言,并用它来执行拼写检查或机器翻译等任务。
## 本节主题:欧洲语言文学和欧洲浪漫酒店 ❤️
在这部分课程中,您将了解机器学习最广泛的用途之一:自然语言处理 (NLP)。源自计算语言学,这一类人工智能会通过语音或文本与人类交流,建立连接人与机器的桥梁。
课程中,我们将通过构建小型对话机器人来学习 NLP 的基础知识,以了解机器学习是如何使这个机器人越来越“智能”。您将穿越回 1813 年,与简·奥斯汀的经典小说 **傲慢与偏见** 中的 Elizabeth Bennett 和 Mr. Darcy 聊天(该小说于 1813 年出版)。然后,您将通过欧洲的酒店评论来进一步学习情感分析。
![傲慢与偏见之书,和茶](../images/p&p.jpg)
> <a href="https://unsplash.com/@elaineh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">由 Elaine Howlin 拍摄,</a> 来自 <a href="https://unsplash.com/s/照片/傲慢与偏见utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 课程
1. [自然语言处理简介](../1-Introduction-to-NLP/README.md)
2. [NLP 常见任务与技巧](../2-Tasks/README.md)
3. [机器学习翻译和情感分析](../3-Translation-Sentiment/README.md)
4. [准备数据](../4-Hotel-Reviews-1/README.md)
5. [用于情感分析的工具NLTK](../5-Hotel-Reviews-2/README.md)
## 作者
这些自然语言处理课程由 [Stephen Howell](https://twitter.com/Howell_MSFT) 用 ☕ 编写

@ -1,53 +1,53 @@
# 强化学习介
# 强化学习
强化学习Reinforcement learningRL被视为基础机器学习除监督学习以及无监督学习之外的范式之一。强化学习是完全关于决策的它可以提供正确的决策或者至少能从他们中学习。
强化学习 (RL, Reinforcement Learning),是基本的机器学习范式之一(仅次于监督学习 (Supervised Learning) 和无监督学习(Unsupervised Learning))。强化学习和「策略」息息相关:它应当产生正确的策略,或从错误的策略中学习。
想象你现在有一个例如股票市场的模拟环境。如果你施加了一条给定的规章制度的话,将会发生什么呢?这条规章制度会带来积极还是消极的影响呢?如果产生了负面影响的话,那么你就需要接受这种 _负强化_ ,从中学习并改变方针。如果产生了正面的成果,那么你就需要基于这种 _正强化_ 越做越好
假设有一个模拟环境比如说股市。当我们用某一个规则来限制这个市场时会发生什么这个规则或者说策略有积极或消极的影响吗如果它的影响是正面的我们需要从这种_负面强化_中学习改变我们的策略。如果它的影响是正面的我们需要在这种_积极强化_的基础上再进一步发展
![彼得狼](../images/peter.png)
![彼得狼](../images/peter.png)
> 彼得和他的朋友们需要逃离饥饿的狼!(图片来自:[Jen Looper](https://twitter.com/jenlooper)
> 彼得和他的朋友们得从饥饿的狼这儿逃掉!图片来自 [Jen Looper](https://twitter.com/jenlooper)
## 区域主题:彼得与狼(俄罗斯)
## 本节主题:彼得与狼(俄罗斯)
[彼得与狼](https://zh.wikipedia.org/wiki/%E5%BD%BC%E5%BE%97%E5%92%8C%E7%8B%BC) 是前苏联作曲家[普罗科菲耶夫](https://zh.wikipedia.org/wiki/%E8%B0%A2%E5%B0%94%E7%9B%96%C2%B7%E6%99%AE%E7%BD%97%E7%A7%91%E8%8F%B2%E8%80%B6%E5%A4%AB)写的一部交响童话。它讲述的是少先队员彼得勇敢地离家到森林空地去追捕狼的故事。在本节中,我们将训练可以帮助彼得的机器学习算法:
[彼得与狼](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) 是俄罗斯作曲家[谢尔盖·普罗科菲耶夫](https://en.wikipedia.org/wiki/Sergei_Prokofiev)创作的音乐童话。它讲述了彼得勇敢地走出家门,到森林中央追逐狼的故事。在本节中,我们将训练帮助 Peter 追狼的机器学习算法:
- **探索** 周边区域并构建一张最佳的导航地图
- **学习** 如何使用滑板并在上保持平衡,以便更地移动。
- **探索**周边区域并构建最佳地图
- **学习**如何使用滑板并在滑板上保持平衡,以便更快地移动。
[![彼得狼](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM)
[![彼得狼](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM)
> 🎥 点击上图聆听普罗科菲耶夫的《彼得与狼》
> 🎥 点击上面的图片,听普罗科菲耶夫的《彼得与狼》
## 强化学习
之前的章节中,你已经看到了两个机器学习问题的例子:
前面的部分中,您已经看到了两类机器学习问题的例子:
- **有监督的**——我们有数据集可以为我们想要解决的问题提出示例解决方案。[分类模型](../../4-Classification/README.md)与[回归模型](../../2-Regression/translations/README.zh-cn.md)都是有监督的任务。
- **无监督的**——我们的训练数据没有标签。无监督学习的一个主要例子就是[聚类分析](../../5-Clustering/README.md)。
- **监督**,在有已经标记的,暗含解决方案的数据集的情况下。 [分类](../../4-Classification/README.md) 和 [回归](../../2-Regression/README.md) 是监督学习任务。
- **无监督**,在我们没有标记训练数据集的情况下。无监督学习的主要例子是 [聚类](../../5-Clustering/README.md)。
在本节中,我们会向你介绍一种新的学习问题。这种问题不需要有标签的训练数据,它们有以下几类问题:
在本节中,我们将学习一类新的机器学习问题,它不需要已经标记的训练数据 —— 比如这两类问题:
- **[半监督学习](https://wikipedia.org/wiki/Semi-supervised_learning)**——我们有很多没有标签的数据可以用于预先训练模型
- **[强化学习](https://wikipedia.org/wiki/Reinforcement_learning)**——一个智能体agent在某些模拟环境中进行实验并以此学习如何表现
- **[半监督学习](https://wikipedia.org/wiki/Semi-supervised_learning)**,在我们有很多未标记的、可以用来预训练模型的数据的情况下
- **[强化学习](https://wikipedia.org/wiki/Reinforcement_learning)**,在这种方法中,机器通过在某种模拟环境中进行实验来学习最佳策略
### 例 - 电脑游戏
### 例 - 电脑游戏
假设你想要教会电脑如何玩一个例如国际象棋或者[超级马里奥](https://wikipedia.org/wiki/Super_Mario)的游戏。对于电脑来说,我们需要让它预测在每个游戏状态下它的动作才能使它成功地玩游戏。虽然这看上去像是个分类问题,但是事实并非如此——因为我们没有包含(游戏)状态和相应动作的数据集。虽然我们可能有一些现有的国际象棋比赛数据或者玩家玩超级马里奥的记录,但是那些数据很可能无法包含足够多的潜在(游戏)状态
假设我们要教会计算机玩某一款游戏 —— 例如国际象棋,或者 [超级马里奥](https://wikipedia.org/wiki/Super_Mario)。为了让计算机学会玩游戏,我们需要它预测在每个游戏「状态」下,它应该做什么「操作」。虽然这看起来像是一个分类问题,但事实并非如此,因为我们并没有像这样的,包含「状态」和状态对应的「操作」的数据集。我们只有一些有限的数据,比如来自国际象棋比赛的记录,或者是玩家玩超级马里奥的记录。这些数据可能无法涵盖足够多的「状态」
**强化学习** (RL) 不是寻找现有的游戏数据,而是基于一种*想让电脑玩* 多次并观察结果的想法。因此,我们需要做以下两件事来应用强化学习
不同于这种需要大量现有的数据的方法,**强化学习**是基于*让计算机多次玩*并观察玩的结果的想法。因此,要使用强化学习方法,我们需要两个要素
- **环境****模拟器** ——可以让我们多次玩游戏。这个模拟器将定义所有游戏的规则、可能的状态以及动作。
- **环境**和**模拟器**,它们允许我们多次玩游戏。该模拟器应该定义所有游戏规则,以及可能的状态和动作。
- **奖励函数** ——会告诉我们在每个动作或游戏中的表现如何。
- **奖励函数**,它会告诉我们每个每一步(或者每局游戏)的表现如何。
其他机器学习和强化学习RL的主要差别就是在RL中我们通常无法在完成游戏之前知道我们是赢还是输。因此我们无法评价游戏中的某一个特定动作是好是坏——我们只会在游戏结束时才得到奖励。我们的目标是设计一种可以在不确定条件下帮我们训练模型的算法。接下来我们将要学习一种叫**Q-learning**的RL算法。
其他类型的机器学习和强化学习 (RL) 之间的主要区别在于,在 RL 中,我们通常在完成游戏之前,都不知道我们是赢还是输。因此,我们不能说单独的某个动作是不是「好」的 - 我们只会在游戏结束时获得奖励。我们的目标是设计算法,使我们能够在这种不确定的条件下训练模型。我们将了解一种称为 **Q-learning** 的 RL 算法。
## 课程
1. [强化学习与Q-Learning介绍](../1-QLearning/README.md)
2. [使用Gym模拟环境](../2-Gym/README.md)
1.【强化学习和 Q-Learning 介绍】(1-QLearning/README.md)
2.【使用 Gym 模拟环境】(2-Gym/README.md)
## Credits
## 本文作者
"强化学习介绍"由[Dmitry Soshnikov](http://soshnikov.com)撰写 ♥️
“强化学习简介” 由 [Dmitry Soshnikov](http://soshnikov.com) 用 ♥️ 编写

@ -0,0 +1,119 @@
[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE)
[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/)
[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/)
[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/)
[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/)
[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/)
# Yeni Başlayanlar için Makine Öğrenimi - Bir Eğitim Programı
> :earth_africa: Dünya kültürleri sayesinde Makine Öğrenimini keşfederken dünyayı gezin :earth_africa:
Microsoft'taki Azure Cloud Destekleyicileri tamamen **Makine Öğrenimi** hakkında olan 12 hafta ve 24 derslik eğitim programını sunmaktan memnuniyet duyar. Bu eğitim programında, kütüphane olarak temelde Scikit-learn kullanarak ve yakında çıkacak olan 'Yeni Başlayanlar için Yapay Zeka' dersinde anlatılan derin öğrenmeden uzak durarak, zaman zaman adlandırıldığı şekliyle, **klasik makine öğrenimi**ni öğreneceksiniz. Bu dersleri yakında çıkacak olan 'Yeni Başlayanlar için Veri Bilimi' eğitim programımızla da birleştirin!
Biz bu klasik teknikleri dünyanın birçok alanından verilere uygularken bizimle dünyayı gezin. Her bir ders, ders başı ve ders sonu kısa sınavlarını, dersi tamamlamak için yazılı yönergeleri, bir çözümü, bir ödevi ve daha fazlasını içerir. Yeni becerilerin 'yerleşmesi' için kanıtlanmış bir yol olan proje temelli pedagojimiz, yaparken öğrenmenizi sağlar.
**:writing_hand: Yazarlarımıza yürekten teşekkürler** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Ornella Altunyan, and Amy Boyd
**:art: Çizerlerimize de teşekkürler** Tomomi Imura, Dasani Madipalli, and Jen Looper
**:pray: Microsoft Student Ambassador yazarlarımıza, eleştirmenlerimize ve içeriğe katkıda bulunanlara özel teşekkürler :pray:** özellikle Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila, and Snigdha Agarwal
---
# Başlarken
**Öğrenciler**, bu eğitim programını kullanmak için, tüm yazılım havuzunu kendi GitHub hesabınıza çatallayın ve alıştırmaları kendiniz veya bir grup ile tamamlayın:
- Bir ders öncesi kısa sınavı ile başlayın
- Her bilgi kontrolünde durup derinlemesine düşünerek dersi okuyun ve etkinlikleri tamamlayın.
- Çözüm kodunu çalıştırmaktansa dersleri kavrayarak projeleri yapmaya çalışın; yine de o çözüm kodu her proje yönelimli derste `/solution` klasörlerinde mevcut.
- Ders sonrası kısa sınavını çözün
- Meydan okumayı tamamlayın
- Ödevi tamamlayın
- Bir ders grubunu tamamladıktan sonra, [Tartışma Panosu](https://github.com/microsoft/ML-For-Beginners/discussions)'nu ziyaret edin ve uygun PAT yönergesini doldurarak "sesli öğrenin" (Yani, tamamen öğrenmeden önce öğrenme süreciniz üzerine derin düşünerek içgözlem ve geridönütlerle kendinizde farkındalık oluşturun.). 'PAT', bir Progress Assessment Tool'dur (Süreç Değerlendirme Aracı), öğrenmenizi daha ileriye taşımak için doldurduğunuz bir yönergedir. Diğer PAT'lere de karşılık verebilirsiniz, böylece beraber öğrenebiliriz.
> İleri çalışma için, bu [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-15963-cxa) modüllerini ve öğrenme rotalarını takip etmenizi tavsiye ediyoruz.
**Öğretmenler**, bu eğitim programının nasıl kullanılacağı hakkında [bazı öneriler ekledik](../for-teachers.md).
---
## Takımla Tanışın
[![Tanıtım videosu](../ml-for-beginners.png)](https://youtu.be/Tj1XWrDSYJU "Promo video")
> :movie_camera: Proje ve projeyi yaratanlar hakkındaki video için yukarıdaki fotoğrafa tıklayın!
---
## Pedagoji
Bu eğitim programını oluştururken iki pedagojik ilke seçtik: uygulamalı **proje temelli** olduğundan ve **sık kısa sınavlar** içerdiğinden emin olmak. Ayrıca, bu eğitim programında tutarlılık sağlaması için genel bir **tema** var.
İçeriğin projelerle uyumlu olduğuna emin olarak, süreç öğrenciler için daha ilgi çekici hale getirilmiştir ve kavramların akılda kalıcılığı artacaktır. Ayrıca, dersten önce ikincil değerli bir kısa sınav öğrencinin niyetini konuyu öğrenmek yaparken dersten sonra yapılan ikinci bir kısa sınav da akılda kalıcılığı sağlar. Bu eğitim programı esnek ve eğlenceli olacak şekilde hazırlanmıştır ve tümüyle veya kısmen işlenebilir. Projeler kolay başlar ve 12 haftalık zamanın sonuna doğru karmaşıklıkları gittikçe artar. Bu eğitim programı, Makine Öğreniminin gerçek hayattaki uygulamaları üzerine, ek puan veya tartışma için bir temel olarak kullanılabilecek bir ek yazı da içermektedir.
> [Davranış Kuralları](../CODE_OF_CONDUCT.md)'mızı, [Katkıda Bulunma](../CONTRIBUTING.md) ve [Çeviri](../TRANSLATIONS.md) kılavuz ilkelerimizi inceleyin. Yapıcı geridönütlerinizi memnuniyetle karşılıyoruz!
## Her bir ders şunları içermektedir:
- isteğe bağlı eskiz notu
- isteğe bağlı ek video
- ders öncesi ısınma kısa sınavı
- yazılı ders
- proje temelli dersler için, projenin nasıl yapılacağına dair adım adım kılavuz
- bilgi kontrolleri
- bir meydan okuma
- ek okuma
- ödev
- ders sonrası kısa sınavı
> **Kısa sınavlar hakkında bir not**: Her biri üç sorudan oluşan ve toplamda 50 tane olan tüm kısa sınavlar [bu uygulamada](https://jolly-sea-0a877260f.azurestaticapps.net) bulunmaktadır. Derslerin içinden de bağlantı yoluyla ulaşılabilirler ancak kısa sınav uygulaması yerelde çalıştırılabilir; `quiz-app` klasöründeki yönergeleri takip edin.
| Ders Numarası | Konu | Ders Gruplandırması | Öğrenme Hedefleri | Ders | Yazar |
| :-----------: | :--------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------: | :------------: |
| 01 | Makine Öğrenimi Giriş | [Giriş](../1-Introduction/README.md) | Makine öğreniminin temel kavramlarını öğrenmek | [ders](../1-Introduction/1-intro-to-ML/README.md) | Muhammad |
| 02 | Makine Öğrenimi Tarihi | [Giriş](../1-Introduction/README.md) | Bu alanın altında yatan tarihi öğrenmek | [ders](../1-Introduction/2-history-of-ML/README.md) | Jen and Amy |
| 03 | Eşitlik ve Makine Öğrenimi | [Giriş](../1-Introduction/README.md) | Öğrencilerin ML modelleri yaparken ve uygularken düşünmeleri gereken eşitlik hakkındaki önemli felsefi sorunlar nelerdir? | [ders](../1-Introduction/3-fairness/README.md) | Tomomi |
| 04 | Makine Öğrenimi için Yöntemler | [Giriş](../1-Introduction/README.md) | ML araştırmacıları ML modelleri üretmek için hangi yöntemleri kullanırlar? | [ders](../1-Introduction/4-techniques-of-ML/README.md) | Chris and Jen |
| 05 | Regresyona Giriş | [Regresyon](../2-Regression/README.md) | Regresyon modelleri için Python ve Scikit-learn'e başlamak | [ders](../2-Regression/1-Tools/README.md) | Jen |
| 06 | Kuzey Amerika balkabağı fiyatları :jack_o_lantern: | [Regresyon](../2-Regression/README.md) | ML hazırlığı için verileri görselleştirmek ve temizlemek | [ders](../2-Regression/2-Data/README.md) | Jen |
| 07 | Kuzey Amerika balkabağı fiyatları :jack_o_lantern: | [Regresyon](../2-Regression/README.md) | Doğrusal ve polinom regresyon modelleri yapmak | [ders](../2-Regression/3-Linear/README.md) | Jen |
| 08 | Kuzey Amerika balkabağı fiyatları :jack_o_lantern: | [Regresyon](../2-Regression/README.md) | Lojistik bir regresyon modeli yapmak | [ders](../2-Regression/4-Logistic/README.md) | Jen |
| 09 | Bir Web Uygulaması :electric_plug: | [Web Uygulaması](../3-Web-App/README.md) | Eğittiğiniz modeli kullanmak için bir web uygulaması yapmak | [ders](../3-Web-App/1-Web-App/README.md) | Jen |
| 10 | Sınıflandırmaya Giriş | [Sınıflandırma](../4-Classification/README.md) | Verilerinizi temizlemek, hazırlamak, ve görselleştirmek; sınıflandırmaya giriş | [ders](../4-Classification/1-Introduction/README.md) | Jen and Cassie |
| 11 | Leziz Asya ve Hint mutfağı :ramen: | [Sınıflandırma](../4-Classification/README.md) | Sınıflandırıcılara giriş | [ders](../4-Classification/2-Classifiers-1/README.md) | Jen and Cassie |
| 12 | Leziz Asya ve Hint mutfağı :ramen: | [Sınıflandırma](../4-Classification/README.md) | Daha fazla sınıflandırıcı | [ders](../4-Classification/3-Classifiers-2/README.md) | Jen and Cassie |
| 13 | Leziz Asya ve Hint mutfağı :ramen: | [Sınıflandırma](../4-Classification/README.md) | Modelinizi kullanarak tavsiyede bulunan bir web uygulaması yapmak | [ders](../4-Classification/4-Applied/README.md) | Jen |
| 14 | Kümelemeye Giriş | [Kümeleme](../5-Clustering/README.md) | Verilerinizi temizlemek, hazırlamak, ve görselleştirmek; kümelemeye giriş | [ders](../5-Clustering/1-Visualize/README.md) | Jen |
| 15 | Nijerya'nın Müzik Zevklerini Keşfetme :headphones: | [Kümeleme](../5-Clustering/README.md) | K merkezli kümeleme yöntemini keşfetmek | [ders](../5-Clustering/2-K-Means/README.md) | Jen |
| 16 | Doğal Dil İşlemeye Giriş :coffee: | [Doğal Dil İşleme](../6-NLP/README.md) | Basit bir bot yaratarak NLP temellerini öğrenmek | [ders](../6-NLP/1-Introduction-to-NLP/README.md) | Stephen |
| 17 | Yaygın NLP Görevleri :coffee: | [Doğal Dil İşleme](../6-NLP/README.md) | Dil yapılarıyla uğraşırken gereken yaygın görevleri anlayarak NLP bilginizi derinleştirmek | [ders](../6-NLP/2-Tasks/README.md) | Stephen |
| 18 | Çeviri ve Duygu Analizi :hearts: | [Doğal Dil İşleme](../6-NLP/README.md) | Jane Austen ile çeviri ve duygu analizi | [ders](../6-NLP/3-Translation-Sentiment/README.md) | Stephen |
| 19 | Avrupa'nın Romantik Otelleri :hearts: | [Doğal Dil İşleme](../6-NLP/README.md) | Otel değerlendirmeleriyle duygu analizi, 1 | [ders](../6-NLP/4-Hotel-Reviews-1/README.md) | Stephen |
| 20 | Avrupa'nın Romantik Otelleri :hearts: | [Doğal Dil İşleme](../6-NLP/README.md) | Otel değerlendirmeleriyle duygu analizi 2 | [ders](../6-NLP/5-Hotel-Reviews-2/README.md) | Stephen |
| 21 | Zaman Serisi Tahminine Giriş | [Zaman Serisi](../7-TimeSeries/README.md) | Zaman serisi tahminine giriş | [ders](../7-TimeSeries/1-Introduction/README.md) | Francesca |
| 22 | :zap: Dünya Güç Kullanımı :zap: - ARIMA ile Zaman Serisi Tahmini | [Zaman Serisi](../7-TimeSeries/README.md) | ARIMA ile zaman serisi tahmini | [ders](../7-TimeSeries/2-ARIMA/README.md) | Francesca |
| 23 | Pekiştirmeli Öğrenmeye Giriş | [Pekiştirmeli Öğrenme](../8-Reinforcement/README.md) | Q-Learning ile pekiştirmeli öğrenmeye giriş | [ders](../8-Reinforcement/1-QLearning/README.md) | Dmitry |
| 24 | Peter'ın Kurttan Uzak Durmasına Yardım Edin! :wolf: | [Pekiştirmeli Öğrenme](../8-Reinforcement/README.md) | Pekiştirmeli öğrenme spor salonu | [ders](../8-Reinforcement/2-Gym/README.md) | Dmitry |
| Ek Yazı | Gerçek Hayattan ML Senaryoları ve Uygulamaları | [Vahşi Doğada ML](../9-Real-World/README.md) | Klasik makine öğreniminin ilginç ve açıklayıcı gerçek hayat uygulamaları | [ders](../9-Real-World/1-Applications/README.md) | Takım |
## Çevrimdışı erişim
Bu dokümantasyonu [Docsify](https://docsify.js.org/#/) kullanarak çevrimdışı çalıştırabilirsiniz. Bu yazılım havuzunu çatallayın, yerel makinenizde [Docsify'ı kurum](https://docsify.js.org/#/quickstart) ve sonra bu yazılım havuzunun kök dizininde `docsify serve` yazın. İnternet sitesi, 3000 portunda `localhost:3000` yerel ana makinenizde sunulacaktır.
## PDF'ler
Eğitim programının bağlantılarla PDF'sine [buradan](../pdf/readme.pdf) ulaşabilirsiniz.
## Yardım İsteniyor!
Bir çeviri katkısında bulunmak ister misiniz? Lütfen [çeviri kılavuz ilkelerimizi](../TRANSLATIONS.md) okuyun ve [buraya](https://github.com/microsoft/ML-For-Beginners/issues/71) girdiyi ekleyin.
## Diğer Eğitim Programları
Takımımız başka eğitim programları üretiyor! İnceleyin:
- [Yeni Başlayanlar için Web Geliştirme](https://aka.ms/webdev-beginners)
- [Yeni Başlayanlar için Nesnelerin İnterneti](https://aka.ms/iot-beginners)

@ -29,11 +29,11 @@
- 从课前测验开始
- 阅读课程内容,完成所有的活动,在每次 knowledge check 时暂停并思考
- 我们建议你基于理解来创建项目(而不是仅仅跑一遍示例代码)示例代码的位置在每一个项目的 `/solution` 文件夹中。
- 我们建议你基于理解来创建项目(而不是仅仅跑一遍示例代码)示例代码的位置在每一个项目的 `/solution` 文件夹中。
- 进行课后测验
- 完成课程挑战
- 完成作业
- 一节课完成后, 访问[讨论版](https://github.com/microsoft/ML-For-Beginners/discussions),通过天蝎相应的 PAT Rubric (课程目标)来深化自己的学习成果。你也可以回应其它的 PAT这样我们可以一起学习。
- 一节课完成后, 访问[讨论版](https://github.com/microsoft/ML-For-Beginners/discussions),通过填写相应的 PAT Rubric (课程目标) 来深化自己的学习成果。你也可以回应其它的 PAT这样我们可以一起学习。
> 如果希望进一步学习,我们推荐跟随 [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-15963-cxa) 的模块和学习路径。
@ -52,7 +52,7 @@
此课程基于两个教学原则:学生应该上手进行**项目实践**,并完成**频繁的测验**。 此外,为了使整个课程更具有整体性,课程们有一个共同的**主题**。
通过确保课程内容与项目强相关,我们让学习过程对学生更具吸引力,概念的学习也被深化了。难度较低的课前测验可以吸引学生学习课程,课后的第二次测验进一步重复了课堂中的概念。该课程被设计地灵活有趣,可以一次性全部学习,或者分开来一部分一部分学习。这些项目由浅入深,从第一周的小项目开始,在第十二周的周期结束时变得较为复杂。本课程还包括一个关于机器学习实际应用的后记,可用作额外学分或讨论的基础。
通过确保课程内容与项目强相关,我们让学习过程对学生更具吸引力,概念的学习也被深化了。难度较低的课前测验可以吸引学生学习课程,课后的第二次测验进一步重复了课堂中的概念。该课程被设计地灵活有趣,可以一次性全部学习,或者分开来一部分一部分学习。这些项目由浅入深,从第一周的小项目开始,在第十二周结束时变得较为复杂。本课程还包括一个关于机器学习实际应用的后记,可用作额外学分或进一步讨论的基础。
> 在这里,你可以找到我们的[行为守则](../CODE_OF_CONDUCT.md)[对项目作出贡献](../CONTRIBUTING.md)以及[翻译](../TRANSLATIONS.md)指南。我们欢迎各位提出有建设性的反馈!

Loading…
Cancel
Save