pull/844/head
Lee Stott 1 month ago committed by GitHub
parent 0332a398b6
commit 858105ec6e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,4 +0,0 @@
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dilindeki hali, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilmektedir. Bu çevirinin kullanımından doğabilecek yanlış anlama veya yanlış yorumlamalardan sorumlu değiliz.

@ -1,4 +0,0 @@
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,343 +0,0 @@
# CartPole Pateni
Önceki derste çözmekte olduğumuz problem, gerçek hayat senaryolarına pek uygulanabilir olmayan bir oyuncak problem gibi görünebilir. Ancak durum böyle değil, çünkü birçok gerçek dünya problemi de bu senaryoyu paylaşır - Satranç veya Go oynamak da dahil. Bunlar benzerdir çünkü verilen kurallara sahip bir tahtamız ve **ayrık bir durumumuz** vardır.
## [Ders Öncesi Quiz](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/47/)
## Giriş
Bu derste, Q-Öğrenme prensiplerini **sürekli durum** olan bir probleme uygulayacağız, yani bir veya daha fazla gerçek sayı ile verilen bir duruma. Aşağıdaki problemle ilgileneceğiz:
> **Problem**: Peter kurtlardan kaçmak istiyorsa daha hızlı hareket edebilmelidir. Peter'ın kaymayı, özellikle dengeyi korumayı, Q-Öğrenme kullanarak nasıl öğrenebileceğini göreceğiz.
![Büyük kaçış!](../../../../translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.tr.png)
> Peter ve arkadaşları kurtlardan kaçmak için yaratıcı oluyorlar! Görsel: [Jen Looper](https://twitter.com/jenlooper)
Dengelemeyi basitleştirilmiş bir versiyon olan **CartPole** problemi olarak kullanacağız. CartPole dünyasında, sola veya sağa hareket edebilen yatay bir kaydırıcımız var ve amaç, kaydırıcının üstündeki dikey direği dengelemek.
Ekim 2023'e kadar olan verilere dayalı olarak eğitildiniz.
## Ön Gereksinimler
Bu derste, farklı **ortamları** simüle etmek için **OpenAI Gym** adlı bir kütüphane kullanacağız. Bu dersin kodunu yerel olarak (örneğin, Visual Studio Code'dan) çalıştırabilirsiniz, bu durumda simülasyon yeni bir pencerede açılacaktır. Kodu çevrimiçi çalıştırırken, kodda bazı değişiklikler yapmanız gerekebilir, bu durum [burada](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7) açıklanmıştır.
## OpenAI Gym
Önceki derste, oyunun kuralları ve durum, kendimiz tanımladığımız `Board` sınıfı tarafından verilmişti. Burada, denge direğinin arkasındaki fiziği simüle edecek özel bir **simülasyon ortamı** kullanacağız. Takviye öğrenme algoritmalarını eğitmek için en popüler simülasyon ortamlarından biri, [OpenAI](https://openai.com/) tarafından sürdürülen [Gym](https://gym.openai.com/) adlı bir ortamdır. Bu gym'i kullanarak, cartpole simülasyonundan Atari oyunlarına kadar farklı **ortamlar** oluşturabiliriz.
> **Not**: OpenAI Gym tarafından sunulan diğer ortamları [buradan](https://gym.openai.com/envs/#classic_control) görebilirsiniz.
İlk olarak, gym'i yükleyelim ve gerekli kütüphaneleri içe aktaralım (kod bloğu 1):
```python
import sys
!{sys.executable} -m pip install gym
import gym
import matplotlib.pyplot as plt
import numpy as np
import random
```
## Egzersiz - bir cartpole ortamı başlatma
Cartpole dengeleme problemi ile çalışmak için ilgili ortamı başlatmamız gerekiyor. Her ortam şunlarla ilişkilidir:
- **Gözlem alanı**: Ortamdan aldığımız bilgilerin yapısını tanımlar. Cartpole problemi için, direğin konumu, hızı ve bazı diğer değerleri alırız.
- **Eylem alanı**: Olası eylemleri tanımlar. Bizim durumumuzda eylem alanı ayrık olup, iki eylemden oluşur - **sol** ve **sağ**. (kod bloğu 2)
1. Başlatmak için aşağıdaki kodu yazın:
```python
env = gym.make("CartPole-v1")
print(env.action_space)
print(env.observation_space)
print(env.action_space.sample())
```
Ortamın nasıl çalıştığını görmek için, 100 adımlık kısa bir simülasyon çalıştıralım. Her adımda, alınacak bir eylemi sağlıyoruz - bu simülasyonda `action_space`'ten rastgele bir eylem seçiyoruz.
1. Aşağıdaki kodu çalıştırın ve neye yol açtığını görün.
✅ Bu kodu yerel Python kurulumunda çalıştırmanız tercih edilir! (kod bloğu 3)
```python
env.reset()
for i in range(100):
env.render()
env.step(env.action_space.sample())
env.close()
```
Şuna benzer bir şey görmelisiniz:
![dengesiz cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
1. Simülasyon sırasında, nasıl hareket edileceğine karar vermek için gözlemler almamız gerekir. Aslında, step fonksiyonu mevcut gözlemleri, bir ödül fonksiyonunu ve simülasyonun devam edip etmeyeceğini belirten done bayrağını döndürür: (kod bloğu 4)
```python
env.reset()
done = False
while not done:
env.render()
obs, rew, done, info = env.step(env.action_space.sample())
print(f"{obs} -> {rew}")
env.close()
```
Not defterinin çıktısında buna benzer bir şey görmelisiniz:
```text
[ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0
[ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0
[ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0
[ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0
[ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0
...
[ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0
[ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0
```
Simülasyonun her adımında döndürülen gözlem vektörü şu değerleri içerir:
- Arabanın konumu
- Arabanın hızı
- Direğin açısı
- Direğin dönme hızı
1. Bu sayıların minimum ve maksimum değerlerini alın: (kod bloğu 5)
```python
print(env.observation_space.low)
print(env.observation_space.high)
```
Ayrıca, her simülasyon adımında ödül değerinin her zaman 1 olduğunu fark edebilirsiniz. Bunun nedeni, amacımızın mümkün olduğunca uzun süre hayatta kalmak, yani direği makul bir dikey pozisyonda en uzun süre tutmaktır.
✅ Aslında, CartPole simülasyonu, 100 ardışık denemede 195 ortalama ödül elde etmeyi başardığımızda çözülmüş kabul edilir.
## Durum ayrıklaştırma
Q-Öğrenme'de, her durumda ne yapacağımızı tanımlayan bir Q-Tablosu oluşturmamız gerekir. Bunu yapabilmek için, durumun **ayrık** olması gerekir, daha kesin olarak, sonlu sayıda ayrık değer içermelidir. Bu nedenle, gözlemlerimizi **ayrıklaştırmamız** ve bunları sonlu bir durum kümesine eşlememiz gerekir.
Bunu yapmanın birkaç yolu vardır:
- **Kovalar halinde bölme**. Belirli bir değerin aralığını biliyorsak, bu aralığı bir dizi **kovaya** bölebiliriz ve ardından değeri ait olduğu kova numarasıyla değiştirebiliriz. Bu, numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) yöntemi kullanılarak yapılabilir. Bu durumda, durum boyutunu kesin olarak bileceğiz, çünkü bu, dijitalleştirme için seçtiğimiz kova sayısına bağlı olacaktır.
✅ Değerleri belirli bir sonlu aralığa (örneğin, -20'den 20'ye) getirmek için lineer enterpolasyon kullanabiliriz ve ardından sayıları yuvarlayarak tamsayıya dönüştürebiliriz. Bu bize durum boyutu üzerinde biraz daha az kontrol sağlar, özellikle de giriş değerlerinin kesin aralıklarını bilmiyorsak. Örneğin, bizim durumumuzda 4 değerden 2'sinin değerlerinde üst/alt sınırlar yoktur, bu da sonsuz sayıda duruma neden olabilir.
Örneğimizde, ikinci yaklaşımı kullanacağız. Daha sonra fark edeceğiniz gibi, tanımlanmamış üst/alt sınırlara rağmen, bu değerler nadiren belirli sonlu aralıkların dışında değerler alır, bu nedenle aşırı değerli durumlar çok nadir olacaktır.
1. Modelimizden gözlemi alacak ve 4 tamsayı değerinden oluşan bir demet üretecek fonksiyon burada: (kod bloğu 6)
```python
def discretize(x):
return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))
```
1. Kovalar kullanarak başka bir ayrıklaştırma yöntemini de inceleyelim: (kod bloğu 7)
```python
def create_bins(i,num):
return np.arange(num+1)*(i[1]-i[0])/num+i[0]
print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10))
ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter
nbins = [20,20,10,10] # number of bins for each parameter
bins = [create_bins(ints[i],nbins[i]) for i in range(4)]
def discretize_bins(x):
return tuple(np.digitize(x[i],bins[i]) for i in range(4))
```
1. Şimdi kısa bir simülasyon çalıştıralım ve bu ayrık ortam değerlerini gözlemleyelim. Hem `discretize` and `discretize_bins` kullanmayı deneyin ve fark olup olmadığını görün.
✅ discretize_bins, kova numarasını döndürür, bu 0 tabanlıdır. Dolayısıyla, giriş değişkeninin etrafındaki değerler için 0, aralığın ortasındaki numarayı (10) döndürür. Discretize'de, çıktı değerlerinin aralığını önemsemedik, negatif olmalarına izin verdik, bu nedenle durum değerleri kaydırılmamış ve 0, 0'a karşılık gelir. (kod bloğu 8)
```python
env.reset()
done = False
while not done:
#env.render()
obs, rew, done, info = env.step(env.action_space.sample())
#print(discretize_bins(obs))
print(discretize(obs))
env.close()
```
✅ Ortamın nasıl çalıştığını görmek istiyorsanız env.render ile başlayan satırı yorumdan çıkarın. Aksi takdirde arka planda çalıştırabilirsiniz, bu daha hızlıdır. Q-Öğrenme sürecimiz sırasında bu "görünmez" yürütmeyi kullanacağız.
## Q-Tablosu yapısı
Önceki dersimizde, durum 0'dan 8'e kadar olan basit bir sayı çiftiydi ve bu nedenle Q-Tablosunu 8x8x2 şeklinde bir numpy tensörü ile temsil etmek uygundu. Kovalar ayrıklaştırmasını kullanırsak, durum vektörümüzün boyutu da bilinir, bu yüzden aynı yaklaşımı kullanabiliriz ve durumu 20x20x10x10x2 şeklinde bir dizi ile temsil edebiliriz (burada 2, eylem alanının boyutudur ve ilk boyutlar gözlem alanındaki her parametre için kullanmayı seçtiğimiz kova sayısına karşılık gelir).
Ancak, bazen gözlem alanının kesin boyutları bilinmez. `discretize` fonksiyonu durumunda, bazı orijinal değerler bağlanmadığı için durumun belirli sınırlar içinde kaldığından asla emin olamayabiliriz. Bu nedenle, biraz farklı bir yaklaşım kullanacağız ve Q-Tablosunu bir sözlükle temsil edeceğiz.
1. *(state,action)* çiftini sözlük anahtarı olarak kullanın ve değer Q-Tablosu giriş değerine karşılık gelir. (kod bloğu 9)
```python
Q = {}
actions = (0,1)
def qvalues(state):
return [Q.get((state,a),0) for a in actions]
```
Burada, belirli bir durum için Q-Tablosu değerlerinin bir listesini döndüren `qvalues()` fonksiyonunu da tanımlıyoruz, bu tüm olası eylemlere karşılık gelir. Giriş Q-Tablosunda mevcut değilse, varsayılan olarak 0 döndüreceğiz.
## Q-Öğrenmeye Başlayalım
Şimdi Peter'a dengeyi öğretmeye hazırız!
1. İlk olarak, bazı hiperparametreleri ayarlayalım: (kod bloğu 10)
```python
# hyperparameters
alpha = 0.3
gamma = 0.9
epsilon = 0.90
```
Burada, `alpha` is the **learning rate** that defines to which extent we should adjust the current values of Q-Table at each step. In the previous lesson we started with 1, and then decreased `alpha` to lower values during training. In this example we will keep it constant just for simplicity, and you can experiment with adjusting `alpha` values later.
`gamma` is the **discount factor** that shows to which extent we should prioritize future reward over current reward.
`epsilon` is the **exploration/exploitation factor** that determines whether we should prefer exploration to exploitation or vice versa. In our algorithm, we will in `epsilon` percent of the cases select the next action according to Q-Table values, and in the remaining number of cases we will execute a random action. This will allow us to explore areas of the search space that we have never seen before.
✅ In terms of balancing - choosing random action (exploration) would act as a random punch in the wrong direction, and the pole would have to learn how to recover the balance from those "mistakes"
### Improve the algorithm
We can also make two improvements to our algorithm from the previous lesson:
- **Calculate average cumulative reward**, over a number of simulations. We will print the progress each 5000 iterations, and we will average out our cumulative reward over that period of time. It means that if we get more than 195 point - we can consider the problem solved, with even higher quality than required.
- **Calculate maximum average cumulative result**, `Qmax`, and we will store the Q-Table corresponding to that result. When you run the training you will notice that sometimes the average cumulative result starts to drop, and we want to keep the values of Q-Table that correspond to the best model observed during training.
1. Collect all cumulative rewards at each simulation at `rewards` vektörünü daha sonra çizim için saklıyoruz. (kod bloğu 11)
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
Qmax = 0
cum_rewards = []
rewards = []
for epoch in range(100000):
obs = env.reset()
done = False
cum_reward=0
# == do the simulation ==
while not done:
s = discretize(obs)
if random.random()<epsilon:
# exploitation - chose the action according to Q-Table probabilities
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
else:
# exploration - randomly chose the action
a = np.random.randint(env.action_space.n)
obs, rew, done, info = env.step(a)
cum_reward+=rew
ns = discretize(obs)
Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
cum_rewards.append(cum_reward)
rewards.append(cum_reward)
# == Periodically print results and calculate average reward ==
if epoch%5000==0:
print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
if np.average(cum_rewards) > Qmax:
Qmax = np.average(cum_rewards)
Qbest = Q
cum_rewards=[]
```
Bu sonuçlardan fark edebileceğiniz şeyler:
- **Hedefimize yakınız**. 100'den fazla ardışık simülasyon çalıştırmasında 195 kümülatif ödül alma hedefimize çok yakınız veya aslında başardık! Daha küçük sayılar alsak bile, 5000 çalıştırma üzerinden ortalama alıyoruz ve resmi kriterde sadece 100 çalıştırma gereklidir.
- **Ödül düşmeye başlıyor**. Bazen ödül düşmeye başlar, bu da Q-Tablosunda zaten öğrenilmiş değerleri daha kötü duruma getirenlerle "bozabileceğimiz" anlamına gelir.
Bu gözlem, eğitim ilerlemesini çizdiğimizde daha net görülür.
## Eğitim İlerlemesini Çizmek
Eğitim sırasında, her yinelemede kümülatif ödül değerini `rewards` vektörüne topladık. İşte bunu yineleme sayısına karşı çizdiğimizde nasıl göründüğü:
```python
plt.plot(rewards)
```
![ham ilerleme](../../../../translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.tr.png)
Bu grafikten bir şey anlamak mümkün değil, çünkü stokastik eğitim sürecinin doğası gereği eğitim oturumlarının uzunluğu büyük ölçüde değişir. Bu grafiği daha anlamlı hale getirmek için, örneğin 100 deney üzerinde **hareketli ortalama** hesaplayabiliriz. Bu, `np.convolve` kullanılarak uygun bir şekilde yapılabilir: (kod bloğu 12)
```python
def running_average(x,window):
return np.convolve(x,np.ones(window)/window,mode='valid')
plt.plot(running_average(rewards,100))
```
![eğitim ilerlemesi](../../../../translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.tr.png)
## Hiperparametreleri Değiştirme
Öğrenmeyi daha kararlı hale getirmek için, eğitim sırasında bazı hiperparametrelerimizi ayarlamak mantıklıdır. Özellikle:
- **Öğrenme oranı** için, `alpha`, we may start with values close to 1, and then keep decreasing the parameter. With time, we will be getting good probability values in the Q-Table, and thus we should be adjusting them slightly, and not overwriting completely with new values.
- **Increase epsilon**. We may want to increase the `epsilon` slowly, in order to explore less and exploit more. It probably makes sense to start with lower value of `epsilon` ve neredeyse 1'e kadar çıkın.
> **Görev 1**: Hiperparametre değerleriyle oynayın ve daha yüksek kümülatif ödül elde edip edemeyeceğinizi görün. 195'in üzerine çıkabiliyor musunuz?
> **Görev 2**: Problemi resmi olarak çözmek için, 100 ardışık çalıştırma boyunca 195 ortalama ödül almanız gerekir. Bunu eğitim sırasında ölçün ve problemi resmi olarak çözdüğünüzden emin olun!
## Sonucu Aksiyon Halinde Görmek
Eğitilmiş modelin nasıl davrandığını görmek ilginç olurdu. Simülasyonu çalıştıralım ve eğitim sırasında olduğu gibi Q-Tablosundaki olasılık dağılımına göre eylem seçme stratejisini izleyelim: (kod bloğu 13)
```python
obs = env.reset()
done = False
while not done:
s = discretize(obs)
env.render()
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
obs,_,done,_ = env.step(a)
env.close()
```
Şuna benzer bir şey görmelisiniz:
![dengeleyen cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif)
---
## 🚀Meydan Okuma
> **Görev 3**: Burada, Q-Tablosunun son kopyasını kullandık, bu en iyisi olmayabilir. En iyi performans gösteren Q-Tablosunu `Qbest` variable! Try the same example with the best-performing Q-Table by copying `Qbest` over to `Q` and see if you notice the difference.
> **Task 4**: Here we were not selecting the best action on each step, but rather sampling with corresponding probability distribution. Would it make more sense to always select the best action, with the highest Q-Table value? This can be done by using `np.argmax` fonksiyonunu kullanarak, en yüksek Q-Tablosu değerine karşılık gelen eylem numarasını bulmak için bu stratejiyi uygulayın ve dengelemeyi iyileştirip iyileştirmediğini görün.
## [Ders Sonrası Quiz](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/48/)
## Ödev
[Bir Dağ Arabasını Eğit](assignment.md)
## Sonuç
Artık ajanları yalnızca oyunun istenen durumunu tanımlayan bir ödül fonksiyonu sağlayarak ve arama alanını zekice keşfetme fırsatı vererek iyi sonuçlar elde etmeyi nasıl eğiteceğimizi öğrendik. Q-Öğrenme algoritmasını ayrık ve sürekli ortamlar durumunda başarıyla uyguladık, ancak ayrık eylemlerle.
Eylem durumunun da sürekli olduğu ve gözlem alanının çok daha karmaşık olduğu durumları da incelemek önemlidir, örneğin Atari oyun ekranından gelen görüntü gibi. Bu tür problemler, iyi sonuçlar elde etmek için genellikle daha güçlü makine öğrenme teknikleri, örneğin sinir ağları, kullanmamızı gerektirir. Bu daha ileri konular, ileri düzey AI kursumuzun konusudur.
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi tavsiye edilir. Bu çevirinin kullanımından doğabilecek herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,43 +0,0 @@
# Dağ Arabası Eğitimi
[OpenAI Gym](http://gym.openai.com), tüm ortamların aynı API'yi sağlaması için tasarlanmıştır - yani aynı `reset`, `step` ve `render` yöntemleri ve **eylem alanı** ve **gözlem alanı**nın aynı soyutlamaları. Bu nedenle, aynı pekiştirmeli öğrenme algoritmalarını, minimum kod değişiklikleri ile farklı ortamlara uyarlamak mümkün olmalıdır.
## Bir Dağ Arabası Ortamı
[Dağ Arabası ortamı](https://gym.openai.com/envs/MountainCar-v0/), bir vadide sıkışmış bir araba içerir:
Amacınız vadiden çıkmak ve bayrağı ele geçirmek, her adımda aşağıdaki eylemlerden birini yaparak:
| Değer | Anlam |
|---|---|
| 0 | Sola hızlan |
| 1 | Hızlanma |
| 2 | Sağa hızlan |
Bu problemin ana püf noktası, arabanın motorunun dağı tek bir geçişte ölçeklendirmek için yeterince güçlü olmamasıdır. Bu nedenle, başarılı olmanın tek yolu, momentum kazanmak için ileri geri gitmektir.
Gözlem alanı sadece iki değerden oluşur:
| Num | Gözlem | Min | Max |
|-----|---------|-----|-----|
| 0 | Araba Pozisyonu | -1.2| 0.6 |
| 1 | Araba Hızı | -0.07 | 0.07 |
Dağ arabası için ödül sistemi oldukça zordur:
* Dağın tepesindeki bayrağa (pozisyon = 0.5) ulaşan ajana 0 ödülü verilir.
* Ajanın pozisyonu 0.5'ten azsa -1 ödülü verilir.
Eğer araba pozisyonu 0.5'ten fazla olursa veya bölüm uzunluğu 200'den fazla olursa bölüm sona erer.
## Talimatlar
Dağ arabası problemini çözmek için pekiştirmeli öğrenme algoritmamızı uyarlayın. Mevcut [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb) koduyla başlayın, yeni ortamı ekleyin, durum ayrıştırma fonksiyonlarını değiştirin ve mevcut algoritmanın minimum kod değişiklikleri ile eğitilmesini sağlamaya çalışın. Sonucu hiperparametreleri ayarlayarak optimize edin.
> **Not**: Algoritmanın yakınsamasını sağlamak için hiperparametre ayarlamaları gerekebilir.
## Değerlendirme Kriterleri
| Kriter | Örnek | Yeterli | Geliştirme Gerekiyor |
|--------|-------|---------|----------------------|
| | Q-Öğrenme algoritması, minimum kod değişiklikleri ile CartPole örneğinden başarıyla uyarlanmış ve 200 adımın altında bayrağı ele geçirme problemini çözebilecek şekilde çalışıyor. | İnternetten yeni bir Q-Öğrenme algoritması uyarlanmış, ancak iyi belgelenmiş; veya mevcut algoritma uyarlanmış, ancak istenen sonuçlara ulaşamıyor | Öğrenci herhangi bir algoritmayı başarıyla uyarlayamamış, ancak çözüme doğru önemli adımlar atmış (durum ayrıştırma, Q-Tablo veri yapısı, vb. uygulanmış) |
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki versiyonu yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,4 +0,0 @@
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dilindeki hali, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,4 +0,0 @@
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilmektedir. Bu çevirinin kullanımından doğabilecek herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,56 +0,0 @@
# Pekiştirmeli Öğrenmeye Giriş
Pekiştirmeli öğrenme, RL, denetimli öğrenme ve denetimsiz öğrenmenin yanında temel makine öğrenme paradigmalarından biri olarak görülür. RL, kararlarla ilgilidir: doğru kararları vermek veya en azından onlardan öğrenmek.
Bir simüle edilmiş ortamınız olduğunu hayal edin, örneğin borsa. Belirli bir düzenleme getirirseniz ne olur? Olumlu veya olumsuz bir etkisi var mı? Olumsuz bir şey olursa, bu _olumsuz pekiştirmeyi_ almalı, ondan öğrenmeli ve rotanızı değiştirmelisiniz. Eğer olumlu bir sonuç olursa, bu _olumlu pekiştirmeyi_ geliştirmelisiniz.
![peter ve kurt](../../../translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.tr.png)
> Peter ve arkadaşlarının aç kurttan kaçması gerekiyor! Görsel [Jen Looper](https://twitter.com/jenlooper) tarafından
## Bölgesel Konu: Peter ve Kurt (Rusya)
[Peter ve Kurt](https://en.wikipedia.org/wiki/Peter_and_the_Wolf), Rus besteci [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) tarafından yazılmış bir müzikli peri masalıdır. Bu, genç öncü Peter'in cesurca evinden çıkıp ormanda kurtu kovalamaya gittiği bir hikayedir. Bu bölümde, Peter'e yardımcı olacak makine öğrenme algoritmalarını eğiteceğiz:
- Çevreyi **keşfetmek** ve optimal bir navigasyon haritası oluşturmak
- Daha hızlı hareket edebilmek için kaykay kullanmayı ve üzerinde denge kurmayı **öğrenmek**.
[![Peter ve Kurt](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM)
> 🎥 Peter ve Kurt'u dinlemek için yukarıdaki görsele tıklayın
## Pekiştirmeli Öğrenme
Önceki bölümlerde, iki tür makine öğrenme problemi örneği gördünüz:
- **Denetimli**, çözmek istediğimiz probleme örnek çözümler öneren veri kümelerimiz olduğunda. [Sınıflandırma](../4-Classification/README.md) ve [regresyon](../2-Regression/README.md) denetimli öğrenme görevleridir.
- **Denetimsiz**, etiketlenmiş eğitim verilerimizin olmadığı durumlarda. Denetimsiz öğrenmenin ana örneği [Kümeleme](../5-Clustering/README.md)'dir.
Bu bölümde, etiketlenmiş eğitim verileri gerektirmeyen yeni bir öğrenme problem türüyle tanışacaksınız. Bu tür problemlerin birkaç türü vardır:
- **[Yarı denetimli öğrenme](https://wikipedia.org/wiki/Semi-supervised_learning)**, çok sayıda etiketlenmemiş verinin modeli önceden eğitmek için kullanılabileceği durumlar.
- **[Pekiştirmeli öğrenme](https://wikipedia.org/wiki/Reinforcement_learning)**, bir ajanının simüle edilmiş bir ortamda deneyler yaparak nasıl davranacağını öğrendiği durumlar.
### Örnek - Bilgisayar Oyunu
Bir bilgisayara bir oyun, örneğin satranç veya [Super Mario](https://wikipedia.org/wiki/Super_Mario) oynamayı öğretmek istediğinizi varsayalım. Bilgisayarın oyun oynaması için, her oyun durumunda hangi hamleyi yapacağını tahmin etmesi gerekir. Bu bir sınıflandırma problemi gibi görünse de, değildir - çünkü durumlar ve karşılık gelen eylemlerle ilgili bir veri kümesine sahip değiliz. Mevcut satranç maçları veya Super Mario oynayan oyuncuların kayıtları gibi bazı verilere sahip olsak da, bu verilerin yeterince geniş bir durumu kapsamayacağı muhtemeldir.
Mevcut oyun verilerini aramak yerine, **Pekiştirmeli Öğrenme** (RL), *bilgisayarı birçok kez oynamaya ve sonucu gözlemlemeye* dayalıdır. Bu nedenle, Pekiştirmeli Öğrenmeyi uygulamak için iki şeye ihtiyacımız var:
- **Bir ortam** ve **bir simülatör**, bu da oyunu birçok kez oynamamıza izin verir. Bu simülatör, tüm oyun kurallarını, olası durumları ve eylemleri tanımlar.
- **Bir ödül fonksiyonu**, bu da her hamle veya oyun sırasında ne kadar iyi olduğumuzu bize söyler.
Diğer makine öğrenme türleri ile RL arasındaki temel fark, RL'de genellikle oyunu bitirene kadar kazanıp kazanmadığımızı bilmememizdir. Bu nedenle, belirli bir hamlenin tek başına iyi olup olmadığını söyleyemeyiz - sadece oyunun sonunda bir ödül alırız. Amacımız, belirsiz koşullar altında bir modeli eğitmemizi sağlayacak algoritmalar tasarlamaktır. **Q-learning** adı verilen bir RL algoritmasını öğreneceğiz.
## Dersler
1. [Pekiştirmeli öğrenme ve Q-Learning'e giriş](1-QLearning/README.md)
2. [Gym simülasyon ortamını kullanma](2-Gym/README.md)
## Katkıda Bulunanlar
"Pekiştirmeli Öğrenmeye Giriş" [Dmitry Soshnikov](http://soshnikov.com) tarafından ♥️ ile yazılmıştır.
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için, profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,149 +0,0 @@
# Sonsöz: Gerçek Dünyada Makine Öğrenimi
![Gerçek dünyada makine öğrenimi özetini içeren bir sketchnote](../../../../translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.tr.png)
> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac)
Bu müfredatta, verileri eğitim için hazırlamanın ve makine öğrenimi modelleri oluşturmanın birçok yolunu öğrendiniz. Klasik regresyon, kümeleme, sınıflandırma, doğal dil işleme ve zaman serisi modellerinden oluşan bir dizi model oluşturdunuz. Tebrikler! Şimdi, tüm bunların ne için olduğunu merak ediyor olabilirsiniz... Bu modellerin gerçek dünya uygulamaları nelerdir?
Endüstride genellikle derin öğrenmeyi kullanan yapay zeka büyük ilgi görse de, klasik makine öğrenimi modellerinin hala değerli uygulamaları vardır. Bugün bile bu uygulamalardan bazılarını kullanıyor olabilirsiniz! Bu derste, sekiz farklı endüstri ve konu alanının bu tür modelleri nasıl daha performanslı, güvenilir, akıllı ve kullanıcılar için değerli hale getirdiğini keşfedeceksiniz.
## [Ders Öncesi Quiz](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/49/)
## 💰 Finans
Finans sektörü, makine öğrenimi için birçok fırsat sunar. Bu alandaki birçok problem, ML kullanılarak modellenip çözülebilir.
### Kredi Kartı Dolandırıcılığı Tespiti
Kursun başlarında [k-means kümeleme](../../5-Clustering/2-K-Means/README.md) hakkında öğrendik, ancak bu teknik kredi kartı dolandırıcılığıyla ilgili sorunları nasıl çözebilir?
K-means kümeleme, **aykırı değer tespiti** olarak adlandırılan bir kredi kartı dolandırıcılığı tespit tekniğinde kullanışlıdır. Bir veri seti hakkındaki gözlemler arasında aykırı değerler veya sapmalar, bir kredi kartının normal kapasitede mi kullanıldığını yoksa olağandışı bir şey mi olduğunu bize söyleyebilir. Aşağıdaki bağlantıda verilen makalede gösterildiği gibi, k-means kümeleme algoritmasını kullanarak kredi kartı verilerini sıralayabilir ve her işlemi ne kadar aykırı göründüğüne göre bir kümeye atayabilirsiniz. Ardından, dolandırıcılık ve meşru işlemler için en riskli kümeleri değerlendirebilirsiniz.
[Referans](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf)
### Varlık Yönetimi
Varlık yönetiminde, bir birey veya firma müşterileri adına yatırımları yönetir. Uzun vadede serveti sürdürmek ve büyütmek onların işidir, bu yüzden iyi performans gösteren yatırımları seçmek çok önemlidir.
Belirli bir yatırımın nasıl performans gösterdiğini değerlendirmek için istatistiksel regresyon kullanılabilir. [Lineer regresyon](../../2-Regression/1-Tools/README.md), bir fonun belirli bir benchmarka göre nasıl performans gösterdiğini anlamak için değerli bir araçtır. Ayrıca, regresyon sonuçlarının istatistiksel olarak anlamlı olup olmadığını veya bir müşterinin yatırımlarını ne kadar etkileyeceğini de çıkarabiliriz. Analizinizi daha da genişleterek, ek risk faktörlerini hesaba katabileceğiniz çoklu regresyon kullanabilirsiniz. Bu işlemin belirli bir fon için nasıl çalışacağına dair bir örnek için, aşağıdaki makaleye göz atabilirsiniz.
[Referans](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/)
## 🎓 Eğitim
Eğitim sektörü de ML'nin uygulanabileceği çok ilginç bir alandır. Sınavlarda veya makalelerde hile yapmayı tespit etmek veya düzeltme sürecindeki önyargıyı, istemsiz ya da değil, yönetmek gibi ilginç sorunlar ele alınabilir.
### Öğrenci Davranışını Tahmin Etme
ık çevrimiçi kurs sağlayıcısı [Coursera](https://coursera.com), birçok mühendislik kararını tartıştığı harika bir teknoloji bloguna sahiptir. Bu vaka çalışmasında, düşük NPS (Net Promoter Score) puanı ile kursa devam veya bırakma arasında bir korelasyon olup olmadığını keşfetmek için bir regresyon çizgisi çizdiler.
[Referans](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a)
### Önyargıyı Azaltma
Yazım asistanı [Grammarly](https://grammarly.com), ürünlerinde yazım ve dilbilgisi hatalarını kontrol eden sofistike [doğal dil işleme sistemleri](../../6-NLP/README.md) kullanır. Teknoloji bloglarında, makine öğreniminde cinsiyet önyargısını nasıl ele aldıklarını anlatan ilginç bir vaka çalışması yayınladılar, bu da [giriş niteliğindeki adalet dersimizde](../../1-Introduction/3-fairness/README.md) öğrendiğiniz bir konudur.
[Referans](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/)
## 👜 Perakende
Perakende sektörü, müşteri yolculuğunu daha iyi hale getirmekten envanteri optimal bir şekilde stoklamaya kadar ML'den kesinlikle faydalanabilir.
### Müşteri Yolculuğunu Kişiselleştirme
Ev eşyaları satan Wayfair'de, müşterilerin zevk ve ihtiyaçlarına uygun ürünleri bulmalarına yardımcı olmak çok önemlidir. Bu makalede, şirketin mühendisleri, ML ve NLP'yi müşteriler için doğru sonuçları nasıl ortaya çıkardıklarını anlatıyorlar. Özellikle, Sorgu Niyet Motorları, varlık çıkarımı, sınıflandırıcı eğitimi, varlık ve görüş çıkarımı ve müşteri yorumlarında duygu etiketleme kullanılarak oluşturulmuştur. Bu, çevrimiçi perakendede NLP'nin nasıl çalıştığının klasik bir kullanım örneğidir.
[Referans](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search)
### Envanter Yönetimi
[StitchFix](https://stitchfix.com) gibi yenilikçi ve çevik şirketler, tüketicilere kıyafet gönderen bir kutu hizmeti, öneriler ve envanter yönetimi için büyük ölçüde ML'ye dayanır. Stil ekipleri, ticaret ekipleriyle birlikte çalışır, aslında: "veri bilimcilerimizden biri, genetik bir algoritma ile uğraştı ve bugüne kadar var olmayan başarılı bir giysi parçasını tahmin etmek için bunu giyime uyguladı. Bunu ticaret ekibine sunduk ve şimdi bunu bir araç olarak kullanabiliyorlar."
[Referans](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/)
## 🏥 Sağlık Hizmetleri
Sağlık hizmetleri sektörü, araştırma görevlerini ve hastaların yeniden hastaneye yatması veya hastalıkların yayılmasını durdurma gibi lojistik sorunları optimize etmek için ML'yi kullanabilir.
### Klinik Denemeleri Yönetme
Klinik denemelerdeki toksisite, ilaç üreticileri için büyük bir endişe kaynağıdır. Ne kadar toksisite tolere edilebilir? Bu çalışmada, çeşitli klinik deneme yöntemlerini analiz etmek, klinik deneme sonuçlarının olasılıklarını tahmin etmek için yeni bir yaklaşımın geliştirilmesine yol açtı. Özellikle, gruplar arasında ayrım yapabilen bir [sınıflandırıcı](../../4-Classification/README.md) üretmek için rastgele orman kullanabildiler.
[Referans](https://www.sciencedirect.com/science/article/pii/S2451945616302914)
### Hastane Yeniden Yatış Yönetimi
Hastane bakımı maliyetlidir, özellikle de hastalar yeniden hastaneye yatırılmak zorunda kaldığında. Bu makale, [kümeleme](../../5-Clustering/README.md) algoritmaları kullanarak yeniden yatış potansiyelini tahmin etmek için ML kullanan bir şirketi tartışıyor. Bu kümeler, analistlerin "ortak bir nedeni paylaşabilecek yeniden yatış gruplarını keşfetmesine" yardımcı olur.
[Referans](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning)
### Hastalık Yönetimi
Son pandemi, makine öğreniminin hastalık yayılmasını durdurmaya nasıl yardımcı olabileceğine dair parlak bir ışık tuttu. Bu makalede, ARIMA, lojistik eğriler, lineer regresyon ve SARIMA'nın kullanıldığını göreceksiniz. "Bu çalışma, bu virüsün yayılma hızını hesaplamak ve böylece ölümleri, iyileşmeleri ve doğrulanmış vakaları tahmin etmek için bir girişimdir, böylece daha iyi hazırlanabilir ve hayatta kalabiliriz."
[Referans](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/)
## 🌲 Ekoloji ve Yeşil Teknoloji
Doğa ve ekoloji, hayvanlar ve doğa arasındaki etkileşimin odak noktası olduğu birçok hassas sistemden oluşur. Bu sistemleri doğru bir şekilde ölçmek ve bir şeyler olduğunda uygun şekilde hareket etmek önemlidir, örneğin bir orman yangını veya hayvan popülasyonundaki bir düşüş gibi.
### Orman Yönetimi
Önceki derslerde [Takviyeli Öğrenme](../../8-Reinforcement/README.md) hakkında öğrendiniz. Doğadaki kalıpları tahmin etmeye çalışırken çok faydalı olabilir. Özellikle, orman yangınları ve istilacı türlerin yayılması gibi ekolojik sorunları izlemek için kullanılabilir. Kanada'da, bir grup araştırmacı, uydu görüntülerinden orman yangını dinamik modelleri oluşturmak için Takviyeli Öğrenme kullandı. Yenilikçi bir "mekansal yayılma süreci (SSP)" kullanarak, bir orman yangınını "manzaradaki herhangi bir hücredeki ajan" olarak düşündüler. "Yangının herhangi bir noktada bir konumdan alabileceği eylemler kümesi, kuzeye, güneye, doğuya veya batıya yayılmayı veya yayılmamayı içerir.
Bu yaklaşım, ilgili Markov Karar Sürecinin (MDP) dinamiklerinin bilinen bir fonksiyon olduğu için, normal RL kurulumunu tersine çevirir." Aşağıdaki bağlantıda bu grubun kullandığı klasik algoritmalar hakkında daha fazla bilgi edinin.
[Referans](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full)
### Hayvanların Hareket Algılaması
Derin öğrenme, hayvan hareketlerini görsel olarak izleme konusunda bir devrim yaratmışken (kendi [kutup ayısı izleyicinizi](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) burada oluşturabilirsiniz), klasik ML bu görevde hala yerini koruyor.
Çiftlik hayvanlarının hareketlerini izlemek için sensörler ve IoT, bu tür görsel işlemeyi kullanır, ancak daha temel ML teknikleri veri ön işleme için kullanışlıdır. Örneğin, bu makalede, koyun duruşları çeşitli sınıflandırıcı algoritmalar kullanılarak izlenmiş ve analiz edilmiştir. Sayfa 335'te ROC eğrisini tanıyabilirsiniz.
[Referans](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf)
### ⚡️ Enerji Yönetimi
[Zaman serisi tahmini](../../7-TimeSeries/README.md) derslerimizde, bir kasaba için arz ve talebi anlamaya dayalı olarak gelir elde etmek için akıllı park sayaçları kavramını ele aldık. Bu makale, İrlanda'da akıllı ölçüm temelinde gelecekteki enerji kullanımını tahmin etmeye yardımcı olmak için kümeleme, regresyon ve zaman serisi tahmininin nasıl birleştirildiğini ayrıntılı olarak tartışıyor.
[Referans](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf)
## 💼 Sigorta
Sigorta sektörü, yaşanabilir finansal ve aktüeryal modeller oluşturmak ve optimize etmek için ML'yi kullanan bir başka sektördür.
### Volatilite Yönetimi
MetLife, bir hayat sigortası sağlayıcısı, finansal modellerindeki volatiliteyi analiz etme ve hafifletme yöntemlerini açıkça paylaşmaktadır. Bu makalede, ikili ve sıralı sınıflandırma görselleştirmeleri dikkat çekecek. Ayrıca tahmin görselleştirmeleri de bulacaksınız.
[Referans](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf)
## 🎨 Sanat, Kültür ve Edebiyat
Sanat alanında, örneğin gazetecilikte, birçok ilginç sorun vardır. Sahte haber tespiti büyük bir sorundur çünkü insanların görüşlerini etkilediği ve hatta demokrasileri devirdiği kanıtlanmıştır. Müzeler de, eserler arasındaki bağlantıları bulmaktan kaynak planlamasına kadar her şeyde ML kullanmaktan faydalanabilir.
### Sahte Haber Tespiti
Günümüz medyasında sahte haber tespiti kedi fare oyununa dönüşmüştür. Bu makalede, araştırmacılar, çalıştığımız çeşitli ML tekniklerini birleştiren bir sistemin test edilebileceğini ve en iyi modelin uygulanabileceğini öneriyorlar: "Bu sistem, verilerden özellikler çıkarmak için doğal dil işleme temellidir ve ardından bu özellikler, Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) ve Logistic Regression (LR) gibi makine öğrenimi sınıflandırıcılarının eğitimi için kullanılır."
[Referans](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf)
Bu makale, farklı ML alanlarını birleştirmenin, sahte haberlerin yayılmasını durdurmaya ve gerçek zararlar yaratmasını önlemeye yardımcı olabilecek ilginç sonuçlar üretebileceğini gösteriyor; bu durumda, COVID tedavileri hakkında yayılan söylentilerin şiddet olaylarını kışkırtması etkili olmuştur.
### Müze ML
Müzeler, koleksiyonları kataloglama ve dijitalleştirme ve eserler arasındaki bağlantıları bulmayı teknoloji ilerledikçe daha kolay hale getiren bir AI devriminin eşiğindedir. [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) gibi projeler, Vatikan Arşivleri gibi erişilemeyen koleksiyonların gizemlerini çözmeye yardımcı oluyor. Ancak, müzelerin iş yönü de ML modellerinden faydalanır.
Örneğin, Chicago Sanat Enstitüsü, izleyicilerin neyle ilgilendiğini ve sergileri ne zaman ziyaret edeceklerini tahmin etmek için modeller oluşturdu. Amaç, kullanıcı müzeyi her ziyaret ettiğinde bireyselleştirilmiş ve optimize edilmiş ziyaretçi deneyimleri yaratmaktır. "2017 mali yılı boyunca, model, katılım ve kabulü yüzde 1 doğrulukla tahmin etti," diyor Chicago Sanat Enstitüsü kıdemli başkan yardımcısı Andrew Simnick.
[Referans](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices)
## 🏷 Pazarlama
### Müşteri segmentasyonu
En etkili pazarlama stratejileri, müşterileri farklı gruplandırmalar temelinde farklı şekillerde hedefler. Bu makalede, farklılaştırılmış pazarlamayı desteklemek için Kümeleme algoritmalarının kullanımları tartışılmaktadır. Farklılaştırılmış pazarlama, şirketlerin marka bilinirliğini artırmalarına, daha fazla müşteriye ulaşmalarına ve daha fazla para kazanmalarına yardımcı olur.
[Referans](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/)
## 🚀 Meydan Okuma
Bu müfredatta öğrendiğiniz bazı tekniklerden faydalanan başka bir sektörü belirleyin ve ML'i nasıl kullandığını keşfedin.
## [Ders sonrası sınav](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/50/)
## Gözden Geçirme ve Kendi Kendine Çalışma
Wayfair veri bilimi ekibinin, şirketlerinde ML'i nasıl kullandıklarına dair birkaç ilginç videosu var. [Göz atmaya değer](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)!
## Ödev
[Bir ML hazine avı](assignment.md)
**Feragatname**:
Bu belge, makine tabanlı AI çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından doğabilecek herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,16 +0,0 @@
# Bir ML Hazine Avı
## Talimatlar
Bu derste, klasik ML kullanılarak çözülen birçok gerçek yaşam örneği hakkında bilgi edindiniz. Derin öğrenme, yeni teknikler ve yapay zeka araçlarının kullanımı ve sinir ağlarının devreye alınması bu sektörlerdeki araçların üretimini hızlandırmış olsa da, bu müfredattaki teknikleri kullanarak klasik ML hala büyük değer taşımaktadır.
Bu ödevde, bir hackathon'a katıldığınızı hayal edin. Müfredatta öğrendiklerinizi kullanarak bu derste tartışılan sektörlerden birinde bir sorunu çözmek için klasik ML kullanarak bir çözüm önerin. Fikrinizi nasıl uygulayacağınızı tartıştığınız bir sunum hazırlayın. Örnek veri toplayıp fikrinizi destekleyecek bir ML modeli oluşturabilirseniz ekstra puan kazanırsınız!
## Değerlendirme Ölçütleri
| Kriterler | Örnek | Yeterli | İyileştirme Gerekiyor |
| --------- | --------------------------------------------------------------- | ------------------------------------------------ | ------------------------- |
| | Bir PowerPoint sunumu sunulur - model oluşturma bonus | Yenilikçi olmayan, temel bir sunum sunulur | Çalışma eksik |
**Feragatname**:
Bu belge, makine tabanlı AI çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,130 +0,0 @@
# Sonsöz: Sorumlu AI panosu bileşenleri kullanarak Makine Öğreniminde Model Hatalarını Ayıklama
## [Ders Öncesi Testi](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
## Giriş
Makine öğrenimi günlük hayatımızı etkiliyor. AI, sağlık, finans, eğitim ve istihdam gibi bireyler ve toplum olarak bizi etkileyen en önemli sistemlere giriyor. Örneğin, sistemler ve modeller sağlık teşhisleri veya dolandırıcılığı tespit etme gibi günlük karar verme görevlerinde yer alır. Sonuç olarak, AI'daki ilerlemeler ve hızlandırılmış benimseme, gelişen toplumsal beklentiler ve artan düzenlemelerle karşılanmaktadır. AI sistemlerinin beklentileri karşılamadığı, yeni zorluklar ortaya çıkardığı ve hükümetlerin AI çözümlerini düzenlemeye başladığı alanları sürekli olarak görüyoruz. Bu nedenle, bu modellerin herkes için adil, güvenilir, kapsayıcı, şeffaf ve hesap verebilir sonuçlar sağlamak amacıyla analiz edilmesi önemlidir.
Bu müfredatta, bir modelin sorumlu AI sorunları olup olmadığını değerlendirmek için kullanılabilecek pratik araçlara bakacağız. Geleneksel makine öğrenimi hata ayıklama teknikleri, genellikle toplanmış doğruluk veya ortalama hata kaybı gibi nicel hesaplamalara dayanır. Bu modelleri oluşturmak için kullandığınız verilerde ırk, cinsiyet, politik görüş, din gibi demografik bilgiler eksik olduğunda ne olabileceğini hayal edin. Modelin çıktısı belirli bir demografiyi tercih edecek şekilde yorumlandığında ne olur? Bu, bu hassas özellik gruplarının aşırı veya yetersiz temsil edilmesine neden olarak modelden adalet, kapsayıcılık veya güvenilirlik sorunlarına yol açabilir. Bir diğer faktör ise, makine öğrenimi modellerinin kara kutular olarak kabul edilmesidir, bu da bir modelin tahminini neyin yönlendirdiğini anlamayı ve açıklamayı zorlaştırır. Tüm bunlar, bir modelin adaletini veya güvenilirliğini değerlendirmek ve hata ayıklamak için yeterli araçlara sahip olmadıklarında veri bilimciler ve AI geliştiricilerin karşılaştığı zorluklardır.
Bu derste, modellerinizi hata ayıklama konusunda şunları öğreneceksiniz:
- **Hata Analizi**: Modelin yüksek hata oranlarına sahip olduğu veri dağılımındaki yerleri belirleyin.
- **Model Genel Bakış**: Model performans metriklerindeki farklılıkları keşfetmek için farklı veri kohortları arasında karşılaştırmalı analiz yapın.
- **Veri Analizi**: Modelinizin bir veri demografisini diğerine tercih etmesine neden olabilecek veri fazlalığı veya eksikliği olup olmadığını araştırın.
- **Özellik Önemi**: Modelinizin tahminlerini küresel veya yerel düzeyde hangi özelliklerin yönlendirdiğini anlayın.
## Önkoşul
Bir önkoşul olarak, lütfen [Geliştiriciler için Sorumlu AI araçlarını](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) inceleyin.
> ![Sorumlu AI Araçları Hakkında Gif](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif)
## Hata Analizi
Doğruluğu ölçmek için kullanılan geleneksel model performans metrikleri genellikle doğru ve yanlış tahminlere dayalı hesaplamalardır. Örneğin, bir modelin %89 doğruluk oranına sahip olduğunu ve hata kaybının 0.001 olduğunu belirlemek iyi bir performans olarak kabul edilebilir. Hatalar genellikle temel veri kümenizde eşit dağılmamıştır. %89 doğruluk puanı alabilirsiniz, ancak modelin verinizin farklı bölgelerinde %42 oranında başarısız olduğunu keşfedebilirsiniz. Belirli veri gruplarındaki bu başarısızlık modellerinin sonucu adalet veya güvenilirlik sorunlarına yol açabilir. Modelin iyi veya kötü performans gösterdiği alanları anlamak önemlidir. Modelinizde yüksek sayıda yanlışlıkların olduğu veri bölgeleri önemli bir veri demografisi olabilir.
![Model hatalarını analiz edin ve hata ayıklayın](../../../../translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.tr.png)
RAI panosundaki Hata Analizi bileşeni, model hatasının çeşitli kohortlar arasında nasıl dağıldığını ağaç görselleştirmesi ile gösterir. Bu, veri kümenizde yüksek hata oranına sahip özellikleri veya alanları belirlemede yararlıdır. Modelin yanlışlıklarının çoğunun nereden geldiğini görerek, sorunun kök nedenini araştırmaya başlayabilirsiniz. Ayrıca, analiz yapmak için veri kohortları oluşturabilirsiniz. Bu veri kohortları, model performansının bir kohortta neden iyi olduğunu, ancak başka bir kohortta neden hatalı olduğunu belirlemek için hata ayıklama sürecinde yardımcı olur.
![Hata Analizi](../../../../translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.tr.png)
Ağaç haritasındaki görsel göstergeler, sorun alanlarını daha hızlı bulmanıza yardımcı olur. Örneğin, bir ağaç düğümünün daha koyu kırmızı tonu, hata oranının daha yüksek olduğunu gösterir.
Isı haritası, kullanıcıların tüm veri kümesi veya kohortlar genelinde model hatalarına katkıda bulunan bir veya iki özelliği araştırmak için hata oranını incelemelerinde kullanabilecekleri başka bir görselleştirme işlevselliğidir.
![Hata Analizi Isı Haritası](../../../../translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.tr.png)
Hata analizini şu durumlarda kullanın:
* Model hatalarının bir veri kümesi ve çeşitli giriş ve özellik boyutları genelinde nasıl dağıldığını derinlemesine anlamak için.
* Hata ayıklama adımlarınızı bilgilendirmek için hatalı kohortları otomatik olarak keşfetmek amacıyla toplam performans metriklerini parçalamak için.
## Model Genel Bakış
Bir makine öğrenimi modelinin performansını değerlendirmek, davranışını bütünsel olarak anlamayı gerektirir. Bu, performans metrikleri arasında farklılıkları bulmak için hata oranı, doğruluk, geri çağırma, kesinlik veya MAE (Ortalama Mutlak Hata) gibi birden fazla metriği gözden geçirerek elde edilebilir. Bir performans metriği harika görünebilir, ancak başka bir metrikte yanlışlıklar ortaya çıkabilir. Ayrıca, tüm veri kümesi veya kohortlar arasında metrikleri karşılaştırmak, modelin iyi veya kötü performans gösterdiği yerleri aydınlatmaya yardımcı olur. Bu, özellikle modelin hassas ve hassas olmayan özellikler (örneğin, hasta ırkı, cinsiyet veya yaşı) arasında performansını görerek modelin potansiyel adaletsizliğini ortaya çıkarmak için önemlidir. Örneğin, modelin hassas özelliklere sahip bir kohortta daha hatalı olduğunu keşfetmek, modelin potansiyel adaletsizliğini ortaya çıkarabilir.
RAI panosundaki Model Genel Bakış bileşeni, sadece bir kohortta veri temsilinin performans metriklerini analiz etmekle kalmaz, aynı zamanda kullanıcıların modelin davranışını farklı kohortlar arasında karşılaştırma yeteneği sağlar.
![Veri seti kohortları - RAI panosunda model genel bakış](../../../../translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.tr.png)
Bileşenin özellik tabanlı analiz işlevselliği, kullanıcıların belirli bir özellik içinde veri alt gruplarını daraltarak anormallikleri daha ayrıntılı düzeyde belirlemelerini sağlar. Örneğin, pano, kullanıcı tarafından seçilen bir özellik için otomatik olarak kohortlar oluşturma yeteneğine sahiptir (örneğin, *"time_in_hospital < 3"* veya *"time_in_hospital >= 7"*). Bu, kullanıcının daha büyük bir veri grubundan belirli bir özelliği izole etmesine ve bu özelliğin modelin hatalı sonuçlarını yönlendiren önemli bir etken olup olmadığını görmesine olanak tanır.
![Özellik kohortları - RAI panosunda model genel bakış](../../../../translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.tr.png)
Model Genel Bakış bileşeni iki tür farklılık metriğini destekler:
**Model performansındaki farklılık**: Bu metrikler, veri alt grupları arasında seçilen performans metriğinin değerlerindeki farklılığı hesaplar. İşte birkaç örnek:
* Doğruluk oranındaki farklılık
* Hata oranındaki farklılık
* Kesinlikteki farklılık
* Geri çağırmadaki farklılık
* Ortalama mutlak hatadaki (MAE) farklılık
**Seçim oranındaki farklılık**: Bu metrik, veri alt grupları arasında seçim oranındaki (olumlu tahmin) farkı içerir. Bunun bir örneği, kredi onay oranlarındaki farklılıktır. Seçim oranı, her sınıfta 1 olarak sınıflandırılan veri noktalarının oranını (ikili sınıflandırmada) veya tahmin değerlerinin dağılımını (regresyonda) ifade eder.
## Veri Analizi
> "Verileri yeterince uzun süre işkence ederseniz, her şeyi itiraf eder" - Ronald Coase
Bu ifade aşırı gibi görünebilir, ancak verilerin herhangi bir sonucu desteklemek için manipüle edilebileceği doğrudur. Böyle bir manipülasyon bazen istemeden de olabilir. İnsan olarak hepimizin önyargıları vardır ve veriye önyargı eklediğinizde bunu bilinçli olarak fark etmek genellikle zordur. AI ve makine öğreniminde adaleti sağlamak karmaşık bir zorluk olmaya devam etmektedir.
Veri, geleneksel model performans metrikleri için büyük bir kör noktadır. Yüksek doğruluk puanlarına sahip olabilirsiniz, ancak bu her zaman veri kümenizde olabilecek temel veri önyargısını yansıtmaz. Örneğin, bir şirketin yönetici pozisyonlarındaki kadın çalışanların %27'si ve aynı seviyedeki erkeklerin %73'ü olan bir veri kümesi, bu verilere dayalı olarak eğitilmiş bir iş ilanı AI modelinin çoğunlukla üst düzey iş pozisyonları için erkek hedef kitleye yönelik olmasına neden olabilir. Veride bu dengesizlik, modelin tahminini bir cinsiyeti diğerine tercih edecek şekilde eğmiştir. Bu, AI modelinde bir cinsiyet önyargısı olan bir adalet sorunu ortaya çıkarır.
RAI panosundaki Veri Analizi bileşeni, veri kümesinde aşırı ve yetersiz temsili olan alanları belirlemeye yardımcı olur. Kullanıcılara, veri dengesizliklerinden veya belirli bir veri grubunun temsil eksikliğinden kaynaklanan hata ve adalet sorunlarının kök nedenini teşhis etme yeteneği sağlar. Bu, kullanıcıların tahmin edilen ve gerçek sonuçlar, hata grupları ve belirli özelliklere dayalı veri kümelerini görselleştirmelerine olanak tanır. Bazen az temsil edilen bir veri grubunu keşfetmek, modelin iyi öğrenmediğini de ortaya çıkarabilir, bu da yüksek yanlışlıkların nedenidir. Veride önyargı olan bir modelin sadece bir adalet sorunu değil, aynı zamanda kapsayıcı veya güvenilir olmadığını da gösterir.
![RAI Panosunda Veri Analizi bileşeni](../../../../translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.tr.png)
Veri analizini şu durumlarda kullanın:
* Farklı filtreler seçerek veri kümenizi farklı boyutlara (kohortlar olarak da bilinir) dilimleyerek veri kümesi istatistiklerinizi keşfedin.
* Veri kümenizin farklı kohortlar ve özellik grupları genelinde dağılımını anlayın.
* Adalet, hata analizi ve nedensellik ile ilgili bulgularınızın (diğer pano bileşenlerinden türetilmiş) veri kümenizin dağılımının bir sonucu olup olmadığını belirleyin.
* Temsil sorunlarından, etiket gürültüsünden, özellik gürültüsünden, etiket önyargısından ve benzeri faktörlerden kaynaklanan hataları hafifletmek için hangi alanlarda daha fazla veri toplayacağınıza karar verin.
## Model Yorumlanabilirliği
Makine öğrenimi modelleri kara kutular olma eğilimindedir. Bir modelin tahminini yönlendiren anahtar veri özelliklerini anlamak zor olabilir. Bir modelin belirli bir tahminde bulunmasının nedenini açıklamak önemlidir. Örneğin, bir AI sistemi, bir diyabet hastasının 30 gün içinde tekrar hastaneye yatma riski taşıdığını tahmin ederse, bu tahminine yol açan destekleyici verileri sağlayabilmelidir. Destekleyici veri göstergelerine sahip olmak, klinisyenlerin veya hastanelerin iyi bilgilendirilmiş kararlar almasına yardımcı olmak için şeffaflık sağlar. Ayrıca, bir modelin bir birey için neden bir tahminde bulunduğunu açıklayabilmek, sağlık düzenlemeleriyle hesap verebilirlik sağlar. İnsanların hayatlarını etkileyen makine öğrenimi modelleri kullanırken, bir modelin davranışını neyin etkilediğini anlamak ve açıklamak çok önemlidir. Model açıklanabilirliği ve yorumlanabilirliği, aşağıdaki senaryolarda soruları yanıtlamaya yardımcı olur:
* Model hata ayıklama: Modelim neden bu hatayı yaptı? Modelimi nasıl geliştirebilirim?
* İnsan-AI işbirliği: Modelin kararlarını nasıl anlayabilir ve güvenebilirim?
* Düzenleyici uyumluluk: Modelim yasal gereklilikleri karşılıyor mu?
RAI panosundaki Özellik Önemi bileşeni, bir modelin tahminlerini nasıl yaptığını anlamak ve hata ayıklamak için kapsamlı bir anlayış sağlar. Ayrıca, makine öğrenimi profesyonelleri ve karar vericiler için modelin davranışını etkileyen özelliklerin kanıtlarınııklamak ve göstermek için düzenleyici uyumluluk açısından faydalı bir araçtır. Kullanıcılar, hem küresel hem de yerel açıklamaları keşfederek hangi özelliklerin modelin tahminlerini yönlendirdiğini doğrulayabilir. Küresel açıklamalar, modelin genel tahminini etkileyen en önemli özellikleri listeler. Yerel açıklamalar, bir modelin belirli bir vaka için yaptığı tahmini hangi özelliklerin yönlendirdiğini gösterir. Yerel açıklamaları değerlendirme yeteneği, belirli bir vakayı hata ayıklama veya denetleme açısından modelin neden doğru veya yanlış bir tahminde bulunduğunu daha iyi anlamak ve yorumlamak için de faydalıdır.
![RAI panosunda Özellik Önemi bileşeni](../../../../translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.tr.png)
* Küresel açıklamalar: Örneğin, bir diyabet hastanesi tekrar yatış modelinin genel davranışını hangi özellikler etkiliyor?
* Yerel açıklamalar: Örneğin, neden 60 yaş üstü ve önceki hastane yatışları olan bir diyabet hastası, 30 gün içinde tekrar hastaneye yatacağı veya yatmayacağı tahmin edildi?
Modelin performansını farklı kohortlar genelinde inceleme sürecinde, Özellik Önemi, bir özelliğin kohortlar genelinde ne düzeyde etki ettiğini gösterir. Modelin hatalı tahminlerini yönlendiren bir özelliğin etki düzeyini karşılaştırırken anormallikleri ortaya çıkarmaya yardımcı olur. Özellik Önemi bileşeni, bir özelliğin değerlerinin modelin sonucunu olumlu veya olumsuz etkilediğini gösterebilir. Örneğin, bir model yanlış bir tahminde bulunduğunda, bileşen, tahmini yönlendiren özellikleri veya özellik değerlerini belirleme ve inceleme yeteneği sağlar. Bu düzeydeki ayrıntı, sadece hata ayıklamada değil, aynı zamanda denetim durumlarında şeffaflık ve hesap verebilirlik sağlamada da yardımcı olur. Son olarak, bileşen adalet sorunlarını belirlemenize yardımcı olabilir. Örneğin, etnik köken veya cinsiyet gibi hassas bir özellik modelin tahminini yönlendirmede yüksek derecede etkiliyse, bu modelde ırk veya cinsiyet önyargısı olduğunu gösterebilir.
![Özellik önemi](../../../../translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.tr.png)
Yorumlanabilirliği şu durumlarda kullanın:
* AI sisteminizin tahminlerinin ne kadar güvenilir olduğunu, tahminler için hangi özelliklerin en önemli olduğunu anlayarak belirleyin.
* Modelinizi anlamak ve sağlıklı özellikler kullanıp kullanmadığını veya sadece yanlış korelasyonları mı kullandığını belirlemek için modelin hata ayıklamasına yaklaşın.
* Modelin tahminlerini hassas özelliklere veya onlarla yüksek derecede ilişkili özelliklere dayandırıp dayandırmadığını anlayarak potansiyel adaletsizlik kaynaklarını ortaya çıkarın.
* Yerel açıklamalar oluşturarak modelin kararlarını kullanıcılara açıklamak ve güven oluşturmak.
* AI sisteminin düzenleyici bir denetimini tamamlayarak modelleri doğrulamak ve model kararlarının insanlar üzerindeki etkisini izlemek.
## Sonuç
Tüm RAI pano bileşenleri, topluma daha az zarar veren ve daha güvenilir makine öğrenimi modelleri oluşturmanıza yardımcı olan pratik araçlardır. İnsan haklarına yönelik tehditlerin önlenmesini, belirli grupları yaşam fırsatlarından dışlamayı veya fiziksel veya psikolojik yaralanma riskini artırır. Ayrıca, modelinizin kararlarına yerel açıklamalar oluşturarak güven oluşturmanıza yardımcı olur. Potansiyel zararlar şu şekilde sınıflandırılabilir:
- **Tahsis**, örneğin bir cinsiyet veya etnik kökenin diğerine tercih edilmesi.
- **Hizmet kalitesi**. Veriyi belirli bir senaryo için eğitiyorsanız, ancak gerçeklik çok daha karmaşıksa, bu kötü performans gösteren bir hizmete yol açar.
- **Kalıp**. Belirli bir grubu önceden atanmış özelliklerle ilişkilendirme.
- **Aşağılama**. Bir şeyi veya birini haksızca eleştirmek ve etiketlemek.
- **Aşırı veya yetersiz temsil**. Belirli bir grubun belirli bir meslekte görülmediği fikri ve bu durumu teşvik eden herhangi bir hizmet veya işlev zarara katkıda bulunur.
### Azure RAI panosu
[Azure RAI panosu](https://learn.microsoft.com
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi tavsiye edilir. Bu çevirinin kullanılması sonucu oluşabilecek yanlış anlaşılmalar veya yanlış yorumlamalardan sorumlu değiliz.

@ -1,14 +0,0 @@
# Sorumlu Yapay Zeka (RAI) panelini keşfedin
## Talimatlar
Bu derste, veri bilimcilerin hata analizi, veri keşfi, adalet değerlendirmesi, model yorumlanabilirliği, karşıt/what-if değerlendirmeleri ve yapay zeka sistemlerinde nedensel analiz gerçekleştirmelerine yardımcı olmak için "açık kaynak" araçlar üzerine kurulu bir bileşenler paketi olan RAI panelini öğrendiniz. Bu ödev için, RAI panelinin bazı örnek [not defterlerini](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) keşfedin ve bulgularınızı bir makale veya sunumda raporlayın.
## Değerlendirme Ölçütleri
| Kriterler | Mükemmel | Yeterli | Geliştirme Gerekiyor |
| -------- | --------- | -------- | ----------------- |
| | RAI panelinin bileşenlerini, çalıştırılan not defterini ve çalıştırma sonucunda elde edilen sonuçları tartışan bir makale veya PowerPoint sunumu sunulmuştur | Sonuçları içermeyen bir makale sunulmuştur | Hiçbir makale sunulmamıştır |
**Feragatname**:
Bu belge, makine tabanlı AI çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından doğabilecek yanlış anlamalar veya yanlış yorumlamalardan sorumlu değiliz.

@ -1,21 +0,0 @@
# Sonsöz: Klasik makine öğreniminin gerçek dünya uygulamaları
Bu bölümde, klasik ML'in bazı gerçek dünya uygulamalarıyla tanışacaksınız. İnterneti tarayarak bu stratejileri kullanan uygulamalar hakkında makaleler ve raporlar bulduk, mümkün olduğunca sinir ağlarından, derin öğrenmeden ve yapay zekadan kaçındık. ML'in iş sistemlerinde, ekolojik uygulamalarda, finans, sanat ve kültürde nasıl kullanıldığını öğrenin.
![chess](../../../translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.tr.jpg)
> Fotoğraf <a href="https://unsplash.com/@childeye?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Alexis Fauvet</a> tarafından <a href="https://unsplash.com/s/photos/artificial-intelligence?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a> üzerinde
## Ders
1. [ML için Gerçek Dünya Uygulamaları](1-Applications/README.md)
2. [Sorumlu AI kontrol paneli bileşenlerini kullanarak Makine Öğrenimi Modellerini Hata Ayıklama](2-Debugging-ML-Models/README.md)
## Katkıda Bulunanlar
"Gerçek Dünya Uygulamaları" [Jen Looper](https://twitter.com/jenlooper) ve [Ornella Altunyan](https://twitter.com/ornelladotcom) dahil olmak üzere bir ekip tarafından yazılmıştır.
"Sorumlu AI kontrol paneli bileşenlerini kullanarak Makine Öğrenimi Modellerini Hata Ayıklama" [Ruth Yakubu](https://twitter.com/ruthieyakubu) tarafından yazılmıştır.
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilmektedir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,12 +0,0 @@
# Microsoft Açık Kaynak Davranış Kuralları
Bu proje [Microsoft Açık Kaynak Davranış Kuralları](https://opensource.microsoft.com/codeofconduct/) benimsemiştir.
Kaynaklar:
- [Microsoft Açık Kaynak Davranış Kuralları](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Davranış Kuralları SSS](https://opensource.microsoft.com/codeofconduct/faq/)
- Sorularınız veya endişeleriniz için [opencode@microsoft.com](mailto:opencode@microsoft.com) ile iletişime geçin
**Feragatname**:
Bu belge, makine tabanlı AI çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belge kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından doğabilecek yanlış anlamalar veya yanlış yorumlamalardan sorumlu değiliz.

@ -1,14 +0,0 @@
# Katkıda Bulunma
Bu proje katkıları ve önerileri memnuniyetle karşılar. Çoğu katkı, bir Katılımcı Lisans Anlaşması'nı (CLA) kabul etmenizi gerektirir; bu, katkınızı kullanma haklarına sahip olduğunuzu ve bu hakları bize gerçekten verdiğinizi beyan eder. Ayrıntılar için https://cla.microsoft.com adresini ziyaret edin.
> Önemli: Bu depodaki metinleri çevirirken, lütfen makine çevirisi kullanmadığınızdan emin olun. Çevirileri topluluk aracılığıyla doğrulayacağız, bu nedenle yalnızca yetkin olduğunuz dillerde çeviri yapmak için gönüllü olun.
Bir pull request gönderdiğinizde, bir CLA-bot otomatik olarak bir CLA sağlamanız gerekip gerekmediğini belirleyecek ve PR'yi uygun şekilde süsleyecektir (örneğin, etiket, yorum). Bot tarafından sağlanan talimatları basitçe takip edin. Tüm depolarımızda CLA kullanarak bunu sadece bir kez yapmanız gerekecek.
Bu proje [Microsoft Açık Kaynak Davranış Kuralları](https://opensource.microsoft.com/codeofconduct/)'nı benimsemiştir.
Daha fazla bilgi için [Davranış Kuralları SSS](https://opensource.microsoft.com/codeofconduct/faq/) sayfasına bakabilir
veya ek sorularınız ya da yorumlarınız için [opencode@microsoft.com](mailto:opencode@microsoft.com) ile iletişime geçebilirsiniz.
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,155 +0,0 @@
[![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/)
[![](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://discord.gg/zxKYvhSnVp?WT.mc_id=academic-000002-leestott)
# Başlangıç Seviyesi İçin Makine Öğrenimi - Bir Müfredat
> 🌍 Dünya kültürleri aracılığıyla Makine Öğrenimini keşfederken dünyayı dolaşın 🌍
Microsoft'taki Bulut Savunucuları olarak, tamamen **Makine Öğrenimi** üzerine 12 haftalık, 26 derslik bir müfredat sunmaktan mutluluk duyuyoruz. Bu müfredatta, genellikle **klasik makine öğrenimi** olarak adlandırılan konuları öğreneceksiniz, ağırlıklı olarak Scikit-learn kütüphanesini kullanarak ve derin öğrenmeyi atlayarak, ki bu konu [Başlangıç Seviyesi İçin AI Müfredatımızda](https://aka.ms/ai4beginners) ele alınmaktadır. Bu dersleri, ['Başlangıç Seviyesi İçin Veri Bilimi' müfredatımızla](https://aka.ms/ds4beginners) birleştirin!
Klasik teknikleri dünyanın farklı bölgelerinden veriler üzerinde uygularken bizimle birlikte dünyayı dolaşın. Her ders, ders öncesi ve sonrası sınavları, dersi tamamlama talimatlarını, bir çözümü, bir ödevi ve daha fazlasını içerir. Proje tabanlı pedagojimiz, yeni becerilerin 'kalıcı' olmasını sağlayan, öğrenirken inşa etmenizi sağlayan kanıtlanmış bir yoldur.
**✍️ Yazarlarımıza içten teşekkürler** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu ve Amy Boyd
**🎨 İllüstratörlerimize teşekkürler** Tomomi Imura, Dasani Madipalli ve Jen Looper
**🙏 Microsoft Öğrenci Elçileri yazarlarımıza, gözden geçirenlerimize ve içerik katkıda bulunanlarımıza özel teşekkürler**, özellikle Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila ve Snigdha Agarwal
**🤩 R derslerimiz için Microsoft Öğrenci Elçileri Eric Wanjau, Jasleen Sondhi ve Vidushi Gupta'ya ekstra teşekkürler!**
# Başlarken
Aşağıdaki adımları izleyin:
1. **Depoyu Çatallayın**: Bu sayfanın sağ üst köşesindeki "Fork" düğmesine tıklayın.
2. **Depoyu Klonlayın**: `git clone https://github.com/microsoft/ML-For-Beginners.git`
> [Bu kurs için ek kaynakların tümünü Microsoft Learn koleksiyonumuzda bulun](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
**[Öğrenciler](https://aka.ms/student-page)**, bu müfredatı kullanmak için, tüm repo'yu kendi GitHub hesabınıza çatallayın ve alıştırmaları kendi başınıza veya bir grup ile tamamlayın:
- Ders öncesi sınavla başlayın.
- Dersi okuyun ve her bilgi kontrolünde durup düşünerek etkinlikleri tamamlayın.
- Çözüm kodunu çalıştırmak yerine dersleri anlayarak projeleri oluşturmaya çalışın; ancak bu kod her proje odaklı derste `/solution` klasörlerinde mevcuttur.
- Ders sonrası sınavı yapı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) ziyaret edin ve uygun PAT rubriğini doldurarak "yüksek sesle öğrenin". Bir 'PAT', öğrenmenizi daha da ilerletmek için doldurduğunuz bir rubriktir. Ayrıca diğer PAT'lere de tepki verebilirsiniz, böylece birlikte öğrenebiliriz.
> Daha fazla çalışma için, bu [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) modüllerini ve öğrenme yollarını takip etmenizi öneririz.
**Öğretmenler**, bu müfredatı nasıl kullanacağınıza dair [bazı öneriler ekledik](for-teachers.md).
---
## Video Yürüyüşleri
Bazı dersler kısa video formatında mevcuttur. Tüm bu videoları derslerin içinde veya [Microsoft Developer YouTube kanalındaki Başlangıç Seviyesi İçin ML oynatma listesinde](https://aka.ms/ml-beginners-videos) bulabilirsiniz, aşağıdaki resme tıklayarak.
[![Başlangıç seviyesi için ML banner](../../translated_images/ml-for-beginners-video-banner.279f2a268d2130758668f4044f8c252d42f7c0a141c2cb56294c1ccc157cdd1c.tr.png)](https://aka.ms/ml-beginners-videos)
---
## Ekibi Tanıyın
[![Tanıtım videosu](../../ml.gif)](https://youtu.be/Tj1XWrDSYJU "Tanıtım videosu")
**Gif by** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal)
> 🎥 Proje ve projeyi oluşturan kişiler hakkında bir video için yukarıdaki resme tıklayın!
---
## Pedagoji
Bu müfredatı oluştururken iki pedagojik ilkeyi seçtik: elverişli ve **proje tabanlı** olmasını ve **sık sınavlar** içermesini sağlamak. Ayrıca, bu müfredatın uyumlu bir **temaya** sahip olmasını sağladık.
İçeriğin projelerle uyumlu olmasını sağlayarak, süreç öğrenciler için daha ilgi çekici hale gelir ve kavramların kalıcılığı artırılır. Ayrıca, bir ders öncesinde düşük riskli bir sınav, öğrencinin bir konuyu öğrenmeye yönelik niyetini belirlerken, ders sonrası ikinci bir sınav daha fazla kalıcılığı sağlar. Bu müfredat esnek ve eğlenceli olacak şekilde tasarlanmıştır ve tamamı veya kısmen alınabilir. Projeler küçük başlar ve 12 haftalık döngünün sonunda giderek daha karmaşık hale gelir. Bu müfredat ayrıca, ekstra kredi veya tartışma temeli olarak kullanılabilecek ML'nin gerçek dünya uygulamaları üzerine bir ek içerir.
> [Davranış Kuralları](CODE_OF_CONDUCT.md), [Katkıda Bulunma](CONTRIBUTING.md) ve [Çeviri](TRANSLATIONS.md) yönergelerimizi bulun. Yapıcı geri bildiriminizi bekliyoruz!
## Her Ders İçerir
- isteğe bağlı sketchnote
- isteğe bağlı ek video
- video yürüyüşü (bazı derslerde)
- ders öncesi ısınma sınavı
- yazılı ders
- proje tabanlı dersler için, projeyi nasıl oluşturacağınızla ilgili adım adım kılavuzlar
- bilgi kontrolleri
- bir meydan okuma
- ek okuma
- ödev
- ders sonrası sınav
> **Diller hakkında bir not**: Bu dersler öncelikle Python ile yazılmıştır, ancak birçoğu R dilinde de mevcuttur. Bir R dersini tamamlamak için `/solution` klasörüne gidin ve R derslerini arayın. Bu dersler, bir **R Markdown** dosyasını temsil eden .rmd uzantısına sahiptir ve bu dosya, `code chunks` (R veya diğer dillerin) ve `YAML header` (PDF gibi çıktıları nasıl biçimlendireceğinizi yönlendiren) bir `Markdown document` içinde yerleştirilmiş bir şekilde basitçe tanımlanabilir. Bu nedenle, veri bilimi için örnek bir yazım çerçevesi olarak hizmet eder, çünkü kodunuzu, çıktısını ve düşüncelerinizi birleştirmenize olanak tanır ve bunları Markdown ile yazmanıza olanak tanır. Ayrıca, R Markdown belgeleri PDF, HTML veya Word gibi çıktı formatlarına dönüştürülebilir.
> **Sınavlar hakkında bir not**: Tüm sınavlar [Quiz App klasöründe](../../quiz-app) yer alır, her biri üç sorudan oluşan toplam 52 sınav. Derslerden bağlantılıdır, ancak quiz uygulaması yerel olarak çalıştırılabilir; yerel olarak barındırmak veya Azure'a dağıtmak için `quiz-app` klasöründeki talimatları izleyin.
| Ders Numarası | Konu | Ders Grubu | Öğrenme Hedefleri | Bağlantılı Ders | Yazar |
| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: |
| 01 | Makine öğrenimine giriş | [Giriş](1-Introduction/README.md) | Makine öğrenimi ile ilgili temel kavramları öğrenin | [Ders](1-Introduction/1-intro-to-ML/README.md) | Muhammad |
| 02 | Makine öğreniminin tarihi | [Giriş](1-Introduction/README.md) | Bu alanın altındaki tarihi öğrenin | [Ders](1-Introduction/2-history-of-ML/README.md) | Jen ve Amy |
| 03 | Adalet ve makine öğrenimi | [Giriş](1-Introduction/README.md) | Öğrencilerin ML modellerini oluştururken ve uygularken dikkate alması gereken önemli felsefi konular nelerdir? | [Ders](1-Introduction/3-fairness/README.md) | Tomomi |
| 04 | Makine öğrenimi teknikleri | [Introduction](1-Introduction/README.md) | ML araştırmacıları ML modelleri oluşturmak için hangi teknikleri kullanıyor? | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | Chris ve Jen |
| 05 | Regresyona giriş | [Regression](2-Regression/README.md) | Regresyon modelleri için Python ve Scikit-learn ile başlayın | <ul><li>[Python](2-Regression/1-Tools/README.md)</li><li>[R](../../2-Regression/1-Tools/solution/R/lesson_1.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 06 | Kuzey Amerika kabak fiyatları 🎃 | [Regression](2-Regression/README.md) | ML için hazırlık olarak verileri görselleştirin ve temizleyin | <ul><li>[Python](2-Regression/2-Data/README.md)</li><li>[R](../../2-Regression/2-Data/solution/R/lesson_2.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 07 | Kuzey Amerika kabak fiyatları 🎃 | [Regression](2-Regression/README.md) | Doğrusal ve polinom regresyon modelleri oluşturun | <ul><li>[Python](2-Regression/3-Linear/README.md)</li><li>[R](../../2-Regression/3-Linear/solution/R/lesson_3.html)</li></ul> | <ul><li>Jen ve Dmitry</li><li>Eric Wanjau</li></ul> |
| 08 | Kuzey Amerika kabak fiyatları 🎃 | [Regression](2-Regression/README.md) | Lojistik regresyon modeli oluşturun | <ul><li>[Python](2-Regression/4-Logistic/README.md) </li><li>[R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 09 | Bir Web Uygulaması 🔌 | [Web App](3-Web-App/README.md) | Eğittiğiniz modeli kullanmak için bir web uygulaması oluşturun | [Python](3-Web-App/1-Web-App/README.md) | Jen |
| 10 | Sınıflandırmaya giriş | [Classification](4-Classification/README.md) | Verilerinizi temizleyin, hazırlayın ve görselleştirin; sınıflandırmaya giriş | <ul><li> [Python](4-Classification/1-Introduction/README.md) </li><li>[R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) | <ul><li>Jen ve Cassie</li><li>Eric Wanjau</li></ul> |
| 11 | Lezzetli Asya ve Hint mutfakları 🍜 | [Classification](4-Classification/README.md) | Sınıflandırıcılarla tanışın | <ul><li> [Python](4-Classification/2-Classifiers-1/README.md)</li><li>[R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) | <ul><li>Jen ve Cassie</li><li>Eric Wanjau</li></ul> |
| 12 | Lezzetli Asya ve Hint mutfakları 🍜 | [Classification](4-Classification/README.md) | Daha fazla sınıflandırıcı | <ul><li> [Python](4-Classification/3-Classifiers-2/README.md)</li><li>[R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) | <ul><li>Jen ve Cassie</li><li>Eric Wanjau</li></ul> |
| 13 | Lezzetli Asya ve Hint mutfakları 🍜 | [Classification](4-Classification/README.md) | Modelinizi kullanarak bir öneri web uygulaması oluşturun | [Python](4-Classification/4-Applied/README.md) | Jen |
| 14 | Kümelemeye giriş | [Clustering](5-Clustering/README.md) | Verilerinizi temizleyin, hazırlayın ve görselleştirin; kümelemeye giriş | <ul><li> [Python](5-Clustering/1-Visualize/README.md)</li><li>[R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 15 | Nijeryalı Müzik Zevklerini Keşfetmek 🎧 | [Clustering](5-Clustering/README.md) | K-Means kümeleme yöntemini keşfedin | <ul><li> [Python](5-Clustering/2-K-Means/README.md)</li><li>[R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 16 | Doğal Dil İşlemeye Giriş ☕️ | [Natural language processing](6-NLP/README.md) | Basit bir bot oluşturarak NLP hakkında temel bilgileri öğrenin | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen |
| 17 | Yaygın NLP Görevleri ☕️ | [Natural language processing](6-NLP/README.md) | Dil yapılarıyla uğraşırken gerekli olan yaygın görevleri anlayarak NLP bilginizi derinleştirin | [Python](6-NLP/2-Tasks/README.md) | Stephen |
| 18 | Çeviri ve Duygu Analizi ♥️ | [Natural language processing](6-NLP/README.md) | Jane Austen ile çeviri ve duygu analizi | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen |
| 19 | Avrupa'nın Romantik Otelleri ♥️ | [Natural language processing](6-NLP/README.md) | Otel yorumlarıyla duygu analizi 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen |
| 20 | Avrupa'nın Romantik Otelleri ♥️ | [Natural language processing](6-NLP/README.md) | Otel yorumlarıyla duygu analizi 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen |
| 21 | Zaman Serisi Tahminine Giriş | [Time series](7-TimeSeries/README.md) | Zaman serisi tahminine giriş | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca |
| 22 | ⚡️ Dünya Güç Kullanımı ⚡️ - ARIMA ile zaman serisi tahmini | [Time series](7-TimeSeries/README.md) | ARIMA ile zaman serisi tahmini | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca |
| 23 | ⚡️ Dünya Güç Kullanımı ⚡️ - SVR ile zaman serisi tahmini | [Time series](7-TimeSeries/README.md) | Destek Vektör Regresörü ile zaman serisi tahmini | [Python](7-TimeSeries/3-SVR/README.md) | Anirban |
| 24 | Pekiştirmeli Öğrenmeye Giriş | [Reinforcement learning](8-Reinforcement/README.md) | Q-Learning ile pekiştirmeli öğrenmeye giriş | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry |
| 25 | Peter'ın kurttan kaçmasına yardım edin! 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | Pekiştirmeli öğrenme Gym | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry |
| Postscript | Gerçek Dünya ML Senaryoları ve Uygulamaları | [ML in the Wild](9-Real-World/README.md) | Klasik ML'nin ilginç ve açıklayıcı gerçek dünya uygulamaları | [Lesson](9-Real-World/1-Applications/README.md) | Team |
| Postscript | RAI gösterge tablosunu kullanarak ML'de Model Hatalarını Ayıklama | [ML in the Wild](9-Real-World/README.md) | Sorumlu AI gösterge tablosu bileşenlerini kullanarak Makine Öğreniminde Model Hatalarını Ayıklama | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu |
> [bu kurs için tüm ek kaynakları Microsoft Learn koleksiyonumuzda bulun](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
## Çevrimdışı erişim
Bu dokümantasyonu [Docsify](https://docsify.js.org/#/) kullanarak çevrimdışı çalıştırabilirsiniz. Bu repoyu fork'layın, [Docsify'i yükleyin](https://docsify.js.org/#/quickstart) yerel makinenize ve ardından bu reponun kök klasöründe `docsify serve` yazın. Web sitesi localhost'unuzda 3000 portunda sunulacaktır: `localhost:3000`.
## PDF'ler
Müfredatın PDF dosyasını bağlantılarla [buradan](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf) bulabilirsiniz.
## Yardım İstendi
Bir çeviri katkısında bulunmak ister misiniz? Lütfen [çeviri yönergelerimizi](TRANSLATIONS.md) okuyun ve iş yükünü yönetmek için şablonlu bir sorun ekleyin [buradan](https://github.com/microsoft/ML-For-Beginners/issues).
## Diğer Müfredatlar
Ekibimiz başka müfredatlar da üretiyor! Göz atın:
- [AI for Beginners](https://aka.ms/ai4beginners)
- [Data Science for Beginners](https://aka.ms/datascience-beginners)
- [**Yeni Sürüm 2.0** - Generative AI for Beginners](https://aka.ms/genai-beginners)
- [**YENİ** Cybersecurity for Beginners](https://github.com/microsoft/Security-101??WT.mc_id=academic-96948-sayoung)
- [Web Dev for Beginners](https://aka.ms/webdev-beginners)
- [IoT for Beginners](https://aka.ms/iot-beginners)
- [Machine Learning for Beginners](https://aka.ms/ml4beginners)
- [XR Development for Beginners](https://aka.ms/xr-dev-for-beginners)
- [Mastering GitHub Copilot for AI Paired Programming](https://aka.ms/GitHubCopilotAI)
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilmektedir. Bu çevirinin kullanımından kaynaklanan yanlış anlama veya yanlış yorumlamalardan sorumlu değiliz.

@ -1,40 +0,0 @@
## Güvenlik
Microsoft, yazılım ürünlerimizin ve hizmetlerimizin güvenliğini ciddiye alır. Bu, [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) ve [GitHub organizasyonlarımız](https://opensource.microsoft.com/) dahil olmak üzere GitHub organizasyonlarımız aracılığıyla yönetilen tüm kaynak kodu depolarını içerir.
Eğer Microsoft'a ait herhangi bir depoda [Microsoft'un güvenlik açığı tanımına](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott) uyan bir güvenlik açığı bulduğunuzu düşünüyorsanız, lütfen aşağıda açıklandığı gibi bildirin.
## Güvenlik Sorunlarını Bildirme
**Lütfen güvenlik açıklarını GitHub'daki genel sorunlar üzerinden bildirmeyin.**
Bunun yerine, Microsoft Güvenlik Yanıt Merkezi'ne (MSRC) [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report) adresinden bildirin.
Giriş yapmadan bildirmeyi tercih ediyorsanız, [secure@microsoft.com](mailto:secure@microsoft.com) adresine e-posta gönderin. Mümkünse, mesajınızı PGP anahtarımızla şifreleyin; lütfen [Microsoft Güvenlik Yanıt Merkezi PGP Anahtar sayfasından](https://www.microsoft.com/en-us/msrc/pgp-key-msrc) indirin.
24 saat içinde bir yanıt almanız gerekir. Herhangi bir nedenle almazsanız, orijinal mesajınızı aldığımızdan emin olmak için e-posta ile takip edin. Ek bilgiye [microsoft.com/msrc](https://www.microsoft.com/msrc) adresinden ulaşabilirsiniz.
Lütfen aşağıda listelenen bilgileri (sağlayabildiğiniz kadarını) ekleyin, bu olası sorunun doğasını ve kapsamını daha iyi anlamamıza yardımcı olacaktır:
* Sorunun türü (ör. buffer overflow, SQL injection, cross-site scripting, vb.)
* Sorunun ortaya çıkmasına ilişkin kaynak dosyaların tam yolları
* Etkilenen kaynak kodunun konumu (etiket/şube/commit veya doğrudan URL)
* Sorunu yeniden oluşturmak için gereken özel yapılandırma
* Sorunu yeniden oluşturmak için adım adım talimatlar
* Kanıt niteliğinde konsept veya exploit kodu (mümkünse)
* Sorunun etkisi, bir saldırganın sorunu nasıl kullanabileceği dahil
Bu bilgiler, raporunuzu daha hızlı değerlendirmemize yardımcı olacaktır.
Bir hata ödül programı için rapor veriyorsanız, daha eksiksiz raporlar daha yüksek ödül kazanımına katkıda bulunabilir. Aktif programlarımız hakkında daha fazla bilgi için [Microsoft Hata Ödül Programı](https://microsoft.com/msrc/bounty) sayfamızı ziyaret edin.
## Tercih Edilen Diller
Tüm iletişimlerin İngilizce olmasını tercih ediyoruz.
## Politika
Microsoft, [Koordine Edilmiş Güvenlik Açığııklaması](https://www.microsoft.com/en-us/msrc/cvd) ilkesini takip eder.
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,13 +0,0 @@
# Destek
## Sorun bildirme ve yardım alma
Bu proje, hataları ve özellik isteklerini takip etmek için GitHub Issues kullanır. Yeni bir sorun bildirmeden önce, mevcut sorunları arayarak tekrarları önleyin. Yeni sorunlar için, hatanızı veya özellik isteğinizi yeni bir Sorun olarak bildirin.
Bu projeyi kullanma konusunda yardım ve sorular için bir sorun bildirin.
## Microsoft Destek Politikası
Bu depo için destek, yukarıda listelenen kaynaklarla sınırlıdır.
**Feragatname**:
Bu belge, makine tabanlı AI çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğa özen göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,37 +0,0 @@
# Dersleri Çevirerek Katkıda Bulunun
Bu müfredattaki derslerin çevirilerine açığız!
## Yönergeler
Her ders klasöründe ve ders tanıtım klasöründe, çevrilmiş markdown dosyalarını içeren klasörler bulunmaktadır.
> Not: Lütfen kod örnek dosyalarındaki hiçbir kodu çevirmeyin; çevirmeniz gereken tek şey README, ödevler ve testlerdir. Teşekkürler!
Çevrilmiş dosyalar şu adlandırma kuralını izlemelidir:
**README._[dil]_.md**
burada _[dil]_ ISO 639-1 standardına göre iki harfli dil kısaltmasıdır (örneğin, İspanyolca için `README.es.md` ve Hollandaca için `README.nl.md`).
**assignment._[dil]_.md**
Readme'ler gibi, lütfen ödevleri de çevirin.
> Önemli: Bu depodaki metinleri çevirirken, lütfen makine çevirisi kullanmadığınızdan emin olun. Çevirileri topluluk aracılığıyla doğrulayacağız, bu nedenle yalnızca yetkin olduğunuz dillerde çeviri için gönüllü olun.
**Testler**
1. Çevirinizi quiz-app'e eklemek için buraya bir dosya ekleyin: https://github.com/microsoft/ML-For-Beginners/tree/main/quiz-app/src/assets/translations, uygun adlandırma kuralı ile (en.json, fr.json). **Ancak 'true' veya 'false' kelimelerini yerelleştirmeyin. Teşekkürler!**
2. Dil kodunuzu quiz-app'in App.vue dosyasındaki açılır menüye ekleyin.
3. Quiz-app'in [translations index.js dosyasını](https://github.com/microsoft/ML-For-Beginners/blob/main/quiz-app/src/assets/translations/index.js) dilinizi eklemek için düzenleyin.
4. Son olarak, çevirdiğiniz README.md dosyalarındaki TÜM test bağlantılarını doğrudan çevirdiğiniz teste yönlendirecek şekilde düzenleyin: https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1 şu şekilde olur https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1?loc=id
**TEŞEKKÜRLER**
Çabalarınızı gerçekten takdir ediyoruz!
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,46 +0,0 @@
- Giriş
- [Makine Öğrenimine Giriş](../1-Introduction/1-intro-to-ML/README.md)
- [Makine Öğreniminin Tarihi](../1-Introduction/2-history-of-ML/README.md)
- [ML ve Adalet](../1-Introduction/3-fairness/README.md)
- [ML Teknikleri](../1-Introduction/4-techniques-of-ML/README.md)
- Regresyon
- [Araçlar](../2-Regression/1-Tools/README.md)
- [Veri](../2-Regression/2-Data/README.md)
- [Doğrusal Regresyon](../2-Regression/3-Linear/README.md)
- [Lojistik Regresyon](../2-Regression/4-Logistic/README.md)
- Web Uygulaması Oluşturma
- [Web Uygulaması](../3-Web-App/1-Web-App/README.md)
- Sınıflandırma
- [Sınıflandırmaya Giriş](../4-Classification/1-Introduction/README.md)
- [Sınıflandırıcılar 1](../4-Classification/2-Classifiers-1/README.md)
- [Sınıflandırıcılar 2](../4-Classification/3-Classifiers-2/README.md)
- [Uygulamalı ML](../4-Classification/4-Applied/README.md)
- Kümeleme
- [Verilerinizi Görselleştirin](../5-Clustering/1-Visualize/README.md)
- [K-Means](../5-Clustering/2-K-Means/README.md)
- NLP
- [NLP'ye Giriş](../6-NLP/1-Introduction-to-NLP/README.md)
- [NLP Görevleri](../6-NLP/2-Tasks/README.md)
- [Çeviri ve Duygu Analizi](../6-NLP/3-Translation-Sentiment/README.md)
- [Otel Yorumları 1](../6-NLP/4-Hotel-Reviews-1/README.md)
- [Otel Yorumları 2](../6-NLP/5-Hotel-Reviews-2/README.md)
- Zaman Serisi Tahmini
- [Zaman Serisi Tahminine Giriş](../7-TimeSeries/1-Introduction/README.md)
- [ARIMA](../7-TimeSeries/2-ARIMA/README.md)
- [SVR](../7-TimeSeries/3-SVR/README.md)
- Pekiştirmeli Öğrenme
- [Q-Learning](../8-Reinforcement/1-QLearning/README.md)
- [Gym](../8-Reinforcement/2-Gym/README.md)
- Gerçek Dünya ML
- [Uygulamalar](../9-Real-World/1-Applications/README.md)
**Feragatname**:
Bu belge, makine tabanlı AI çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belgenin kendi dilindeki hali yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,26 +0,0 @@
## Eğitimciler İçin
Bu müfredatı sınıfınızda kullanmak ister misiniz? Lütfen çekinmeden kullanın!
Aslında, GitHub Classroom kullanarak GitHub üzerinde de kullanabilirsiniz.
Bunu yapmak için, bu repoyu forklayın. Her ders için bir repo oluşturmanız gerekecek, bu yüzden her klasörü ayrı bir repoya çıkarmanız gerekecek. Bu şekilde, [GitHub Classroom](https://classroom.github.com/classrooms) her dersi ayrı ayrı alabilir.
Bu [tam talimatlar](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) sınıfınızı nasıl kuracağınız konusunda size bir fikir verecektir.
## Repoyu olduğu gibi kullanmak
Eğer GitHub Classroom kullanmadan bu repoyu olduğu gibi kullanmak isterseniz, bu da mümkündür. Öğrencilerinizle birlikte hangi dersi işleyeceğinizi iletişim kurmanız gerekecek.
Çevrimiçi bir formatta (Zoom, Teams veya diğerleri) sınavlar için breakout odaları oluşturabilir ve öğrencilerin öğrenmeye hazır olmalarına yardımcı olmak için mentorluk yapabilirsiniz. Ardından öğrencileri sınavlara davet edin ve belirli bir zamanda cevaplarını 'issues' olarak göndermelerini isteyin. Eğer öğrencilerin açıkta işbirliği yapmalarını isterseniz, ödevler için de aynı şeyi yapabilirsiniz.
Daha özel bir formatı tercih ederseniz, öğrencilerinizden müfredatı, ders ders kendi GitHub repolarına özel repo olarak forklamalarını ve size erişim vermelerini isteyin. Ardından sınavları ve ödevleri özel olarak tamamlayabilir ve size sınıf repounuzdaki issues üzerinden gönderebilirler.
Çevrimiçi sınıf formatında bu işi yapmanın birçok yolu vardır. Lütfen sizin için en iyi neyin çalıştığını bize bildirin!
## Lütfen düşüncelerinizi bizimle paylaşın!
Bu müfredatın sizin ve öğrencileriniz için işe yaramasını istiyoruz. Lütfen bize [geri bildirim](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u) verin.
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dilindeki hali, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlaşılmalar veya yanlış yorumlamalardan sorumlu değiliz.

@ -1,115 +0,0 @@
# Quizler
Bu quizler, https://aka.ms/ml-beginners adresindeki ML müfredatının ders öncesi ve sonrası quizleridir.
## Proje Kurulumu
```
npm install
```
### Geliştirme için derler ve sıcak yükler
```
npm run serve
```
### Üretim için derler ve küçültür
```
npm run build
```
### Dosyaları kontrol eder ve düzeltir
```
npm run lint
```
### Yapılandırmayı Özelleştir
[Configuration Reference](https://cli.vuejs.org/config/) adresine bakın.
Teşekkürler: Bu quiz uygulamasının orijinal versiyonuna teşekkürler: https://github.com/arpan45/simple-quiz-vue
## Azure'a Dağıtım
Başlamanıza yardımcı olacak adım adım bir rehber:
1. Bir GitHub Deposunu Çatallayın
Statik web uygulamanızın kodunun GitHub deponuzda olduğundan emin olun. Bu depoyu çatallayın.
2. Bir Azure Statik Web Uygulaması Oluşturun
- [Azure hesabı](http://azure.microsoft.com) oluşturun
- [Azure portalına](https://portal.azure.com) gidin
- "Kaynak oluştur" seçeneğine tıklayın ve "Statik Web Uygulaması" arayın.
- "Oluştur" butonuna tıklayın.
3. Statik Web Uygulamasını Yapılandırın
- Temel Bilgiler: Abonelik: Azure aboneliğinizi seçin.
- Kaynak Grubu: Yeni bir kaynak grubu oluşturun veya mevcut birini kullanın.
- Ad: Statik web uygulamanız için bir ad girin.
- Bölge: Kullanıcılarınıza en yakın bölgeyi seçin.
- #### Dağıtım Detayları:
- Kaynak: "GitHub"ı seçin.
- GitHub Hesabı: Azure'un GitHub hesabınıza erişmesine izin verin.
- Organizasyon: GitHub organizasyonunuzu seçin.
- Depo: Statik web uygulamanızı içeren depoyu seçin.
- Dal: Hangi daldan dağıtım yapacağınızı seçin.
- #### Yapı Detayları:
- Yapı Ön Ayarları: Uygulamanızın hangi çerçeve ile oluşturulduğunu seçin (örneğin, React, Angular, Vue, vb.).
- Uygulama Konumu: Uygulama kodunuzu içeren klasörü belirtin (örneğin, kökteyse /).
- API Konumu: Bir API'niz varsa, konumunu belirtin (isteğe bağlı).
- Çıktı Konumu: Yapı çıktısının oluşturulduğu klasörü belirtin (örneğin, build veya dist).
4. Gözden Geçirin ve Oluşturun
Ayarlarınızı gözden geçirin ve "Oluştur" butonuna tıklayın. Azure gerekli kaynakları ayarlayacak ve deponuza bir GitHub Actions iş akışı oluşturacaktır.
5. GitHub Actions İş Akışı
Azure, deponuzda otomatik olarak bir GitHub Actions iş akışı dosyası oluşturacaktır (.github/workflows/azure-static-web-apps-<name>.yml). Bu iş akışı yapı ve dağıtım sürecini yönetecektir.
6. Dağıtımı İzleyin
GitHub deponuzdaki "Actions" sekmesine gidin.
Bir iş akışının çalıştığını görmelisiniz. Bu iş akışı, statik web uygulamanızı Azure'a yapılandıracak ve dağıtacaktır.
İş akışı tamamlandığında, uygulamanız sağlanan Azure URL'sinde canlı olacaktır.
### Örnek İş Akışı Dosyası
İşte GitHub Actions iş akışı dosyasının nasıl görünebileceğine dair bir örnek:
name: Azure Static Web Apps CI/CD
```
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
jobs:
build_and_deploy_job:
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v2
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
action: "upload"
app_location: "/quiz-app" # App source code path
api_location: ""API source code path optional
output_location: "dist" #Built app content directory - optional
```
### Ek Kaynaklar
- [Azure Statik Web Uygulamaları Dokümantasyonu](https://learn.microsoft.com/azure/static-web-apps/getting-started)
- [GitHub Actions Dokümantasyonu](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app)
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal diliyle yazılmış hali, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,278 +0,0 @@
Attribution-ShareAlike 4.0 Uluslararası
=======================================================================
Creative Commons Corporation ("Creative Commons") bir hukuk firması değildir ve
hukuki hizmet veya danışmanlık sağlamaz. Creative Commons kamu lisanslarının
dağıtılması, avukat-müvekkil veya başka bir ilişki yaratmaz. Creative Commons,
lisanslarını ve ilgili bilgileri "olduğu gibi" sunar. Creative Commons,
lisansları, bu lisanslar altında lisanslanan herhangi bir materyal veya ilgili
bilgiler hakkında hiçbir garanti vermez. Creative Commons, kullanımlarından
kaynaklanan zararlardan sorumluluğunu mümkün olan en geniş ölçüde reddeder.
Creative Commons Kamu Lisanslarının Kullanımı
Creative Commons kamu lisansları, yazarların ve diğer hak sahiplerinin telif
hakkı ve aşağıda belirtilen belirli diğer haklara tabi orijinal eserleri ve
diğer materyalleri paylaşmak için kullanabileceği standart bir terim ve
koşul seti sağlar. Aşağıdaki hususlar yalnızca bilgilendirme amaçlıdır,
kapsamlı değildir ve lisanslarımızın bir parçasını oluşturmaz.
Lisans verenler için hususlar: Kamu lisanslarımız,
telif hakkı ve belirli diğer haklar tarafından kısıtlanmış materyalin
kamu tarafından kullanılmasına izin vermek için yetkilendirilmiş
kişiler tarafından kullanılmak üzere tasarlanmıştır. Lisanslarımız
geri alınamaz. Lisans verenler, bir lisansı uygulamadan önce seçtikleri
lisansın şartlarını ve koşullarını okumalı ve anlamalıdır. Lisans verenler,
lisanslarımızı uygulamadan önce tüm gerekli hakları güvence altına almalıdır,
böylece kamu beklenildiği gibi materyali yeniden kullanabilir. Lisans verenler,
lisansa tabi olmayan herhangi bir materyali açıkça işaretlemelidir. Bu,
diğer CC lisanslı materyalleri veya telif hakkı istisnası veya sınırlaması
altında kullanılan materyalleri içerir. Lisans verenler için daha fazla husus:
wiki.creativecommons.org/Considerations_for_licensors
Kamu için hususlar: Kamu lisanslarımızdan birini kullanarak,
lisans veren, lisanslı materyali belirli terim ve koşullar altında
kullanma izni verir. Lisans verenin izni herhangi bir nedenle gerekli
değilse - örneğin, geçerli bir istisna veya telif hakkı sınırlaması nedeniyle -
bu kullanım lisans tarafından düzenlenmez. Lisanslarımız yalnızca telif hakkı
ve lisans verenin yetki verdiği belirli diğer haklar altında izin verir.
Lisanslı materyalin kullanımı, başkalarının materyalde telif hakkı veya
diğer haklara sahip olması gibi diğer nedenlerle hala kısıtlanabilir.
Lisans veren, tüm değişikliklerin işaretlenmesi veya tanımlanması gibi
özel taleplerde bulunabilir. Lisanslarımız tarafından zorunlu kılınmamakla
birlikte, bu taleplere makul olduğu sürece saygı göstermeniz teşvik edilir.
Kamu için daha fazla husus:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-ShareAlike 4.0 Uluslararası Kamu Lisansı
Lisanslı Hakları (aşağıda tanımlanmıştır) kullanarak, bu Creative Commons
Attribution-ShareAlike 4.0 Uluslararası Kamu Lisansı ("Kamu Lisansı")
şart ve koşullarına bağlı olmayı kabul edersiniz. Bu Kamu Lisansı bir
sözleşme olarak yorumlanabiliyorsa, bu şart ve koşulları kabul etmeniz
karşılığında Lisanslı Haklar size verilir ve Lisans veren, Lisanslı
Materyali bu şartlar ve koşullar altında sunmanın getirdiği faydalar
karşılığında size bu hakları verir.
Bölüm 1 -- Tanımlar.
a. Uyarlanmış Materyal, Lisans Verenin elinde bulundurduğu Telif Hakkı
ve Benzer Haklar kapsamında izin gerektiren bir şekilde Lisanslı
Materyal'den türetilen veya buna dayalı olan ve Lisanslı Materyalin
çevrildiği, değiştirildiği, düzenlendiği, dönüştürüldüğü veya başka
şekilde değiştirildiği materyal anlamına gelir. Bu Kamu Lisansı
amaçları doğrultusunda, Lisanslı Materyal bir müzik eseri, performans
veya ses kaydı ise, Lisanslı Materyal hareketli bir görüntü ile
zamanlı ilişki içinde senkronize edildiğinde her zaman Uyarlanmış
Materyal üretilir.
b. Uyarlayıcı Lisansı, bu Kamu Lisansı'nın şart ve koşullarına uygun
olarak Uyarlanmış Materyale katkılarınızda Telif Hakkı ve Benzer
Haklarınızı uyguladığınız lisans anlamına gelir.
c. BY-SA Uyumlu Lisans, creativecommons.org/compatiblelicenses adresinde
listelenen ve Creative Commons tarafından bu Kamu Lisansı'nın esasen
eşdeğeri olarak onaylanan bir lisans anlamına gelir.
d. Telif Hakkı ve Benzer Haklar, performans, yayın, ses kaydı ve Sui
Generis Veritabanı Hakları dahil ancak bunlarla sınırlı olmamak üzere,
telif hakkına yakından bağlı telif hakkı ve/veya benzer haklar anlamına
gelir. Bu Kamu Lisansı amaçları doğrultusunda, Bölüm 2(b)(1)-(2)'de
belirtilen haklar Telif Hakkı ve Benzer Haklar değildir.
e. Etkili Teknolojik Önlemler, uygun yetki olmadan 20 Aralık 1996'da
kabul edilen WIPO Telif Hakkı Antlaşması'nın 11. Maddesi ve/veya benzer
uluslararası anlaşmalar kapsamındaki yükümlülükleri yerine getiren
yasalara göre aşılmaması gereken önlemler anlamına gelir.
f. İstisnalar ve Sınırlamalar, Lisanslı Materyali kullanmanız için
geçerli olan adil kullanım, adil işlem ve/veya diğer herhangi bir
telif hakkı ve benzer haklar istisnası veya sınırlaması anlamına gelir.
g. Lisans Unsurları, bir Creative Commons Kamu Lisansı'nın adında listelenen
lisans nitelikleri anlamına gelir. Bu Kamu Lisansı'nın Lisans Unsurları
Atıf ve PaylaşımAlike'dır.
h. Lisanslı Materyal, Lisans Verenin bu Kamu Lisansı'nı uyguladığı sanatsal
veya edebi eser, veritabanı veya diğer materyal anlamına gelir.
i. Lisanslı Haklar, bu Kamu Lisansı'nın şart ve koşullarına tabi olarak
size verilen haklar anlamına gelir ve Lisans Verenin lisans verme yetkisine
sahip olduğu ve Lisanslı Materyali kullanmanız için geçerli olan tüm Telif
Hakkı ve Benzer Haklarla sınırlıdır.
j. Lisans Veren, bu Kamu Lisansı kapsamında haklar veren birey(ler) veya
kuruluş(lar) anlamına gelir.
k. Paylaşmak, çoğaltma, kamuya açık gösterim, kamuya açık performans, dağıtım,
yayma, iletişim veya ithalat gibi Lisanslı Haklar kapsamında izin gerektiren
herhangi bir araç veya süreçle materyali halka sunmak ve materyali kamuya,
bireylerin kendi seçtikleri yer ve zamanda erişebilecekleri şekilde sunmak
anlamına gelir.
l. Sui Generis Veritabanı Hakları, 11 Mart 1996 tarihli Avrupa Parlamentosu
ve Konseyi'nin 96/9/EC Yönergesi'nden kaynaklanan ve değiştirilen ve/veya
yerine geçen, dünyanın herhangi bir yerindeki diğer esasen eşdeğer haklar
anlamına gelir.
m. Siz, bu Kamu Lisansı altında Lisanslı Hakları kullanan birey veya kuruluş
anlamına gelir. "Sizin" de buna karşılık gelen bir anlamı vardır.
Bölüm 2 -- Kapsam.
a. Lisans verme.
1. Bu Kamu Lisansı'nın şart ve koşullarına tabi olarak, Lisans Veren,
size dünya çapında, telif ücretsiz, alt lisans verilemez, münhasır
olmayan, geri alınamaz bir lisans vererek Lisanslı Hakları Lisanslı
Materyal üzerinde kullanmanızı sağlar:
a. Lisanslı Materyali, tamamen veya kısmen çoğaltmak ve paylaşmak; ve
b. Uyarlanmış Materyal üretmek, çoğaltmak ve paylaşmak.
2. İstisnalar ve Sınırlamalar. İstisnalar ve Sınırlamalar kullanımınıza
uygulandığında, bu Kamu Lisansı uygulanmaz ve bu şart ve koşullara
uymanız gerekmez.
3. Süre. Bu Kamu Lisansı'nın süresi, Bölüm 6(a)'da belirtilmiştir.
4. Medya ve formatlar; teknik değişikliklere izin verilir. Lisans Veren,
Lisanslı Hakları şimdi bilinen veya daha sonra oluşturulan tüm medya
ve formatlarda kullanmanıza ve bunu yapmak için gerekli teknik
değişiklikleri yapmanıza izin verir. Lisans Veren, Etkili Teknolojik
Önlemleri aşmak için gerekli teknik değişiklikler dahil olmak üzere
Lisanslı Hakları kullanmak için gerekli teknik değişiklikleri yapmanızı
yasaklamama veya herhangi bir hak veya yetki ileri sürmeme konusunda
feragat eder ve/veya kabul eder. Bu Kamu Lisansı amaçları doğrultusunda,
bu Bölüm 2(a)(4) tarafından yetkilendirilen değişiklikleri yapmak asla
Uyarlanmış Materyal üretmez.
5. Aşağı yönlü alıcılar.
a. Lisans Veren'den Teklif -- Lisanslı Materyal. Lisanslı Materyalin
her alıcısı, bu Kamu Lisansı'nın şart ve koşulları altında Lisanslı
Hakları kullanma teklifini otomatik olarak Lisans Verenden alır.
b. Lisans Veren'den Ek Teklif -- Uyarlanmış Materyal. Sizden Uyarlanmış
Materyal alan her alıcı, Uyarlanmış Materyalde Lisanslı Hakları,
uyguladığınız Uyarlayıcı Lisans koşulları altında kullanma teklifini
otomatik olarak Lisans Verenden alır.
c. Aşağı yönlü kısıtlamalar yok. Lisanslı Materyalin herhangi bir
alıcısının Lisanslı Hakları kullanmasını kısıtlıyorsa, Lisanslı
Materyale herhangi bir ek veya farklı şart veya koşul sunamaz veya
uygulayamaz veya Etkili Teknolojik Önlemler uygulayamazsınız.
6. Onay yok. Bu Kamu Lisansı'nda hiçbir şey, sizin veya Lisanslı Materyali
kullanımınızın Lisans Veren veya Bölüm 3(a)(1)(A)(i)'de belirtilen diğer
kişilere atıfta bulunularak bağlantılı, sponsorlu, onaylı veya resmi statüde
olduğunu iddia etme veya ima etme izni olarak yorumlanamaz.
b. Diğer haklar.
1. Bütünlük hakkı gibi manevi haklar, bu Kamu Lisansı kapsamında lisanslanmamıştır,
ne de tanıtım, gizlilik ve/veya diğer benzer kişilik hakları; ancak, mümkün
olduğu ölçüde, Lisans Veren, Lisanslı Hakları kullanmanızı sağlamak için
gerekli olan sınırlı ölçüde, Lisans Verenin elinde bulundurduğu bu tür hakları
ileri sürmeme veya feragat etme konusunda anlaşır, ancak aksi halde değil.
2. Patent ve ticari marka hakları bu Kamu Lisansı kapsamında lisanslanmamıştır.
3. Mümkün olduğu ölçüde, Lisans Veren, Lisanslı Hakları kullanmanız için sizden
doğrudan veya herhangi bir gönüllü veya feragat edilebilir yasal veya zorunlu
lisanslama planı kapsamında bir toplama topluluğu aracılığıyla telif ücreti
toplama hakkından feragat eder. Diğer tüm durumlarda, Lisans Veren, bu tür
telif ücretlerini toplama hakkınııkça saklı tutar.
Bölüm 3 -- Lisans Koşulları.
Lisanslı Hakları kullanmanız, açıkça aşağıdaki koşullara tabi olarak yapılmalıdır.
a. Atıf.
1. Lisanslı Materyali (değiştirilmiş formda dahil) paylaşırsanız, şunları yapmalısınız:
a. Lisans Veren tarafından Lisanslı Materyal ile birlikte sağlanmışsa,
aşağıdakileri koruyun:
i. Lisanslı Materyalin yaratıcısının (yaratıcılarının) ve Lisans Veren
tarafından makul bir şekilde istenen herhangi bir şekilde (takma adla
belirtilmişse dahil) atıf almak üzere belirlenen diğer kişilerin
kimlik bilgilerini;
ii. bir telif hakkı bildirimi;
iii. bu Kamu Lisansına atıfta bulunan bir bildirim;
iv. garanti feragatnamesine atıfta bulunan bir bildirim;
v. makul ölçüde uygulanabilir olduğu sürece, Lisanslı Materyale bir URI
veya bağlantı;
b. Lisanslı Materyali değiştirdiğinizi belirtin ve önceki değişikliklerin
herhangi bir göstergesini koruyun; ve
c. Lisanslı Materyalin bu Kamu Lisansı kapsamında lisanslandığını belirtin ve
bu Kamu Lisansının metnini veya URI'sini veya bağlantısını ekleyin.
2. Bölüm 3(a)(1) koşullarını, Lisanslı Materyali paylaştığınız ortam, araç ve
bağlama göre makul herhangi bir şekilde yerine getirebilirsiniz. Örneğin,
gerekli bilgileri içeren bir kaynağa URI veya bağlantı sağlayarak koşulları
yerine getirmek makul olabilir.
3. Lisans Veren tarafından talep edilirse, Bölüm 3(a)(1)(A) tarafından gerekli
bilgilerin makul ölçüde uygulanabilir olduğu sürece kaldırılmasını sağlamalısınız.
b. PaylaşımAlike.
Bölüm 3(a) koşullarına ek olarak, ürettiğiniz Uyarlanmış Materyali paylaşırsanız,
aşağıdaki koşullar da geçerlidir.
1. Uyguladığınız Uyarlayıcı Lisans, aynı Lisans Unsurlarına sahip bir Creative
Commons lisansı olmalı, bu sürüm veya daha sonra, veya bir BY-SA Uyumlu Lisans
olmalıdır.
2. Uyguladığınız Uyarlayıcı Lisansın metnini veya URI'sini veya bağlantısını
eklemelisiniz. Bu koşulu, Uyarlanmış Materyali paylaştığınız ortam, araç ve
bağlama göre makul herhangi bir şekilde yerine getirebilirsiniz.
3. Uyarlanmış Materyalin, uyguladığınız Uyarlayıcı Lisans altında verilen hakların
kullanılmasını kısıtlayan herhangi bir ek veya farklı şart veya koşul sunamaz veya
uygulayamaz veya Etkili Teknolojik Önlemler uygulayamazsınız.
Bölüm 4 -- Sui Generis Veritabanı Hakları.
Lisanslı Haklar, Lisanslı Materyali kullanmanız için geçerli olan Sui Generis Veritabanı
Haklarını içeriyorsa:
a. Şüpheye mahal vermemek için, Bölüm 2(a)(1), veritabanının içeriğinin tamamını veya
önemli bir kısmını çıkarmak, yeniden kullanmak, çoğaltmak ve paylaşmak hakkını size verir;
b. Veritabanı içeriğinin tamamını veya önemli bir kısmını, Sui Generis Veritabanı
Haklarına sahip olduğunuz bir veritabanına dahil ederseniz, Sui Generis Veritabanı
Haklarına sahip olduğunuz veritabanı (ancak bireysel içerikleri değil) Uyarlanmış
Materyaldir,
Bölüm 3(b) amaçları doğrultusunda; ve
c. Veritabanı içeriğinin tamamını veya önemli bir kısmını paylaşırsanız, Bölüm 3(a)
koşullarına uymalısınız.
Şüpheye mahal vermemek için, bu Bölüm 4, Lisanslı Hakların diğer Telif Hakkı ve Benzer
Hakları içerdiği durumlarda bu Kamu Lisansı kapsamındaki yükümlülüklerinizi tamamlar ve
yerine geçmez.
Bölüm 5 -- Garanti Feragatnamesi ve Sorumluluk Sınırlaması.
a. LİSANS VEREN TARAFINDAN AYRICA YAPILMADIĞI SÜRECE, MÜMKÜN OLDUĞU ÖLÇÜDE, LİSANS
VEREN, LİSANSLI MATERYALİ OLDUĞU GİBİ VE MEVCUT OLDUĞU GİBİ SUNAR VE LİSANSLI
MATERYAL HAKKINDA HİÇBİR TÜRDE BEYAN VEYA GARANTİ VERMEZ, İSTER AÇIK, İSTER ZIMNİ,
YASAL VEYA DİĞER. BU, BAŞLIK GARANTİLERİ, SATILABİLİRLİK, BELİRLİ BİR AMACA UYGUNLUK,
İHLAL ETMEME, GİZLİ VEYA DİĞER KUSURLARIN BULUNMAMASI, DOĞRULUK VEYA HATALARIN VARLIĞI
VEYA YOKLUĞU, BİLİNEN VEYA KEŞFEDİLEBİLEN DAHİL ANCAK BUNLARLA SINIRLI OLMAMAK Ü
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi tavsiye edilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,10 +0,0 @@
Tüm müfredatın sketchnote'larını buradan indirebilirsiniz.
🖨 Yüksek çözünürlükte yazdırmak için, TIFF versiyonları [bu depoda](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff) mevcuttur.
🎨 Oluşturan: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac))
[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/)
**Feragatname**:
Bu belge, makine tabanlı yapay zeka çeviri hizmetleri kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi tavsiye edilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.

@ -1,148 +0,0 @@
# 机器学习简介
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1/)
---
[![初学者的机器学习 - 初学者的机器学习简介](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "初学者的机器学习 - 初学者的机器学习简介")
> 🎥 点击上面的图片观看一个简短的视频,了解本课内容。
欢迎来到这个面向初学者的经典机器学习课程无论你是完全不了解这个话题还是一个有经验的ML从业者想要复习某个领域我们都很高兴你能加入我们我们希望为你的ML学习创造一个友好的起点并乐于评估、回应并采纳你的[反馈](https://github.com/microsoft/ML-For-Beginners/discussions)。
[![ML简介](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "ML简介")
> 🎥 点击上面的图片观看视频MIT的John Guttag介绍机器学习
---
## 机器学习入门
在开始这个课程之前,你需要将你的计算机设置好,并准备好在本地运行笔记本。
- **通过这些视频配置你的机器**。使用以下链接了解[如何在系统中安装Python](https://youtu.be/CXZYvNRIAKM)和[设置开发用的文本编辑器](https://youtu.be/EU8eayHWoZg)。
- **学习Python**。还建议你对[Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott)有基本的了解,这是一门对数据科学家很有用的编程语言,我们在本课程中会使用它。
- **学习Node.js和JavaScript**。我们在构建Web应用程序时也会多次使用JavaScript所以你需要安装[node](https://nodejs.org)和[npm](https://www.npmjs.com/)以及用于Python和JavaScript开发的[Visual Studio Code](https://code.visualstudio.com/)。
- **创建一个GitHub账户**。既然你在[GitHub](https://github.com)上找到了我们你可能已经有一个账户了如果没有创建一个然后fork这个课程以便自己使用。也可以给我们一个star 😊)
- **探索Scikit-learn**。熟悉一下[Scikit-learn](https://scikit-learn.org/stable/user_guide.html)这是我们在这些课程中引用的一组ML库。
---
## 什么是机器学习?
“机器学习”这个术语是当今最流行和经常使用的术语之一。如果你对技术有一定了解,无论你从事什么领域,你都有很大可能至少听过一次这个术语。然而,机器学习的机制对大多数人来说仍然是一个谜。对于机器学习初学者来说,这个主题有时会让人感到不知所措。因此,理解机器学习的真正含义,并通过实际例子一步步学习它,是很重要的。
---
## 热潮曲线
![ml hype curve](../../../../translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.zh.png)
> 谷歌趋势显示了最近“机器学习”一词的“热潮曲线”
---
## 神秘的宇宙
我们生活在一个充满迷人谜团的宇宙中。伟大的科学家如斯蒂芬·霍金、阿尔伯特·爱因斯坦等,终其一生致力于寻找揭示我们周围世界谜团的有意义的信息。这是人类学习的本质:一个人类孩子通过感知周围环境的事实,逐年揭示世界的结构,直到成年。
---
## 孩子的脑袋
孩子的脑袋和感官感知周围环境的事实,并逐渐学习生活中的隐藏模式,这帮助孩子制定逻辑规则来识别学到的模式。人类大脑的学习过程使人类成为这个世界上最复杂的生物。通过不断发现隐藏的模式并在这些模式上进行创新,使我们在一生中变得越来越好。这种学习能力和进化能力与一个叫做[脑可塑性](https://www.simplypsychology.org/brain-plasticity.html)的概念有关。从表面上看,我们可以在一定程度上将人类大脑的学习过程与机器学习的概念联系起来。
---
## 人类大脑
[人类大脑](https://www.livescience.com/29365-human-brain.html)从现实世界中感知事物处理感知到的信息做出理性决策并根据情况执行某些行为。这就是我们所说的智能行为。当我们将这种智能行为过程的仿真程序化到机器上时这就是人工智能AI
---
## 一些术语
虽然这些术语可能会混淆但机器学习ML是人工智能的一个重要子集。**ML关注的是使用专门的算法从感知到的数据中发现有意义的信息和隐藏的模式以支持理性决策过程**。
---
## AI, ML, 深度学习
![AI, ML, deep learning, data science](../../../../translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.zh.png)
> 一张展示AI、ML、深度学习和数据科学之间关系的图表。由[Jen Looper](https://twitter.com/jenlooper)制作,灵感来自[这张图](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)
---
## 涵盖的概念
在这个课程中我们将只涵盖机器学习的核心概念这是初学者必须了解的。我们主要使用Scikit-learn一个许多学生用来学习基础知识的优秀库来讲解我们所谓的“经典机器学习”。要理解人工智能或深度学习的更广泛概念扎实的机器学习基础知识是不可或缺的因此我们希望在这里提供这些知识。
---
## 在本课程中你将学习:
- 机器学习的核心概念
- ML的历史
- ML与公平性
- 回归ML技术
- 分类ML技术
- 聚类ML技术
- 自然语言处理ML技术
- 时间序列预测ML技术
- 强化学习
- ML的实际应用
---
## 我们不会涵盖的内容
- 深度学习
- 神经网络
- AI
为了提供更好的学习体验我们将避免神经网络的复杂性、“深度学习”——使用神经网络构建多层模型——和AI我们将在不同的课程中讨论这些内容。我们还将提供即将推出的数据科学课程以专注于这个更大领域的这一方面。
---
## 为什么要学习机器学习?
从系统的角度来看,机器学习被定义为创建能够从数据中学习隐藏模式以辅助智能决策的自动化系统。
这种动机在某种程度上是受人类大脑如何根据从外部世界感知的数据学习某些事物的启发。
✅ 想一想为什么企业会想尝试使用机器学习策略,而不是创建一个基于硬编码规则的引擎。
---
## 机器学习的应用
机器学习的应用现在几乎无处不在,就像由我们的智能手机、连接设备和其他系统生成的数据在我们的社会中流动一样无处不在。考虑到最先进的机器学习算法的巨大潜力,研究人员一直在探索其解决多维和多学科现实生活问题的能力,并取得了很好的成果。
---
## 应用ML的例子
**你可以通过多种方式使用机器学习**
- 从患者的病史或报告中预测疾病的可能性。
- 利用天气数据预测天气事件。
- 理解文本的情感。
- 识别假新闻以阻止宣传的传播。
金融、经济学、地球科学、太空探索、生物医学工程、认知科学,甚至人文学科领域都采用机器学习来解决它们领域中繁重的数据处理问题。
---
## 结论
机器学习通过从现实世界或生成的数据中发现有意义的见解来自动化模式发现过程。它在商业、健康和金融应用等领域中已经证明了自己的高度价值。
在不久的将来,了解机器学习的基础知识将成为任何领域的人们必须掌握的技能,因为它被广泛采用。
---
# 🚀 挑战
在纸上或使用[Excalidraw](https://excalidraw.com/)等在线应用程序画出你对AI、ML、深度学习和数据科学之间区别的理解。添加一些这些技术擅长解决的问题的想法。
# [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/2/)
---
# 复习与自学
要了解更多关于如何在云中使用ML算法的信息请关注这个[学习路径](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott)。
参加一个关于ML基础知识的[学习路径](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott)。
---
# 作业
[开始运行](assignment.md)
**免责声明**
本文件是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的母语版本为权威来源。对于关键信息,建议使用专业的人类翻译。我们不对因使用本翻译而产生的任何误解或误读承担责任。

@ -1,12 +0,0 @@
# 启动和运行
## 说明
在这个不计分的作业中你应该复习一下Python并使你的环境能够运行notebooks。
请参考这个 [Python 学习路径](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott),然后通过以下入门视频设置你的系统:
https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
**免责声明**
本文档是使用基于机器的人工智能翻译服务进行翻译的。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业的人类翻译。对于因使用此翻译而引起的任何误解或误读,我们概不负责。

@ -1,152 +0,0 @@
# 机器学习的历史
![机器学习历史概要](../../../../translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.zh.png)
> 由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 绘制的速写笔记
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/3/)
---
[![机器学习初学者 - 机器学习的历史](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "机器学习初学者 - 机器学习的历史")
> 🎥 点击上方图片观看本课的简短视频。
在本课中,我们将回顾机器学习和人工智能历史上的重要里程碑。
人工智能AI作为一个领域的历史与机器学习的历史紧密相连因为支撑机器学习的算法和计算进步推动了人工智能的发展。值得注意的是虽然这些领域作为独立的研究领域在20世纪50年代开始成型但重要的[算法、统计、数学、计算和技术发现](https://wikipedia.org/wiki/Timeline_of_machine_learning)早在这一时期之前就已经出现并且有所重叠。实际上,人们已经思考这些问题[数百年](https://wikipedia.org/wiki/History_of_artificial_intelligence)了:这篇文章讨论了“思考机器”这一概念的历史智力基础。
---
## 著名发现
- 1763年, 1812年 [贝叶斯定理](https://wikipedia.org/wiki/Bayes%27_theorem)及其前身。这个定理及其应用在推理中起着重要作用,描述了基于先验知识发生事件的概率。
- 1805年 [最小二乘法](https://wikipedia.org/wiki/Least_squares) 由法国数学家Adrien-Marie Legendre提出。这个理论你将在我们的回归单元中学习帮助进行数据拟合。
- 1913年 [马尔可夫链](https://wikipedia.org/wiki/Markov_chain)由俄罗斯数学家Andrey Markov命名用于描述基于前一个状态的一系列可能事件。
- 1957年 [感知器](https://wikipedia.org/wiki/Perceptron) 是一种由美国心理学家Frank Rosenblatt发明的线性分类器支撑了深度学习的进步。
---
- 1967年 [最近邻](https://wikipedia.org/wiki/Nearest_neighbor) 是一种最初设计用于绘制路线的算法。在机器学习背景下,它用于检测模式。
- 1970年 [反向传播](https://wikipedia.org/wiki/Backpropagation) 用于训练[前馈神经网络](https://wikipedia.org/wiki/Feedforward_neural_network)。
- 1982年 [递归神经网络](https://wikipedia.org/wiki/Recurrent_neural_network) 是从前馈神经网络派生的人工神经网络,创建时间图。
✅ 做一些研究。还有哪些日期在机器学习和人工智能历史上是关键的?
---
## 1950年会思考的机器
Alan Turing一个真正了不起的人物被[公众在2019年](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century)投票选为20世纪最伟大的科学家被认为帮助奠定了“会思考的机器”这一概念的基础。他通过创建[图灵测试](https://www.bbc.com/news/technology-18475646)部分解决了反对者和他自己对这一概念的经验证据的需求,你将在我们的自然语言处理课程中探讨这一点。
---
## 1956年达特茅斯夏季研究项目
“达特茅斯夏季人工智能研究项目是人工智能作为一个领域的奠基性事件”,在这里“人工智能”一词被创造出来了([来源](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth))。
> 学习或任何其他智能特征的每一个方面原则上都可以如此精确地描述,以至于可以制造出模拟它的机器。
---
首席研究员、数学教授John McCarthy希望“基于这样一种假设进行研究即学习或任何其他智能特征的每一个方面原则上都可以如此精确地描述以至于可以制造出模拟它的机器。” 参与者中还包括该领域的另一位著名人物Marvin Minsky。
该研讨会被认为启动并鼓励了几次讨论,包括“符号方法的兴起、专注于有限领域的系统(早期专家系统)以及演绎系统与归纳系统的对立。”([来源](https://wikipedia.org/wiki/Dartmouth_workshop))。
---
## 1956 - 1974年“黄金时代”
从1950年代到70年代中期人们对AI能够解决许多问题充满乐观。1967年Marvin Minsky自信地表示“在一代人之内……创造人工智能的问题将基本解决。”Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall
自然语言处理研究蓬勃发展,搜索得到改进并变得更强大,“微观世界”的概念被创造出来,在那里可以使用简单的语言指令完成简单的任务。
---
政府机构提供了充足的资金,计算和算法方面取得了进展,智能机器的原型被建造出来。这些机器包括:
* [Shakey机器人](https://wikipedia.org/wiki/Shakey_the_robot),能够智能地操纵和决定如何执行任务。
![Shakey一个智能机器人](../../../../translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.zh.jpg)
> 1972年的Shakey
---
* Eliza一个早期的“聊天机器人”可以与人对话并充当原始的“治疗师”。你将在自然语言处理课程中了解更多关于Eliza的信息。
![Eliza一个机器人](../../../../translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.zh.png)
> Eliza一个聊天机器人的版本
---
* “积木世界”是一个微观世界的例子,在那里可以堆叠和分类积木,并可以测试教机器做决定的实验。使用诸如[SHRDLU](https://wikipedia.org/wiki/SHRDLU)之类的库构建的进步推动了语言处理的发展。
[![积木世界与SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "积木世界与SHRDLU")
> 🎥 点击上方图片观看视频积木世界与SHRDLU
---
## 1974 - 1980年“AI寒冬”
到70年代中期制造“智能机器”的复杂性被低估的事实变得显而易见而其承诺在现有的计算能力下被夸大了。资金枯竭对该领域的信心减弱。一些影响信心的问题包括
---
- **限制**。计算能力太有限。
- **组合爆炸**。随着对计算机要求的增加,需要训练的参数数量呈指数增长,而计算能力和能力没有相应地进化。
- **数据稀缺**。数据稀缺,阻碍了测试、开发和改进算法的过程。
- **我们在问正确的问题吗?**。提出的问题本身开始受到质疑。研究人员开始面对对其方法的批评:
- 图灵测试受到质疑,其中包括“中文房间理论”这一观点,该理论认为,“编程一个数字计算机可能会使其看起来理解语言,但不能产生真正的理解。”([来源](https://plato.stanford.edu/entries/chinese-room/)
- 将像“治疗师”ELIZA这样的人工智能引入社会的伦理问题受到挑战。
---
同时,各种人工智能思想流派开始形成。“[简洁AI与凌乱AI](https://wikipedia.org/wiki/Neats_and_scruffies)”的二分法被确立。_凌乱_实验室通过长时间调整程序来获得期望的结果。_简洁_实验室“专注于逻辑和正式问题解决”。ELIZA和SHRDLU是著名的_凌乱_系统。到了80年代随着对机器学习系统可重复性需求的出现_简洁_方法逐渐占据了主导地位因为其结果更具解释性。
---
## 1980年代 专家系统
随着该领域的发展其对商业的好处变得更加明显到了80年代“专家系统”也开始普及。“专家系统是最早真正成功的人工智能AI软件形式之一。”[来源](https://wikipedia.org/wiki/Expert_system))。
这种类型的系统实际上是_混合_的部分由定义业务需求的规则引擎组成部分由利用规则系统推导新事实的推理引擎组成。
这个时代也越来越关注神经网络。
---
## 1987 - 1993年AI寒潮
专门的专家系统硬件的普及产生了不幸的后果,即变得过于专业化。个人计算机的兴起也与这些大型、专门、集中化的系统竞争。计算的民主化已经开始,并最终为现代大数据的爆发铺平了道路。
---
## 1993 - 2011年
这一时期标志着机器学习和人工智能能够解决早期由于数据和计算能力不足而导致的一些问题。数据量开始迅速增加并变得更广泛可用无论是好是坏尤其是在2007年左右智能手机的出现。计算能力成倍增长算法也随之发展。随着过去自由放任的日子开始凝聚成一个真正的学科该领域开始走向成熟。
---
## 现在
今天机器学习和人工智能几乎触及我们生活的每个部分。这个时代需要对这些算法对人类生活的风险和潜在影响有仔细的理解。正如微软的Brad Smith所说“信息技术提出了涉及基本人权保护的核心问题如隐私和言论自由。这些问题加剧了创造这些产品的科技公司的责任。在我们看来这也呼吁政府进行深思熟虑的监管并制定关于可接受用途的规范”[来源](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/))。
---
未来将如何发展尚未可知,但理解这些计算机系统以及它们运行的软件和算法是很重要的。我们希望这门课程能帮助你更好地理解,以便你自己做出决定。
[![深度学习的历史](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "深度学习的历史")
> 🎥 点击上方图片观看视频Yann LeCun在这次讲座中讨论了深度学习的历史
---
## 🚀挑战
深入了解这些历史时刻之一,了解背后的人物。这些人物非常有趣,没有任何科学发现是在文化真空中产生的。你发现了什么?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/4/)
---
## 复习与自学
这里有一些可以观看和聆听的内容:
[这个播客中Amy Boyd讨论了AI的演变](http://runasradio.com/Shows/Show/739)
[![艾米·博伊德讲述AI历史](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "艾米·博伊德讲述AI历史")
---
## 作业
[创建时间线](assignment.md)
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文档的本国语言版本视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用此翻译而引起的任何误解或误读,我们不承担任何责任。

@ -1,14 +0,0 @@
# 创建时间线
## 说明
使用[这个仓库](https://github.com/Digital-Humanities-Toolkit/timeline-builder),创建一个关于算法、数学、统计、人工智能或机器学习历史某一方面的时间线,或这些领域的组合。你可以专注于一个人、一个想法,或一个长时间段的思想。确保添加多媒体元素。
## 评分标准
| 标准 | 模范 | 合格 | 需要改进 |
| ------ | ------------------------------------------------- | --------------------------------------- | --------------------------------------------------------------- |
| | 部署的时间线作为GitHub页面展示 | 代码不完整且未部署 | 时间线不完整,研究不充分且未部署 |
**免责声明**:
本文档是使用机器翻译服务翻译的。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的母语版本为权威来源。对于关键信息,建议使用专业的人类翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,159 +0,0 @@
# 构建负责任的人工智能解决方案
![在速写笔记中总结的机器学习中的负责任AI](../../../../translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.zh.png)
> 速写笔记由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 提供
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
## 介绍
在本课程中你将开始了解机器学习如何以及正在影响我们的日常生活。即使在现在系统和模型已经参与了日常的决策任务例如医疗诊断、贷款审批或检测欺诈。因此这些模型需要表现良好以提供可信的结果。就像任何软件应用程序一样AI系统也会有未达预期或产生不理想结果的情况。这就是为什么理解和解释AI模型行为是至关重要的。
想象一下当你用来构建这些模型的数据缺乏某些人口统计信息如种族、性别、政治观点、宗教或者这些人口统计信息被不成比例地代表时会发生什么情况。再想想当模型的输出被解读为偏向某些人口统计时会有什么后果另外当模型产生不利结果并对人们造成伤害时会发生什么谁应该对AI系统的行为负责这些是我们将在本课程中探讨的问题。
在本课中,你将:
- 提高对机器学习中公平性的重要性及相关危害的认识。
- 熟悉探索异常值和不寻常场景的实践,以确保可靠性和安全性。
- 了解设计包容性系统以赋权所有人的必要性。
- 探讨保护数据和个人隐私与安全的重要性。
- 了解采用透明方法解释AI模型行为的重要性。
- 注意到责任感在建立AI系统信任中的重要性。
## 先决条件
作为先决条件请完成“负责任AI原则”学习路径并观看以下视频
通过以下[学习路径](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)了解更多关于负责任AI的信息。
[![Microsoft's Approach to Responsible AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI")
> 🎥 点击上图观看视频Microsoft's Approach to Responsible AI
## 公平性
AI系统应该公平对待每个人避免对相似群体的人产生不同的影响。例如当AI系统提供医疗建议、贷款申请或就业指导时它们应该对有相似症状、财务状况或专业资格的每个人提供相同的建议。我们每个人都携带着影响我们决策和行动的继承偏见。这些偏见可能体现在我们用来训练AI系统的数据中。这种操控有时是无意的。通常很难有意识地知道你何时在数据中引入了偏见。
**“不公平”** 包括对某一群体的负面影响或“伤害”,例如按种族、性别、年龄或残疾状态定义的群体。主要的公平性相关伤害可以分类为:
- **分配**,例如一个性别或种族被偏爱于另一个。
- **服务质量**。如果你为一个特定场景训练数据,但现实要复杂得多,就会导致服务表现不佳。例如,一个手部肥皂分配器似乎无法感应深色皮肤的人。[参考](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **诽谤**。不公平地批评和标签某物或某人。例如,一种图像标签技术臭名昭著地将深色皮肤人的图像错误标记为大猩猩。
- **过度或不足代表**。某一群体在某一职业中未被看到的想法,任何继续推广这种现象的服务或功能都是在造成伤害。
- **刻板印象**。将某一群体与预先分配的属性联系在一起。例如,英语和土耳其语之间的语言翻译系统可能由于与性别有关的刻板印象而出现错误。
![翻译成土耳其语](../../../../translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.zh.png)
> 翻译成土耳其语
![翻译回英语](../../../../translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.zh.png)
> 翻译回英语
在设计和测试AI系统时我们需要确保AI是公平的并且没有被编程成做出有偏见或歧视性的决策这是人类也被禁止做出的。确保AI和机器学习中的公平性仍然是一个复杂的社会技术挑战。
### 可靠性和安全性
为了建立信任AI系统需要在正常和意外条件下可靠、安全和一致。了解AI系统在各种情况下的行为是很重要的特别是在异常情况下。构建AI解决方案时需要大量关注如何处理AI解决方案可能遇到的各种情况。例如一辆自动驾驶汽车需要将人的安全放在首位。因此驱动汽车的AI需要考虑汽车可能遇到的所有场景如夜晚、雷暴或暴风雪、孩子跑过街道、宠物、道路施工等。一个AI系统在多种条件下可靠和安全地处理情况的能力反映了数据科学家或AI开发人员在设计或测试系统时所考虑的预期水平。
> [🎥 点击这里观看视频:](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
### 包容性
AI系统应该设计成能够吸引和赋权所有人。在设计和实施AI系统时数据科学家和AI开发人员会识别和解决系统中可能无意中排除某些人的潜在障碍。例如全球有10亿残疾人。随着AI的发展他们可以更轻松地在日常生活中访问各种信息和机会。通过解决这些障碍可以创新和开发出为每个人带来更好体验的AI产品。
> [🎥 点击这里观看视频AI中的包容性](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
### 安全和隐私
AI系统应该是安全的并尊重人们的隐私。人们对那些将其隐私、信息或生活置于风险中的系统信任度较低。在训练机器学习模型时我们依赖数据来产生最佳结果。在此过程中数据的来源和完整性必须考虑。例如数据是用户提交的还是公开可用的接下来在处理数据时至关重要的是开发能够保护机密信息并抵御攻击的AI系统。随着AI的普及保护隐私和确保重要的个人和商业信息的安全变得越来越重要和复杂。隐私和数据安全问题需要特别关注AI因为访问数据对于AI系统做出准确和知情的预测和决策至关重要。
> [🎥 点击这里观看视频AI中的安全性](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- 作为一个行业我们在隐私和安全方面取得了重大进展这主要得益于如GDPR通用数据保护条例等法规的推动。
- 然而对于AI系统我们必须承认在需要更多个人数据以使系统更个性化和有效与隐私之间的紧张关系。
- 就像互联网带来的连接计算机一样我们也看到与AI相关的安全问题数量激增。
- 同时我们也看到AI被用来改善安全性。例如大多数现代的防病毒扫描器今天都是由AI启发驱动的。
- 我们需要确保我们的数据科学流程与最新的隐私和安全实践和谐融合。
### 透明性
AI系统应该是可理解的。透明性的一个关键部分是解释AI系统及其组件的行为。提高对AI系统的理解需要利益相关者理解它们的工作原理和原因以便他们能够识别潜在的性能问题、安全和隐私问题、偏见、排他性做法或意外结果。我们还认为使用AI系统的人应该诚实并坦率地说明何时、为何以及如何选择部署它们以及所使用系统的局限性。例如如果一家银行使用AI系统来支持其消费者贷款决策重要的是检查结果并了解哪些数据影响了系统的建议。政府开始在各个行业对AI进行监管因此数据科学家和组织必须解释AI系统是否符合监管要求特别是在出现不理想结果时。
> [🎥 点击这里观看视频AI中的透明性](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- 由于AI系统非常复杂很难理解它们的工作原理并解释结果。
- 这种缺乏理解会影响这些系统的管理、操作和文档编制方式。
- 更重要的是,这种缺乏理解会影响使用这些系统产生结果的决策。
### 责任
设计和部署AI系统的人必须对其系统的运行负责。责任感的需求在敏感技术的使用中尤为重要如面部识别技术。最近对面部识别技术的需求不断增长特别是执法机构看到了这项技术在寻找失踪儿童等用途中的潜力。然而这些技术可能会被政府用来威胁公民的基本自由例如通过使对特定个人的持续监控成为可能。因此数据科学家和组织需要对其AI系统对个人或社会的影响负责。
[![Leading AI Researcher Warns of Mass Surveillance Through Facial Recognition](../../../../translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.zh.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft's Approach to Responsible AI")
> 🎥 点击上图观看视频:面部识别技术大规模监控的警告
最终对于我们这一代人来说作为将AI引入社会的第一代人最大的一个问题是如何确保计算机对人负责以及如何确保设计计算机的人对所有人负责。
## 影响评估
在训练机器学习模型之前进行影响评估以了解AI系统的目的、预期用途、部署地点以及与系统互动的人是谁这一点很重要。这些对于评审员或测试人员评估系统时了解在识别潜在风险和预期后果时需要考虑的因素非常有帮助。
进行影响评估时的重点领域如下:
* **对个人的不利影响**。了解任何限制或要求、不支持的使用或任何已知的性能限制对于确保系统不会以可能对个人造成伤害的方式使用至关重要。
* **数据要求**。了解系统如何以及在哪里使用数据使评审员能够探索你需要注意的任何数据要求例如GDPR或HIPPA数据法规。此外检查数据的来源或数量是否足够用于训练。
* **影响总结**。收集一份使用系统可能带来的潜在伤害清单。在ML生命周期中检查是否已缓解或解决识别出的问题。
* **每个核心原则的适用目标**。评估每个原则的目标是否实现,以及是否存在任何差距。
## 使用负责任AI进行调试
类似于调试软件应用程序调试AI系统是识别和解决系统问题的必要过程。许多因素会影响模型未按预期或负责任地表现。大多数传统的模型性能指标是模型性能的定量汇总这不足以分析模型如何违反负责任AI原则。此外机器学习模型是一个黑箱难以理解其结果的驱动因素或在出现错误时提供解释。在本课程的后期我们将学习如何使用负责任AI仪表板来帮助调试AI系统。仪表板为数据科学家和AI开发人员提供了一个全面的工具用于执行
* **错误分析**。识别模型的错误分布,这可能影响系统的公平性或可靠性。
* **模型概述**。发现模型在数据群体中的性能差异。
* **数据分析**。了解数据分布并识别数据中可能导致公平性、包容性和可靠性问题的潜在偏见。
* **模型可解释性**。了解影响或影响模型预测的因素。这有助于解释模型的行为,对于透明性和责任感非常重要。
## 🚀 挑战
为了防止伤害的引入,我们应该:
- 让系统开发团队拥有多样化的背景和观点
- 投资反映我们社会多样性的数据集
- 在整个机器学习生命周期中开发更好的方法以检测和纠正负责任AI的出现
思考一些现实生活中的场景,模型的不可信性在模型构建和使用中变得显而易见。我们还应该考虑什么?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/6/)
## 复习与自学
在本课中,你学习了机器学习中公平性和不公平性的基本概念。
观看这个研讨会,深入了解这些主题:
- 追求负责任AI将原则付诸实践作者Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma
[![Responsible AI Toolbox: An open-source framework for building responsible AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: An open-source framework for building responsible AI")
> 🎥 点击上图观看视频RAI Toolbox: An open-source framework for building responsible AI by Besmira Nushi, Mehrnoosh Sameki, and Amit Sharma
另外,阅读:
- Microsoft的RAI资源中心[负责任的AI资源 Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- Microsoft的FATE研究组[FATE: 公平性、责任感、透明性和AI伦理 - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
RAI Toolbox:
- [负责任AI工具箱GitHub仓库](https://github.com/microsoft/responsible-ai-toolbox)
阅读关于Azure机器学习的工具以确保公平性
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## 作业
[探索RAI工具箱](assignment.md)
**免责声明**:
本文件已使用基于机器的AI翻译服务进行翻译。尽管我们力求准确但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议进行专业人工翻译。我们对使用本翻译可能引起的任何误解或误读不承担责任。

@ -1,14 +0,0 @@
# 探索负责任的AI工具箱
## 说明
在本课中您了解了负责任的AI工具箱这是一个“开源的、社区驱动的项目旨在帮助数据科学家分析和改进AI系统。”在这个作业中请探索RAI工具箱的一个[notebook](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb),并在报告或演示文稿中汇报您的发现。
## 评分标准
| 标准 | 模范 | 合格 | 需要改进 |
| -------- | --------- | -------- | -------------- |
| | 提交了一篇讨论Fairlearn系统、运行的notebook及其结论的论文或PowerPoint演示文稿 | 提交了一篇没有结论的论文 | 没有提交论文 |
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。尽管我们力求准确但请注意自动翻译可能包含错误或不准确之处。应将原文档的本国语言版本视为权威来源。对于重要信息建议使用专业的人类翻译。对于因使用本翻译而产生的任何误解或误读我们概不负责。

@ -1,121 +0,0 @@
# 机器学习技术
构建、使用和维护机器学习模型及其使用的数据的过程,与许多其他开发工作流非常不同。在本课中,我们将揭开这个过程的神秘面纱,并概述您需要了解的主要技术。您将:
- 从高层次上理解机器学习的基本过程。
- 探索基本概念,如“模型”、“预测”和“训练数据”。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/7/)
[![ML for beginners - Techniques of Machine Learning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for beginners - Techniques of Machine Learning")
> 🎥 点击上方图片观看本课的简短视频。
## 介绍
从高层次来看创建机器学习ML过程的工艺包含若干步骤
1. **确定问题**。大多数ML过程都是从提出一个不能通过简单的条件程序或基于规则的引擎回答的问题开始。这些问题通常围绕基于数据集合的预测展开。
2. **收集和准备数据**。为了能够回答您的问题,您需要数据。数据的质量和数量有时会决定您能多好地回答最初的问题。数据可视化是这一阶段的重要方面。此阶段还包括将数据分为训练组和测试组以构建模型。
3. **选择训练方法**。根据您的问题和数据的性质您需要选择如何训练模型以最好地反映您的数据并对其进行准确预测。这是您的ML过程需要特定专业知识并且通常需要大量实验的部分。
4. **训练模型**。使用您的训练数据,您将使用各种算法训练模型以识别数据中的模式。模型可能利用内部权重,可以调整这些权重以优先考虑数据的某些部分,从而构建更好的模型。
5. **评估模型**。您使用从未见过的数据(您的测试数据)来查看模型的表现。
6. **参数调整**。根据模型的表现,您可以使用不同的参数或变量重新进行该过程,这些参数或变量控制用于训练模型的算法的行为。
7. **预测**。使用新输入来测试模型的准确性。
## 提出什么问题
计算机特别擅长发现数据中的隐藏模式。这一功能对于研究人员来说非常有用,他们在某个领域有一些问题,这些问题不能通过创建基于条件的规则引擎轻松回答。举例来说,给定一个精算任务,数据科学家可能能够构建关于吸烟者与非吸烟者死亡率的手工规则。
然而当许多其他变量被引入时基于过去的健康历史ML模型可能更有效地预测未来的死亡率。一个更愉快的例子可能是根据包括纬度、经度、气候变化、海洋的接近度、喷流模式等数据预测某个地点四月份的天气。
✅ 这份关于天气模型的[幻灯片](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf)提供了使用ML进行天气分析的历史视角。
## 构建前的任务
在开始构建模型之前,您需要完成几个任务。为了测试您的问题并根据模型的预测形成假设,您需要识别和配置几个元素。
### 数据
为了能够以任何确定性回答您的问题,您需要大量合适类型的数据。在这一点上,您需要做两件事:
- **收集数据**。牢记上一课关于数据分析公平性的内容,谨慎收集您的数据。了解这些数据的来源、它可能具有的任何内在偏见,并记录其来源。
- **准备数据**。数据准备过程有几个步骤。如果数据来自不同的来源,您可能需要整理数据并使其规范化。您可以通过各种方法提高数据的质量和数量,例如将字符串转换为数字(如我们在[聚类](../../5-Clustering/1-Visualize/README.md)中所做的)。您还可以基于原始数据生成新数据(如我们在[分类](../../4-Classification/1-Introduction/README.md)中所做的)。您可以清理和编辑数据(如我们在[Web应用](../../3-Web-App/README.md)课程之前所做的)。最后,根据您的训练技术,您可能还需要对其进行随机化和打乱。
✅ 收集和处理数据后,花点时间看看它的形状是否能让您解决预期的问题。正如我们在[聚类](../../5-Clustering/1-Visualize/README.md)课程中发现的那样,数据可能无法在您的任务中表现良好!
### 特征和目标
一个[特征](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection)是数据的可测量属性。在许多数据集中,它表现为列标题,如“日期”、“大小”或“颜色”。您的特征变量,通常在代码中表示为`X`,代表用于训练模型的输入变量。
目标是您试图预测的事物。目标通常在代码中表示为`y`,代表您试图从数据中询问的问题的答案:在十二月,哪种**颜色**的南瓜最便宜?在旧金山,哪个社区的房地产**价格**最好?有时目标也称为标签属性。
### 选择您的特征变量
🎓 **特征选择和特征提取** 如何在构建模型时知道选择哪个变量?您可能会通过特征选择或特征提取的过程来选择最合适的变量以构建性能最佳的模型。然而,它们并不是一回事:“特征提取从原始特征的函数中创建新特征,而特征选择返回特征的子集。”([来源](https://wikipedia.org/wiki/Feature_selection)
### 可视化您的数据
数据科学家工具包的重要方面是使用Seaborn或MatPlotLib等出色库来可视化数据的能力。以可视化方式表示您的数据可能会让您发现可以利用的隐藏关联。您的可视化还可能帮助您发现偏见或不平衡的数据正如我们在[分类](../../4-Classification/2-Classifiers-1/README.md)中发现的那样)。
### 分割您的数据集
在训练之前,您需要将数据集分割成两个或多个不等大小的部分,这些部分仍能很好地代表数据。
- **训练**。数据集的这一部分用于训练模型。这部分数据构成了原始数据集的大部分。
- **测试**。测试数据集是一个独立的数据组,通常从原始数据中收集,用于确认构建模型的性能。
- **验证**。验证集是一个较小的独立数据组,您用它来调整模型的超参数或架构以改进模型。根据您的数据大小和您提出的问题,您可能不需要构建这个第三组(正如我们在[时间序列预测](../../7-TimeSeries/1-Introduction/README.md)中所指出的那样)。
## 构建模型
使用您的训练数据,您的目标是使用各种算法构建一个模型或数据的统计表示来**训练**它。训练模型使其暴露于数据,并允许其对发现、验证和接受或拒绝的感知模式做出假设。
### 决定训练方法
根据您的问题和数据的性质,您将选择一种方法来训练它。通过[Scikit-learn的文档](https://scikit-learn.org/stable/user_guide.html)——我们在本课程中使用的库,您可以探索许多训练模型的方法。根据您的经验,您可能需要尝试几种不同的方法来构建最佳模型。您可能会经历一个过程,即数据科学家通过向模型提供未见过的数据来评估模型的性能,检查其准确性、偏差和其他质量降低问题,并选择最适合手头任务的训练方法。
### 训练模型
有了您的训练数据您就可以“拟合”它来创建一个模型。您会注意到在许多ML库中您会发现代码“model.fit”——此时您将以值数组通常是“X”的形式发送您的特征变量和目标变量通常是“y”
### 评估模型
一旦训练过程完成(训练大型模型可能需要多次迭代或“周期”),您将能够使用测试数据来评估模型的质量,以衡量其性能。这些数据是模型之前未分析过的原始数据的一个子集。您可以打印出一张关于模型质量的指标表。
🎓 **模型拟合**
在机器学习的背景下,模型拟合是指模型的基础函数在尝试分析不熟悉的数据时的准确性。
🎓 **欠拟合**和**过拟合**是降低模型质量的常见问题,因为模型要么拟合得不够好,要么拟合得太好。这导致模型的预测要么与训练数据过于紧密对齐,要么与训练数据对齐过于松散。过拟合的模型因为过于了解数据的细节和噪音而预测训练数据太好。欠拟合的模型不准确,因为它既不能准确分析其训练数据,也不能准确分析尚未“见过”的数据。
![过拟合模型](../../../../translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.zh.png)
> 信息图由[Jen Looper](https://twitter.com/jenlooper)制作
## 参数调整
初步训练完成后,观察模型的质量并考虑通过调整其“超参数”来改进它。阅读更多关于这一过程的内容[在文档中](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)。
## 预测
这是您可以使用全新数据测试模型准确性的时刻。在“应用”ML设置中当您构建Web资产以在生产中使用模型时这个过程可能涉及收集用户输入例如按钮按下以设置变量并将其发送到模型进行推断或评估。
在这些课程中您将发现如何使用这些步骤来准备、构建、测试、评估和预测——所有数据科学家的操作以及更多内容随着您在成为“全栈”ML工程师的旅程中不断前进。
---
## 🚀挑战
绘制一个反映ML实践者步骤的流程图。您现在在这个过程中看到自己处于哪个阶段您预测您会在哪个阶段遇到困难对您来说什么看起来很容易
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/8/)
## 回顾与自学
在网上搜索与数据科学家讨论他们日常工作的采访。这里有一个[采访](https://www.youtube.com/watch?v=Z3IjgbbCEfs)。
## 作业
[采访数据科学家](assignment.md)
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。尽管我们力求准确但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议进行专业的人类翻译。对于因使用此翻译而引起的任何误解或误读我们不承担任何责任。

@ -1,14 +0,0 @@
# 采访数据科学家
## 说明
在你的公司、用户群、朋友或同学中找一个专业从事数据科学工作的人进行交谈。写一篇关于他们日常工作的简短文章500字。他们是专门从事某一领域还是从事“全栈”工作
## 评分标准
| 标准 | 卓越 | 合格 | 需要改进 |
| ------ | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | --------------------- |
| | 提交了一篇符合字数要求的文章,且注明了来源,并以 .doc 文件格式呈现 | 文章来源注明不充分或篇幅短于要求长度 | 未提交文章 |
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,26 +0,0 @@
# 机器学习简介
在本课程部分中,您将了解机器学习领域的基本概念、它是什么,并了解其历史以及研究人员使用的技术。让我们一起探索这个机器学习的新世界吧!
![globe](../../../translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.zh.jpg)
> 图片由 <a href="https://unsplash.com/@bill_oxford?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Bill Oxford</a> 提供,来自 <a href="https://unsplash.com/s/photos/globe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
### 课程
1. [机器学习简介](1-intro-to-ML/README.md)
1. [机器学习和人工智能的历史](2-history-of-ML/README.md)
1. [公平性与机器学习](3-fairness/README.md)
1. [机器学习的技术](4-techniques-of-ML/README.md)
### 致谢
“机器学习简介”由包括 [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) 和 [Jen Looper](https://twitter.com/jenlooper) 在内的团队用♥️编写。
“机器学习的历史”由 [Jen Looper](https://twitter.com/jenlooper) 和 [Amy Boyd](https://twitter.com/AmyKateNicho) 用♥️编写。
“公平性与机器学习”由 [Tomomi Imura](https://twitter.com/girliemac) 用♥️编写。
“机器学习的技术”由 [Jen Looper](https://twitter.com/jenlooper) 和 [Chris Noring](https://twitter.com/softchris) 用♥️编写。
**免责声明**:
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用此翻译而产生的任何误解或误释,我们不承担任何责任。

@ -1,228 +0,0 @@
# 使用 Python 和 Scikit-learn 构建回归模型入门
![回归模型的概述](../../../../translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.zh.png)
> 由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 绘制的手绘笔记
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/9/)
> ### [本课程提供 R 语言版本!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
## 简介
在这四节课中,你将学习如何构建回归模型。我们将很快讨论这些模型的用途。但在开始之前,请确保你已经准备好了合适的工具!
在本课中,你将学到:
- 配置你的电脑以进行本地机器学习任务。
- 使用 Jupyter 笔记本。
- 安装和使用 Scikit-learn。
- 通过动手练习探索线性回归。
## 安装和配置
[![机器学习初学者 - 设置工具以构建机器学习模型](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "机器学习初学者 - 设置工具以构建机器学习模型")
> 🎥 点击上面的图片观看一个简短的视频,了解如何配置你的电脑以进行机器学习。
1. **安装 Python**。确保你的电脑上安装了 [Python](https://www.python.org/downloads/)。你将使用 Python 进行许多数据科学和机器学习任务。大多数计算机系统已经包含了 Python 安装。也有一些有用的 [Python 编码包](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott),可以简化某些用户的设置过程。
然而,有些 Python 的使用需要一个版本的软件,而其他使用则需要不同的版本。因此,在 [虚拟环境](https://docs.python.org/3/library/venv.html) 中工作是很有用的。
2. **安装 Visual Studio Code**。确保你的电脑上安装了 Visual Studio Code。按照这些说明进行 [安装 Visual Studio Code](https://code.visualstudio.com/) 的基本安装。在本课程中,你将使用 Visual Studio Code 中的 Python因此你可能需要了解如何 [配置 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) 以进行 Python 开发。
> 通过学习这组 [Learn 模块](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) 来熟悉 Python
>
> [![使用 Visual Studio Code 设置 Python](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "使用 Visual Studio Code 设置 Python")
>
> 🎥 点击上面的图片观看视频:在 VS Code 中使用 Python。
3. **安装 Scikit-learn**,按照 [这些说明](https://scikit-learn.org/stable/install.html)。由于你需要确保使用 Python 3建议你使用虚拟环境。请注意如果你在 M1 Mac 上安装此库,请参阅上述链接页面中的特别说明。
1. **安装 Jupyter Notebook**。你需要 [安装 Jupyter 包](https://pypi.org/project/jupyter/)。
## 你的机器学习编写环境
你将使用 **notebooks** 来开发你的 Python 代码并创建机器学习模型。这种类型的文件是数据科学家的常用工具,可以通过其后缀或扩展名 `.ipynb` 识别。
笔记本是一种交互式环境,允许开发者编写代码并添加注释和文档,这对于实验或研究导向的项目非常有帮助。
[![机器学习初学者 - 设置 Jupyter 笔记本以开始构建回归模型](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "机器学习初学者 - 设置 Jupyter 笔记本以开始构建回归模型")
> 🎥 点击上面的图片观看一个简短的视频,了解如何进行此练习。
### 练习 - 使用笔记本
在这个文件夹中,你会找到 _notebook.ipynb_ 文件。
1. 在 Visual Studio Code 中打开 _notebook.ipynb_
一个 Jupyter 服务器将会启动,并启动 Python 3+。你会发现笔记本中有一些区域可以 `run`,即代码片段。你可以通过选择一个看起来像播放按钮的图标来运行一个代码块。
1. 选择 `md` 图标并添加一些 markdown以及以下文本 **# 欢迎来到你的笔记本**。
接下来,添加一些 Python 代码。
1. 在代码块中输入 **print('hello notebook')**
1. 选择箭头来运行代码。
你应该会看到打印的语句:
```output
hello notebook
```
![在 VS Code 中打开的笔记本](../../../../translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.zh.jpg)
你可以在代码中插入注释,以自我记录笔记本。
✅ 想一想,网页开发者的工作环境与数据科学家的工作环境有何不同。
## 使用 Scikit-learn 入门
现在 Python 已经在你的本地环境中设置完毕,并且你已经熟悉了 Jupyter 笔记本,让我们同样熟悉一下 Scikit-learn发音为 `sci` as in `science`。Scikit-learn 提供了一个 [广泛的 API](https://scikit-learn.org/stable/modules/classes.html#api-ref),帮助你执行机器学习任务。
根据他们的 [网站](https://scikit-learn.org/stable/getting_started.html)"Scikit-learn 是一个开源机器学习库,支持监督学习和非监督学习。它还提供了各种工具用于模型拟合、数据预处理、模型选择和评估,以及许多其他实用工具。"
在本课程中,你将使用 Scikit-learn 和其他工具来构建机器学习模型以执行我们称之为“传统机器学习”的任务。我们故意避开了神经网络和深度学习因为它们将在我们即将推出的“AI for Beginners”课程中更好地覆盖。
Scikit-learn 使构建模型和评估它们的使用变得简单。它主要专注于使用数值数据,并包含几个现成的数据集供学习使用。它还包括预构建的模型供学生尝试。让我们探索一下加载预打包数据和使用内置估算器来构建第一个机器学习模型的过程。
## 练习 - 你的第一个 Scikit-learn 笔记本
> 本教程的灵感来自 Scikit-learn 网站上的 [线性回归示例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。
[![机器学习初学者 - 你的第一个 Python 线性回归项目](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "机器学习初学者 - 你的第一个 Python 线性回归项目")
> 🎥 点击上面的图片观看一个简短的视频,了解如何进行此练习。
在与本课相关的 _notebook.ipynb_ 文件中,按下“垃圾桶”图标清除所有单元格。
在本节中,你将使用一个内置于 Scikit-learn 中的小数据集,关于糖尿病。假设你想测试一种糖尿病患者的治疗方法。机器学习模型可以帮助你确定哪些患者在不同变量组合下对治疗反应更好。即使是一个非常基本的回归模型,当可视化时,也可能显示出关于变量的信息,这些信息可以帮助你组织理论上的临床试验。
✅ 回归方法有很多种,选择哪一种取决于你要回答的问题。如果你想预测一个特定年龄的人的可能身高,你会使用线性回归,因为你在寻找一个**数值值**。如果你想知道某种菜肴是否应该被认为是素食,你在寻找一个**类别分配**,因此你会使用逻辑回归。你稍后会学习更多关于逻辑回归的内容。想一想你可以向数据提出的一些问题,以及哪种方法更合适。
让我们开始这个任务。
### 导入库
对于这个任务,我们将导入一些库:
- **matplotlib**。这是一个有用的 [绘图工具](https://matplotlib.org/),我们将使用它来创建折线图。
- **numpy**。 [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) 是一个处理 Python 数值数据的有用库。
- **sklearn**。这是 [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) 库。
导入一些库来帮助你完成任务。
1. 通过输入以下代码添加导入:
```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
```
上面你正在导入 `matplotlib`, `numpy` and you are importing `datasets`, `linear_model` and `model_selection` from `sklearn`. `model_selection` is used for splitting data into training and test sets.
### The diabetes dataset
The built-in [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) includes 442 samples of data around diabetes, with 10 feature variables, some of which include:
- age: age in years
- bmi: body mass index
- bp: average blood pressure
- s1 tc: T-Cells (a type of white blood cells)
✅ This dataset includes the concept of 'sex' as a feature variable important to research around diabetes. Many medical datasets include this type of binary classification. Think a bit about how categorizations such as this might exclude certain parts of a population from treatments.
Now, load up the X and y data.
> 🎓 Remember, this is supervised learning, and we need a named 'y' target.
In a new code cell, load the diabetes dataset by calling `load_diabetes()`. The input `return_X_y=True` signals that `X` will be a data matrix, and `y` 将是回归目标。
1. 添加一些打印命令以显示数据矩阵的形状及其第一个元素:
```python
X, y = datasets.load_diabetes(return_X_y=True)
print(X.shape)
print(X[0])
```
你得到的响应是一个元组。你所做的是将元组的前两个值分别分配给 `X` and `y`。了解更多 [关于元组](https://wikipedia.org/wiki/Tuple)。
你可以看到这个数据有 442 个项目,形状为 10 个元素的数组:
```text
(442, 10)
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ 想一想数据和回归目标之间的关系。线性回归预测特征 X 和目标变量 y 之间的关系。你能在文档中找到糖尿病数据集的 [目标](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) 吗?考虑到目标,这个数据集在展示什么?
2. 接下来,通过选择数据集的第 3 列来绘制一部分数据。你可以通过使用 `:` operator to select all rows, and then selecting the 3rd column using the index (2). You can also reshape the data to be a 2D array - as required for plotting - by using `reshape(n_rows, n_columns)` 来实现。如果其中一个参数为 -1则自动计算相应的维度。
```python
X = X[:, 2]
X = X.reshape((-1,1))
```
✅ 随时打印出数据以检查其形状。
3. 现在你已经准备好要绘制的数据可以看看机器是否能帮助确定此数据集中数字之间的逻辑分割。为此你需要将数据X和目标y分成测试集和训练集。Scikit-learn 有一个简单的方法来做到这一点;你可以在给定点分割测试数据。
```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
```
4. 现在你准备好训练你的模型了!加载线性回归模型,并使用 `model.fit()` 训练你的 X 和 y 训练集:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` is a function you'll see in many ML libraries such as TensorFlow
5. Then, create a prediction using test data, using the function `predict()`。这将用于在数据组之间画线
```python
y_pred = model.predict(X_test)
```
6. 现在是时候在图中显示数据了。Matplotlib 是完成此任务的非常有用的工具。创建所有 X 和 y 测试数据的散点图,并使用预测在模型的数据组之间的最合适位置画一条线。
```python
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.xlabel('Scaled BMIs')
plt.ylabel('Disease Progression')
plt.title('A Graph Plot Showing Diabetes Progression Against BMI')
plt.show()
```
![显示糖尿病数据点的散点图](../../../../translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.zh.png)
✅ 想一想这里发生了什么。一条直线穿过许多小数据点,但它到底在做什么?你能看到如何使用这条线来预测一个新的、未见过的数据点在图的 y 轴上的位置吗?试着用语言描述这个模型的实际用途。
恭喜你,你构建了你的第一个线性回归模型,用它进行了预测,并在图中显示了它!
---
## 🚀挑战
绘制此数据集的不同变量。提示:编辑这行:`X = X[:,2]`。考虑到这个数据集的目标,你能发现糖尿病作为一种疾病的进展情况吗?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/10/)
## 复习与自学
在本教程中,你使用了简单线性回归,而不是单变量或多变量线性回归。阅读一下这些方法之间的区别,或者看看 [这个视频](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef)。
阅读更多关于回归概念的内容,并思考可以用这种技术回答哪些问题。参加这个 [教程](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) 以加深理解。
## 作业
[不同的数据集](assignment.md)
**免责声明**:
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用此翻译而引起的任何误解或误读,我们不承担责任。

@ -1,16 +0,0 @@
# 使用Scikit-learn进行回归分析
## 说明
查看Scikit-learn中的 [Linnerud 数据集](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud)。这个数据集有多个 [目标](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset)'它由来自健身俱乐部的二十名中年男性的三项运动(数据)和三项生理(目标)变量组成'。
用你自己的话描述如何创建一个回归模型,该模型将绘制腰围与完成仰卧起坐次数之间的关系。对该数据集中的其他数据点也做同样的描述。
## 评分标准
| 标准 | 杰出 | 合格 | 需要改进 |
| ----------------------------- | -------------------------------- | --------------------------- | ------------------------ |
| 提交描述性段落 | 提交的段落写得很好 | 提交了几句话 | 没有提供描述 |
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文档的母语版本视为权威来源。对于关键信息,建议进行专业人工翻译。对于因使用此翻译而引起的任何误解或误读,我们概不负责。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。虽然我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议进行专业的人类翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -1,215 +0,0 @@
# 使用 Scikit-learn 构建回归模型:准备和可视化数据
![数据可视化信息图](../../../../translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.zh.png)
信息图由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 提供
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/11/)
> ### [本课程有 R 版本!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## 介绍
现在你已经准备好了使用 Scikit-learn 构建机器学习模型的工具,你可以开始向你的数据提出问题了。在处理数据和应用机器学习解决方案时,理解如何提出正确的问题以正确地释放数据集的潜力是非常重要的。
在本课中,你将学习:
- 如何为模型构建准备数据。
- 如何使用 Matplotlib 进行数据可视化。
## 向数据提出正确的问题
你需要回答的问题将决定你将使用哪种类型的机器学习算法。而你得到的答案的质量将在很大程度上取决于你的数据的性质。
看看为本课提供的[数据](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)。你可以在 VS Code 中打开这个 .csv 文件。快速浏览一下,你会发现有空白和混合的字符串和数字数据。还有一个奇怪的列叫做 'Package',其中的数据是 'sacks'、'bins' 和其他值的混合。实际上,这些数据有点乱。
[![初学者的机器学习 - 如何分析和清理数据集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "初学者的机器学习 - 如何分析和清理数据集")
> 🎥 点击上方图片观看准备本课数据的短视频。
实际上,很少有数据集是完全准备好直接用于创建机器学习模型的。在本课中,你将学习如何使用标准 Python 库准备原始数据集。你还将学习各种数据可视化技术。
## 案例研究:'南瓜市场'
在这个文件夹中,你会在根 `data` 文件夹中找到一个名为 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .csv 文件,其中包含关于南瓜市场的 1757 行数据,按城市分组。这是从美国农业部分发的[特色作物终端市场标准报告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)中提取的原始数据。
### 准备数据
这些数据是公共领域的数据。可以从 USDA 网站按城市下载多个单独的文件。为了避免太多单独的文件我们将所有城市的数据合并到一个电子表格中因此我们已经_准备_了一些数据。接下来让我们仔细看看这些数据。
### 南瓜数据 - 初步结论
你注意到这些数据有什么特点?你已经看到有字符串、数字、空白和奇怪的值混合在一起,需要你理解。
你可以用回归技术向这些数据提出什么问题?比如“预测某个月份出售的南瓜价格”。再看看数据,你需要做一些更改来创建所需的任务数据结构。
## 练习 - 分析南瓜数据
让我们使用 [Pandas](https://pandas.pydata.org/),(名称代表 `Python Data Analysis`)这是一个非常有用的数据处理工具,来分析和准备这些南瓜数据。
### 首先,检查缺失日期
你首先需要采取措施检查缺失日期:
1. 将日期转换为月份格式(这些是美国日期,所以格式是 `MM/DD/YYYY`)。
2. 提取月份到新列。
在 Visual Studio Code 中打开 _notebook.ipynb_ 文件,并将电子表格导入到新的 Pandas 数据框中。
1. 使用 `head()` 函数查看前五行。
```python
import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
pumpkins.head()
```
✅ 你会使用什么函数来查看最后五行?
1. 检查当前数据框中是否有缺失数据:
```python
pumpkins.isnull().sum()
```
有缺失数据,但可能对当前任务没有影响。
1. 为了使数据框更容易处理,仅选择需要的列,使用 `loc` function which extracts from the original dataframe a group of rows (passed as first parameter) and columns (passed as second parameter). The expression `:`,下面的例子中表示“所有行”。
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]
```
### 其次,确定南瓜的平均价格
思考如何确定某个月份南瓜的平均价格。你会选择哪些列来完成这个任务?提示:你需要 3 列。
解决方案:取 `Low Price` and `High Price` 列的平均值填充新的 Price 列,并将 Date 列转换为仅显示月份。幸运的是,根据上面的检查,日期或价格没有缺失数据。
1. 要计算平均值,添加以下代码:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
```
✅ 随时使用 `print(month)` 打印任何你想检查的数据。
2. 现在,将转换后的数据复制到新的 Pandas 数据框中:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
打印出你的数据框,你会看到一个干净、整洁的数据集,你可以在其上构建新的回归模型。
### 但是等等!这里有些奇怪的东西
如果你看看 `Package` column, pumpkins are sold in many different configurations. Some are sold in '1 1/9 bushel' measures, and some in '1/2 bushel' measures, some per pumpkin, some per pound, and some in big boxes with varying widths.
> Pumpkins seem very hard to weigh consistently
Digging into the original data, it's interesting that anything with `Unit of Sale` equalling 'EACH' or 'PER BIN' also have the `Package` type per inch, per bin, or 'each'. Pumpkins seem to be very hard to weigh consistently, so let's filter them by selecting only pumpkins with the string 'bushel' in their `Package` 列。
1. 在文件顶部的初始 .csv 导入下添加一个过滤器:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
如果你现在打印数据,你会看到你只得到了大约 415 行包含蒲式耳单位的南瓜数据。
### 但是等等!还有一件事要做
你注意到每行的蒲式耳量不同吗?你需要标准化定价以显示每蒲式耳的价格,所以做一些数学运算来标准化它。
1. 在创建 new_pumpkins 数据框的代码块后添加这些行:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
```
✅ 根据 [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308),蒲式耳的重量取决于产品的类型,因为它是一个体积测量单位。“例如,一蒲式耳的西红柿应该重 56 磅……叶类蔬菜占据更多空间但重量较轻,所以一蒲式耳的菠菜只有 20 磅。”这都相当复杂!我们不必进行蒲式耳到磅的转换,而是按蒲式耳定价。所有这些对南瓜蒲式耳的研究,表明了解数据的性质是多么重要!
现在,你可以根据蒲式耳测量分析每单位的定价。如果你再打印一次数据,你会看到它是如何标准化的。
✅ 你注意到按半蒲式耳出售的南瓜非常贵吗?你能找出原因吗?提示:小南瓜比大南瓜贵得多,可能是因为每蒲式耳有更多的小南瓜,而一个大南瓜占用了很多空间。
## 可视化策略
数据科学家的职责之一是展示他们所处理的数据的质量和性质。为此,他们经常创建有趣的可视化,例如图表、图形和图表,展示数据的不同方面。通过这种方式,他们能够直观地展示关系和难以发现的差距。
[![初学者的机器学习 - 如何使用 Matplotlib 进行数据可视化](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "初学者的机器学习 - 如何使用 Matplotlib 进行数据可视化")
> 🎥 点击上方图片观看本课数据可视化的短视频。
可视化还可以帮助确定最适合数据的机器学习技术。例如,似乎遵循一条线的散点图表明该数据是线性回归练习的良好候选数据。
一个在 Jupyter 笔记本中效果很好的数据可视化库是 [Matplotlib](https://matplotlib.org/)(你在上一课中也看到了它)。
> 在[这些教程](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott)中获得更多数据可视化经验。
## 练习 - 试验 Matplotlib
尝试创建一些基本图表来显示你刚创建的新数据框。基本折线图会显示什么?
1. 在文件顶部Pandas 导入下方导入 Matplotlib
```python
import matplotlib.pyplot as plt
```
1. 重新运行整个笔记本以刷新。
1. 在笔记本底部添加一个单元格,将数据绘制为箱形图:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![显示价格与月份关系的散点图](../../../../translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.zh.png)
这是一个有用的图表吗?它有什么让你惊讶的地方吗?
这并不是特别有用,因为它只是在给定月份中显示你的数据点的分布。
### 使其有用
为了让图表显示有用的数据,你通常需要以某种方式对数据进行分组。让我们尝试创建一个图表,其中 y 轴显示月份,数据展示数据的分布。
1. 添加一个单元格以创建分组条形图:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![显示价格与月份关系的条形图](../../../../translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.zh.png)
这是一个更有用的数据可视化!它似乎表明南瓜的最高价格出现在九月和十月。这个符合你的预期吗?为什么或为什么不?
---
## 🚀挑战
探索 Matplotlib 提供的不同类型的可视化。哪些类型最适合回归问题?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/12/)
## 回顾与自学
看看数据可视化的多种方式。列出各种可用的库,并注明哪些库最适合特定类型的任务,例如 2D 可视化与 3D 可视化。你发现了什么?
## 作业
[探索可视化](assignment.md)
**免责声明**:
本文件是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对使用此翻译引起的任何误解或曲解承担责任。

@ -1,11 +0,0 @@
# 探索可视化
有几种不同的库可用于数据可视化。使用本课中的南瓜数据在一个示例笔记本中创建一些可视化图表使用matplotlib和seaborn。哪些库更容易使用
## 评分标准
| 标准 | 卓越 | 充分 | 需要改进 |
| ---- | ---- | ---- | -------- |
| | 提交的笔记本中有两个探索/可视化图表 | 提交的笔记本中有一个探索/可视化图表 | 未提交笔记本 |
**免责声明**:
本文件使用基于机器的AI翻译服务进行翻译。尽管我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息建议使用专业人工翻译。我们对因使用此翻译而引起的任何误解或误读不承担责任。

@ -1,4 +0,0 @@
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,370 +0,0 @@
# 使用 Scikit-learn 构建回归模型:四种回归方法
![线性回归与多项式回归信息图](../../../../translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.zh.png)
> 信息图作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/13/)
> ### [这节课也有 R 版本!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### 介绍
到目前为止,你已经用南瓜定价数据集的示例数据探索了什么是回归,并用 Matplotlib 对其进行了可视化。
现在你已经准备好深入了解机器学习中的回归。虽然可视化可以帮助你理解数据但机器学习的真正力量在于_训练模型_。模型在历史数据上进行训练以自动捕捉数据依赖关系并允许你预测模型从未见过的新数据的结果。
在本课中你将学习两种类型的回归_基本线性回归_和_多项式回归_以及这些技术背后的一些数学原理。这些模型将允许我们根据不同的输入数据预测南瓜价格。
[![初学者的机器学习 - 理解线性回归](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "初学者的机器学习 - 理解线性回归")
> 🎥 点击上面的图片观看关于线性回归的简短视频概述。
> 在整个课程中,我们假设数学知识最低,并努力使其对来自其他领域的学生可访问,因此请注意笔记、🧮 标注、图表和其他学习工具以帮助理解。
### 前提条件
到现在为止你应该熟悉我们正在检查的南瓜数据的结构。你可以在本课的_notebook.ipynb_文件中找到预加载和预清理的数据。在文件中南瓜价格按蒲式耳显示在一个新的数据框中。确保你可以在 Visual Studio Code 的内核中运行这些笔记本。
### 准备工作
提醒一下,你正在加载这些数据以便提出问题。
- 什么时候是购买南瓜的最佳时间?
- 我可以期待一个迷你南瓜盒的价格是多少?
- 我应该购买半蒲式耳的篮子还是1 1/9蒲式耳的盒子
让我们继续深入挖掘这些数据。
在上一课中,你创建了一个 Pandas 数据框并用部分原始数据集填充它按蒲式耳标准化价格。然而通过这样做你只能收集到约400个数据点而且只是在秋季月份。
看看我们在本课配套笔记本中预加载的数据。数据已预加载,并绘制了初始散点图以显示月份数据。也许我们可以通过进一步清理数据来了解更多关于数据的性质。
## 线性回归线
正如你在第一课中所学,线性回归练习的目标是能够绘制一条线来:
- **显示变量关系**。显示变量之间的关系
- **做出预测**。准确预测新数据点在该线上的位置。
这种类型的线通常是通过**最小二乘回归**绘制的。术语“最小二乘”意味着所有围绕回归线的数据点都被平方然后相加。理想情况下,最终的总和尽可能小,因为我们希望错误数量低,即`least-squares`。
我们这样做是因为我们希望建模一条线,使其与所有数据点的累计距离最小。我们在相加之前将项平方,因为我们关心的是它的大小而不是方向。
> **🧮 给我展示数学**
>
> 这条线称为_最佳拟合线_可以通过[一个方程](https://en.wikipedia.org/wiki/Simple_linear_regression)来表示:
>
> ```
> Y = a + bX
> ```
>
> `X` is the 'explanatory variable'. `Y` is the 'dependent variable'. The slope of the line is `b` and `a` is the y-intercept, which refers to the value of `Y` when `X = 0`.
>
>![calculate the slope](../../../../translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.zh.png)
>
> First, calculate the slope `b`. Infographic by [Jen Looper](https://twitter.com/jenlooper)
>
> In other words, and referring to our pumpkin data's original question: "predict the price of a pumpkin per bushel by month", `X` would refer to the price and `Y` would refer to the month of sale.
>
>![complete the equation](../../../../translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.zh.png)
>
> Calculate the value of Y. If you're paying around $4, it must be April! Infographic by [Jen Looper](https://twitter.com/jenlooper)
>
> The math that calculates the line must demonstrate the slope of the line, which is also dependent on the intercept, or where `Y` is situated when `X = 0`.
>
> You can observe the method of calculation for these values on the [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) web site. Also visit [this Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html) to watch how the numbers' values impact the line.
## Correlation
One more term to understand is the **Correlation Coefficient** between given X and Y variables. Using a scatterplot, you can quickly visualize this coefficient. A plot with datapoints scattered in a neat line have high correlation, but a plot with datapoints scattered everywhere between X and Y have a low correlation.
A good linear regression model will be one that has a high (nearer to 1 than 0) Correlation Coefficient using the Least-Squares Regression method with a line of regression.
✅ Run the notebook accompanying this lesson and look at the Month to Price scatterplot. Does the data associating Month to Price for pumpkin sales seem to have high or low correlation, according to your visual interpretation of the scatterplot? Does that change if you use more fine-grained measure instead of `Month`, eg. *day of the year* (i.e. number of days since the beginning of the year)?
In the code below, we will assume that we have cleaned up the data, and obtained a data frame called `new_pumpkins`, similar to the following:
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
---|-------|-----------|---------|------|---------|-----------|------------|-------
70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> The code to clean the data is available in [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). We have performed the same cleaning steps as in the previous lesson, and have calculated `DayOfYear` 列使用以下表达式:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
现在你已经了解了线性回归背后的数学原理,让我们创建一个回归模型,看看我们是否可以预测哪种南瓜包装的价格最好。有人为节日南瓜田购买南瓜可能需要这些信息,以优化他们的南瓜包购买。
## 寻找相关性
[![初学者的机器学习 - 寻找相关性:线性回归的关键](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "初学者的机器学习 - 寻找相关性:线性回归的关键")
> 🎥 点击上面的图片观看关于相关性的简短视频概述。
从上一课中你可能已经看到,不同月份的平均价格如下所示:
<img alt="按月平均价格" src="../2-Data/images/barchart.png" width="50%"/>
这表明应该有一些相关性,我们可以尝试训练线性回归模型来预测`Month` and `Price`, or between `DayOfYear` and `Price`. Here is the scatter plot that shows the latter relationship:
<img alt="Scatter plot of Price vs. Day of Year" src="images/scatter-dayofyear.png" width="50%" />
Let's see if there is a correlation using the `corr`函数之间的关系:
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
看起来相关性很小,-0.15 通过`Month` and -0.17 by the `DayOfMonth`, but there could be another important relationship. It looks like there are different clusters of prices corresponding to different pumpkin varieties. To confirm this hypothesis, let's plot each pumpkin category using a different color. By passing an `ax` parameter to the `scatter`绘图函数我们可以在同一张图上绘制所有点:
```python
ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="价格与年度天数的散点图" src="images/scatter-dayofyear-color.png" width="50%" />
我们的调查表明,品种对总体价格的影响比实际销售日期更大。我们可以通过柱状图看到这一点:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="价格与品种的柱状图" src="images/price-by-variety.png" width="50%" />
让我们暂时只关注一种南瓜品种,“派型”,看看日期对价格的影响:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="价格与年度天数的散点图" src="images/pie-pumpkins-scatter.png" width="50%" />
如果我们现在计算`Price` and `DayOfYear` using `corr` function, we will get something like `-0.27`之间的相关性 - 这意味着训练预测模型是有意义的。
> 在训练线性回归模型之前,确保数据干净是很重要的。线性回归不适用于缺失值,因此清除所有空单元格是有意义的:
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
另一种方法是用相应列的平均值填充这些空值。
## 简单线性回归
[![初学者的机器学习 - 使用 Scikit-learn 的线性和多项式回归](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "初学者的机器学习 - 使用 Scikit-learn 的线性和多项式回归")
> 🎥 点击上面的图片观看关于线性和多项式回归的简短视频概述。
为了训练我们的线性回归模型,我们将使用**Scikit-learn**库。
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
我们首先将输入值(特征)和预期输出(标签)分离到单独的 numpy 数组中:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> 请注意,我们必须对输入数据执行`reshape`操作,以便线性回归包能够正确理解它。线性回归期望输入为二维数组,其中数组的每一行对应一个输入特征向量。在我们的例子中,由于我们只有一个输入 - 我们需要一个形状为 N×1 的数组,其中 N 是数据集大小。
然后,我们需要将数据分成训练和测试数据集,以便在训练后验证我们的模型:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
最后,训练实际的线性回归模型只需要两行代码。我们定义`LinearRegression` object, and fit it to our data using the `fit`方法:
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
`LinearRegression` object after `fit`-ting contains all the coefficients of the regression, which can be accessed using `.coef_` property. In our case, there is just one coefficient, which should be around `-0.017`. It means that prices seem to drop a bit with time, but not too much, around 2 cents per day. We can also access the intersection point of the regression with Y-axis using `lin_reg.intercept_` - it will be around `21`在我们的例子中,表示年初的价格。
为了查看我们的模型有多准确我们可以在测试数据集上预测价格然后测量我们的预测与预期值的接近程度。这可以使用均方误差MSE指标来完成这是所有预期值和预测值之间的平方差的平均值。
```python
pred = lin_reg.predict(X_test)
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
```
我们的误差似乎在2点左右大约是17%。另一个模型质量的指标是**决定系数**,可以这样获得:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
如果值为0则意味着模型不考虑输入数据并作为*最差线性预测器*即结果的简单平均值。值为1意味着我们可以完美预测所有预期输出。在我们的例子中系数约为0.06,这相当低。
我们还可以将测试数据与回归线一起绘制,以更好地了解回归在我们的案例中是如何工作的:
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
<img alt="线性回归" src="images/linear-results.png" width="50%" />
## 多项式回归
另一种线性回归是多项式回归。有时变量之间存在线性关系 - 南瓜体积越大,价格越高 - 有时这些关系不能绘制为平面或直线。
✅ 这里有[更多示例](https://online.stat.psu.edu/stat501/lesson/9/9.8)说明可以使用多项式回归的数据
再看看日期与价格之间的关系。这个散点图看起来是否一定要用直线来分析?价格不能波动吗?在这种情况下,你可以尝试多项式回归。
✅ 多项式是可能包含一个或多个变量和系数的数学表达式
多项式回归创建一条曲线以更好地拟合非线性数据。在我们的例子中,如果我们在输入数据中包含一个平方的`DayOfYear`变量,我们应该能够用一条抛物线来拟合我们的数据,该抛物线将在一年中的某一点达到最低点。
Scikit-learn 包含一个有用的[pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline),可以将不同的数据处理步骤组合在一起。**管道**是**估计器**的链。在我们的例子中,我们将创建一个管道,首先将多项式特征添加到我们的模型中,然后训练回归:
```python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
使用`PolynomialFeatures(2)` means that we will include all second-degree polynomials from the input data. In our case it will just mean `DayOfYear`<sup>2</sup>, but given two input variables X and Y, this will add X<sup>2</sup>, XY and Y<sup>2</sup>. We may also use higher degree polynomials if we want.
Pipelines can be used in the same manner as the original `LinearRegression` object, i.e. we can `fit` the pipeline, and then use `predict` to get the prediction results. Here is the graph showing test data, and the approximation curve:
<img alt="Polynomial regression" src="images/poly-results.png" width="50%" />
Using Polynomial Regression, we can get slightly lower MSE and higher determination, but not significantly. We need to take into account other features!
> You can see that the minimal pumpkin prices are observed somewhere around Halloween. How can you explain this?
🎃 Congratulations, you just created a model that can help predict the price of pie pumpkins. You can probably repeat the same procedure for all pumpkin types, but that would be tedious. Let's learn now how to take pumpkin variety into account in our model!
## Categorical Features
In the ideal world, we want to be able to predict prices for different pumpkin varieties using the same model. However, the `Variety` column is somewhat different from columns like `Month`, because it contains non-numeric values. Such columns are called **categorical**.
[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 Click the image above for a short video overview of using categorical features.
Here you can see how average price depends on variety:
<img alt="Average price by variety" src="images/price-by-variety.png" width="50%" />
To take variety into account, we first need to convert it to numeric form, or **encode** it. There are several way we can do it:
* Simple **numeric encoding** will build a table of different varieties, and then replace the variety name by an index in that table. This is not the best idea for linear regression, because linear regression takes the actual numeric value of the index, and adds it to the result, multiplying by some coefficient. In our case, the relationship between the index number and the price is clearly non-linear, even if we make sure that indices are ordered in some specific way.
* **One-hot encoding** will replace the `Variety` column by 4 different columns, one for each variety. Each column will contain `1` if the corresponding row is of a given variety, and `0` 否则。这意味着线性回归中将有四个系数,每个南瓜品种一个,负责该特定品种的“起始价格”(或“附加价格”)。
下面的代码显示了我们如何对一个品种进行独热编码:
```python
pd.get_dummies(new_pumpkins['Variety'])
```
ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE
----|-----------|-----------|--------------------------|----------
70 | 0 | 0 | 0 | 1
71 | 0 | 0 | 0 | 1
... | ... | ... | ... | ...
1738 | 0 | 1 | 0 | 0
1739 | 0 | 1 | 0 | 0
1740 | 0 | 1 | 0 | 0
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
要使用独热编码品种作为输入训练线性回归,我们只需要正确初始化`X` and `y`数据:
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
其余代码与我们上面用于训练线性回归的代码相同。如果你尝试一下你会发现均方误差大致相同但我们得到了更高的决定系数约77%)。为了获得更准确的预测,我们可以考虑更多的分类特征,以及数值特征,如`Month` or `DayOfYear`. To get one large array of features, we can use `join`
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
```
在这里我们还考虑了`City` and `Package`类型这给我们带来了MSE 2.8410%和决定系数0.94
## 综合起来
为了制作最佳模型,我们可以使用上述示例中的组合(独热编码分类 + 数值)数据与多项式回归。以下是完整代码,供你参考:
```python
# set up training data
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# make train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# setup and train the pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# predict results for test data
pred = pipeline.predict(X_test)
# calculate MSE and determination
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
这应该给我们几乎97%的最佳决定系数MSE=2.23~8%的预测误差)。
| 模型 | MSE | 决定系数 |
|-------|-----|-----------|
| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 |
| `DayOfYear` Polynomial | 2.73 (17.0%) | 0.08 |
| `Variety` 线性 | 5.24 (19.7%) | 0.77 |
| 所有特征线性 | 2.84 (10.5%) | 0.94 |
| 所有特征多项式 | 2.23 (8.25%) | 0.97 |
🏆 做得好你在一节课中创建了四个回归模型并将模型质量提高到97%。在回归的最后一部分中,你将学习逻辑回归以确定类别。
---
## 🚀挑战
在这个笔记本中测试几个不同的变量,看看相关性如何对应于模型的准确性。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)
## 复习与自学
在本课中我们学习了线性回归。还有其他重要的回归类型。阅读逐步回归、岭回归、套索回归和弹性网回归技术。一个很好的课程是[斯坦福统计学习课程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## 作业
[构建一个模型](assignment.md)
**免责声明**:
本文件使用机器翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担责任。

@ -1,14 +0,0 @@
# 创建回归模型
## 说明
在本课中你学习了如何使用线性回归和多项式回归来构建模型。利用这些知识找到一个数据集或使用Scikit-learn的内置数据集来构建一个新的模型。在你的笔记本中解释你选择的技术并展示你的模型的准确性。如果不准确请解释原因。
## 评分标准
| 标准 | 模范表现 | 合格表现 | 需要改进 |
| -------- | ------------------------------------------------------------ | -------------------------- | ----------------------------- |
| | 提供了一个完整的笔记本,并且有详细的解决方案文档 | 解决方案不完整 | 解决方案有缺陷或存在错误 |
**免责声明**:
本文件使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文件的母语版本视为权威来源。对于重要信息,建议使用专业人工翻译。对于因使用此翻译而产生的任何误解或误读,我们不承担责任。

@ -1,4 +0,0 @@
**免责声明**:
本文档使用基于机器的AI翻译服务进行翻译。尽管我们力求准确但请注意自动翻译可能包含错误或不准确之处。应将原文档的本国语言版本视为权威来源。对于关键信息建议使用专业人工翻译。对于因使用此翻译而引起的任何误解或误读我们概不负责。

@ -1,395 +0,0 @@
# 使用逻辑回归预测分类
![逻辑回归与线性回归信息图](../../../../translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.zh.png)
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)
> ### [本课程也有 R 版本!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
## 简介
在这最后一节关于回归的课程中,我们将介绍逻辑回归,这是一种经典的机器学习技术。你可以使用这种技术来发现模式并预测二元分类。这颗糖果是巧克力吗?这种疾病是否具有传染性?这个顾客会选择这个产品吗?
在本课中,你将学习:
- 一个新的数据可视化库
- 逻辑回归的技巧
✅ 在这个 [学习模块](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) 中深入了解如何使用这种回归方法
## 前提条件
在处理南瓜数据的过程中,我们已经足够熟悉这个数据集,意识到有一个二元分类可以使用:`Color`。
让我们构建一个逻辑回归模型来预测给定一些变量_某个南瓜的颜色可能是什么_橙色 🎃 或白色 👻)。
> 为什么在回归课程中讨论二元分类?只是为了语言上的方便,因为逻辑回归实际上是 [一种分类方法](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression),虽然它基于线性。了解其他分类数据的方法将在下一个课程组中讨论。
## 定义问题
对于我们的目的,我们将其表达为二元分类:“白色”或“非白色”。我们的数据集中还有一个“条纹”类别,但实例很少,所以我们不会使用它。无论如何,一旦我们从数据集中移除空值,它就会消失。
> 🎃 有趣的事实,我们有时称白色南瓜为“幽灵”南瓜。它们不太容易雕刻,所以不像橙色南瓜那么受欢迎,但它们看起来很酷!所以我们也可以将问题重新表述为:“幽灵”或“非幽灵”。👻
## 关于逻辑回归
逻辑回归与之前学过的线性回归在几个重要方面有所不同。
[![机器学习初学者 - 了解用于分类的逻辑回归](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "机器学习初学者 - 了解用于分类的逻辑回归")
> 🎥 点击上方图片观看关于逻辑回归的简短视频概述。
### 二元分类
逻辑回归不提供与线性回归相同的功能。前者提供关于二元分类“白色或非白色”的预测而后者能够预测连续值例如给定南瓜的产地和收获时间_其价格将上涨多少_。
![南瓜分类模型](../../../../translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.zh.png)
> 信息图由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 提供
### 其他分类
还有其他类型的逻辑回归,包括多项和序数:
- **多项式**,涉及多个类别 - “橙色、白色和条纹”。
- **序数**,涉及有序类别,如果我们想根据有限数量的尺寸(迷你、小、中、大、超大、特大)对南瓜进行逻辑排序,这种方法很有用。
![多项式与序数回归](../../../../translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.zh.png)
### 变量不需要相关
还记得线性回归在变量相关性更高时效果更好吗?逻辑回归正好相反 - 变量不需要对齐。这适用于相关性较弱的数据。
### 你需要大量干净的数据
如果使用更多数据,逻辑回归会给出更准确的结果;我们的小数据集对于这个任务来说并不理想,所以请记住这一点。
[![机器学习初学者 - 数据分析与准备](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "机器学习初学者 - 数据分析与准备")
✅ 思考哪些类型的数据适合逻辑回归
## 练习 - 整理数据
首先,稍微清理一下数据,删除空值并选择一些列:
1. 添加以下代码:
```python
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
pumpkins = full_pumpkins.loc[:, columns_to_select]
pumpkins.dropna(inplace=True)
```
你可以随时查看新的数据框:
```python
pumpkins.info
```
### 可视化 - 分类图
到现在你已经加载了 [starter notebook](../../../../2-Regression/4-Logistic/notebook.ipynb) 再次使用南瓜数据并清理它,以保留包含一些变量的数据集,包括 `Color`。让我们使用不同的库来可视化数据框:[Seaborn](https://seaborn.pydata.org/index.html),它基于我们之前使用的 Matplotlib。
Seaborn 提供了一些很好的方法来可视化你的数据。例如,你可以在分类图中比较每个 `Variety``Color` 的数据分布。
1. 使用 `catplot` function, using our pumpkin data `pumpkins` 创建这样的图,并为每个南瓜类别(橙色或白色)指定颜色映射:
```python
import seaborn as sns
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
sns.catplot(
data=pumpkins, y="Variety", hue="Color", kind="count",
palette=palette,
)
```
![可视化数据的网格](../../../../translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.zh.png)
通过观察数据,你可以看到颜色数据与品种的关系。
✅ 根据这个分类图,你可以设想哪些有趣的探索?
### 数据预处理:特征和标签编码
我们的南瓜数据集的所有列都包含字符串值。处理分类数据对人类来说很直观,但对机器来说却不是。机器学习算法在处理数字时效果更好。这就是为什么编码是数据预处理阶段非常重要的一步,因为它使我们能够将分类数据转换为数值数据,而不会丢失任何信息。良好的编码有助于构建一个好的模型。
对于特征编码,主要有两种编码器:
1. 序数编码器:适用于序数变量,即其数据具有逻辑顺序的分类变量,如数据集中的 `Item Size` 列。它创建一个映射,使每个类别由一个数字表示,该数字是列中类别的顺序。
```python
from sklearn.preprocessing import OrdinalEncoder
item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
ordinal_features = ['Item Size']
ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
```
2. 分类编码器:适用于名义变量,即其数据没有逻辑顺序的分类变量,如数据集中除 `Item Size` 之外的所有特征。它是一种独热编码这意味着每个类别由一个二进制列表示如果南瓜属于该品种则编码变量等于1否则为0。
```python
from sklearn.preprocessing import OneHotEncoder
categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
categorical_encoder = OneHotEncoder(sparse_output=False)
```
然后,使用 `ColumnTransformer` 将多个编码器组合成一个步骤并将其应用于适当的列。
```python
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
```
另一方面,为了编码标签,我们使用 scikit-learn 的 `LabelEncoder`这是一个实用类帮助规范化标签使它们只包含0到 n_classes-1这里是0和1之间的值。
```python
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])
```
一旦我们对特征和标签进行编码,我们可以将它们合并到一个新的数据框 `encoded_pumpkins` 中。
```python
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
```
✅ 使用序数编码器对 `Item Size` column?
### Analyse relationships between variables
Now that we have pre-processed our data, we can analyse the relationships between the features and the label to grasp an idea of how well the model will be able to predict the label given the features.
The best way to perform this kind of analysis is plotting the data. We'll be using again the Seaborn `catplot` function, to visualize the relationships between `Item Size`, `Variety``Color` 在分类图中的优势是什么?为了更好地绘制数据,我们将使用编码后的 `Item Size` column and the unencoded `Variety` 列。
```python
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")
```
![分类图](../../../../translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.zh.png)
### 使用群图
由于颜色是一个二元类别(白色或非白色),它需要“[专门的可视化方法](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar)”。还有其他方法可以可视化这个类别与其他变量的关系。
你可以使用 Seaborn 图表并排可视化变量。
1. 尝试使用“群图”来显示值的分布:
```python
palette = {
0: 'orange',
1: 'wheat'
}
sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
```
![群图](../../../../translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.zh.png)
**注意**:上述代码可能会生成警告,因为 seaborn 无法在群图中表示如此多的数据点。一个可能的解决方案是减小标记的大小,使用 'size' 参数。然而,请注意这会影响图的可读性。
> **🧮 展示数学**
>
> 逻辑回归依赖于使用 [Sigmoid 函数](https://wikipedia.org/wiki/Sigmoid_function) 的“最大似然”概念。Sigmoid 函数在图上看起来像一个“S”形。它取一个值并将其映射到0到1之间的某个位置。它的曲线也被称为“逻辑曲线”。其公式如下
>
> ![逻辑函数](../../../../translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.zh.png)
>
> 其中 Sigmoid 的中点位于 x 的0点L 是曲线的最大值k 是曲线的陡度。如果函数的结果大于0.5则该标签将被赋予二元选择的“1”类。如果不是则将其分类为“0”。
## 构建你的模型
在 Scikit-learn 中构建一个二元分类模型非常简单。
[![机器学习初学者 - 用于数据分类的逻辑回归](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "机器学习初学者 - 用于数据分类的逻辑回归")
> 🎥 点击上方图片观看关于构建线性回归模型的简短视频概述。
1. 选择要在分类模型中使用的变量,并调用 `train_test_split()` 来拆分训练和测试集:
```python
from sklearn.model_selection import train_test_split
X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
y = encoded_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
2. 现在你可以通过调用 `fit()` 使用训练数据训练你的模型,并打印出其结果:
```python
from sklearn.metrics import f1_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('F1-score: ', f1_score(y_test, predictions))
```
看一下你模型的评分板。考虑到你只有大约1000行数据这还不错
```output
precision recall f1-score support
0 0.94 0.98 0.96 166
1 0.85 0.67 0.75 33
accuracy 0.92 199
macro avg 0.89 0.82 0.85 199
weighted avg 0.92 0.92 0.92 199
Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0 0 0 1 1]
F1-score: 0.7457627118644068
```
## 通过混淆矩阵更好地理解
虽然你可以通过打印上面的项目来获得评分报告 [terms](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report),但你可能能够通过使用 [混淆矩阵](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) 更容易地理解你的模型,以帮助我们了解模型的表现。
> 🎓 “[混淆矩阵](https://wikipedia.org/wiki/Confusion_matrix)”(或“错误矩阵”)是一个表,表达了模型的真 vs. 假阳性和阴性,从而评估预测的准确性。
1. 要使用混淆矩阵,请调用 `confusion_matrix()`
```python
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, predictions)
```
看一下你模型的混淆矩阵:
```output
array([[162, 4],
[ 11, 22]])
```
在 Scikit-learn 中混淆矩阵的行轴0是实际标签轴1是预测标签。
| | 0 | 1 |
| :---: | :---: | :---: |
| 0 | TN | FP |
| 1 | FN | TP |
这里发生了什么?假设我们的模型被要求在两个二元类别之间分类南瓜,即“白色”和“非白色”。
- 如果你的模型预测南瓜为非白色,实际上属于“非白色”类别,我们称之为真阴性,显示在左上角。
- 如果你的模型预测南瓜为白色,实际上属于“非白色”类别,我们称之为假阴性,显示在左下角。
- 如果你的模型预测南瓜为非白色,实际上属于“白色”类别,我们称之为假阳性,显示在右上角。
- 如果你的模型预测南瓜为白色,实际上属于“白色”类别,我们称之为真阳性,显示在右下角。
你可能已经猜到,真阳性和真阴性的数量越多,假阳性和假阴性的数量越少,模型的表现就越好。
混淆矩阵如何与精度和召回率相关请记住上面打印的分类报告显示了精度0.85和召回率0.67)。
精度 = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
召回率 = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
✅ 问:根据混淆矩阵,模型表现如何?答:还不错,有很多真阴性,但也有一些假阴性。
让我们借助混淆矩阵的 TP/TN 和 FP/FN 映射,重新审视之前看到的术语:
🎓 精度TP/(TP + FP) 在检索到的实例中相关实例的比例(例如,哪些标签被正确标记)
🎓 召回率TP/(TP + FN) 检索到的相关实例的比例,无论是否标记正确
🎓 f1-score2 * 精度 * 召回率)/(精度 + 召回率精度和召回率的加权平均值最好为1最差为0
🎓 支持:每个标签检索到的实例的数量
🎓 准确率TP + TN/TP + TN + FP + FN样本中准确预测的标签的百分比。
🎓 宏平均:每个标签的未加权平均指标的计算,不考虑标签不平衡。
🎓 加权平均:每个标签的平均指标的计算,考虑标签不平衡,通过其支持(每个标签的真实实例数量)加权。
✅ 如果你希望模型减少假阴性的数量,你应该关注哪个指标?
## 可视化此模型的 ROC 曲线
[![机器学习初学者 - 使用 ROC 曲线分析逻辑回归性能](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "机器学习初学者 - 使用 ROC 曲线分析逻辑回归性能")
> 🎥 点击上方图片观看关于 ROC 曲线的简短视频概述
让我们做一个可视化看看所谓的“ROC”曲线
```python
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
```
使用 Matplotlib 绘制模型的 [接收者操作特性](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) 或 ROC。ROC 曲线通常用于查看分类器的输出在真实和假阳性方面的表现。“ROC 曲线通常在 Y 轴上显示真实阳性率,在 X 轴上显示假阳性率。”因此,曲线的陡度和曲线与中点线之间的空间很重要:你希望曲线迅速向上并越过线。在我们的情况下,一开始有假阳性,然后线条正确地向上并越过:
![ROC](../../../../translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.zh.png)
最后,使用 Scikit-learn 的 [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) 计算实际的“曲线下面积”AUC
```python
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
```
结果是 `0.9749908725812341`。由于 AUC 范围从0到1你希望分数越大越好因为预测100%正确的模型的 AUC 为1在这种情况下模型_非常好_。
在未来的分类课程中,你将学习如何迭代以提高模型的分数。但现在,恭喜你!你已经完成了这些回归课程!
---
## 🚀挑战
关于逻辑回归还有很多内容需要解读!但学习的最佳方式是实验。找到一个适合这种分析的数据集,并用它构建一个模型。你学到了什么?提示:试试 [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) 找有趣的数据集。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/16/)
## 复习与自学
阅读 [斯坦福大学的这篇论文](https://web.stanford.edu/~jurafsky/slp3/5.pdf) 的前几页,了解逻辑回归的一些实际用途。思考哪些任务更适合我们到目前为止学习的回归任务。哪种方法最适合?
## 作业
[重试这个回归](assignment.md)
**免责声明**:
本文件已使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议进行专业的人类翻译。我们不对使用此翻译引起的任何误解或误读负责。

@ -1,14 +0,0 @@
# 重试一些回归
## 说明
在本课中,你使用了南瓜数据的一个子集。现在,回到原始数据,尝试使用全部数据,进行清洗和标准化,构建一个逻辑回归模型。
## 评分标准
| 标准 | 杰出表现 | 充分表现 | 需要改进 |
| -------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- |
| | 提供了一个解释清晰且表现良好的模型的笔记本 | 提供了一个表现最低限度的模型的笔记本 | 提供了一个表现不佳的模型的笔记本或没有提供模型的笔记本 |
**免责声明**
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议进行专业人工翻译。对于因使用此翻译而引起的任何误解或误读,我们概不负责。

@ -1,4 +0,0 @@
**免责声明**
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文档的母语版本视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -1,43 +0,0 @@
# 机器学习的回归模型
## 区域专题:北美南瓜价格的回归模型 🎃
在北美,南瓜经常被雕刻成万圣节的恐怖面孔。让我们一起来探索这些迷人的蔬菜吧!
![南瓜灯](../../../translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.zh.jpg)
> 图片由 <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> 拍摄,发布在 <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 你将学到什么
[![回归简介](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "回归简介视频 - 点击观看!")
> 🎥 点击上面的图片观看本课的快速简介视频
本节课程涵盖了机器学习背景下的各种回归类型。回归模型可以帮助确定变量之间的_关系_。这种类型的模型可以预测长度、温度或年龄等数值从而在分析数据点时揭示变量之间的关系。
在这一系列课程中,你将发现线性回归和逻辑回归之间的区别,以及何时应该选择其中之一。
[![初学者的机器学习 - 机器学习回归模型简介](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "初学者的机器学习 - 机器学习回归模型简介")
> 🎥 点击上面的图片观看回归模型简介短视频。
在这一组课程中,你将开始机器学习任务,包括配置 Visual Studio Code 来管理笔记本,这是数据科学家的常用环境。你将了解 Scikit-learn这是一个机器学习库并在本章中构建你的第一个模型重点是回归模型。
> 有一些有用的低代码工具可以帮助你学习如何使用回归模型。试试 [Azure ML 进行此任务](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
### 课程
1. [行业工具](1-Tools/README.md)
2. [数据管理](2-Data/README.md)
3. [线性和多项式回归](3-Linear/README.md)
4. [逻辑回归](4-Logistic/README.md)
---
### 致谢
"ML with regression" 由 [Jen Looper](https://twitter.com/jenlooper) 用 ♥️ 编写
♥️ 测验贡献者包括: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) 和 [Ornella Altunyan](https://twitter.com/ornelladotcom)
南瓜数据集由 [Kaggle 上的这个项目](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) 推荐,其数据来源于美国农业部发布的 [特种作物终端市场标准报告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)。我们根据品种添加了一些颜色数据以规范分布。这些数据属于公共领域。
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担任何责任。

@ -1,348 +0,0 @@
# 构建一个使用机器学习模型的Web应用
在本课中你将使用一个非常特别的数据集训练一个机器学习模型_过去一个世纪的UFO目击事件_这些数据来源于NUFORC的数据库。
你将学习到:
- 如何“pickle”一个训练好的模型
- 如何在Flask应用中使用该模型
我们将继续使用notebook来清理数据和训练我们的模型但你可以更进一步探索在实际环境中使用模型在一个web应用中。
要做到这一点你需要使用Flask构建一个web应用。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/17/)
## 构建应用
有几种方法可以构建web应用来使用机器学习模型。你的web架构可能会影响你训练模型的方式。想象一下你在一个企业中工作数据科学团队已经训练了一个模型他们希望你在应用中使用。
### 考虑因素
你需要问自己很多问题:
- **这是一个web应用还是一个移动应用** 如果你正在构建一个移动应用或需要在物联网环境中使用模型,你可以使用 [TensorFlow Lite](https://www.tensorflow.org/lite/) 并在Android或iOS应用中使用该模型。
- **模型将驻留在哪里?** 在云端还是本地?
- **离线支持。** 应用是否需要离线工作?
- **使用什么技术训练模型?** 所选技术可能会影响你需要使用的工具。
- **使用TensorFlow。** 如果你使用TensorFlow训练模型例如该生态系统提供了使用 [TensorFlow.js](https://www.tensorflow.org/js/) 将TensorFlow模型转换为web应用使用的能力。
- **使用PyTorch。** 如果你使用诸如 [PyTorch](https://pytorch.org/) 之类的库构建模型,你可以选择将其导出为 [ONNX](https://onnx.ai/) (开放神经网络交换) 格式,用于可以使用 [Onnx Runtime](https://www.onnxruntime.ai/) 的JavaScript web应用。这种选择将在未来的课程中探索用于一个Scikit-learn训练的模型。
- **使用Lobe.ai或Azure Custom Vision。** 如果你使用诸如 [Lobe.ai](https://lobe.ai/) 或 [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) 之类的ML SaaS软件即服务系统训练模型这类软件提供了为多种平台导出模型的方法包括构建一个定制API通过你的在线应用在云端查询。
你还有机会构建一个完整的Flask web应用该应用可以在web浏览器中自行训练模型。这也可以在JavaScript环境中使用TensorFlow.js完成。
为了我们的目的因为我们一直在使用基于Python的notebook让我们来探索将训练好的模型从这样的notebook导出为一个Python构建的web应用可读的格式所需的步骤。
## 工具
完成这项任务你需要两个工具Flask和Pickle它们都运行在Python上。
✅ 什么是 [Flask](https://palletsprojects.com/p/flask/)? 由其创建者定义为“微框架”Flask提供了使用Python和一个模板引擎构建网页的基本web框架功能。看看 [这个学习模块](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) 来练习使用Flask构建。
✅ 什么是 [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 是一个Python模块用于序列化和反序列化Python对象结构。当你“pickle”一个模型时你将其结构序列化或扁平化以便在web上使用。注意pickle本质上是不安全的因此如果被提示“un-pickle”一个文件时要小心。一个pickled文件的后缀是 `.pkl`
## 练习 - 清理数据
在本课中,你将使用由 [NUFORC](https://nuforc.org)国家UFO报告中心收集的80,000个UFO目击事件数据。这些数据包含一些有趣的UFO目击描述例如
- **长描述示例。** “一个人从夜间照在草地上的光束中出现,并跑向德州仪器的停车场”。
- **短描述示例。** “灯光追逐我们”。
[ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) 电子表格包括关于`city`、`state`和`country`的列,记录了目击事件发生的地点、物体的`shape`、其`latitude`和`longitude`。
在本课包含的空白 [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) 中:
1. 导入`pandas`、`matplotlib`和`numpy`并导入ufos电子表格。你可以查看一个样本数据集
```python
import pandas as pd
import numpy as np
ufos = pd.read_csv('./data/ufos.csv')
ufos.head()
```
1. 将ufos数据转换为一个具有新标题的小数据框。检查`Country`字段中的唯一值。
```python
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
ufos.Country.unique()
```
1. 现在你可以通过删除任何空值并仅导入1-60秒之间的目击事件来减少需要处理的数据量
```python
ufos.dropna(inplace=True)
ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
ufos.info()
```
1. 导入Scikit-learn的`LabelEncoder`库,将国家的文本值转换为数字:
✅ LabelEncoder按字母顺序编码数据
```python
from sklearn.preprocessing import LabelEncoder
ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])
ufos.head()
```
你的数据应该看起来像这样:
```output
Seconds Country Latitude Longitude
2 20.0 3 53.200000 -2.916667
3 20.0 4 28.978333 -96.645833
14 30.0 4 35.823889 -80.253611
23 60.0 4 45.582778 -122.352222
24 3.0 3 51.783333 -0.783333
```
## 练习 - 构建你的模型
现在你可以通过将数据分为训练组和测试组来准备训练模型。
1. 选择你要训练的三个特征作为X向量y向量将是`Country`. You want to be able to input `Seconds`, `Latitude` and `Longitude`并获得一个国家ID以返回。
```python
from sklearn.model_selection import train_test_split
Selected_features = ['Seconds','Latitude','Longitude']
X = ufos[Selected_features]
y = ufos['Country']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
1. 使用逻辑回归训练你的模型:
```python
from sklearn.metrics import accuracy_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('Accuracy: ', accuracy_score(y_test, predictions))
```
准确率不错 **约95%**,不出所料,因为`Country` and `Latitude/Longitude` correlate.
The model you created isn't very revolutionary as you should be able to infer a `Country` from its `Latitude` and `Longitude`但这是一个从你清理、导出并在web应用中使用的原始数据中尝试训练的好练习。
## 练习 - “pickle”你的模型
现在是时候_pickle你的模型了你可以用几行代码完成。一旦_pickle完毕加载你的pickled模型并用包含秒数、纬度和经度值的样本数据数组进行测试
```python
import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))
model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))
```
模型返回**'3'**,这是英国的国家代码。太神奇了!👽
## 练习 - 构建一个Flask应用
现在你可以构建一个Flask应用来调用你的模型并返回类似的结果但以更具视觉吸引力的方式。
1. 先在_notebook.ipynb_文件所在的地方创建一个名为**web-app**的文件夹其中包含你的_ufo-model.pkl_文件。
1. 在该文件夹中创建三个文件夹:**static**,其中包含一个**css**文件夹,以及**templates**。你现在应该有以下文件和目录:
```output
web-app/
static/
css/
templates/
notebook.ipynb
ufo-model.pkl
```
✅ 参考解决方案文件夹以查看完成的应用
1. 在_web-app_文件夹中创建的第一个文件是**requirements.txt**文件。就像JavaScript应用中的_package.json_一样该文件列出了应用所需的依赖项。在**requirements.txt**中添加以下几行:
```text
scikit-learn
pandas
numpy
flask
```
1. 现在通过导航到_web-app_运行此文件
```bash
cd web-app
```
1. 在你的终端中键入`pip install`以安装_requirements.txt_中列出的库
```bash
pip install -r requirements.txt
```
1. 现在,你准备创建另外三个文件以完成应用:
1. 在根目录中创建**app.py**。
2. 在_templates_目录中创建**index.html**。
3. 在_static/css_目录中创建**styles.css**。
1. 使用一些样式构建_styles.css_文件
```css
body {
width: 100%;
height: 100%;
font-family: 'Helvetica';
background: black;
color: #fff;
text-align: center;
letter-spacing: 1.4px;
font-size: 30px;
}
input {
min-width: 150px;
}
.grid {
width: 300px;
border: 1px solid #2d2d2d;
display: grid;
justify-content: center;
margin: 20px auto;
}
.box {
color: #fff;
background: #2d2d2d;
padding: 12px;
display: inline-block;
}
```
1. 接下来构建_index.html_文件
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>🛸 UFO Appearance Prediction! 👽</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<div class="grid">
<div class="box">
<p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p>
<form action="{{ url_for('predict')}}" method="post">
<input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" />
<input type="text" name="latitude" placeholder="Latitude" required="required" />
<input type="text" name="longitude" placeholder="Longitude" required="required" />
<button type="submit" class="btn">Predict country where the UFO is seen</button>
</form>
<p>{{ prediction_text }}</p>
</div>
</div>
</body>
</html>
```
查看此文件中的模板。注意将由应用提供的变量周围的“胡须”语法,如预测文本:`{{}}`. There's also a form that posts a prediction to the `/predict` route.
Finally, you're ready to build the python file that drives the consumption of the model and the display of predictions:
1. In `app.py`中添加:
```python
import numpy as np
from flask import Flask, request, render_template
import pickle
app = Flask(__name__)
model = pickle.load(open("./ufo-model.pkl", "rb"))
@app.route("/")
def home():
return render_template("index.html")
@app.route("/predict", methods=["POST"])
def predict():
int_features = [int(x) for x in request.form.values()]
final_features = [np.array(int_features)]
prediction = model.predict(final_features)
output = prediction[0]
countries = ["Australia", "Canada", "Germany", "UK", "US"]
return render_template(
"index.html", prediction_text="Likely country: {}".format(countries[output])
)
if __name__ == "__main__":
app.run(debug=True)
```
> 💡 提示:当你添加[`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) while running the web app using Flask, any changes you make to your application will be reflected immediately without the need to restart the server. Beware! Don't enable this mode in a production app.
If you run `python app.py` or `python3 app.py` - your web server starts up, locally, and you can fill out a short form to get an answer to your burning question about where UFOs have been sighted!
Before doing that, take a look at the parts of `app.py`:
1. First, dependencies are loaded and the app starts.
1. Then, the model is imported.
1. Then, index.html is rendered on the home route.
On the `/predict` route, several things happen when the form is posted:
1. The form variables are gathered and converted to a numpy array. They are then sent to the model and a prediction is returned.
2. The Countries that we want displayed are re-rendered as readable text from their predicted country code, and that value is sent back to index.html to be rendered in the template.
Using a model this way, with Flask and a pickled model, is relatively straightforward. The hardest thing is to understand what shape the data is that must be sent to the model to get a prediction. That all depends on how the model was trained. This one has three data points to be input in order to get a prediction.
In a professional setting, you can see how good communication is necessary between the folks who train the model and those who consume it in a web or mobile app. In our case, it's only one person, you!
---
## 🚀 Challenge
Instead of working in a notebook and importing the model to the Flask app, you could train the model right within the Flask app! Try converting your Python code in the notebook, perhaps after your data is cleaned, to train the model from within the app on a route called `train`时。追求这种方法的优缺点是什么?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/18/)
## 复习与自学
有很多方法可以构建一个使用机器学习模型的web应用。列出你可以使用JavaScript或Python构建一个利用机器学习的web应用的方法。考虑架构模型应该留在应用中还是驻留在云端如果是后者你将如何访问它画出一个应用机器学习web解决方案的架构模型。
## 作业
[尝试一个不同的模型](assignment.md)
**免责声明**
本文件是使用基于机器的人工智能翻译服务翻译的。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业人工翻译。对于使用本翻译而引起的任何误解或误读,我们概不负责。

@ -1,14 +0,0 @@
# 尝试不同的模型
## 说明
现在你已经使用训练好的回归模型构建了一个网页应用程序,请使用之前回归课程中的一个模型重新制作这个网页应用程序。你可以保持原有的风格或设计一个不同的风格以反映南瓜数据。注意更改输入以反映你的模型的训练方法。
## 评分标准
| 标准 | 杰出 | 合格 | 需要改进 |
| -------------------------- | ------------------------------------------------------ | ------------------------------------------------------ | -------------------------------------- |
| | 网页应用程序按预期运行并部署到云端 | 网页应用程序包含缺陷或显示意外结果 | 网页应用程序不能正常运行 |
**免责声明**:
本文档是使用基于机器的人工智能翻译服务翻译的。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担任何责任。

@ -1,24 +0,0 @@
# 构建一个使用你的ML模型的Web应用
在本课程的这一部分你将了解一个应用的机器学习主题如何将你的Scikit-learn模型保存为一个文件以便在Web应用中进行预测。一旦模型保存好你将学习如何在一个用Flask构建的Web应用中使用它。你将首先使用一些关于UFO目击事件的数据创建一个模型然后你将构建一个Web应用该应用将允许你输入一个包含纬度和经度值的秒数以预测哪个国家报告看到了UFO。
![UFO 停车](../../../translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.zh.jpg)
照片由 <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Michael Herren</a> 拍摄,来自 <a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 课程
1. [构建一个Web应用](1-Web-App/README.md)
## 致谢
"构建一个Web应用" 由 [Jen Looper](https://twitter.com/jenlooper) 用 ♥️ 编写。
♥️ 测验由 Rohan Raj 编写。
数据集来源于 [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings)。
Web应用架构部分参考了 [这篇文章](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) 和 [这个仓库](https://github.com/abhinavsagar/machine-learning-deployment) ,由 Abhinav Sagar 提供。
**免责声明**:
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,302 +0,0 @@
# 分类简介
在这四节课中你将探索经典机器学习的一个基本重点——_分类_。我们将使用关于亚洲和印度所有美味菜肴的数据集演示如何使用各种分类算法。希望你已经准备好享受这场美食盛宴了
![just a pinch!](../../../../translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.zh.png)
> 在这些课程中庆祝泛亚洲美食吧!图片由 [Jen Looper](https://twitter.com/jenlooper) 提供
分类是一种[监督学习](https://wikipedia.org/wiki/Supervised_learning)形式它与回归技术有很多相似之处。如果说机器学习的全部内容是通过使用数据集来预测值或事物的名称那么分类通常分为两类_二元分类_和_多类分类_。
[![Introduction to classification](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduction to classification")
> 🎥 点击上面的图片观看视频MIT的John Guttag介绍分类
记住:
- **线性回归**帮助你预测变量之间的关系并准确预测新数据点相对于这条线的位置。因此你可以预测_南瓜在九月和十二月的价格_。
- **逻辑回归**帮助你发现“二元类别”在这个价格点上_这个南瓜是橙色的还是非橙色的_
分类使用各种算法来确定数据点的标签或类别的其他方式。让我们使用这个美食数据,看看通过观察一组配料,是否可以确定它的来源美食。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)
> ### [本课程有R语言版本](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### 介绍
分类是机器学习研究人员和数据科学家的基本活动之一。从对二元值的基本分类(“这封邮件是垃圾邮件还是不是?”),到使用计算机视觉进行复杂的图像分类和分割,能够将数据分类并对其提问总是很有用的。
以更科学的方式陈述这个过程,你的分类方法创建了一个预测模型,使你能够将输入变量与输出变量之间的关系映射出来。
![binary vs. multiclass classification](../../../../translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.zh.png)
> 分类算法处理的二元与多类问题。信息图由 [Jen Looper](https://twitter.com/jenlooper) 提供
在开始清理数据、可视化数据并为我们的机器学习任务做准备之前,让我们先了解一下机器学习分类数据的各种方式。
分类源自[统计学](https://wikipedia.org/wiki/Statistical_classification),使用经典机器学习进行分类使用特征,例如`smoker`, `weight`, 和`age`来确定_患X疾病的可能性_。作为一种类似于你之前执行的回归练习的监督学习技术你的数据是有标签的机器学习算法使用这些标签来分类和预测数据集的类别或“特征”并将其分配到一个组或结果中。
✅ 想象一下关于美食的数据集。一个多类模型能够回答什么问题?一个二元模型能够回答什么问题?如果你想确定某种美食是否可能使用葫芦巴怎么办?如果你想知道,如果得到一袋满是八角、洋蓟、花椰菜和辣根的杂货,你能否做出一道典型的印度菜?
[![Crazy mystery baskets](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Crazy mystery baskets")
> 🎥 点击上面的图片观看视频。节目“Chopped”的整个前提是“神秘篮子”厨师们必须用随机选择的配料做出一些菜肴。肯定有一个机器学习模型会有所帮助
## 你好,'分类器'
我们想要向这个美食数据集提出的问题实际上是一个**多类问题**,因为我们有几个潜在的国家美食可以处理。给定一批配料,这些数据将适合哪些类别?
Scikit-learn提供了几种不同的算法来分类数据具体取决于你要解决的问题类型。在接下来的两节课中你将学习这些算法中的几种。
## 练习 - 清理和平衡你的数据
在开始这个项目之前的第一个任务是清理和**平衡**你的数据以获得更好的结果。从这个文件夹根目录中的空白_notebook.ipynb_文件开始。
首先要安装的是[imblearn](https://imbalanced-learn.org/stable/)。这是一个Scikit-learn包它将允许你更好地平衡数据你将在稍后了解更多关于此任务的内容
1. 要安装`imblearn`,运行`pip install`,如下所示:
```python
pip install imblearn
```
1. 导入需要的包以导入数据并可视化它,还要从`imblearn`中导入`SMOTE`。
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE
```
现在你已设置好读取导入数据。
1. 下一个任务是导入数据:
```python
df = pd.read_csv('../data/cuisines.csv')
```
使用`read_csv()` will read the content of the csv file _cusines.csv_ and place it in the variable `df`
1. 检查数据的形状:
```python
df.head()
```
前五行看起来像这样:
```output
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
```
1. 通过调用`info()`获取有关此数据的信息:
```python
df.info()
```
你的输出类似于:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2448 entries, 0 to 2447
Columns: 385 entries, Unnamed: 0 to zucchini
dtypes: int64(384), object(1)
memory usage: 7.2+ MB
```
## 练习 - 了解美食
现在工作开始变得更有趣了。让我们发现每种美食的数据分布
1. 通过调用`barh()`将数据绘制为条形图:
```python
df.cuisine.value_counts().plot.barh()
```
![cuisine data distribution](../../../../translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.zh.png)
有有限数量的美食,但数据分布不均。你可以修复它!在这样做之前,多探索一下。
1. 找出每种美食有多少数据并打印出来:
```python
thai_df = df[(df.cuisine == "thai")]
japanese_df = df[(df.cuisine == "japanese")]
chinese_df = df[(df.cuisine == "chinese")]
indian_df = df[(df.cuisine == "indian")]
korean_df = df[(df.cuisine == "korean")]
print(f'thai df: {thai_df.shape}')
print(f'japanese df: {japanese_df.shape}')
print(f'chinese df: {chinese_df.shape}')
print(f'indian df: {indian_df.shape}')
print(f'korean df: {korean_df.shape}')
```
输出如下所示:
```output
thai df: (289, 385)
japanese df: (320, 385)
chinese df: (442, 385)
indian df: (598, 385)
korean df: (799, 385)
```
## 发现配料
现在你可以深入挖掘数据,了解每种美食的典型配料。你应该清理会在美食之间造成混淆的重复数据,所以让我们了解这个问题。
1. 在Python中创建一个函数`create_ingredient()`来创建一个配料数据框。这个函数将首先删除一个无用的列,并按其计数对配料进行排序:
```python
def create_ingredient_df(df):
ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
inplace=False)
return ingredient_df
```
现在你可以使用该函数了解每种美食最受欢迎的前十种配料。
1. 调用`create_ingredient()` and plot it calling `barh()`
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![thai](../../../../translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.zh.png)
1. 对日本数据做同样的操作:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![japanese](../../../../translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.zh.png)
1. 现在是中国配料:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![chinese](../../../../translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.zh.png)
1. 绘制印度配料:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![indian](../../../../translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.zh.png)
1. 最后,绘制韩国配料:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![korean](../../../../translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.zh.png)
1. 现在,通过调用`drop()`删除在不同美食之间造成混淆的最常见配料:
每个人都喜欢大米、大蒜和姜!
```python
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
labels_df = df.cuisine #.unique()
feature_df.head()
```
## 平衡数据集
现在你已经清理了数据,使用[SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - “合成少数过采样技术” - 来平衡它。
1. 调用`fit_resample()`,这种策略通过插值生成新样本。
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
通过平衡你的数据,当分类它时你将获得更好的结果。想想一个二元分类。如果你大部分数据都是一个类别的,机器学习模型会更频繁地预测该类别,仅仅因为它有更多的数据。平衡数据会修正任何倾斜的数据,并有助于消除这种不平衡。
1. 现在你可以检查每种配料的标签数量:
```python
print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {df.cuisine.value_counts()}')
```
你的输出如下所示:
```output
new label count: korean 799
chinese 799
indian 799
japanese 799
thai 799
Name: cuisine, dtype: int64
old label count: korean 799
indian 598
chinese 442
japanese 320
thai 289
Name: cuisine, dtype: int64
```
数据干净、平衡,非常美味!
1. 最后一步是将你的平衡数据,包括标签和特征,保存到一个可以导出到文件的新数据框中:
```python
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. 你可以使用`transformed_df.head()` and `transformed_df.info()`再看一遍数据。保存这个数据的副本以供将来课程使用:
```python
transformed_df.head()
transformed_df.info()
transformed_df.to_csv("../data/cleaned_cuisines.csv")
```
这个新的CSV现在可以在根数据文件夹中找到。
---
## 🚀挑战
这个课程包含几个有趣的数据集。浏览`data`文件夹,看看是否有适合二元或多类分类的数据集?你会向这个数据集提出什么问题?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)
## 复习与自学
探索SMOTE的API。它最适用于哪些用例它解决了哪些问题
## 作业
[探索分类方法](assignment.md)
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。虽然我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读我们不承担任何责任。

@ -1,14 +0,0 @@
# 探索分类方法
## 说明
在 [Scikit-learn 文档](https://scikit-learn.org/stable/supervised_learning.html) 中,你会发现大量的分类数据的方法。请在这些文档中进行一次小型寻宝游戏:你的目标是寻找分类方法,并将其与本课程中的数据集、你可以提出的问题以及分类技术相匹配。创建一个电子表格或 .doc 文件的表格,并解释该数据集如何与分类算法一起工作。
## 评分标准
| 标准 | 卓越 | 适当 | 需要改进 |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| | 提供了一份概述5种算法及其分类技术的文档。概述解释得非常清楚且详细。 | 提供了一份概述3种算法及其分类技术的文档。概述解释得非常清楚且详细。 | 提供了一份概述少于三种算法及其分类技术的文档,且概述解释得既不清楚也不详细。 |
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议进行专业的人类翻译。我们不对因使用此翻译而引起的任何误解或误读承担责任。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用本翻译而引起的任何误解或误释,我们不承担任何责任。

@ -1,244 +0,0 @@
# 美食分类器 1
在本课中,你将使用上节课保存的数据集,这些数据是关于美食的平衡、干净的数据。
你将使用这个数据集与各种分类器一起工作_根据一组食材预测给定的国家美食_。在此过程中你将了解一些算法如何被用来完成分类任务。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/21/)
# 准备工作
假设你已经完成了[第一课](../1-Introduction/README.md),确保在根目录 `/data` 文件夹中存在一个 _cleaned_cuisines.csv_ 文件,以供这四节课使用。
## 练习 - 预测国家美食
1. 在本课的 _notebook.ipynb_ 文件夹中,导入该文件和 Pandas 库:
```python
import pandas as pd
cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
cuisines_df.head()
```
数据看起来是这样的:
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1. 现在,导入更多的库:
```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
from sklearn.svm import SVC
import numpy as np
```
1. 将 X 和 y 坐标分成两个用于训练的数据框架。`cuisine` 可以作为标签数据框:
```python
cuisines_label_df = cuisines_df['cuisine']
cuisines_label_df.head()
```
它看起来是这样的:
```output
0 indian
1 indian
2 indian
3 indian
4 indian
Name: cuisine, dtype: object
```
1. 删除 `Unnamed: 0` column and the `cuisine` column, calling `drop()` 列。将剩余的数据保存为可训练的特征:
```python
cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
cuisines_feature_df.head()
```
你的特征看起来是这样的:
| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
现在你已经准备好训练你的模型了!
## 选择你的分类器
现在你的数据已经清理干净并准备好进行训练,你需要决定使用哪种算法来完成这项任务。
Scikit-learn 将分类归为监督学习,在这个类别中你会发现很多分类方法。 [种类繁多](https://scikit-learn.org/stable/supervised_learning.html),乍一看可能会让人眼花缭乱。以下方法都包含分类技术:
- 线性模型
- 支持向量机
- 随机梯度下降
- 最近邻
- 高斯过程
- 决策树
- 集成方法(投票分类器)
- 多类和多输出算法(多类和多标签分类,多类-多输出分类)
> 你也可以使用[神经网络来分类数据](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification),但这超出了本课的范围。
### 选择哪个分类器?
那么你应该选择哪个分类器呢通常运行多个分类器并寻找一个好的结果是一种测试方法。Scikit-learn 提供了一个[并排比较](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html)的创建数据集,比较了 KNeighbors、SVC 两种方式、GaussianProcessClassifier、DecisionTreeClassifier、RandomForestClassifier、MLPClassifier、AdaBoostClassifier、GaussianNB 和 QuadraticDiscrinationAnalysis展示了结果的可视化
![分类器比较](../../../../translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.zh.png)
> 图表来自 Scikit-learn 的文档
> AutoML 通过在云中运行这些比较,允许你选择最适合你数据的算法,巧妙地解决了这个问题。试试[这里](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
### 更好的方法
比盲目猜测更好的方法是遵循这个可下载的[机器学习速查表](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott)上的想法。在这里,我们发现,对于我们的多类问题,我们有一些选择:
![多类问题速查表](../../../../translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.zh.png)
> 微软算法速查表的一部分,详细介绍了多类分类选项
✅ 下载这个速查表,打印出来,挂在墙上!
### 推理
让我们看看能否根据我们面临的限制推理出不同的方法:
- **神经网络太重了**。考虑到我们的数据集干净但很少,并且我们是通过笔记本本地运行训练,神经网络对于这个任务来说太重了。
- **没有两类分类器**。我们不使用两类分类器,因此排除了 one-vs-all。
- **决策树或逻辑回归可能有效**。决策树可能有效,或者多类数据的逻辑回归。
- **多类增强决策树解决不同的问题**。多类增强决策树最适合非参数任务,例如设计用于构建排名的任务,因此对我们没有用。
### 使用 Scikit-learn
我们将使用 Scikit-learn 来分析我们的数据。然而,在 Scikit-learn 中有许多方法可以使用逻辑回归。看看[需要传递的参数](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression)。
本质上有两个重要参数 - `multi_class` and `solver` - that we need to specify, when we ask Scikit-learn to perform a logistic regression. The `multi_class` value applies a certain behavior. The value of the solver is what algorithm to use. Not all solvers can be paired with all `multi_class` values.
According to the docs, in the multiclass case, the training algorithm:
- **Uses the one-vs-rest (OvR) scheme**, if the `multi_class` option is set to `ovr`
- **Uses the cross-entropy loss**, if the `multi_class` option is set to `multinomial`. (Currently the `multinomial` option is supported only by the lbfgs, sag, saga and newton-cg solvers.)"
> 🎓 The 'scheme' here can either be 'ovr' (one-vs-rest) or 'multinomial'. Since logistic regression is really designed to support binary classification, these schemes allow it to better handle multiclass classification tasks. [source](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 The 'solver' is defined as "the algorithm to use in the optimization problem". [source](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
Scikit-learn offers this table to explain how solvers handle different challenges presented by different kinds of data structures:
![solvers](../../../../translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.zh.png)
## Exercise - split the data
We can focus on logistic regression for our first training trial since you recently learned about the latter in a previous lesson.
Split your data into training and testing groups by calling `train_test_split()`
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## 练习 - 应用逻辑回归
由于你使用的是多类情况,你需要选择什么 _方案_ 和设置什么 _求解器_。使用 LogisticRegression 的多类设置和 **liblinear** 求解器进行训练。
1. 创建一个多类设置为 `ovr` and the solver set to `liblinear` 的逻辑回归:
```python
lr = LogisticRegression(multi_class='ovr',solver='liblinear')
model = lr.fit(X_train, np.ravel(y_train))
accuracy = model.score(X_test, y_test)
print ("Accuracy is {}".format(accuracy))
```
✅ 尝试一个不同的求解器,例如 `lbfgs`, which is often set as default
> Note, use Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) 函数在需要时展平你的数据。
准确率超过 **80%**,效果很好!
1. 你可以通过测试一行数据(#50来看到这个模型的实际效果
```python
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
print(f'cuisine: {y_test.iloc[50]}')
```
结果打印出来:
```output
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
cuisine: indian
```
✅ 尝试一个不同的行号并检查结果
1. 更深入地了解,你可以检查这个预测的准确性:
```python
test= X_test.iloc[50].values.reshape(-1, 1).T
proba = model.predict_proba(test)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)
topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()
```
结果打印出来 - 印度菜是最好的猜测,概率很高:
| | 0 |
| -------: | -------: |
| indian | 0.715851 |
| chinese | 0.229475 |
| japanese | 0.029763 |
| korean | 0.017277 |
| thai | 0.007634 |
✅ 你能解释为什么模型非常确定这是印度菜吗?
1. 通过打印分类报告,获取更多细节,就像在回归课程中所做的那样:
```python
y_pred = model.predict(X_test)
print(classification_report(y_test,y_pred))
```
| | precision | recall | f1-score | support |
| ------------ | --------- | ------ | -------- | ------- |
| chinese | 0.73 | 0.71 | 0.72 | 229 |
| indian | 0.91 | 0.93 | 0.92 | 254 |
| japanese | 0.70 | 0.75 | 0.72 | 220 |
| korean | 0.86 | 0.76 | 0.81 | 242 |
| thai | 0.79 | 0.85 | 0.82 | 254 |
| accuracy | 0.80 | 1199 | | |
| macro avg | 0.80 | 0.80 | 0.80 | 1199 |
| weighted avg | 0.80 | 0.80 | 0.80 | 1199 |
## 🚀挑战
在本课中,你使用清理后的数据构建了一个机器学习模型,可以根据一系列食材预测国家美食。花点时间阅读 Scikit-learn 提供的许多分类数据的选项。深入了解“求解器”的概念,了解幕后发生了什么。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/22/)
## 回顾与自学
深入了解逻辑回归背后的数学原理,在[这节课](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## 作业
[研究求解器](assignment.md)
**免责声明**
本文档已使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议使用专业人工翻译。我们对使用本翻译可能引起的任何误解或误读不承担责任。

@ -1,12 +0,0 @@
# 研究求解器
## 说明
在本课中,你了解了将算法与机器学习过程相结合以创建准确模型的各种求解器。浏览课中列出的求解器,并选择两个。在你自己的话中,对这两个求解器进行比较和对比。它们解决什么样的问题?它们如何处理各种数据结构?为什么你会选择其中一个而不是另一个?
## 评分标准
| 标准 | 模范 | 合格 | 需要改进 |
| ------ | --------------------------------------------------------------------------------------------- | ---------------------------------------------- | --------------------------- |
| | 提交的 .doc 文件包含两个段落,每个段落分别比较一个求解器,并进行深思熟虑的比较。 | 提交的 .doc 文件只有一个段落 | 作业不完整 |
**免责声明**:
本文件使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文件的本地语言版本视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。尽管我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议进行专业的人类翻译。我们不对因使用本翻译而产生的任何误解或误读负责。

@ -1,238 +0,0 @@
# 美食分类器 2
在第二节分类课程中,您将探索更多分类数值数据的方法。您还将了解选择不同分类器的后果。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)
### 前提条件
我们假设您已经完成了前面的课程,并在您的 `data` 文件夹中有一个名为 _cleaned_cuisines.csv_ 的已清理数据集,该文件位于这四节课的根目录中。
### 准备
我们已经加载了您的 _notebook.ipynb_ 文件,并将已清理的数据集划分为 X 和 y 数据框,准备进行模型构建过程。
## 分类图
之前您通过微软的速查表了解了分类数据的各种选项。Scikit-learn 提供了一个类似但更细致的速查表,可以进一步帮助您缩小估算器(分类器的另一种说法)的选择范围:
![Scikit-learn 的机器学习图](../../../../translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.zh.png)
> 提示:[在线访问此图](https://scikit-learn.org/stable/tutorial/machine_learning_map/)并点击路径以阅读文档。
### 计划
一旦您对数据有了清晰的理解,这张图就非常有帮助,因为您可以沿着路径“走”到一个决策:
- 我们有超过50个样本
- 我们想预测一个类别
- 我们有标记的数据
- 我们有少于100K个样本
- ✨ 我们可以选择一个线性SVC
- 如果这不起作用,因为我们有数值数据
- 我们可以尝试一个 ✨ KNeighbors 分类器
- 如果这不起作用,尝试 ✨ SVC 和 ✨ 集成分类器
这是一个非常有用的路径。
## 练习 - 划分数据
按照这条路径,我们应该从导入一些需要的库开始。
1. 导入所需的库:
```python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
import numpy as np
```
1. 划分您的训练和测试数据:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## 线性 SVC 分类器
支持向量聚类SVC是支持向量机家族中的一种机器学习技术下面会详细介绍。在这种方法中您可以选择一个“核”来决定如何聚类标签。参数 'C' 指的是“正则化”,它调节参数的影响。核可以是[几种](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC)中的一种;这里我们将其设置为“线性”,以确保我们利用线性 SVC。概率默认为“false”在这里我们将其设置为“true”以收集概率估计。我们将随机状态设置为“0”以打乱数据以获得概率。
### 练习 - 应用线性 SVC
首先创建一个分类器数组。我们将在测试时逐步添加到这个数组中。
1. 从线性 SVC 开始:
```python
C = 10
# Create different classifiers.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
}
```
2. 使用线性 SVC 训练您的模型并打印出报告:
```python
n_classifiers = len(classifiers)
for index, (name, classifier) in enumerate(classifiers.items()):
classifier.fit(X_train, np.ravel(y_train))
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
print(classification_report(y_test,y_pred))
```
结果相当不错:
```output
Accuracy (train) for Linear SVC: 78.6%
precision recall f1-score support
chinese 0.71 0.67 0.69 242
indian 0.88 0.86 0.87 234
japanese 0.79 0.74 0.76 254
korean 0.85 0.81 0.83 242
thai 0.71 0.86 0.78 227
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
## K-Neighbors 分类器
K-Neighbors 是“邻居”家族的机器学习方法的一部分,可以用于监督和非监督学习。在这种方法中,会创建预定义数量的点,并围绕这些点收集数据,以便为数据预测通用标签。
### 练习 - 应用 K-Neighbors 分类器
之前的分类器效果不错,并且与数据配合良好,但也许我们可以获得更好的准确性。试试 K-Neighbors 分类器。
1. 在分类器数组中添加一行(在线性 SVC 项目后添加一个逗号):
```python
'KNN classifier': KNeighborsClassifier(C),
```
结果稍差一些:
```output
Accuracy (train) for KNN classifier: 73.8%
precision recall f1-score support
chinese 0.64 0.67 0.66 242
indian 0.86 0.78 0.82 234
japanese 0.66 0.83 0.74 254
korean 0.94 0.58 0.72 242
thai 0.71 0.82 0.76 227
accuracy 0.74 1199
macro avg 0.76 0.74 0.74 1199
weighted avg 0.76 0.74 0.74 1199
```
✅ 了解 [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)
## 支持向量分类器
支持向量分类器是 [支持向量机](https://wikipedia.org/wiki/Support-vector_machine) 家族的一部分这些机器学习方法用于分类和回归任务。SVMs 将“训练示例映射到空间中的点”以最大化两个类别之间的距离。随后将数据映射到此空间,以便预测它们的类别。
### 练习 - 应用支持向量分类器
让我们尝试用支持向量分类器获得更好的准确性。
1. 在 K-Neighbors 项目后添加一个逗号,然后添加这一行:
```python
'SVC': SVC(),
```
结果相当好!
```output
Accuracy (train) for SVC: 83.2%
precision recall f1-score support
chinese 0.79 0.74 0.76 242
indian 0.88 0.90 0.89 234
japanese 0.87 0.81 0.84 254
korean 0.91 0.82 0.86 242
thai 0.74 0.90 0.81 227
accuracy 0.83 1199
macro avg 0.84 0.83 0.83 1199
weighted avg 0.84 0.83 0.83 1199
```
✅ 了解 [支持向量](https://scikit-learn.org/stable/modules/svm.html#svm)
## 集成分类器
让我们走到这条路径的尽头,尽管前面的测试结果已经相当好。让我们尝试一些“集成分类器”,特别是随机森林和 AdaBoost
```python
'RFST': RandomForestClassifier(n_estimators=100),
'ADA': AdaBoostClassifier(n_estimators=100)
```
结果非常好,尤其是随机森林:
```output
Accuracy (train) for RFST: 84.5%
precision recall f1-score support
chinese 0.80 0.77 0.78 242
indian 0.89 0.92 0.90 234
japanese 0.86 0.84 0.85 254
korean 0.88 0.83 0.85 242
thai 0.80 0.87 0.83 227
accuracy 0.84 1199
macro avg 0.85 0.85 0.84 1199
weighted avg 0.85 0.84 0.84 1199
Accuracy (train) for ADA: 72.4%
precision recall f1-score support
chinese 0.64 0.49 0.56 242
indian 0.91 0.83 0.87 234
japanese 0.68 0.69 0.69 254
korean 0.73 0.79 0.76 242
thai 0.67 0.83 0.74 227
accuracy 0.72 1199
macro avg 0.73 0.73 0.72 1199
weighted avg 0.73 0.72 0.72 1199
```
✅ 了解 [集成分类器](https://scikit-learn.org/stable/modules/ensemble.html)
这种机器学习方法“结合了几个基础估算器的预测”以提高模型的质量。在我们的示例中,我们使用了随机森林和 AdaBoost。
- [随机森林](https://scikit-learn.org/stable/modules/ensemble.html#forest),一种平均方法,构建一个充满随机性的“决策树”森林,以避免过拟合。参数 n_estimators 设置为树的数量。
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) 将分类器拟合到数据集,然后将该分类器的副本拟合到同一数据集。它关注错误分类项的权重,并调整下一个分类器的拟合以进行修正。
---
## 🚀挑战
这些技术中的每一个都有大量参数可以调整。研究每个技术的默认参数,并思考调整这些参数对模型质量的影响。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)
## 复习与自学
这些课程中有很多术语,所以花点时间复习一下[这个列表](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott)中的有用术语!
## 作业
[参数调试](assignment.md)
**免责声明**:
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的母语版本为权威来源。对于关键信息,建议使用专业的人类翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。

@ -1,14 +0,0 @@
# 参数演练
## 说明
在使用这些分类器时有很多默认设置的参数。VS Code 中的 Intellisense 可以帮助你深入了解它们。在本课中采用一种机器学习分类技术,并通过调整各种参数值来重新训练模型。创建一个笔记本,解释为什么某些更改有助于模型质量,而其他更改则会降低质量。请在回答中详细说明。
## 评分标准
| 标准 | 卓越 | 适当 | 需要改进 |
| ------ | ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ----------------------------- |
| | 提供一个完全构建的分类器的笔记本,并在文本框中解释参数调整和更改 | 提供的笔记本部分完成或解释不充分 | 提供的笔记本有错误或缺陷 |
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于重要信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担责任。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。尽管我们力求准确但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议使用专业的人类翻译。对于因使用此翻译而引起的任何误解或误读我们概不负责。

@ -1,317 +0,0 @@
# 构建一个美食推荐 Web 应用
在本课中,你将使用之前课程中学到的一些技术,结合贯穿本系列课程使用的美食数据集,构建一个分类模型。此外,你还将构建一个小型 Web 应用来使用保存的模型,并利用 Onnx 的 Web 运行时。
机器学习最有用的实际应用之一是构建推荐系统,你今天可以迈出这一方向的第一步!
[![展示这个 Web 应用](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "应用机器学习")
> 🎥 点击上面的图片观看视频Jen Looper 使用分类美食数据构建 Web 应用
## [课前小测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/25/)
在本课中你将学习:
- 如何构建模型并将其保存为 Onnx 模型
- 如何使用 Netron 检查模型
- 如何在 Web 应用中使用你的模型进行推断
## 构建你的模型
构建应用机器学习系统是利用这些技术为你的业务系统服务的重要部分。你可以使用 Onnx 在 Web 应用中使用模型(如果需要,也可以在离线环境中使用它们)。
在[之前的课程](../../3-Web-App/1-Web-App/README.md)中,你构建了一个关于 UFO 目击事件的回归模型,将其“腌制”并在 Flask 应用中使用。虽然这种架构非常有用,但它是一个全栈的 Python 应用,而你的需求可能包括使用 JavaScript 应用。
在本课中,你可以构建一个基于 JavaScript 的基本推断系统。但首先,你需要训练一个模型并将其转换为 Onnx 格式。
## 练习 - 训练分类模型
首先,使用我们之前使用的清理后的美食数据集训练一个分类模型。
1. 首先导入有用的库:
```python
!pip install skl2onnx
import pandas as pd
```
你需要 '[skl2onnx](https://onnx.ai/sklearn-onnx/)' 来帮助将你的 Scikit-learn 模型转换为 Onnx 格式。
1. 然后,以与之前课程相同的方式处理你的数据,通过 `read_csv()` 读取 CSV 文件:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. 移除前两个不必要的列,并将剩余的数据保存为 'X'
```python
X = data.iloc[:,2:]
X.head()
```
1. 将标签保存为 'y'
```python
y = data[['cuisine']]
y.head()
```
### 开始训练流程
我们将使用具有良好准确性的 'SVC' 库。
1. 从 Scikit-learn 导入适当的库:
```python
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report
```
1. 分离训练集和测试集:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. 构建一个 SVC 分类模型,如你在之前的课程中所做的那样:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. 现在,测试你的模型,调用 `predict()`
```python
y_pred = model.predict(X_test)
```
1. 打印分类报告以检查模型的质量:
```python
print(classification_report(y_test,y_pred))
```
如我们之前所见,准确性很好:
```output
precision recall f1-score support
chinese 0.72 0.69 0.70 257
indian 0.91 0.87 0.89 243
japanese 0.79 0.77 0.78 239
korean 0.83 0.79 0.81 236
thai 0.72 0.84 0.78 224
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
### 将你的模型转换为 Onnx
确保使用正确的 Tensor 数进行转换。此数据集中列出了 380 种成分,因此你需要在 `FloatTensorType` 中标注该数字:
1. 使用 380 的 tensor 数进行转换。
```python
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
initial_type = [('float_input', FloatTensorType([None, 380]))]
options = {id(model): {'nocl': True, 'zipmap': False}}
```
1. 创建 onx 文件并保存为 **model.onnx**
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> 注意,你可以在转换脚本中传递[选项](https://onnx.ai/sklearn-onnx/parameterized.html)。在本例中,我们将 'nocl' 设置为 True并将 'zipmap' 设置为 False。由于这是一个分类模型你可以选择移除 ZipMap它会生成一个字典列表不必要`nocl` refers to class information being included in the model. Reduce your model's size by setting `nocl` to 'True'.
Running the entire notebook will now build an Onnx model and save it to this folder.
## View your model
Onnx models are not very visible in Visual Studio code, but there's a very good free software that many researchers use to visualize the model to ensure that it is properly built. Download [Netron](https://github.com/lutzroeder/Netron) and open your model.onnx file. You can see your simple model visualized, with its 380 inputs and classifier listed:
![Netron visual](../../../../translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.zh.png)
Netron is a helpful tool to view your models.
Now you are ready to use this neat model in a web app. Let's build an app that will come in handy when you look in your refrigerator and try to figure out which combination of your leftover ingredients you can use to cook a given cuisine, as determined by your model.
## Build a recommender web application
You can use your model directly in a web app. This architecture also allows you to run it locally and even offline if needed. Start by creating an `index.html` file in the same folder where you stored your `model.onnx` 文件。
1. 在这个文件 _index.html_ 中,添加以下标记:
```html
<!DOCTYPE html>
<html>
<header>
<title>Cuisine Matcher</title>
</header>
<body>
...
</body>
</html>
```
1. 现在,在 `body` 标签内工作,添加一些标记以显示反映某些成分的复选框列表:
```html
<h1>Check your refrigerator. What can you create?</h1>
<div id="wrapper">
<div class="boxCont">
<input type="checkbox" value="4" class="checkbox">
<label>apple</label>
</div>
<div class="boxCont">
<input type="checkbox" value="247" class="checkbox">
<label>pear</label>
</div>
<div class="boxCont">
<input type="checkbox" value="77" class="checkbox">
<label>cherry</label>
</div>
<div class="boxCont">
<input type="checkbox" value="126" class="checkbox">
<label>fenugreek</label>
</div>
<div class="boxCont">
<input type="checkbox" value="302" class="checkbox">
<label>sake</label>
</div>
<div class="boxCont">
<input type="checkbox" value="327" class="checkbox">
<label>soy sauce</label>
</div>
<div class="boxCont">
<input type="checkbox" value="112" class="checkbox">
<label>cumin</label>
</div>
</div>
<div style="padding-top:10px">
<button onClick="startInference()">What kind of cuisine can you make?</button>
</div>
```
注意,每个复选框都有一个值。这反映了成分在数据集中的索引位置。例如,苹果在这个按字母顺序排列的列表中占据第五列,所以它的值是 '4',因为我们从 0 开始计数。你可以查阅[成分电子表格](../../../../4-Classification/data/ingredient_indexes.csv)来发现给定成分的索引。
继续在 index.html 文件中工作,在最后一个关闭的 `</div>` 后添加一个脚本块,其中调用模型。
1. 首先,导入 [Onnx Runtime](https://www.onnxruntime.ai/)
```html
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
```
> Onnx Runtime 用于在广泛的硬件平台上运行你的 Onnx 模型,包括优化和使用的 API。
1. 一旦 Runtime 就位,你可以调用它:
```html
<script>
const ingredients = Array(380).fill(0);
const checks = [...document.querySelectorAll('.checkbox')];
checks.forEach(check => {
check.addEventListener('change', function() {
// toggle the state of the ingredient
// based on the checkbox's value (1 or 0)
ingredients[check.value] = check.checked ? 1 : 0;
});
});
function testCheckboxes() {
// validate if at least one checkbox is checked
return checks.some(check => check.checked);
}
async function startInference() {
let atLeastOneChecked = testCheckboxes()
if (!atLeastOneChecked) {
alert('Please select at least one ingredient.');
return;
}
try {
// create a new session and load the model.
const session = await ort.InferenceSession.create('./model.onnx');
const input = new ort.Tensor(new Float32Array(ingredients), [1, 380]);
const feeds = { float_input: input };
// feed inputs and run
const results = await session.run(feeds);
// read from results
alert('You can enjoy ' + results.label.data[0] + ' cuisine today!')
} catch (e) {
console.log(`failed to inference ONNX model`);
console.error(e);
}
}
</script>
```
在这段代码中,发生了几件事:
1. 你创建了一个包含 380 个可能值1 或 0的数组这些值将根据成分复选框是否被选中而设置并发送到模型进行推断。
2. 你创建了一个复选框数组,并提供了一种确定它们是否被选中的方法,在 `init` function that is called when the application starts. When a checkbox is checked, the `ingredients` array is altered to reflect the chosen ingredient.
3. You created a `testCheckboxes` function that checks whether any checkbox was checked.
4. You use `startInference` function when the button is pressed and, if any checkbox is checked, you start inference.
5. The inference routine includes:
1. Setting up an asynchronous load of the model
2. Creating a Tensor structure to send to the model
3. Creating 'feeds' that reflects the `float_input` input that you created when training your model (you can use Netron to verify that name)
4. Sending these 'feeds' to the model and waiting for a response
## Test your application
Open a terminal session in Visual Studio Code in the folder where your index.html file resides. Ensure that you have [http-server](https://www.npmjs.com/package/http-server) installed globally, and type `http-server` 提示符下。一个本地主机应该会打开,你可以查看你的 Web 应用。检查根据各种成分推荐的美食:
![成分 Web 应用](../../../../translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.zh.png)
恭喜,你已经创建了一个带有几个字段的“推荐” Web 应用。花点时间来完善这个系统吧!
## 🚀挑战
你的 Web 应用非常简单,因此继续使用[ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv) 数据中的成分及其索引来完善它。哪些口味组合可以创造出特定的国家菜肴?
## [课后小测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/26/)
## 复习与自学
虽然本课只是触及了创建食材推荐系统的实用性,但这个机器学习应用领域有很多丰富的例子。阅读更多关于这些系统如何构建的内容:
- https://www.sciencedirect.com/topics/computer-science/recommendation-engine
- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/
- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/
## 作业
[构建一个新的推荐系统](assignment.md)
**免责声明**:
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议进行专业人工翻译。我们对因使用此翻译而引起的任何误解或误读不承担责任。

@ -1,14 +0,0 @@
# 构建推荐系统
## 说明
根据你在本课中的练习,你现在知道如何使用 Onnx Runtime 和转换后的 Onnx 模型来构建基于 JavaScript 的 web 应用。尝试使用这些课程中的数据或其他来源的数据(请注明出处)来构建一个新的推荐系统。你可以根据各种个性属性创建一个宠物推荐系统,或者根据一个人的心情创建一个音乐类型推荐系统。发挥你的创造力吧!
## 评分标准
| 标准 | 杰出表现 | 合格表现 | 需要改进 |
| -------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- |
| | 提供了一个 web 应用和笔记本,且两者都记录良好并能运行 | 其中一个缺失或有缺陷 | 两者都缺失或有缺陷 |
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -1,30 +0,0 @@
# 分类入门
## 区域话题:美味的亚洲和印度美食 🍜
在亚洲和印度,饮食传统极其多样化,而且非常美味!让我们看看有关区域美食的数据,试着了解它们的成分。
![泰国食品卖家](../../../translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.zh.jpg)
> 照片由 <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lisheng Chang</a> 提供,来自 <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 你将学到什么
在本节中,你将基于之前对回归的学习,了解其他分类器,以便更好地理解数据。
> 有一些有用的低代码工具可以帮助你学习如何使用分类模型。试试 [Azure ML 来完成这个任务](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## 课程
1. [分类简介](1-Introduction/README.md)
2. [更多分类器](2-Classifiers-1/README.md)
3. [其他分类器](3-Classifiers-2/README.md)
4. [应用机器学习:构建一个 web 应用](4-Applied/README.md)
## 致谢
"分类入门" 由 [Cassie Breviu](https://www.twitter.com/cassiebreviu) 和 [Jen Looper](https://www.twitter.com/jenlooper) 用 ♥️ 编写
美味的美食数据集来源于 [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines)。
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而引起的任何误解或误释承担责任。

@ -1,221 +0,0 @@
# 聚类简介
聚类是一种[无监督学习](https://wikipedia.org/wiki/Unsupervised_learning)方法,假设数据集是未标记的,或者其输入未与预定义的输出匹配。它使用各种算法对未标记的数据进行分类,并根据数据中识别出的模式提供分组。
[![PSquare的No One Like You](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "PSquare的No One Like You")
> 🎥 点击上面的图片观看视频。在学习聚类机器学习的同时享受一些尼日利亚舞厅音乐——这是PSquare在2014年发布的一首备受好评的歌曲。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)
### 简介
[聚类](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124)对于数据探索非常有用。让我们看看它是否可以帮助发现尼日利亚观众消费音乐的趋势和模式。
✅ 花一分钟时间思考聚类的用途。在现实生活中,每当你有一堆洗好的衣服需要分类到家庭成员的衣物中时,就会发生聚类🧦👕👖🩲。在数据科学中,聚类发生在尝试分析用户的偏好或确定任何未标记数据集的特征时。聚类在某种程度上帮助我们理解混乱,比如一个袜子抽屉。
[![机器学习简介](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "聚类简介")
> 🎥 点击上面的图片观看视频MIT的John Guttag介绍聚类
在专业环境中,聚类可以用来确定市场细分,例如确定哪个年龄段购买哪些物品。另一个用途是异常检测,可能用于从信用卡交易数据集中检测欺诈行为。或者你可能会使用聚类来确定一批医学扫描中的肿瘤。
✅ 想一分钟,你可能在银行、电子商务或商业环境中如何遇到过聚类。
> 🎓 有趣的是聚类分析起源于20世纪30年代的人类学和心理学领域。你能想象它可能是如何使用的吗
或者,你可以用它来对搜索结果进行分组——例如购物链接、图片或评论。当你有一个大型数据集需要缩小并进行更细粒度的分析时,聚类是非常有用的,因此这种技术可以在构建其他模型之前了解数据。
✅ 一旦你的数据被组织成聚类你可以为其分配一个聚类ID这种技术在保护数据集隐私时非常有用你可以通过其聚类ID而不是更具揭示性的可识别数据来引用数据点。你能想到其他为什么你会用聚类ID而不是聚类的其他元素来识别它的原因吗
在这个[学习模块](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)中深入了解聚类技术
## 聚类入门
[Scikit-learn提供了大量](https://scikit-learn.org/stable/modules/clustering.html)的聚类方法。你选择的类型将取决于你的用例。根据文档每种方法都有不同的优点。以下是Scikit-learn支持的方法及其适用用例的简化表
| 方法名称 | 用例 |
| :--------------------------- | :--------------------------------------------------------------------- |
| K-Means | 通用,归纳式 |
| Affinity propagation | 许多,不均匀的聚类,归纳式 |
| Mean-shift | 许多,不均匀的聚类,归纳式 |
| Spectral clustering | 少数,均匀的聚类,传导式 |
| Ward hierarchical clustering | 许多,受约束的聚类,传导式 |
| Agglomerative clustering | 许多,受约束的,非欧几里得距离,传导式 |
| DBSCAN | 非平面几何,不均匀的聚类,传导式 |
| OPTICS | 非平面几何,不均匀的聚类,密度可变,传导式 |
| Gaussian mixtures | 平面几何,归纳式 |
| BIRCH | 带有离群值的大型数据集,归纳式 |
> 🎓 我们如何创建聚类与我们如何将数据点聚集成组有很大关系。让我们解开一些词汇:
>
> 🎓 ['传导式' vs. '归纳式'](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> 传导推理是从观察到的训练案例中推导出来的,这些案例映射到特定的测试案例。归纳推理是从训练案例中推导出来的,这些案例映射到一般规则,然后才应用于测试案例。
>
> 举个例子:假设你有一个部分标记的数据集。有些东西是'唱片',有些是'CD',有些是空白的。你的任务是为空白部分提供标签。如果你选择归纳方法,你会训练一个模型寻找'唱片'和'CD',并将这些标签应用于未标记的数据。这种方法在分类实际上是'磁带'的东西时会遇到麻烦。另一方面,传导方法更有效地处理这种未知数据,因为它会将相似的项目分组,然后将标签应用于一个组。在这种情况下,聚类可能反映'圆形音乐物品'和'方形音乐物品'。
>
> 🎓 ['非平面' vs. '平面'几何](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
>
> 源自数学术语,非平面与平面几何指的是通过'平面'[欧几里得](https://wikipedia.org/wiki/Euclidean_geometry))或'非平面'(非欧几里得)几何方法测量点之间的距离。
>
>'平面'在此上下文中指的是欧几里得几何(其中的一部分被教授为'平面'几何),而非平面指的是非欧几里得几何。几何与机器学习有什么关系?好吧,作为两个根植于数学的领域,必须有一种常见的方法来测量聚类中点之间的距离,这可以通过'平面'或'非平面'方式完成,具体取决于数据的性质。[欧几里得距离](https://wikipedia.org/wiki/Euclidean_distance)被测量为两点之间线段的长度。[非欧几里得距离](https://wikipedia.org/wiki/Non-Euclidean_geometry)沿曲线测量。如果你的数据在可视化时似乎不存在于平面上,你可能需要使用专门的算法来处理它。
>
![平面 vs 非平面几何信息图](../../../../translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.zh.png)
> 信息图由[Dasani Madipalli](https://twitter.com/dasani_decoded)制作
>
> 🎓 ['距离'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
>
> 聚类由其距离矩阵定义,例如点之间的距离。这种距离可以通过几种方式测量。欧几里得聚类由点值的平均值定义,并包含一个'质心'或中心点。因此距离通过到质心的距离来测量。非欧几里得距离指的是'聚类中心点',即最接近其他点的点。聚类中心点反过来可以通过各种方式定义。
>
> 🎓 ['受约束'](https://wikipedia.org/wiki/Constrained_clustering)
>
> [受约束聚类](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf)将'半监督'学习引入这种无监督方法。点之间的关系被标记为'不能链接'或'必须链接',因此在数据集上强加了一些规则。
>
> 举个例子:如果一个算法在一批未标记或半标记的数据上自由运行,它产生的聚类可能质量很差。在上面的例子中,聚类可能会将'圆形音乐物品'、'方形音乐物品'、'三角形物品'和'饼干'分组。如果给出一些约束或规则(“项目必须是塑料制成的”,“项目需要能够产生音乐”),这可以帮助'约束'算法做出更好的选择。
>
> 🎓 '密度'
>
> 被认为是'噪声'的数据被认为是'密集'的。通过检查,每个聚类中点之间的距离可能证明是更密集或更稀疏的,因此需要使用适当的聚类方法来分析这种数据。[这篇文章](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html)展示了使用K-Means聚类与HDBSCAN算法探索具有不均匀聚类密度的噪声数据集的区别。
## 聚类算法
有超过100种聚类算法它们的使用取决于手头数据的性质。让我们讨论一些主要的
- **层次聚类**。如果一个对象是通过其与附近对象的接近程度来分类的而不是与远离的对象分类则聚类是基于其成员与其他对象的距离形成的。Scikit-learn的凝聚聚类是层次聚类。
![层次聚类信息图](../../../../translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.zh.png)
> 信息图由[Dasani Madipalli](https://twitter.com/dasani_decoded)制作
- **质心聚类**。这种流行的算法需要选择'k',即要形成的聚类数量,然后算法确定聚类的中心点并围绕该点收集数据。[K-means聚类](https://wikipedia.org/wiki/K-means_clustering)是质心聚类的流行版本。中心由最近的均值确定,因此得名。聚类的平方距离被最小化。
![质心聚类信息图](../../../../translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.zh.png)
> 信息图由[Dasani Madipalli](https://twitter.com/dasani_decoded)制作
- **基于分布的聚类**。基于统计建模,基于分布的聚类中心在确定数据点属于某个聚类的概率,并相应地分配它。高斯混合方法属于这种类型。
- **基于密度的聚类**。数据点根据其密度或围绕彼此的分组被分配到聚类。远离组的数据点被视为离群点或噪声。DBSCAN、Mean-shift和OPTICS属于这种类型的聚类。
- **基于网格的聚类**。对于多维数据集,创建一个网格并将数据分配到网格的单元中,从而创建聚类。
## 练习 - 聚类你的数据
聚类作为一种技术大大受益于适当的可视化,所以让我们开始可视化我们的音乐数据。这个练习将帮助我们决定哪种聚类方法最有效地用于这种数据的性质。
1. 打开此文件夹中的[_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb)文件。
1. 导入`Seaborn`包以获得良好的数据可视化效果。
```python
!pip install seaborn
```
1. 从[_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv)中追加歌曲数据。加载一个包含一些关于歌曲数据的数据框架。通过导入库并导出数据来准备探索此数据:
```python
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("../data/nigerian-songs.csv")
df.head()
```
检查前几行数据:
| | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- |
| 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
| 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
1. 获取有关数据框架的信息,调用`info()`
```python
df.info()
```
输出如下所示:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 530 entries, 0 to 529
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 530 non-null object
1 album 530 non-null object
2 artist 530 non-null object
3 artist_top_genre 530 non-null object
4 release_date 530 non-null int64
5 length 530 non-null int64
6 popularity 530 non-null int64
7 danceability 530 non-null float64
8 acousticness 530 non-null float64
9 energy 530 non-null float64
10 instrumentalness 530 non-null float64
11 liveness 530 non-null float64
12 loudness 530 non-null float64
13 speechiness 530 non-null float64
14 tempo 530 non-null float64
15 time_signature 530 non-null int64
dtypes: float64(8), int64(4), object(4)
memory usage: 66.4+ KB
```
1. 通过调用`isnull()`并验证总和为0来仔细检查是否有空值
```python
df.isnull().sum()
```
看起来不错:
```output
name 0
album 0
artist 0
artist_top_genre 0
release_date 0
length 0
popularity 0
danceability 0
acousticness 0
energy 0
instrumentalness 0
liveness 0
loudness 0
speechiness 0
tempo 0
time_signature 0
dtype: int64
```
1. 描述数据:
```python
df.describe()
```
| | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- |
| count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 |
| mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 |
| std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 |
| min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 |
| 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 |
| 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 |
| 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 |
| max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 |
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)
## 复习与自学
在应用聚类算法之前,正如我们所学,了解数据集的性质是一个好主意。可以在[这里](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)阅读更多相关内容。
[这篇有用的文章](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/)会带你了解在不同数据形状下,各种聚类算法的不同表现方式。
## 作业
[研究其他聚类的可视化方式](assignment.md)
**免责声明**
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的本国语言版本视为权威来源。对于关键信息,建议进行专业人工翻译。对于因使用此翻译而引起的任何误解或误读,我们概不负责。

@ -1,14 +0,0 @@
# 研究其他聚类的可视化方法
## 指导说明
在本课中,你已经学习了一些可视化技术,以便为聚类做好数据绘图的准备。特别是散点图对于寻找对象组非常有用。研究不同的方法和不同的库来创建散点图,并在笔记本中记录你的工作。你可以使用本课的数据、其他课程的数据或你自己找到的数据(不过请在笔记本中注明其来源)。使用散点图绘制一些数据,并解释你发现了什么。
## 评分标准
| 标准 | 模范 | 适当 | 需要改进 |
| -------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- |
| | 提交一个包含五个有详细记录的散点图的笔记本 | 提交一个包含少于五个散点图且记录不太详细的笔记本 | 提交一个不完整的笔记本 |
**免责声明**:
本文档是使用基于机器的AI翻译服务翻译的。尽管我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始文档视为权威来源。对于关键信息建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读我们不承担责任。

@ -1,4 +0,0 @@
**免责声明**:
本文件使用基于机器的AI翻译服务进行翻译。尽管我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息建议使用专业的人类翻译。我们不对因使用本翻译而引起的任何误解或误读承担责任。

@ -1,250 +0,0 @@
# K-Means 聚类
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)
在本课中,你将学习如何使用 Scikit-learn 和之前导入的尼日利亚音乐数据集创建聚类。我们将介绍 K-Means 聚类的基础知识。请记住,正如你在之前的课程中所学,有很多方法可以处理聚类,使用的方法取决于你的数据。我们将尝试 K-Means因为它是最常见的聚类技术。让我们开始吧
你将学习的术语:
- Silhouette 评分
- 肘部法
- 惯性
- 方差
## 介绍
[K-Means 聚类](https://wikipedia.org/wiki/K-means_clustering) 是一种源自信号处理领域的方法。它用于通过一系列观察将数据分成 'k' 个聚类。每个观察都试图将一个给定的数据点分配到离它最近的 '均值',即聚类的中心点。
这些聚类可以可视化为 [Voronoi 图](https://wikipedia.org/wiki/Voronoi_diagram),其中包括一个点(或 '种子')及其对应的区域。
![voronoi diagram](../../../../translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.zh.png)
> 信息图由 [Jen Looper](https://twitter.com/jenlooper) 提供
K-Means 聚类过程 [分三步执行](https://scikit-learn.org/stable/modules/clustering.html#k-means)
1. 算法通过从数据集中采样选择 k 个中心点。之后,它循环执行以下步骤:
1. 将每个样本分配到最近的质心。
2. 通过取分配给前一个质心的所有样本的平均值来创建新的质心。
3. 然后计算新旧质心之间的差异,并重复直到质心稳定。
使用 K-Means 的一个缺点是你需要确定 'k',即质心的数量。幸运的是,'肘部法'可以帮助估计一个好的起始值。你将在稍后尝试它。
## 先决条件
你将在本课的 [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) 文件中工作,该文件包含你在上一课中完成的数据导入和初步清理。
## 练习 - 准备工作
首先,再次查看歌曲数据。
1. 为每列创建一个箱线图,调用 `boxplot()`
```python
plt.figure(figsize=(20,20), dpi=200)
plt.subplot(4,3,1)
sns.boxplot(x = 'popularity', data = df)
plt.subplot(4,3,2)
sns.boxplot(x = 'acousticness', data = df)
plt.subplot(4,3,3)
sns.boxplot(x = 'energy', data = df)
plt.subplot(4,3,4)
sns.boxplot(x = 'instrumentalness', data = df)
plt.subplot(4,3,5)
sns.boxplot(x = 'liveness', data = df)
plt.subplot(4,3,6)
sns.boxplot(x = 'loudness', data = df)
plt.subplot(4,3,7)
sns.boxplot(x = 'speechiness', data = df)
plt.subplot(4,3,8)
sns.boxplot(x = 'tempo', data = df)
plt.subplot(4,3,9)
sns.boxplot(x = 'time_signature', data = df)
plt.subplot(4,3,10)
sns.boxplot(x = 'danceability', data = df)
plt.subplot(4,3,11)
sns.boxplot(x = 'length', data = df)
plt.subplot(4,3,12)
sns.boxplot(x = 'release_date', data = df)
```
这些数据有点嘈杂:通过观察每列的箱线图,你可以看到异常值。
![outliers](../../../../translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.zh.png)
你可以遍历数据集并删除这些异常值,但这会使数据变得非常少。
1. 现在,选择你将在聚类练习中使用的列。选择具有相似范围的列,并将 `artist_top_genre` 列编码为数值数据:
```python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')]
y = df['artist_top_genre']
X['artist_top_genre'] = le.fit_transform(X['artist_top_genre'])
y = le.transform(y)
```
1. 现在你需要选择目标聚类的数量。你知道从数据集中提取了 3 种歌曲类型,所以我们试试 3 个聚类:
```python
from sklearn.cluster import KMeans
nclusters = 3
seed = 0
km = KMeans(n_clusters=nclusters, random_state=seed)
km.fit(X)
# Predict the cluster for each data point
y_cluster_kmeans = km.predict(X)
y_cluster_kmeans
```
你会看到一个数组打印出每行数据框的预测聚类0、1 或 2
1. 使用此数组计算 'silhouette score'
```python
from sklearn import metrics
score = metrics.silhouette_score(X, y_cluster_kmeans)
score
```
## Silhouette 评分
寻找接近 1 的 silhouette 评分。此评分范围从 -1 到 1如果评分为 1聚类密集且与其他聚类分离良好。接近 0 的值表示聚类重叠,样本非常接近相邻聚类的决策边界。[(来源)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
我们的评分是 **0.53**,所以在中间。这表明我们的数据不太适合这种聚类,但让我们继续。
### 练习 - 构建模型
1. 导入 `KMeans` 并开始聚类过程。
```python
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
```
这里有几个部分值得解释。
> 🎓 range: 这些是聚类过程的迭代次数
> 🎓 random_state: "确定质心初始化的随机数生成。" [来源](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 WCSS: "组内平方和" 测量聚类内所有点到聚类质心的平方平均距离。 [来源](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce)
> 🎓 惯性: K-Means 算法试图选择质心以最小化 '惯性'"衡量聚类内部的一致性。" [来源](https://scikit-learn.org/stable/modules/clustering.html)。该值在每次迭代时附加到 wcss 变量上。
> 🎓 k-means++: 在 [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) 中,你可以使用 'k-means++' 优化,它 "将质心初始化为(通常)彼此相距较远,从而可能比随机初始化产生更好的结果。
### 肘部法
之前,你推测因为你目标是 3 种歌曲类型,所以你应该选择 3 个聚类。但真的是这样吗?
1. 使用 '肘部法' 来确认。
```python
plt.figure(figsize=(10,5))
sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red')
plt.title('Elbow')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
```
使用你在上一步中构建的 `wcss` 变量创建一个图表,显示肘部的 '弯曲' 位置,指示最佳的聚类数量。也许确实是 3
![elbow method](../../../../translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.zh.png)
## 练习 - 显示聚类
1. 再次尝试此过程,这次设置三个聚类,并将聚类显示为散点图:
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)
labels = kmeans.predict(X)
plt.scatter(df['popularity'],df['danceability'],c = labels)
plt.xlabel('popularity')
plt.ylabel('danceability')
plt.show()
```
1. 检查模型的准确性:
```python
labels = kmeans.labels_
correct_labels = sum(y == labels)
print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size))
print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
```
该模型的准确性不是很好,聚类的形状也给你一个提示。
![clusters](../../../../translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.zh.png)
这些数据太不平衡,相关性太小,各列值之间的方差太大,无法很好地聚类。事实上,形成的聚类可能受到我们上面定义的三种类型类别的严重影响或偏斜。这是一个学习过程!
在 Scikit-learn 的文档中,你可以看到像这样的模型,聚类没有很好地划分,有 '方差' 问题:
![problem models](../../../../translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.zh.png)
> 信息图来自 Scikit-learn
## 方差
方差定义为 "平均平方差" [(来源)](https://www.mathsisfun.com/data/standard-deviation.html)。在这个聚类问题的背景下,它指的是我们数据集的数字倾向于从均值中偏离太多。
✅ 这是一个很好的时机来思考你可以用哪些方法来解决这个问题。稍微调整数据?使用不同的列?使用不同的算法?提示:尝试[缩放数据](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/)以标准化它并测试其他列。
> 试试这个 '[方差计算器](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' 来更好地理解这个概念。
---
## 🚀挑战
花一些时间在这个 notebook 上,调整参数。你能通过进一步清理数据(例如删除异常值)来提高模型的准确性吗?你可以使用权重来给某些数据样本更多的权重。你还能做些什么来创建更好的聚类?
提示尝试缩放你的数据。notebook 中有注释代码,添加标准缩放以使数据列在范围上更相似。你会发现,虽然 silhouette 评分下降了,但肘部图的 '弯曲' 更加平滑。这是因为让数据不缩放会使方差较小的数据权重更大。阅读更多关于这个问题的信息 [这里](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)
## 回顾与自学
看看一个 K-Means 模拟器 [比如这个](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/)。你可以使用这个工具来可视化样本数据点并确定其质心。你可以编辑数据的随机性、聚类数量和质心数量。这是否有助于你了解数据如何分组?
另外,看看斯坦福大学的 [K-Means 讲义](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html)。
## 作业
[尝试不同的聚类方法](assignment.md)
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担任何责任。

@ -1,14 +0,0 @@
# 尝试不同的聚类方法
## 说明
在本课中你学习了K-Means聚类。有时K-Means并不适合你的数据。请创建一个笔记本使用这些课程中的数据或其他来源的数据请注明来源并展示一种不同于K-Means的聚类方法。你学到了什么
## 评分标准
| 标准 | 杰出表现 | 合格表现 | 需要改进 |
| -------- | ------------------------------------------------------------------ | --------------------------------------------------------------- | ---------------------------- |
| | 提供了一个有详细文档记录的聚类模型的笔记本 | 提供了一个没有良好文档记录和/或不完整的笔记本 | 提交的作品不完整 |
**免责声明**:
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的本国语言版本视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对使用本翻译所产生的任何误解或误释承担责任。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。尽管我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议使用专业的人类翻译。对于因使用此翻译而引起的任何误解或误读我们概不负责。

@ -1,31 +0,0 @@
# 机器学习中的聚类模型
聚类是一种机器学习任务,旨在寻找相似的对象并将它们分组到称为簇的组中。聚类与机器学习中的其他方法不同,因为它是自动发生的,实际上可以说它是监督学习的反面。
## 地区专题:为尼日利亚观众的音乐品味设计的聚类模型 🎧
尼日利亚的观众有着多样化的音乐品味。使用从Spotify抓取的数据灵感来源于[这篇文章](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421),让我们看看尼日利亚流行的一些音乐。这个数据集包括关于各种歌曲的“舞蹈性”得分、“声学性”、响度、“演讲性”、流行度和能量的数据。发现这些数据中的模式将会很有趣!
![唱盘](../../../translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.zh.jpg)
> 照片由<a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Marcela Laskoski</a>拍摄,发布于<a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
在这一系列课程中,你将发现使用聚类技术分析数据的新方法。当你的数据集缺乏标签时,聚类特别有用。如果数据集有标签,那么你在之前课程中学到的分类技术可能会更有用。但在你想要对未标记的数据进行分组的情况下,聚类是发现模式的好方法。
> 有一些有用的低代码工具可以帮助你学习如何使用聚类模型。试试[Azure ML来完成这个任务](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## 课程
1. [聚类简介](1-Visualize/README.md)
2. [K-Means聚类](2-K-Means/README.md)
## 致谢
这些课程由[Jen Looper](https://www.twitter.com/jenlooper)精心编写,并得到了[Rishit Dagli](https://rishit_dagli)和[Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan)的有益评审。
[Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify)数据集来源于Kaggle由Spotify抓取。
一些有用的K-Means示例对创建这节课提供了帮助包括这个[iris探索](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering),这个[入门笔记](https://www.kaggle.com/prashant111/k-means-clustering-with-python),以及这个[假设的NGO示例](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering)。
**免责声明**:
本文件使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担任何责任。

@ -1,168 +0,0 @@
# 自然语言处理简介
本课涵盖了*自然语言处理*NLP这一*计算语言学*的子领域的简史和重要概念。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/31/)
## 介绍
NLP是机器学习应用和生产软件中最知名的领域之一。
✅ 你能想到每天使用的软件中可能嵌入了一些NLP吗你经常使用的文字处理程序或移动应用程序呢
你将学习:
- **语言的概念**。语言是如何发展的,主要的研究领域是什么。
- **定义和概念**。你还将学习计算机如何处理文本的定义和概念,包括解析、语法以及识别名词和动词。本课中有一些编码任务,并引入了一些重要概念,你将在接下来的课程中学习如何编码这些概念。
## 计算语言学
计算语言学是一个研究和开发领域研究计算机如何处理、理解、翻译和与语言交流。自然语言处理NLP是一个相关领域专注于计算机如何处理“自然”或人类语言。
### 示例 - 手机语音输入
如果你曾经使用手机语音输入而不是打字,或者向虚拟助手提问,你的语音会被转换为文本形式,然后进行处理或*解析*。检测到的关键词会被处理成手机或助手能够理解和执行的格式。
![理解](../../../../translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.zh.png)
> 真正的语言理解很难!图片由[Jen Looper](https://twitter.com/jenlooper)提供
### 这种技术是如何实现的?
这是因为有人编写了一个计算机程序来实现这一点。几年前,一些科幻作家预测人们主要会与计算机对话,计算机会总是准确理解他们的意思。遗憾的是,这个问题比许多人想象的要难得多,虽然今天我们对这个问题有了更好的理解,但在实现“完美”的自然语言处理方面仍然面临重大挑战,特别是在理解句子的意义时。这在理解幽默或检测句子中的情感(如讽刺)时尤其困难。
此时,你可能会回想起学校课堂上老师讲解句子语法部分的情景。在一些国家,学生会专门学习语法和语言学,但在许多国家,这些主题是作为学习语言的一部分:在小学学习母语(学习阅读和写作),可能在中学学习第二语言。如果你不擅长区分名词和动词或副词和形容词,也不用担心!
如果你在区分*简单现在时*和*现在进行时*方面有困难,你并不孤单。这对许多人来说是一个挑战,即使是某种语言的母语者。好消息是,计算机非常擅长应用正式规则,你将学习编写代码,能够像人类一样*解析*句子。更大的挑战是理解句子的*意义*和*情感*。
## 前提条件
本课的主要前提条件是能够阅读和理解本课的语言。本课没有数学问题或方程需要解决。虽然原作者用英语写了本课,但它也被翻译成其他语言,所以你可能在阅读翻译版本。有些例子使用了不同的语言(以比较不同语言的语法规则)。这些例子*没有*翻译,但解释性文本是翻译的,所以意思应该是清楚的。
对于编码任务你将使用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网站上的说明将其安装到你的系统中同时安装语料库如下所示
```bash
pip install -U textblob
python -m textblob.download_corpora
```
> 💡 提示你可以直接在VS Code环境中运行Python。查看[文档](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott)以获取更多信息。
## 与机器对话
让计算机理解人类语言的历史可以追溯到几十年前,最早考虑自然语言处理的科学家之一是*阿兰·图灵*。
### '图灵测试'
当图灵在20世纪50年代研究*人工智能*时,他考虑是否可以给人类和计算机(通过打字通信)进行一个对话测试,让人类在对话中无法确定他们是在与另一个人还是计算机对话。
如果在一定长度的对话后,人类无法确定回答是否来自计算机,那么是否可以说计算机在*思考*
### 灵感来源 - '模仿游戏'
这个想法来自一个叫做*模仿游戏*的聚会游戏,审问者独自在一个房间里,任务是确定另一个房间里的两个人分别是男性和女性。审问者可以发送纸条,并且必须尝试提出问题,通过书面回答来揭示神秘人物的性别。当然,另一个房间里的玩家试图通过回答问题来误导或困惑审问者,同时给出看似诚实的回答。
### 开发Eliza
在20世纪60年代一位MIT科学家*约瑟夫·魏岑鲍姆*开发了[*Eliza*](https://wikipedia.org/wiki/ELIZA)一个计算机“治疗师”会向人类提问并给出理解他们答案的假象。然而虽然Eliza可以解析句子并识别某些语法结构和关键词从而给出合理的回答但不能说它*理解*句子。如果Eliza遇到格式为“**我很** <u>难过</u>”的句子,它可能会重新排列并替换句子中的单词,形成“你**一直** <u>难过</u>多久了”的回答。
这给人一种Eliza理解了陈述并在问后续问题的印象而实际上它只是改变了时态并添加了一些单词。如果Eliza无法识别出有响应的关键词它会给出一个随机的回答这个回答可以适用于许多不同的陈述。例如如果用户写“**你是** <u>自行车</u>”,它可能会回答“我**一直**是 <u>自行车</u>多久了?”,而不是一个更合理的回答。
[![与Eliza聊天](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "与Eliza聊天")
> 🎥 点击上方图片观看关于原始ELIZA程序的视频
> 注意如果你有ACM账户可以阅读1966年发表的[Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract)原始描述。或者,可以在[wikipedia](https://wikipedia.org/wiki/ELIZA)上了解Eliza
## 练习 - 编写一个基本的对话机器人
一个对话机器人如Eliza是一个引导用户输入并似乎能够理解和智能回应的程序。与Eliza不同我们的机器人不会有多个规则来让它看起来像是在进行智能对话。相反我们的机器人只有一个功能就是通过随机回应来保持对话这些回应在几乎任何琐碎的对话中都可能有效。
### 计划
构建对话机器人的步骤:
1. 打印指示,告知用户如何与机器人互动
2. 开始一个循环
1. 接受用户输入
2. 如果用户要求退出,则退出
3. 处理用户输入并确定回应(在本例中,回应是从可能的通用回应列表中随机选择的)
4. 打印回应
3. 返回第2步循环
### 构建机器人
接下来让我们创建机器人。我们将从定义一些短语开始。
1. 使用以下随机回应在Python中自己创建这个机器人
```python
random_responses = ["That is quite interesting, please tell me more.",
"I see. Do go on.",
"Why do you say that?",
"Funny weather we've been having, isn't it?",
"Let's change the subject.",
"Did you catch the game last night?"]
```
这里有一些示例输出供你参考(用户输入在以`>`开头的行上):
```output
Hello, I am Marvin, the simple robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am good thanks
That is quite interesting, please tell me more.
> today I went for a walk
Did you catch the game last night?
> I did, but my team lost
Funny weather we've been having, isn't it?
> yes but I hope next week is better
Let's change the subject.
> ok, lets talk about music
Why do you say that?
> because I like music!
Why do you say that?
> bye
It was nice talking to you, goodbye!
```
任务的一个可能解决方案在[这里](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py)
✅ 停下来思考
1. 你认为随机回应会“骗”某人认为机器人真的理解他们吗?
2. 机器人需要哪些功能才能更有效?
3. 如果一个机器人真的能“理解”句子的意义,它是否需要“记住”对话中前面句子的意义?
---
## 🚀挑战
选择上面的一个“停下来思考”元素,尝试在代码中实现它们,或者用伪代码在纸上写出解决方案。
在下一课中,你将学习一些其他解析自然语言和机器学习的方法。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/32/)
## 复习与自学
查看下面的参考资料,作为进一步阅读的机会。
### 参考资料
1. Schubert, Lenhart, "Computational Linguistics", *斯坦福哲学百科全书* (2020年春季版), Edward N. Zalta (编), URL = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010.
## 作业
[搜索一个机器人](assignment.md)
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议进行专业的人类翻译。我们对使用本翻译所产生的任何误解或误读不承担责任。

@ -1,14 +0,0 @@
# 寻找机器人
## 说明
机器人无处不在。你的任务是:找到一个并采纳它!你可以在网站上、银行应用程序中以及电话中找到它们,例如,当你打电话给金融服务公司咨询或获取账户信息时。分析这个机器人,看看你能否让它混淆。如果你能让机器人混淆,为什么会发生这种情况?写一篇简短的文章描述你的经历。
## 评分标准
| 标准 | 模范 | 合格 | 需要改进 |
| -------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- |
| | 写了一整页的文章,解释了假定的机器人架构并概述了你与它的体验 | 文章不完整或研究不充分 | 未提交文章 |
**免责声明**:
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于重要信息,建议进行专业的人类翻译。对于因使用本翻译而引起的任何误解或误释,我们不承担责任。

@ -1,217 +0,0 @@
# 常见的自然语言处理任务和技术
对于大多数*自然语言处理*任务需要将要处理的文本分解、检查并将结果存储或与规则和数据集进行交叉引用。这些任务使程序员能够推导出文本中的_意义_或_意图_或仅仅是术语和单词的_频率_。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/33/)
让我们来了解一些常见的文本处理技术。结合机器学习这些技术可以帮助你高效地分析大量文本。然而在将机器学习应用于这些任务之前我们先来了解一下NLP专家所遇到的问题。
## NLP常见任务
分析文本有不同的方法。你可以执行一些任务,通过这些任务你能够理解文本并得出结论。通常你会按顺序执行这些任务。
### 分词
大多数NLP算法首先要做的可能是将文本分割成标记或单词。虽然这听起来很简单但考虑到标点符号和不同语言的单词和句子分隔符会使其变得复杂。你可能需要使用各种方法来确定分界线。
![tokenization](../../../../translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.zh.png)
> 分词一个来自**傲慢与偏见**的句子。信息图由 [Jen Looper](https://twitter.com/jenlooper) 提供
### 嵌入
[词嵌入](https://wikipedia.org/wiki/Word_embedding)是一种将文本数据数值化的方法。嵌入的方式是使具有相似意义或经常一起使用的单词聚集在一起。
![word embeddings](../../../../translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.zh.png)
> “我对你的神经非常尊重,它们是我的老朋友。” - 来自**傲慢与偏见**的一句话的词嵌入。信息图由 [Jen Looper](https://twitter.com/jenlooper) 提供
✅ 尝试[这个有趣的工具](https://projector.tensorflow.org/)来实验词嵌入。点击一个单词会显示相似单词的聚类:'toy'与'disney'、'lego'、'playstation'和'console'聚在一起。
### 解析和词性标注
每个被分词的单词都可以被标注为词性 - 名词、动词或形容词。句子 `the quick red fox jumped over the lazy brown dog` 可能被词性标注为 fox = 名词, jumped = 动词。
![parsing](../../../../translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.zh.png)
> 解析一个来自**傲慢与偏见**的句子。信息图由 [Jen Looper](https://twitter.com/jenlooper) 提供
解析是识别句子中哪些单词是相关的 - 例如 `the quick red fox jumped` 是一个形容词-名词-动词序列,与 `lazy brown dog` 序列分开。
### 词和短语频率
分析大量文本时,一个有用的过程是建立一个感兴趣的每个单词或短语的词典,并记录其出现频率。短语 `the quick red fox jumped over the lazy brown dog` 中 the 的词频为2。
让我们看一个例子文本,我们数一下单词的频率。鲁德亚德·吉卜林的诗《胜利者》中包含以下诗句:
```output
What the moral? Who rides may read.
When the night is thick and the tracks are blind
A friend at a pinch is a friend, indeed,
But a fool to wait for the laggard behind.
Down to Gehenna or up to the Throne,
He travels the fastest who travels alone.
```
由于短语频率可以根据需要区分大小写或不区分大小写,短语 `a friend` has a frequency of 2 and `the` has a frequency of 6, and `travels` 的频率是2。
### N-grams
文本可以被分割成固定长度的单词序列一个单词unigram、两个单词bigrams、三个单词trigrams或任意数量的单词n-grams
例如 `the quick red fox jumped over the lazy brown dog` 以2的n-gram得分产生以下n-grams
1. the quick
2. quick red
3. red fox
4. fox jumped
5. jumped over
6. over the
7. the lazy
8. lazy brown
9. brown dog
可以将其想象为一个滑动框在句子上。以下是3个单词的n-grams每个句子中的n-gram用粗体表示
1. <u>**the quick red**</u> fox jumped over the lazy brown dog
2. the **<u>quick red fox</u>** jumped over the lazy brown dog
3. the quick **<u>red fox jumped</u>** over the lazy brown dog
4. the quick red **<u>fox jumped over</u>** the lazy brown dog
5. the quick red fox **<u>jumped over the</u>** lazy brown dog
6. the quick red fox jumped **<u>over the lazy</u>** brown dog
7. the quick red fox jumped over <u>**the lazy brown**</u> dog
8. the quick red fox jumped over the **<u>lazy brown dog</u>**
![n-grams sliding window](../../../../6-NLP/2-Tasks/images/n-grams.gif)
> N-gram值为3信息图由 [Jen Looper](https://twitter.com/jenlooper) 提供
### 名词短语提取
在大多数句子中,有一个名词是主语或宾语。在英语中,它通常可以通过前面有'a'、'an'或'the'来识别。通过'提取名词短语'来识别句子的主语或宾语是NLP中试图理解句子意义时的常见任务。
✅ 在句子 "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun." 中,你能识别出名词短语吗?
在句子 `the quick red fox jumped over the lazy brown dog` 中有2个名词短语**quick red fox** 和 **lazy brown dog**
### 情感分析
一个句子或文本可以被分析其情感,或者它有多*积极*或*消极*。情感通过*极性*和*客观性/主观性*来衡量。极性从-1.0到1.0消极到积极和0.0到1.0(最客观到最主观)。
✅ 你将会学到有不同的方法使用机器学习来确定情感,但一种方法是有一个由人类专家分类为积极或消极的单词和短语列表,并将该模型应用于文本以计算极性得分。你能看到这在某些情况下如何工作,而在其他情况下效果较差吗?
### 词形变化
词形变化使你可以获取一个单词并得到该单词的单数或复数形式。
### 词干提取
*词干*是一个词组的根或词头,例如 *flew*、*flies*、*flying* 的词干是动词 *fly*
对于NLP研究人员还有一些有用的数据库尤其是
### WordNet
[WordNet](https://wordnet.princeton.edu/) 是一个包含许多语言中每个单词的同义词、反义词及其他许多细节的数据库。在构建翻译、拼写检查器或任何类型的语言工具时,它非常有用。
## NLP库
幸运的是你不需要自己构建所有这些技术因为有一些优秀的Python库可以使其对非自然语言处理或机器学习专业的开发人员更易于使用。接下来的课程中会有更多这些库的示例但在这里你会学到一些有用的例子来帮助你完成下一个任务。
### 练习 - 使用 `TextBlob` library
Let's use a library called TextBlob as it contains helpful APIs for tackling these types of tasks. TextBlob "stands on the giant shoulders of [NLTK](https://nltk.org) and [pattern](https://github.com/clips/pattern), and plays nicely with both." It has a considerable amount of ML embedded in its API.
> Note: A useful [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) guide is available for TextBlob that is recommended for experienced Python developers
When attempting to identify *noun phrases*, TextBlob offers several options of extractors to find noun phrases.
1. Take a look at `ConllExtractor`
```python
from textblob import TextBlob
from textblob.np_extractors import ConllExtractor
# import and create a Conll extractor to use later
extractor = ConllExtractor()
# later when you need a noun phrase extractor:
user_input = input("> ")
user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified
np = user_input_blob.noun_phrases
```
> 这里发生了什么? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) 是“一个使用ConLL-2000训练语料库进行块解析的名词短语提取器。” ConLL-2000 指的是2000年计算自然语言学习会议。每年会议都会举办一个研讨会来解决一个棘手的NLP问题2000年的问题是名词块解析。模型是在《华尔街日报》上训练的“第15-18节作为训练数据211727个标记和第20节作为测试数据47377个标记”。你可以在[这里](https://www.clips.uantwerpen.be/conll2000/chunking/)查看使用的程序和[结果](https://ifarm.nl/erikt/research/np-chunking.html)。
### 挑战 - 使用NLP改进你的机器人
在上一课中你构建了一个非常简单的问答机器人。现在你将通过分析输入的情感并打印出相应的回应使Marvin更具同情心。你还需要识别一个 `noun_phrase` 并询问相关内容。
构建更好的对话机器人的步骤:
1. 打印指示,指导用户如何与机器人互动
2. 开始循环
1. 接受用户输入
2. 如果用户要求退出,则退出
3. 处理用户输入并确定适当的情感回应
4. 如果在情感中检测到名词短语,将其复数化并要求更多相关输入
5. 打印回应
3. 返回步骤2
以下是使用TextBlob确定情感的代码片段。注意只有四个情感回应的*梯度*(如果你愿意,可以有更多):
```python
if user_input_blob.polarity <= -0.5:
response = "Oh dear, that sounds bad. "
elif user_input_blob.polarity <= 0:
response = "Hmm, that's not great. "
elif user_input_blob.polarity <= 0.5:
response = "Well, that sounds positive. "
elif user_input_blob.polarity <= 1:
response = "Wow, that sounds great. "
```
以下是一些示例输出以供参考(用户输入以>开头的行):
```output
Hello, I am Marvin, the friendly robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am ok
Well, that sounds positive. Can you tell me more?
> I went for a walk and saw a lovely cat
Well, that sounds positive. Can you tell me more about lovely cats?
> cats are the best. But I also have a cool dog
Wow, that sounds great. Can you tell me more about cool dogs?
> I have an old hounddog but he is sick
Hmm, that's not great. Can you tell me more about old hounddogs?
> bye
It was nice talking to you, goodbye!
```
任务的一个可能解决方案在[这里](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py)
✅ 知识检查
1. 你认为同情回应会“欺骗”某人认为机器人真的理解他们吗?
2. 识别名词短语是否使机器人更“可信”?
3. 为什么从句子中提取“名词短语”是一件有用的事情?
---
实现之前知识检查中的机器人,并在朋友身上测试。它能欺骗他们吗?你能让你的机器人更“可信”吗?
## 🚀挑战
尝试实现之前知识检查中的一个任务。在朋友身上测试机器人。它能欺骗他们吗?你能让你的机器人更“可信”吗?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/34/)
## 复习与自学
在接下来的几节课中,你将学习更多关于情感分析的内容。研究这种有趣的技术,例如在[KDNuggets](https://www.kdnuggets.com/tag/nlp)上的文章。
## 作业
[让机器人对话](assignment.md)
**免责声明**
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文档的母语版本视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,14 +0,0 @@
# 让机器人回应
## 说明
在过去的几节课中,你编写了一个基本的聊天机器人。这个机器人会给出随机的回答,直到你说“再见”。你能让这些回答不那么随机,并在你说特定的话(如“为什么”或“怎么”)时触发特定的回答吗?在扩展你的机器人时,想一想机器学习如何使这类工作变得不那么繁琐。你可以使用 NLTK 或 TextBlob 库来简化你的任务。
## 评分标准
| 标准 | 杰出 | 合格 | 需要改进 |
| ------ | --------------------------------------------- | ----------------------------------------------- | ---------------------- |
| | 提供了一个新的 bot.py 文件并进行了文档记录 | 提供了一个新的机器人文件,但包含错误 | 没有提供文件 |
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议进行专业人工翻译。我们不对使用此翻译所产生的任何误解或误读承担责任。

@ -1,190 +0,0 @@
# 机器学习中的翻译和情感分析
在前面的课程中,你学习了如何使用`TextBlob`构建一个基本的机器人,这是一个在幕后嵌入了机器学习的库,用于执行基本的自然语言处理任务,如名词短语提取。在计算语言学中,另一个重要的挑战是准确地将一个语言的句子翻译成另一种语言。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/35/)
翻译是一个非常困难的问题,因为有成千上万种语言,每种语言都有非常不同的语法规则。一种方法是将一种语言的正式语法规则(如英语)转换为一种不依赖语言的结构,然后通过转换回另一种语言来进行翻译。这种方法的步骤如下:
1. **识别**。将输入语言中的单词标记为名词、动词等。
2. **创建翻译**。生成目标语言格式的每个单词的直接翻译。
### 示例句子,从英语到爱尔兰语
在“英语”中,句子 _I feel happy_ 是三个单词,顺序是:
- **主语** (I)
- **动词** (feel)
- **形容词** (happy)
然而,在“爱尔兰语”中,同一句子有非常不同的语法结构——情感如“*happy*”或“*sad*”被表达为在你身上。
英语短语`I feel happy`在爱尔兰语中是`Tá athas orm`。一个*字面*翻译是`Happy is upon me`。
一个将爱尔兰语翻译成英语的人会说`I feel happy`,而不是`Happy is upon me`,因为他们理解句子的意思,即使单词和句子结构不同。
爱尔兰语句子的正式顺序是:
- **动词** (Tá 或 is)
- **形容词** (athas, 或 happy)
- **主语** (orm, 或 upon me)
## 翻译
一个简单的翻译程序可能只翻译单词,而忽略句子结构。
✅ 如果你作为成年人学习了第二(或第三或更多)语言,你可能会开始时用母语思考,在脑海中逐字翻译概念到第二语言,然后说出你的翻译。这类似于简单的翻译计算机程序所做的。要达到流利程度,重要的是要超越这个阶段!
简单的翻译会导致糟糕(有时甚至搞笑)的误译:`I feel happy`字面翻译成爱尔兰语是`Mise bhraitheann athas`。这意味着(字面上)`me feel happy`,并不是一个有效的爱尔兰语句子。尽管英语和爱尔兰语是两个紧邻岛屿上使用的语言,它们却有着非常不同的语法结构。
> 你可以观看一些关于爱尔兰语言传统的视频,如[这个](https://www.youtube.com/watch?v=mRIaLSdRMMs)
### 机器学习方法
到目前为止你已经了解了自然语言处理的正式规则方法。另一种方法是忽略单词的含义而是_使用机器学习来检测模式_。如果你有大量的文本一个*语料库*)或文本(*语料库*)在原始语言和目标语言中,这种方法可以在翻译中起作用。
例如,考虑*傲慢与偏见*的情况这是简·奥斯汀在1813年写的一本著名的英语小说。如果你查阅这本书的英文版和人类翻译的*法文*版,你可以在其中检测到一种语言中成语式翻译成另一种语言的短语。你很快就会这样做。
例如,当一个英语短语如`I have no money`被字面翻译成法语时,它可能变成`Je n'ai pas de monnaie`。“Monnaie”是一个棘手的法语“假同源词”因为“money”和“monnaie”并不相同。一个更好的翻译是人类可能会做的`Je n'ai pas d'argent`因为它更好地传达了你没有钱的意思而不是“零钱”这是“monnaie”的意思
![monnaie](../../../../translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.zh.png)
> 图片由 [Jen Looper](https://twitter.com/jenlooper) 提供
如果一个机器学习模型有足够的人类翻译来建立一个模型,它可以通过识别先前由两种语言的专家人类翻译的文本中的常见模式来提高翻译的准确性。
### 练习 - 翻译
你可以使用`TextBlob`来翻译句子。试试**傲慢与偏见**的著名第一句话:
```python
from textblob import TextBlob
blob = TextBlob(
"It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!"
)
print(blob.translate(to="fr"))
```
`TextBlob`的翻译非常好“C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!”。
可以说TextBlob的翻译实际上比1932年V. Leconte和Ch. Pressoir的法语翻译更准确
"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet égard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles."
在这种情况下,由机器学习提供的信息的翻译比人为翻译做得更好,后者不必要地为“清晰”而在原作者的嘴里塞了话。
> 这里发生了什么为什么TextBlob在翻译方面如此出色实际上它使用了Google翻译这是一个复杂的AI能够解析数百万的短语以预测最适合手头任务的字符串。这里没有任何手动操作你需要互联网连接来使用`blob.translate`.
✅ Try some more sentences. Which is better, ML or human translation? In which cases?
## Sentiment analysis
Another area where machine learning can work very well is sentiment analysis. A non-ML approach to sentiment is to identify words and phrases which are 'positive' and 'negative'. Then, given a new piece of text, calculate the total value of the positive, negative and neutral words to identify the overall sentiment.
This approach is easily tricked as you may have seen in the Marvin task - the sentence `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road`是一个讽刺的、负面的情感句子但简单的算法检测到“great”、“wonderful”、“glad”是正面的“waste”、“lost”和“dark”是负面的。总体情感被这些相互冲突的单词所左右。
✅ 停下来想一想我们作为人类如何表达讽刺。语调起了很大的作用。尝试用不同的方式说“好吧,那部电影真棒”,看看你的声音如何传达意义。
### 机器学习方法
机器学习的方法是手动收集负面和正面的文本——推文或电影评论,或者任何人们给出评分和书面意见的内容。然后可以将自然语言处理技术应用于意见和评分,以便出现模式(例如,正面的电影评论往往比负面的电影评论更多地使用“奥斯卡级别”的短语,或正面的餐馆评论更多地说“美食”而不是“恶心”)。
> ⚖️ **示例**:如果你在政治家的办公室工作,有一项新的法律正在辩论中,选民可能会写信给办公室,支持或反对这项新法律。假设你负责阅读这些邮件并将它们分类为支持和反对。如果有很多邮件,你可能会感到不堪重负,试图阅读所有的邮件。如果有一个机器人可以为你阅读所有邮件,理解它们并告诉你每封邮件属于哪一类,那不是很好吗?
>
> 一种实现方法是使用机器学习。你会用一部分反对的邮件和一部分支持的邮件来训练模型。模型会倾向于将某些短语和单词与反对方和支持方相关联,但它不会理解任何内容,只是某些单词和模式更有可能出现在反对或支持的邮件中。你可以用一些没有用于训练模型的邮件来测试它,看看它是否得出了与你相同的结论。然后,一旦你对模型的准确性感到满意,你就可以处理未来的邮件,而不必阅读每一封邮件。
✅ 这个过程听起来像你在前面的课程中使用的过程吗?
## 练习 - 情感句子
情感通过一个从-1到1的*极性*来衡量,-1是最负面的情感1是最正面的情感。情感还通过0到1的评分来衡量客观性0和主观性1
再看看简·奥斯汀的*傲慢与偏见*。该文本可在[古腾堡计划](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm)上找到。下面的示例显示了一个短程序,它分析了书中的第一句和最后一句的情感,并显示其情感极性和主观性/客观性评分。
你应该使用`TextBlob`库(如上所述)来确定`情感`(你不必编写自己的情感计算器)在以下任务中。
```python
from textblob import TextBlob
quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife."""
quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them."""
sentiment1 = TextBlob(quote1).sentiment
sentiment2 = TextBlob(quote2).sentiment
print(quote1 + " has a sentiment of " + str(sentiment1))
print(quote2 + " has a sentiment of " + str(sentiment2))
```
你会看到以下输出:
```output
It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146)
Darcy, as well as Elizabeth, really loved them; and they were
both ever sensible of the warmest gratitude towards the persons
who, by bringing her into Derbyshire, had been the means of
uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8)
```
## 挑战 - 检查情感极性
你的任务是通过情感极性来确定*傲慢与偏见*是否有更多绝对正面的句子而不是绝对负面的句子。对于这个任务你可以假设极性评分为1或-1是绝对正面或负面。
**步骤:**
1. 从古腾堡计划下载一本[傲慢与偏见](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm)的副本作为.txt文件。删除文件开头和结尾的元数据只保留原文。
2. 在Python中打开文件并将内容提取为字符串。
3. 使用书字符串创建一个TextBlob。
4. 在循环中分析书中的每个句子。
1. 如果极性是1或-1将句子存储在正面或负面的消息数组或列表中。
5. 最后,分别打印出所有正面句子和负面句子及其数量。
这里有一个示例[解决方案](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb)。
✅ 知识检查
1. 情感是基于句子中使用的单词,但代码*理解*单词吗?
2. 你认为情感极性准确吗?换句话说,你*同意*这些评分吗?
1. 特别是,你是否同意以下句子的绝对**正面**极性?
* “What an excellent father you have, girls!” said she, when the door was shut.
* “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect.
* How wonderfully these sort of things occur!
* I have the greatest dislike in the world to that sort of thing.
* Charlotte is an excellent manager, I dare say.
* “This is delightful indeed!
* I am so happy!
* Your idea of the ponies is delightful.
2. 以下三个句子被评分为绝对正面情感,但仔细阅读,它们并不是正面的句子。为什么情感分析认为它们是正面的句子?
* Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power.
* If I could but see you as happy!
* Our distress, my dear Lizzy, is very great.
3. 你是否同意以下句子的绝对**负面**极性?
- Everybody is disgusted with his pride.
- “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful.
- The pause was to Elizabeths feelings dreadful.
- It would be dreadful!
✅ 任何简·奥斯汀的爱好者都会理解,她经常用她的书来批评英国摄政时期社会中更荒谬的方面。伊丽莎白·班内特,《傲慢与偏见》的主角,是一个敏锐的社会观察者(像作者一样),她的语言经常充满了微妙的意味。即使是故事中的爱情对象达西先生也注意到伊丽莎白的戏谑和戏弄的语言使用:“我已经有幸与你相识足够长的时间,知道你偶尔会表达一些并非你真正观点的意见,以此为乐。”
---
## 🚀挑战
你能通过从用户输入中提取其他特征来让Marvin变得更好吗
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/36/)
## 复习与自学
有很多方法可以从文本中提取情感。想想可能利用这种技术的商业应用。想想它可能会出错的地方。阅读更多关于分析情感的复杂企业级系统,如[Azure文本分析](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott)。测试一些上述的傲慢与偏见的句子,看看它是否能检测到微妙之处。
## 作业
[诗意许可](assignment.md)
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误读不承担责任。

@ -1,14 +0,0 @@
# 诗意的许可
## 说明
在[这个笔记本](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency)中你可以找到超过500首艾米莉·狄金森的诗这些诗已经使用Azure文本分析进行了情感分析。使用这个数据集按照课程中描述的方法进行分析。一首诗的建议情感是否与更复杂的Azure服务的决定相匹配为什么或为什么不在你看来有什么让你感到惊讶的吗
## 评分标准
| 标准 | 杰出表现 | 合格表现 | 需要改进 |
| -------- | -------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ |
| | 提供了一个包含作者样本输出的完整分析的笔记本 | 笔记本不完整或未进行分析 | 没有提供笔记本 |
**免责声明**:
本文档使用基于机器的AI翻译服务进行翻译。尽管我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原文档的本国语言版本视为权威来源。对于关键信息建议使用专业人工翻译。对于因使用此翻译而产生的任何误解或误读我们概不负责。

@ -1,4 +0,0 @@
**免责声明**:
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文档的本国语言版本视为权威来源。对于重要信息,建议进行专业的人类翻译。对于因使用此翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,4 +0,0 @@
**免责声明**
本文件使用机器翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。

@ -1,315 +0,0 @@
# 使用酒店评论进行情感分析 - 处理数据
在本节中,你将使用前几节课中学到的技术对一个大型数据集进行一些探索性数据分析。一旦你对各列的实用性有了较好的理解,你将学到:
- 如何删除不必要的列
- 如何基于现有列计算一些新数据
- 如何保存结果数据集以便在最终挑战中使用
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/37/)
### 介绍
到目前为止,你已经了解了文本数据与数值数据类型有很大的不同。如果是人类书写或说出的文本,可以通过分析找到模式和频率、情感和意义。本课将带你进入一个真实的数据集,面临一个真实的挑战:**[欧洲515K酒店评论数据](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)**,并包含一个[CC0公共领域许可](https://creativecommons.org/publicdomain/zero/1.0/)。它是从Booking.com的公共资源中抓取的。数据集的创建者是Jiashen Liu。
### 准备
你将需要:
* 能够使用Python 3运行.ipynb笔记本
* pandas
* NLTK[你应该在本地安装](https://www.nltk.org/install.html)
* 数据集可在Kaggle上找到[欧洲515K酒店评论数据](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)。解压后大约230 MB。下载到与这些NLP课程相关的根`/data`文件夹中。
## 探索性数据分析
这个挑战假设你正在使用情感分析和客人评论评分来构建一个酒店推荐机器人。你将使用的数据集包括6个城市中1493家不同酒店的评论。
使用Python、一个酒店评论数据集和NLTK的情感分析你可以找出
* 评论中最常用的词和短语是什么?
* 描述酒店的官方标签与评论评分是否相关(例如,某个酒店的“有小孩的家庭”标签的负面评论是否多于“单人旅行者”的负面评论,这可能表明它更适合单人旅行者?)
* NLTK情感评分是否与酒店评论者的数值评分一致
#### 数据集
让我们探索你已下载并保存在本地的数据集。用VS Code或Excel等编辑器打开文件。
数据集的标题如下:
*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng*
以下是按便于检查的方式分组的标题:
##### 酒店列
* `Hotel_Name`, `Hotel_Address`, `lat` (纬度), `lng` (经度)
* 使用*lat*和*lng*你可以用Python绘制一张地图显示酒店位置或许用颜色编码表示负面和正面评论
* Hotel_Address对我们来说不是显而易见的有用我们可能会用国家替换它以便更容易排序和搜索
**酒店元评论列**
* `Average_Score`
* 根据数据集创建者,这一列是*酒店的平均评分,根据去年最新评论计算*。这种计算评分的方式似乎有些不寻常,但这是抓取的数据,所以我们暂且接受。
✅ 基于数据中的其他列,你能想到另一种计算平均评分的方法吗?
* `Total_Number_of_Reviews`
* 该酒店收到的总评论数 - 不清楚(不写代码的话)这是否指的是数据集中的评论数。
* `Additional_Number_of_Scoring`
* 这意味着给出了评论评分,但评论者没有写正面或负面评论
**评论列**
- `Reviewer_Score`
- 这是一个最多有一位小数的数值最小值和最大值在2.5到10之间
- 没有解释为什么2.5是最低可能的评分
- `Negative_Review`
- 如果评论者什么都没写,这一栏将显示“**No Negative**”
- 注意评论者可能会在负面评论栏写正面评论(例如,“这家酒店没有什么不好的地方”)
- `Review_Total_Negative_Word_Counts`
- 更高的负面词汇数量表示较低的评分(不检查情感性)
- `Positive_Review`
- 如果评论者什么都没写,这一栏将显示“**No Positive**”
- 注意评论者可能会在正面评论栏写负面评论(例如,“这家酒店根本没有什么好的地方”)
- `Review_Total_Positive_Word_Counts`
- 更高的正面词汇数量表示较高的评分(不检查情感性)
- `Review_Date`和`days_since_review`
- 可以对评论应用新鲜度或陈旧度的衡量(较旧的评论可能不如较新的评论准确,因为酒店管理变了,或进行了装修,或添加了游泳池等)
- `Tags`
- 这些是评论者可能选择用来描述他们是何种客人的简短描述(例如,单人或家庭),他们住的房间类型,停留时间以及评论提交的方式。
- 不幸的是,使用这些标签是有问题的,请查看下面讨论它们实用性的部分
**评论者列**
- `Total_Number_of_Reviews_Reviewer_Has_Given`
- 这可能是推荐模型中的一个因素例如如果你能确定更多的多产评论者有数百条评论更可能给出负面而不是正面的评论。然而任何特定评论的评论者没有用唯一代码标识因此无法链接到一组评论。有30位评论者有100条或更多评论但很难看出这如何有助于推荐模型。
- `Reviewer_Nationality`
- 有些人可能认为某些国籍的人更可能给出正面或负面评论,因为有国家倾向。小心将这种轶事观点构建到你的模型中。这些是国家(有时是种族)刻板印象,每个评论者都是基于他们的经验写评论的个体。可能通过多种镜头过滤,如他们以前的酒店住宿、旅行距离和个人性格。认为他们的国籍是评论评分的原因是难以证明的。
##### 示例
| 平均评分 | 总评论数 | 评论者评分 | 负面评论 | 正面评论 | 标签 |
| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- |
| 7.8 | 1945 | 2.5 | 这目前不是一家酒店,而是一个施工现场。我从早上到全天都被不可接受的建筑噪音吓坏了,无法在长途旅行后休息和在房间工作。人们整天都在用凿岩机在相邻房间工作。我要求换房,但没有安静的房间。更糟的是,我被多收了费用。我在晚上退房,因为我有很早的航班,并收到了一张合适的账单。一天后,酒店未经我同意再次收取超出预订价格的费用。这是一个可怕的地方,不要通过预订来惩罚自己。 | 没有任何好地方,远离这里 | 商务旅行夫妻标准双人房住了2晚 |
如你所见这位客人在这家酒店住得并不愉快。这家酒店有7.8的良好平均评分和1945条评论但这位评论者给了2.5分并写了115个字描述他们的负面经历。如果他们在Positive_Review栏中什么都没写你可能会推测没有什么正面的但他们写了7个警告词。如果我们只是数词而不是词的意义或情感我们可能会对评论者的意图有偏差的看法。奇怪的是他们的2.5分令人困惑因为如果酒店住宿如此糟糕为什么还给它任何分数仔细调查数据集你会发现最低可能的分数是2.5而不是0。最高可能的分数是10。
##### 标签
如上所述,乍一看,使用`Tags`来分类数据的想法是有道理的。不幸的是,这些标签没有标准化,这意味着在给定的酒店中,选项可能是*单人房*、*双人房*和*双人房*,但在下一家酒店中,它们是*豪华单人房*、*经典大床房*和*行政大床房*。这些可能是相同的东西,但有太多的变体,选择变得:
1. 尝试将所有术语更改为单一标准,这非常困难,因为不清楚每种情况下的转换路径是什么(例如,*经典单人房*映射到*单人房*,但*带庭院花园或城市景观的高级大床房*更难映射)
1. 我们可以采取NLP方法测量某些术语如*单人旅行者*、*商务旅行者*或*带小孩的家庭*在每家酒店中的频率,并将其纳入推荐
标签通常但不总是是一个包含5到6个逗号分隔值的字段对应于*旅行类型*、*客人类型*、*房间类型*、*夜晚数*和*提交评论的设备类型*。然而,因为有些评论者没有填写每个字段(他们可能留一个空白),值并不总是按相同顺序排列。
例如,取*组类型*。在`Tags`列中有1025种独特的可能性不幸的是只有一部分指的是组有些是房间类型等。如果你只过滤提到家庭的那些结果包含许多*家庭房*类型的结果。如果你包括*带*这个词,即计算*带*值的*家庭*结果更好在515,000个结果中有超过80,000个包含“带小孩的家庭”或“带大孩子的家庭”短语。
这意味着标签列对我们来说并非完全无用,但需要一些工作使其有用。
##### 酒店平均评分
数据集中有一些奇怪之处或差异,我无法弄清楚,但在此说明以便你在构建模型时注意到它们。如果你弄清楚了,请在讨论区告诉我们!
数据集有以下列与平均评分和评论数量相关:
1. Hotel_Name
2. Additional_Number_of_Scoring
3. Average_Score
4. Total_Number_of_Reviews
5. Reviewer_Score
数据集中评论最多的单个酒店是*Britannia International Hotel Canary Wharf*有4789条评论中的515,000条。但如果我们看`Total_Number_of_Reviews`值这家酒店是9086。你可能推测有更多没有评论的评分所以也许我们应该加上`Additional_Number_of_Scoring`列值。该值是2682加上4789得到7471仍然比`Total_Number_of_Reviews`少1615。
如果你取`Average_Score`列你可能推测它是数据集中评论的平均值但Kaggle的描述是“*根据去年最新评论计算的酒店平均评分*”。这似乎没有那么有用但我们可以根据数据集中的评论评分计算自己的平均值。以同一家酒店为例给出的酒店平均评分是7.1但计算得出的评分数据集中评论者的平均评分是6.8。这接近但不是相同的值,我们只能猜测`Additional_Number_of_Scoring`评论中的评分将平均值提高到7.1。不幸的是,没有办法测试或证明这一断言,因此很难使用或信任`Average_Score`、`Additional_Number_of_Scoring`和`Total_Number_of_Reviews`,因为它们基于或引用了我们没有的数据。
更复杂的是评论第二多的酒店的计算平均评分为8.12,而数据集`Average_Score`是8.1。这是正确的评分巧合还是第一家酒店的差异?
考虑到这些酒店可能是异常值,也许大多数值匹配(但某些原因导致部分不匹配),我们将在下一步编写一个短程序来探索数据集中的值,并确定这些值的正确使用(或不使用)。
> 🚨 注意
>
> 使用此数据集时你将编写代码从文本中计算某些内容而不必自己阅读或分析文本。这是NLP的本质解释意义或情感而不需要人类来做。然而你可能会阅读一些负面评论。我建议你不要这样做因为你不需要这样做。有些是愚蠢的或无关紧要的负面酒店评论如“天气不好”这是酒店或任何人无法控制的。但也有一些负面评论是种族主义、性别歧视或年龄歧视的。这是从公共网站抓取的数据集中不可避免的。某些评论者留下的评论会让你觉得令人反感、不舒服或不安。最好让代码测量情感而不是自己阅读它们并感到不安。尽管如此写这种东西的人是少数但它们依然存在。
## 练习 - 数据探索
### 加载数据
视觉检查数据已经够多了现在你将编写一些代码并得到一些答案本节使用pandas库。你的第一个任务是确保你能加载和读取CSV数据。pandas库有一个快速的CSV加载器结果放在一个数据框中如前几课所示。我们加载的CSV有超过50万行但只有17列。pandas为你提供了许多强大的方法与数据框交互包括对每一行执行操作的能力。
从这里开始将有代码片段和一些代码解释以及一些关于结果含义的讨论。使用包含的_notebook.ipynb_进行你的代码编写。
让我们从加载你将使用的数据文件开始:
```python
# Load the hotel reviews from CSV
import pandas as pd
import time
# importing time so the start and end time can be used to calculate file loading time
print("Loading data file now, this could take a while depending on file size")
start = time.time()
# df is 'DataFrame' - make sure you downloaded the file to the data folder
df = pd.read_csv('../../data/Hotel_Reviews.csv')
end = time.time()
print("Loading took " + str(round(end - start, 2)) + " seconds")
```
现在数据已加载,我们可以对其进行一些操作。将此代码保留在程序顶部以便下一部分使用。
## 探索数据
在这种情况下,数据已经是*干净的*,这意味着它已经准备好使用,并且没有可能使只期望英文字符的算法出错的其他语言字符。
✅ 你可能需要处理需要一些初步处理才能格式化的数据然后应用NLP技术但这次不需要。如果需要你将如何处理非英文字符
花点时间确保数据加载后,你可以用代码探索它。非常容易想要专注于`Negative_Review`和`Positive_Review`列。它们充满了你的NLP算法要处理的自然文本。但等等在你跳入NLP和情感分析之前你应该按照下面的代码确定数据集中给定的值是否与你用pandas计算的值匹配。
## 数据框操作
本课的第一个任务是编写一些代码检查以下断言是否正确(不更改数据框)。
> 像许多编程任务一样有几种方法可以完成它但好的建议是以最简单、最容易理解的方式完成特别是当你将来回到这段代码时更容易理解。对于数据框有一个全面的API通常有一种方法可以高效地完成你想要的操作。
将以下问题视为编码任务,尝试在不查看解决方案的情况下回答它们。
1. 打印出你刚加载的数据框的*形状*(形状是行数和列数)
2. 计算评论者国籍的频率计数:
1. 列`Reviewer_Nationality`有多少不同的值,它们是什么?
2. 数据集中最常见的评论者国籍是什么(打印国家和评论数)?
3. 下一个最常见的10个国籍及其频率计数是什么
3. 每个最常见的10个评论者国籍中评论最多的酒店是什么
4. 数据集中每家酒店有多少评论(酒店的频率计数)?
5. 虽然数据集中每家酒店都有`Average_Score`列,但你也可以计算一个平均评分(获取数据集中每家酒店的所有评论者评分的平均值)。在你的数据框中添加一个新列,标题为`Calc_Average_Score`,包含计算的平均值。
6. 是否有任何酒店的`Average_Score`和`Calc_Average_Score`(四舍五入到一位小数)相同?使用`?
1. Try writing a Python function that takes a Series (row) as an argument and compares the values, printing out a message when the values are not equal. Then use the `.apply()方法处理每一行。
7. 计算并打印出`Negative_Review`列值为“No Negative”的行数
8. 计算并打印出`Positive_Review`列值为“No Positive”的行数
rows have column `Positive_Review` values of "No Positive" 9. Calculate and print out how many rows have column `Positive_Review` values of "No Positive" **and** `Negative_Review` values of "No Negative" ### Code answers 1. Print out the *shape* of the data frame you have just loaded (the shape is the number of rows and columns) ```python
print("The shape of the data (rows, cols) is " + str(df.shape))
> The shape of the data (rows, cols) is (515738, 17)
``` 2. Calculate the frequency count for reviewer nationalities: 1. How many distinct values are there for the column `Reviewer_Nationality` and what are they? 2. What reviewer nationality is the most common in the dataset (print country and number of reviews)? ```python
# value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality
nationality_freq = df["Reviewer_Nationality"].value_counts()
print("There are " + str(nationality_freq.size) + " different nationalities")
# print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data
print(nationality_freq)
There are 227 different nationalities
United Kingdom 245246
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
...
Comoros 1
Palau 1
Northern Mariana Islands 1
Cape Verde 1
Guinea 1
Name: Reviewer_Nationality, Length: 227, dtype: int64
``` 3. What are the next top 10 most frequently found nationalities, and their frequency count? ```python
print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.")
# Notice there is a leading space on the values, strip() removes that for printing
# What is the top 10 most common nationalities and their frequencies?
print("The next 10 highest frequency reviewer nationalities are:")
print(nationality_freq[1:11].to_string())
The highest frequency reviewer nationality is United Kingdom with 245246 reviews.
The next 10 highest frequency reviewer nationalities are:
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
Saudi Arabia 8951
Netherlands 8772
Switzerland 8678
Germany 7941
Canada 7894
France 7296
``` 3. What was the most frequently reviewed hotel for each of the top 10 most reviewer nationalities? ```python
# What was the most frequently reviewed hotel for the top 10 nationalities
# Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow)
for nat in nationality_freq[:10].index:
# First, extract all the rows that match the criteria into a new dataframe
nat_df = df[df["Reviewer_Nationality"] == nat]
# Now get the hotel freq
freq = nat_df["Hotel_Name"].value_counts()
print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.")
The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews.
The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews.
The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews.
The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews.
The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews.
The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews.
The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews.
The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews.
The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews.
The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews.
``` 4. How many reviews are there per hotel (frequency count of hotel) in the dataset? ```python
# First create a new dataframe based on the old one, removing the uneeded columns
hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1)
# Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found
hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')
# Get rid of all the duplicated rows
hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"])
display(hotel_freq_df)
``` | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | | :----------------------------------------: | :---------------------: | :-----------------: | | Britannia International Hotel Canary Wharf | 9086 | 4789 | | Park Plaza Westminster Bridge London | 12158 | 4169 | | Copthorne Tara Hotel London Kensington | 7105 | 3578 | | ... | ... | ... | | Mercure Paris Porte d Orleans | 110 | 10 | | Hotel Wagner | 135 | 10 | | Hotel Gallitzinberg | 173 | 8 | You may notice that the *counted in the dataset* results do not match the value in `Total_Number_of_Reviews`. It is unclear if this value in the dataset represented the total number of reviews the hotel had, but not all were scraped, or some other calculation. `Total_Number_of_Reviews` is not used in the model because of this unclarity. 5. While there is an `Average_Score` column for each hotel in the dataset, you can also calculate an average score (getting the average of all reviewer scores in the dataset for each hotel). Add a new column to your dataframe with the column header `Calc_Average_Score` that contains that calculated average. Print out the columns `Hotel_Name`, `Average_Score`, and `Calc_Average_Score`. ```python
# define a function that takes a row and performs some calculation with it
def get_difference_review_avg(row):
return row["Average_Score"] - row["Calc_Average_Score"]
# 'mean' is mathematical word for 'average'
df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
# Add a new column with the difference between the two average scores
df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1)
# Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)
review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"])
# Sort the dataframe to find the lowest and highest average score difference
review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"])
display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]])
``` You may also wonder about the `Average_Score` value and why it is sometimes different from the calculated average score. As we can't know why some of the values match, but others have a difference, it's safest in this case to use the review scores that we have to calculate the average ourselves. That said, the differences are usually very small, here are the hotels with the greatest deviation from the dataset average and the calculated average: | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | | ... | ... | ... | ... | | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | | 0.9 | 6.8 | 5.9 | Villa Eugenie | | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | With only 1 hotel having a difference of score greater than 1, it means we can probably ignore the difference and use the calculated average score. 6. Calculate and print out how many rows have column `Negative_Review` values of "No Negative" 7. Calculate and print out how many rows have column `Positive_Review` values of "No Positive" 8. Calculate and print out how many rows have column `Positive_Review` values of "No Positive" **and** `Negative_Review` values of "No Negative" ```python
# with lambdas:
start = time.time()
no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1)
print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index)))
no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1)
print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index)))
both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1)
print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index)))
end = time.time()
print("Lambdas took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Lambdas took 9.64 seconds
``` ## Another way Another way count items without Lambdas, and use sum to count the rows: ```python
# without lambdas (using a mixture of notations to show you can use both)
start = time.time()
no_negative_reviews = sum(df.Negative_Review == "No Negative")
print("Number of No Negative reviews: " + str(no_negative_reviews))
no_positive_reviews = sum(df["Positive_Review"] == "No Positive")
print("Number of No Positive reviews: " + str(no_positive_reviews))
both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive"))
print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews))
end = time.time()
print("Sum took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Sum took 0.19 seconds
``` You may have noticed that there are 127 rows that have both "No Negative" and "No Positive" values for the columns `Negative_Review` and `Positive_Review` respectively. That means that the reviewer gave the hotel a numerical score, but declined to write either a positive or negative review. Luckily this is a small amount of rows (127 out of 515738, or 0.02%), so it probably won't skew our model or results in any particular direction, but you might not have expected a data set of reviews to have rows with no reviews, so it's worth exploring the data to discover rows like this. Now that you have explored the dataset, in the next lesson you will filter the data and add some sentiment analysis. --- ## 🚀Challenge This lesson demonstrates, as we saw in previous lessons, how critically important it is to understand your data and its foibles before performing operations on it. Text-based data, in particular, bears careful scrutiny. Dig through various text-heavy datasets and see if you can discover areas that could introduce bias or skewed sentiment into a model. ## [Post-lecture quiz](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/38/) ## Review & Self Study Take [this Learning Path on NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) to discover tools to try when building speech and text-heavy models. ## Assignment [NLTK](assignment.md)
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议使用专业的人类翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。

@ -1,8 +0,0 @@
# NLTK
## 指南
NLTK 是一个在计算语言学和自然语言处理领域中广为人知的库。请利用这个机会阅读 '[NLTK book](https://www.nltk.org/book/)' 并尝试其中的练习。在这个不计分的作业中,你将更深入地了解这个库。
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业人工翻译。对于因使用此翻译而产生的任何误解或误读,我们不承担责任。

@ -1,4 +0,0 @@
**免责声明**:
本文档是使用基于机器的AI翻译服务翻译的。尽管我们力求准确但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息建议进行专业的人类翻译。对于因使用此翻译而产生的任何误解或误释我们不承担任何责任。

@ -1,4 +0,0 @@
**免责声明**:
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的本地语言版本视为权威来源。对于关键信息,建议使用专业的人类翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担责任。

@ -1,377 +0,0 @@
# 酒店评论的情感分析
现在你已经详细探索了数据集是时候过滤列并使用NLP技术在数据集上获得关于酒店的新见解了。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/39/)
### 过滤和情感分析操作
正如你可能已经注意到的,数据集存在一些问题。有些列充满了无用的信息,其他一些似乎不正确。如果它们是正确的,也不清楚它们是如何计算的,并且无法通过你自己的计算独立验证答案。
## 练习:更多数据处理
进一步清理数据。添加以后有用的列,改变其他列中的值,并完全删除某些列。
1. 初步列处理
1. 删除`lat`和`lng`
2. 将`Hotel_Address`的值替换为以下值(如果地址包含城市和国家的名称,将其更改为仅包含城市和国家)。
数据集中只有以下城市和国家:
阿姆斯特丹,荷兰
巴塞罗那,西班牙
伦敦,英国
米兰,意大利
巴黎,法国
维也纳,奥地利
```python
def replace_address(row):
if "Netherlands" in row["Hotel_Address"]:
return "Amsterdam, Netherlands"
elif "Barcelona" in row["Hotel_Address"]:
return "Barcelona, Spain"
elif "United Kingdom" in row["Hotel_Address"]:
return "London, United Kingdom"
elif "Milan" in row["Hotel_Address"]:
return "Milan, Italy"
elif "France" in row["Hotel_Address"]:
return "Paris, France"
elif "Vienna" in row["Hotel_Address"]:
return "Vienna, Austria"
# Replace all the addresses with a shortened, more useful form
df["Hotel_Address"] = df.apply(replace_address, axis = 1)
# The sum of the value_counts() should add up to the total number of reviews
print(df["Hotel_Address"].value_counts())
```
现在你可以查询国家级别的数据:
```python
display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"}))
```
| 酒店地址 | 酒店名称 |
| :------------------ | :------: |
| 阿姆斯特丹,荷兰 | 105 |
| 巴塞罗那,西班牙 | 211 |
| 伦敦,英国 | 400 |
| 米兰,意大利 | 162 |
| 巴黎,法国 | 458 |
| 维也纳,奥地利 | 158 |
2. 处理酒店元评论列
1. 删除`Additional_Number_of_Scoring`
1. Replace `Total_Number_of_Reviews` with the total number of reviews for that hotel that are actually in the dataset
1. Replace `Average_Score`,用我们自己计算的分数替代
```python
# Drop `Additional_Number_of_Scoring`
df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True)
# Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values
df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')
df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
```
3. 处理评论列
1. 删除`Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` and `days_since_review`
2. Keep `Reviewer_Score`, `Negative_Review`, and `Positive_Review` as they are,
3. Keep `Tags` for now
- We'll be doing some additional filtering operations on the tags in the next section and then tags will be dropped
4. Process reviewer columns
1. Drop `Total_Number_of_Reviews_Reviewer_Has_Given`
2. Keep `Reviewer_Nationality`
### Tag columns
The `Tag` column is problematic as it is a list (in text form) stored in the column. Unfortunately the order and number of sub sections in this column are not always the same. It's hard for a human to identify the correct phrases to be interested in, because there are 515,000 rows, and 1427 hotels, and each has slightly different options a reviewer could choose. This is where NLP shines. You can scan the text and find the most common phrases, and count them.
Unfortunately, we are not interested in single words, but multi-word phrases (e.g. *Business trip*). Running a multi-word frequency distribution algorithm on that much data (6762646 words) could take an extraordinary amount of time, but without looking at the data, it would seem that is a necessary expense. This is where exploratory data analysis comes in useful, because you've seen a sample of the tags such as `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']`,你可以开始问是否有可能大大减少你必须做的处理。幸运的是,这是可能的,但首先你需要遵循几个步骤来确定感兴趣的标签。
### 过滤标签
记住数据集的目标是添加情感和列,以帮助你选择最佳酒店(为自己或客户要求你制作一个酒店推荐机器人)。你需要问自己这些标签在最终数据集中是否有用。这里有一个解释(如果你出于其他原因需要数据集,不同的标签可能会被保留/排除在选择之外):
1. 旅行类型是相关的,应该保留
2. 客人群体类型是重要的,应该保留
3. 客人入住的房间、套房或工作室类型是无关紧要的(所有酒店基本上都有相同的房间)
4. 提交评论的设备是无关紧要的
5. 评论者入住的夜晚数量*可能*是相关的,如果你将较长的入住时间与他们更喜欢酒店联系起来,但这有点牵强,可能是无关紧要的
总之,**保留两种标签,删除其他的**。
首先你不想计算标签直到它们处于更好的格式这意味着删除方括号和引号。你可以通过多种方式来做这件事但你想要最快的方法因为处理大量数据可能需要很长时间。幸运的是pandas有一种简单的方法来完成每个步骤。
```Python
# Remove opening and closing brackets
df.Tags = df.Tags.str.strip("[']")
# remove all quotes too
df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
```
每个标签变成类似这样的:`Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device`.
Next we find a problem. Some reviews, or rows, have 5 columns, some 3, some 6. This is a result of how the dataset was created, and hard to fix. You want to get a frequency count of each phrase, but they are in different order in each review, so the count might be off, and a hotel might not get a tag assigned to it that it deserved.
Instead you will use the different order to our advantage, because each tag is multi-word but also separated by a comma! The simplest way to do this is to create 6 temporary columns with each tag inserted in to the column corresponding to its order in the tag. You can then merge the 6 columns into one big column and run the `value_counts()` method on the resulting column. Printing that out, you'll see there was 2428 unique tags. Here is a small sample:
| Tag | Count |
| ------------------------------ | ------ |
| Leisure trip | 417778 |
| Submitted from a mobile device | 307640 |
| Couple | 252294 |
| Stayed 1 night | 193645 |
| Stayed 2 nights | 133937 |
| Solo traveler | 108545 |
| Stayed 3 nights | 95821 |
| Business trip | 82939 |
| Group | 65392 |
| Family with young children | 61015 |
| Stayed 4 nights | 47817 |
| Double Room | 35207 |
| Standard Double Room | 32248 |
| Superior Double Room | 31393 |
| Family with older children | 26349 |
| Deluxe Double Room | 24823 |
| Double or Twin Room | 22393 |
| Stayed 5 nights | 20845 |
| Standard Double or Twin Room | 17483 |
| Classic Double Room | 16989 |
| Superior Double or Twin Room | 13570 |
| 2 rooms | 12393 |
Some of the common tags like `Submitted from a mobile device` are of no use to us, so it might be a smart thing to remove them before counting phrase occurrence, but it is such a fast operation you can leave them in and ignore them.
### Removing the length of stay tags
Removing these tags is step 1, it reduces the total number of tags to be considered slightly. Note you do not remove them from the dataset, just choose to remove them from consideration as values to count/keep in the reviews dataset.
| Length of stay | Count |
| ---------------- | ------ |
| Stayed 1 night | 193645 |
| Stayed 2 nights | 133937 |
| Stayed 3 nights | 95821 |
| Stayed 4 nights | 47817 |
| Stayed 5 nights | 20845 |
| Stayed 6 nights | 9776 |
| Stayed 7 nights | 7399 |
| Stayed 8 nights | 2502 |
| Stayed 9 nights | 1293 |
| ... | ... |
There are a huge variety of rooms, suites, studios, apartments and so on. They all mean roughly the same thing and not relevant to you, so remove them from consideration.
| Type of room | Count |
| ----------------------------- | ----- |
| Double Room | 35207 |
| Standard Double Room | 32248 |
| Superior Double Room | 31393 |
| Deluxe Double Room | 24823 |
| Double or Twin Room | 22393 |
| Standard Double or Twin Room | 17483 |
| Classic Double Room | 16989 |
| Superior Double or Twin Room | 13570 |
Finally, and this is delightful (because it didn't take much processing at all), you will be left with the following *useful* tags:
| Tag | Count |
| --------------------------------------------- | ------ |
| Leisure trip | 417778 |
| Couple | 252294 |
| Solo traveler | 108545 |
| Business trip | 82939 |
| Group (combined with Travellers with friends) | 67535 |
| Family with young children | 61015 |
| Family with older children | 26349 |
| With a pet | 1405 |
You could argue that `Travellers with friends` is the same as `Group` more or less, and that would be fair to combine the two as above. The code for identifying the correct tags is [the Tags notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb).
The final step is to create new columns for each of these tags. Then, for every review row, if the `Tag`列匹配其中一个新列添加1否则添加0。最终结果将是一个计数显示有多少评论者选择了这家酒店总体上用于例如商务旅行还是休闲旅行或者是否带宠物这在推荐酒店时是有用的信息。
```python
# Process the Tags into new columns
# The file Hotel_Reviews_Tags.py, identifies the most important tags
# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends,
# Family with young children, Family with older children, With a pet
df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0)
df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0)
df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0)
df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0)
df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0)
df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0)
df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0)
df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0)
```
### 保存文件
最后,以新名称保存现在的数据集。
```python
df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True)
# Saving new data file with calculated columns
print("Saving results to Hotel_Reviews_Filtered.csv")
df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False)
```
## 情感分析操作
在这一最后部分,你将对评论列应用情感分析,并将结果保存在数据集中。
## 练习:加载和保存过滤后的数据
请注意,现在你加载的是在上一部分保存的过滤后的数据集,而不是原始数据集。
```python
import time
import pandas as pd
import nltk as nltk
from nltk.corpus import stopwords
from nltk.sentiment.vader import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')
# Load the filtered hotel reviews from CSV
df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')
# You code will be added here
# Finally remember to save the hotel reviews with new NLP data added
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False)
```
### 移除停用词
如果你在负面和正面评论列上运行情感分析可能需要很长时间。测试在一台强大的测试笔记本电脑上使用快速CPU耗时12-14分钟具体取决于使用的情感库。这是一个相对较长的时间所以值得调查是否可以加快速度。
移除停用词,即不改变句子情感的常见英语词汇,是第一步。通过移除它们,情感分析应该运行得更快,但不会降低准确性(因为停用词不会影响情感,但会减慢分析速度)。
最长的负面评论是395个词但在移除停用词后是195个词。
移除停用词也是一个快速操作在测试设备上从515,000行的两个评论列中移除停用词耗时3.3秒。根据你的设备CPU速度、RAM、是否有SSD等因素这可能会稍微多一点或少一点时间。操作的相对短暂性意味着如果它能改善情感分析时间那么这是值得做的。
```python
from nltk.corpus import stopwords
# Load the hotel reviews from CSV
df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv")
# Remove stop words - can be slow for a lot of text!
# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches
# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends
start = time.time()
cache = set(stopwords.words("english"))
def remove_stopwords(review):
text = " ".join([word for word in review.split() if word not in cache])
return text
# Remove the stop words from both columns
df.Negative_Review = df.Negative_Review.apply(remove_stopwords)
df.Positive_Review = df.Positive_Review.apply(remove_stopwords)
```
### 执行情感分析
现在你应该计算负面和正面评论列的情感分析并将结果存储在两个新列中。情感测试将与同一评论的评论者评分进行比较。例如如果情感认为负面评论的情感是1极其正面的情感而正面评论的情感也是1但评论者给酒店的评分是最低的那么要么评论文本与评分不匹配要么情感分析器无法正确识别情感。你应该预期一些情感评分是完全错误的通常这可以解释例如评论可能是极其讽刺的“当然我喜欢在没有暖气的房间里睡觉”而情感分析器认为这是正面的情感即使人类阅读它会知道这是讽刺。
NLTK提供了不同的情感分析器供学习你可以替换它们看看情感是否更准确。这里使用的是VADER情感分析。
> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
```python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
# Create the vader sentiment analyser (there are others in NLTK you can try too)
vader_sentiment = SentimentIntensityAnalyzer()
# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
# There are 3 possibilities of input for a review:
# It could be "No Negative", in which case, return 0
# It could be "No Positive", in which case, return 0
# It could be a review, in which case calculate the sentiment
def calc_sentiment(review):
if review == "No Negative" or review == "No Positive":
return 0
return vader_sentiment.polarity_scores(review)["compound"]
```
在你的程序中,当你准备好计算情感时,可以将其应用于每个评论,如下所示:
```python
# Add a negative sentiment and positive sentiment column
print("Calculating sentiment columns for both positive and negative reviews")
start = time.time()
df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment)
df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment)
end = time.time()
print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds")
```
这在我的电脑上大约需要120秒但在每台电脑上都会有所不同。如果你想打印结果并查看情感是否与评论匹配
```python
df = df.sort_values(by=["Negative_Sentiment"], ascending=True)
print(df[["Negative_Review", "Negative_Sentiment"]])
df = df.sort_values(by=["Positive_Sentiment"], ascending=True)
print(df[["Positive_Review", "Positive_Sentiment"]])
```
在使用文件之前要做的最后一件事是保存它!你还应该考虑重新排序所有新列,以便于使用(对人类来说,这是一种外观上的变化)。
```python
# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)
df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1)
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)
```
你应该运行整个[分析笔记本](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb)的代码(在你运行[过滤笔记本](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb)以生成Hotel_Reviews_Filtered.csv文件之后
回顾一下,步骤是:
1. 原始数据集文件**Hotel_Reviews.csv**在上一课中通过[探索笔记本](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb)进行了探索
2. 通过[过滤笔记本](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb)过滤Hotel_Reviews.csv生成**Hotel_Reviews_Filtered.csv**
3. 通过[情感分析笔记本](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb)处理Hotel_Reviews_Filtered.csv生成**Hotel_Reviews_NLP.csv**
4. 在下面的NLP挑战中使用Hotel_Reviews_NLP.csv
### 结论
当你开始时,你有一个包含列和数据的数据集,但并非所有数据都可以验证或使用。你已经探索了数据,过滤了不需要的内容,将标签转换为有用的东西,计算了自己的平均值,添加了一些情感列,并希望学习了一些关于处理自然文本的有趣知识。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/40/)
## 挑战
现在你已经对数据集进行了情感分析,看看你是否可以使用本课程中学到的策略(例如聚类)来确定情感模式。
## 复习与自学
参加[这个学习模块](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott)以了解更多并使用不同的工具探索文本中的情感。
## 作业
[尝试不同的数据集](assignment.md)
**免责声明**
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担任何责任。

@ -1,14 +0,0 @@
# 尝试不同的数据集
## 说明
既然你已经了解了如何使用NLTK来为文本分配情感值现在试试一个不同的数据集。你可能需要对数据进行一些处理因此请创建一个笔记本并记录你的思考过程。你发现了什么
## 评分标准
| 标准 | 卓越 | 合格 | 需要改进 |
| -------- | ----------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ---------------------- |
| | 提供了一个完整的笔记本和数据集,并且有详细记录的单元格解释了如何分配情感值 | 笔记本缺少良好的解释 | 笔记本有缺陷 |
**免责声明**:
本文档使用基于机器的人工智能翻译服务进行翻译。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始文档的母语版本视为权威来源。对于关键信息,建议进行专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。

@ -1,4 +0,0 @@
**免责声明**
本文件使用基于机器的AI翻译服务进行翻译。虽然我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读我们不承担任何责任。

@ -1,4 +0,0 @@
**免责声明**:
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的本地语言版本视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担责任。

@ -1,27 +0,0 @@
# 自然语言处理入门
自然语言处理 (NLP) 是计算机程序理解人类语言(口语和书面语)的能力,称为自然语言。它是人工智能 (AI) 的一个组成部分。NLP 已经存在了超过 50 年,并且在语言学领域有其根源。整个领域旨在帮助机器理解和处理人类语言。这可以用于执行诸如拼写检查或机器翻译等任务。它在许多领域中有各种实际应用,包括医学研究、搜索引擎和商业智能。
## 地区主题:欧洲语言文学和欧洲浪漫酒店 ❤️
在课程的这一部分,你将了解机器学习的最广泛使用之一:自然语言处理 (NLP)。源自计算语言学,这种人工智能类别通过语音或文本通信在人与机器之间架起桥梁。
在这些课程中,我们将通过构建小型对话机器人来学习 NLP 的基础知识,以了解机器学习如何帮助使这些对话变得越来越“智能”。你将穿越时光,与简·奥斯汀 1813 年出版的经典小说《傲慢与偏见》中的伊丽莎白·班纳特和达西先生聊天。然后,你将通过学习欧洲酒店评论的情感分析来进一步提高你的知识。
![傲慢与偏见书和茶](../../../translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.zh.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/photos/pride-and-prejudice?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,4 +0,0 @@
下载酒店评论数据到此文件夹。
**免责声明**:
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用此翻译而引起的任何误解或误读,我们概不负责。

@ -1,188 +0,0 @@
# 时间序列预测简介
![时间序列概要图](../../../../translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.zh.png)
> 由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 绘制的速写图
在本课及接下来的课程中,你将学习一些关于时间序列预测的知识,这是机器学习科学家工具库中一个有趣且有价值的部分,虽然它不像其他主题那么广为人知。时间序列预测就像一种“水晶球”:基于某个变量(如价格)的过去表现,你可以预测其未来的潜在价值。
[![时间序列预测简介](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "时间序列预测简介")
> 🎥 点击上方图片观看关于时间序列预测的视频
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/41/)
这是一个有用且有趣的领域,对商业具有实际价值,因为它直接应用于定价、库存和供应链问题。虽然深度学习技术已经开始用于获得更多见解以更好地预测未来表现,但时间序列预测仍然是一个主要由经典机器学习技术所主导的领域。
> 宾夕法尼亚州立大学的实用时间序列课程可以在[这里](https://online.stat.psu.edu/stat510/lesson/1)找到
## 介绍
假设你维护一系列智能停车计时器,这些计时器提供关于它们在一段时间内使用频率和时长的数据。
> 如果你可以根据计时器的过去表现,预测其未来价值会怎样呢?这可以根据供需法则进行预测。
准确预测何时采取行动以实现目标是一个挑战,可以通过时间序列预测来解决。在寻找停车位的繁忙时段被收取更多费用可能不会让人们高兴,但这肯定是产生收入来清洁街道的一种方法!
让我们探讨一些时间序列算法类型并开始一个笔记本来清理和准备一些数据。你将分析的数据来自GEFCom2014预测竞赛。它包括2012年至2014年之间的3年每小时电力负载和温度值。根据电力负载和温度的历史模式你可以预测电力负载的未来值。
在这个例子中,你将学习如何仅使用历史负载数据来预测一个时间步长。开始之前,了解幕后发生的事情是有用的。
## 一些定义
当遇到“时间序列”这个术语时,你需要理解它在几个不同上下文中的使用。
🎓 **时间序列**
在数学中,“时间序列是一系列按时间顺序索引(或列出或绘图)的数据点。最常见的是,时间序列是在连续的等间隔时间点上获取的一系列。”时间序列的一个例子是[道琼斯工业平均指数](https://wikipedia.org/wiki/Time_series)的每日收盘值。时间序列绘图和统计建模的使用在信号处理、天气预报、地震预测和其他事件发生并且数据点可以随时间绘制的领域中经常遇到。
🎓 **时间序列分析**
时间序列分析是对上述时间序列数据的分析。时间序列数据可以采取不同的形式,包括“中断时间序列”,它检测时间序列在中断事件前后的演变模式。所需的时间序列分析类型取决于数据的性质。时间序列数据本身可以采取一系列数字或字符的形式。
要执行的分析使用各种方法,包括频域和时域、线性和非线性等。[了解更多](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm)关于分析此类数据的多种方法。
🎓 **时间序列预测**
时间序列预测是使用模型根据过去收集的数据展示的模式来预测未来值。虽然可以使用回归模型来探索时间序列数据并在图上将时间索引作为x变量但此类数据最好使用特殊类型的模型进行分析。
时间序列数据是一组有序的观察值不像可以通过线性回归分析的数据。最常见的一种是ARIMA它是“自回归积分滑动平均”的缩写。
[ARIMA模型](https://online.stat.psu.edu/stat510/lesson/1/1.1)“将一系列的当前值与过去的值和过去的预测误差相关联。”它们最适合分析时域数据,即随时间排序的数据。
> 有几种类型的ARIMA模型你可以在[这里](https://people.duke.edu/~rnau/411arim.htm)了解更多,你将在下一课中涉及这些内容。
在下一课中,你将使用[单变量时间序列](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm)构建一个ARIMA模型该模型关注随时间变化的一个变量。这类数据的一个例子是[这个数据集](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm)记录了Mauna Loa天文台的每月CO2浓度
| CO2 | YearMonth | Year | Month |
| :-----: | :-------: | :---: | :---: |
| 330.62 | 1975.04 | 1975 | 1 |
| 331.40 | 1975.13 | 1975 | 2 |
| 331.87 | 1975.21 | 1975 | 3 |
| 333.18 | 1975.29 | 1975 | 4 |
| 333.92 | 1975.38 | 1975 | 5 |
| 333.43 | 1975.46 | 1975 | 6 |
| 331.85 | 1975.54 | 1975 | 7 |
| 330.01 | 1975.63 | 1975 | 8 |
| 328.51 | 1975.71 | 1975 | 9 |
| 328.41 | 1975.79 | 1975 | 10 |
| 329.25 | 1975.88 | 1975 | 11 |
| 330.97 | 1975.96 | 1975 | 12 |
✅ 识别这个数据集中随时间变化的变量
## 时间序列数据需要考虑的特性
在查看时间序列数据时,你可能会注意到它具有[某些特性](https://online.stat.psu.edu/stat510/lesson/1/1.1),你需要考虑并减轻这些特性以更好地理解其模式。如果你将时间序列数据视为可能提供“信号”的数据,这些特性可以被视为“噪声”。你通常需要通过使用一些统计技术来减少这些“噪声”。
以下是一些你应该了解的概念,以便能够处理时间序列:
🎓 **趋势**
趋势被定义为随时间的可测量的增加和减少。[阅读更多](https://machinelearningmastery.com/time-series-trends-in-python)。在时间序列的上下文中,这涉及如何使用并在必要时从你的时间序列中移除趋势。
🎓 **[季节性](https://machinelearningmastery.com/time-series-seasonality-with-python/)**
季节性被定义为周期性的波动,例如可能影响销售的假日高峰。[看看](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm)不同类型的图表如何显示数据中的季节性。
🎓 **异常值**
异常值远离标准数据方差。
🎓 **长期周期**
独立于季节性,数据可能显示出长期周期,例如持续超过一年的经济衰退。
🎓 **恒定方差**
随时间推移,一些数据显示出恒定的波动,例如每天和夜间的能量使用。
🎓 **突然变化**
数据可能显示出需要进一步分析的突然变化。例如由于COVID导致企业突然关闭导致数据发生变化。
✅ 这里有一个[示例时间序列图](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python),显示了几年来每日的游戏内货币花费。你能在这个数据中识别出上面列出的任何特性吗?
![游戏内货币花费](../../../../translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.zh.png)
## 练习 - 开始使用电力使用数据
让我们开始创建一个时间序列模型,以预测给定过去使用情况的未来电力使用情况。
> 本示例中的数据来自GEFCom2014预测竞赛。它包括2012年至2014年之间的3年每小时电力负载和温度值。
>
> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli 和 Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016.
1. 在本课的 `working` 文件夹中,打开 _notebook.ipynb_ 文件。首先添加将帮助你加载和可视化数据的库
```python
import os
import matplotlib.pyplot as plt
from common.utils import load_data
%matplotlib inline
```
请注意,你正在使用包含的文件中的 `common` folder which set up your environment and handle downloading the data.
2. Next, examine the data as a dataframe calling `load_data()` and `head()`
```python
data_dir = './data'
energy = load_data(data_dir)[['load']]
energy.head()
```
你可以看到有两列表示日期和负载:
| | load |
| :-----------------: | :----: |
| 2012-01-01 00:00:00 | 2698.0 |
| 2012-01-01 01:00:00 | 2558.0 |
| 2012-01-01 02:00:00 | 2444.0 |
| 2012-01-01 03:00:00 | 2402.0 |
| 2012-01-01 04:00:00 | 2403.0 |
3. 现在,通过调用 `plot()` 绘制数据:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![能量图](../../../../translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.zh.png)
4. 现在,通过提供输入 `energy` in `[from date]: [to date]` 模式绘制2014年7月的第一周
```python
energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![七月](../../../../translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.zh.png)
一个美丽的图!看看这些图表,看看你是否能确定上面列出的任何特性。通过可视化数据,我们可以推测什么?
在下一课中你将创建一个ARIMA模型来进行一些预测。
---
## 🚀挑战
列出你能想到的所有可以从时间序列预测中受益的行业和研究领域。你能想到这些技术在艺术中的应用吗?在计量经济学中?生态学?零售业?工业?金融?还有哪里?
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/42/)
## 复习与自学
虽然我们不会在这里讨论,但有时会使用神经网络来增强经典的时间序列预测方法。阅读更多关于它们的信息[在这篇文章中](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412)
## 作业
[可视化更多时间序列](assignment.md)
**免责声明**
本文件使用基于机器的AI翻译服务进行翻译。尽管我们力求准确但请注意自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于重要信息建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读我们不承担任何责任。

@ -1,14 +0,0 @@
# 可视化更多时间序列
## 说明
你已经开始通过查看需要这种特殊建模的数据类型来学习时间序列预测。你已经可视化了一些关于能源的数据。现在,寻找一些其他可以从时间序列预测中受益的数据。找到三个例子(可以试试 [Kaggle](https://kaggle.com) 和 [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)),并创建一个笔记本来可视化它们。在笔记本中记录它们的任何特殊特征(季节性、突然变化或其他趋势)。
## 评分标准
| 标准 | 杰出表现 | 充足表现 | 需要改进 |
| -------- | ------------------------------------------------------ | ---------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| | 在笔记本中绘制并解释了三个数据集 | 在笔记本中绘制并解释了两个数据集 | 在笔记本中绘制或解释的数据集较少,或者呈现的数据不足 |
**免责声明**:
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的母语版本为权威来源。对于关键信息,建议寻求专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议进行专业的人类翻译。我们不对使用本翻译而产生的任何误解或误读承担责任。

@ -1,4 +0,0 @@
**免责声明**
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档视为权威来源。对于关键信息,建议进行专业人工翻译。我们不对因使用本翻译而产生的任何误解或误读承担责任。

@ -1,396 +0,0 @@
# ARIMA 时间序列预测
在上一节课中,你了解了一些时间序列预测的基础知识,并加载了一个显示某段时间内电力负载波动的数据集。
[![ARIMA 简介](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introduction to ARIMA")
> 🎥 点击上面的图片观看视频ARIMA 模型的简要介绍。示例使用 R 语言,但概念是通用的。
## [课前小测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/43/)
## 简介
在本课中,你将了解一种特定的构建模型的方法,即 [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)。ARIMA 模型特别适合拟合显示 [非平稳性](https://wikipedia.org/wiki/Stationary_process)的数据。
## 基本概念
为了能够使用 ARIMA有一些概念你需要了解
- 🎓 **平稳性**。在统计学背景下,平稳性指的是数据的分布在时间上不变。非平稳数据则由于趋势而显示波动,必须通过转换来进行分析。例如,季节性可以引入数据波动,可以通过“季节性差分”过程来消除。
- 🎓 **[差分](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**。在统计学背景下,差分指的是通过移除非恒定趋势将非平稳数据转换为平稳数据的过程。“差分移除了时间序列中的水平变化,消除了趋势和季节性,从而稳定了时间序列的均值。” [Shixiong 等人的论文](https://arxiv.org/abs/1904.07632)
## ARIMA 在时间序列中的应用
让我们拆解 ARIMA 的各个部分,以便更好地理解它如何帮助我们建模时间序列并进行预测。
- **AR - 自回归**。自回归模型,顾名思义,是向“后”看,分析数据中的先前值并对其进行假设。这些先前值被称为“滞后”。例如,显示每月铅笔销售数据的数据集。每个月的销售总额将被视为数据集中的“演变变量”。该模型是“对其自身滞后(即先前)值进行回归”。[wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
- **I - 积分**。与类似的“ARMA”模型不同ARIMA 中的“I”指的是其 *[积分](https://wikipedia.org/wiki/Order_of_integration)* 方面。通过应用差分步骤来消除非平稳性,数据被“积分”。
- **MA - 移动平均**。该模型的 [移动平均](https://wikipedia.org/wiki/Moving-average_model) 方面指的是通过观察当前和过去的滞后值来确定输出变量。
总而言之ARIMA 被用来使模型尽可能紧密地拟合时间序列数据的特殊形式。
## 练习 - 构建 ARIMA 模型
打开本课中的 [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) 文件夹,并找到 [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb) 文件。
1. 运行 notebook 以加载 `statsmodels` Python 库;你将需要它来构建 ARIMA 模型。
1. 加载必要的库
1. 现在,加载一些对绘图有用的库:
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
from IPython.display import Image
%matplotlib inline
pd.options.display.float_format = '{:,.2f}'.format
np.set_printoptions(precision=2)
warnings.filterwarnings("ignore") # specify to ignore warning messages
```
1. 将 `/data/energy.csv` 文件中的数据加载到 Pandas 数据框中并查看:
```python
energy = load_data('./data')[['load']]
energy.head(10)
```
1. 绘制 2012 年 1 月至 2014 年 12 月的所有可用能源数据。应该没有意外,因为我们在上一节课中看到了这些数据:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
现在,让我们构建一个模型!
### 创建训练和测试数据集
现在你的数据已经加载,可以将其分成训练集和测试集。你将用训练集来训练你的模型。像往常一样,模型训练完成后,你将使用测试集评估其准确性。你需要确保测试集覆盖比训练集晚的时间段,以确保模型不会从未来时间段获取信息。
1. 将 2014 年 9 月 1 日至 10 月 31 日的两个月分配给训练集。测试集将包括 2014 年 11 月 1 日至 12 月 31 日的两个月:
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
由于这些数据反映了每日能源消耗,存在明显的季节性模式,但最近几天的消耗最为相似。
1. 可视化差异:
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![训练和测试数据](../../../../translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.zh.png)
因此,使用相对较小的时间窗口来训练数据应该是足够的。
> 注意:由于我们用来拟合 ARIMA 模型的函数在拟合过程中使用了样本内验证,我们将省略验证数据。
### 准备数据进行训练
现在,你需要通过对数据进行过滤和缩放来准备训练数据。过滤数据集以仅包括所需的时间段和列,并缩放以确保数据在 0 到 1 之间。
1. 过滤原始数据集以仅包括上述时间段和所需的“load”列及日期
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
你可以看到数据的形状:
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
1. 将数据缩放到 0 到 1 的范围内。
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
train.head(10)
```
1. 可视化原始数据与缩放后的数据:
```python
energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12)
train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12)
plt.show()
```
![原始数据](../../../../translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.zh.png)
> 原始数据
![缩放后的数据](../../../../translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.zh.png)
> 缩放后的数据
1. 现在你已经校准了缩放后的数据,可以缩放测试数据:
```python
test['load'] = scaler.transform(test)
test.head()
```
### 实现 ARIMA
现在是时候实现 ARIMA 了!你将使用之前安装的 `statsmodels` 库。
现在你需要按照几个步骤进行
1. 通过调用 `SARIMAX()` and passing in the model parameters: p, d, and q parameters, and P, D, and Q parameters.
2. Prepare the model for the training data by calling the fit() function.
3. Make predictions calling the `forecast()` function and specifying the number of steps (the `horizon`) to forecast.
> 🎓 What are all these parameters for? In an ARIMA model there are 3 parameters that are used to help model the major aspects of a time series: seasonality, trend, and noise. These parameters are:
`p`: the parameter associated with the auto-regressive aspect of the model, which incorporates *past* values.
`d`: the parameter associated with the integrated part of the model, which affects the amount of *differencing* (🎓 remember differencing 👆?) to apply to a time series.
`q`: the parameter associated with the moving-average part of the model.
> Note: If your data has a seasonal aspect - which this one does - , we use a seasonal ARIMA model (SARIMA). In that case you need to use another set of parameters: `P`, `D`, and `Q` which describe the same associations as `p`, `d`, and `q` 来定义模型,但对应于模型的季节性组件。
1. 首先设置你首选的 horizon 值。让我们尝试 3 小时:
```python
# Specify the number of steps to forecast ahead
HORIZON = 3
print('Forecasting horizon:', HORIZON, 'hours')
```
为 ARIMA 模型选择最佳参数值可能具有挑战性,因为它在某种程度上是主观且耗时的。你可以考虑使用 `auto_arima()` function from the [`pyramid` 库](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html)
1. 现在尝试一些手动选择以找到一个好的模型。
```python
order = (4, 1, 0)
seasonal_order = (1, 1, 0, 24)
model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order)
results = model.fit()
print(results.summary())
```
打印出结果表格。
你已经构建了你的第一个模型!现在我们需要找到一种方法来评估它。
### 评估你的模型
为了评估你的模型,你可以进行所谓的 `walk forward` 验证。实际上,时间序列模型在每次新数据可用时都会重新训练。这允许模型在每个时间步长上做出最佳预测。
使用这种技术从时间序列的开头开始,在训练数据集上训练模型。然后对下一个时间步长进行预测。预测结果与已知值进行评估。然后扩展训练集以包括已知值,并重复该过程。
> 注意:你应该保持训练集窗口固定,以便每次将新观察值添加到训练集中时,都从集开始移除观察值。
此过程提供了模型在实际应用中的更稳健估计。然而,创建如此多的模型会带来计算成本。如果数据量小或模型简单,这是可以接受的,但在大规模应用中可能会成为问题。
步进验证是时间序列模型评估的黄金标准,推荐用于你自己的项目。
1. 首先,为每个 HORIZON 步长创建一个测试数据点。
```python
test_shifted = test.copy()
for t in range(1, HORIZON+1):
test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H')
test_shifted = test_shifted.dropna(how='any')
test_shifted.head(5)
```
| | | load | load+1 | load+2 |
| ---------- | -------- | ---- | ------ | ------ |
| 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 |
| 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 |
| 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 |
| 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 |
| 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 |
数据根据其 horizon 点水平移动。
1. 使用这种滑动窗口方法对测试数据进行预测,循环大小为测试数据长度:
```python
%%time
training_window = 720 # dedicate 30 days (720 hours) for training
train_ts = train['load']
test_ts = test_shifted
history = [x for x in train_ts]
history = history[(-training_window):]
predictions = list()
order = (2, 1, 0)
seasonal_order = (1, 1, 0, 24)
for t in range(test_ts.shape[0]):
model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order)
model_fit = model.fit()
yhat = model_fit.forecast(steps = HORIZON)
predictions.append(yhat)
obs = list(test_ts.iloc[t])
# move the training window
history.append(obs[0])
history.pop(0)
print(test_ts.index[t])
print(t+1, ': predicted =', yhat, 'expected =', obs)
```
你可以观看训练过程:
```output
2014-12-30 00:00:00
1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323]
2014-12-30 01:00:00
2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126]
2014-12-30 02:00:00
3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795]
```
1. 比较预测值和实际负载:
```python
eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)])
eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1]
eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h')
eval_df['actual'] = np.array(np.transpose(test_ts)).ravel()
eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']])
eval_df.head()
```
输出
| | | timestamp | h | prediction | actual |
| --- | ---------- | --------- | --- | ---------- | -------- |
| 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 |
| 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 |
| 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 |
| 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 |
| 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 |
观察每小时数据的预测值与实际负载。准确性如何?
### 检查模型准确性
通过测试所有预测的平均绝对百分比误差MAPE来检查模型的准确性。
> **🧮 展示数学公式**
>
> ![MAPE](../../../../translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.zh.png)
>
> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) 用于显示预测准确性,定义如上公式。实际值<sub>t</sub>和预测值<sub>t</sub>之差除以实际值<sub>t</sub>。“在此计算中,每个预测点的绝对值之和除以拟合点数 n。” [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
1. 用代码表达公式:
```python
if(HORIZON > 1):
eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual']
print(eval_df.groupby('h')['APE'].mean())
```
1. 计算一步的 MAPE
```python
print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%')
```
一步预测 MAPE 0.5570581332313952 %
1. 打印多步预测 MAPE
```python
print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%')
```
```output
Multi-step forecast MAPE: 1.1460048657704118 %
```
一个较低的数值是最好的:考虑到一个预测 MAPE 为 10 的模型,误差为 10%。
1. 但正如往常,视觉化这种准确性测量更容易,所以让我们绘制它:
```python
if(HORIZON == 1):
## Plotting single step forecast
eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8))
else:
## Plotting multi step forecast
plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']]
for t in range(1, HORIZON+1):
plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values
fig = plt.figure(figsize=(15, 8))
ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0)
ax = fig.add_subplot(111)
for t in range(1, HORIZON+1):
x = plot_df['timestamp'][(t-1):]
y = plot_df['t+'+str(t)][0:len(x)]
ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t))
ax.legend(loc='best')
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![一个时间序列模型](../../../../translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.zh.png)
🏆 一个非常漂亮的图表,显示了一个准确性良好的模型。做得好!
---
## 🚀挑战
深入研究测试时间序列模型准确性的方法。在本课中我们讨论了 MAPE但还有其他方法可以使用吗研究它们并注释。一份有用的文档可以在 [这里](https://otexts.com/fpp2/accuracy.html) 找到。
## [课后小测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/44/)
## 复习与自学
本课仅触及了使用 ARIMA 进行时间序列预测的基础知识。花些时间通过深入研究 [这个仓库](https://microsoft.github.io/forecasting/) 及其各种模型类型来加深你的知识,学习其他构建时间序列模型的方法。
## 作业
[一个新的 ARIMA 模型](assignment.md)
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的母语版本为权威来源。对于关键信息,建议寻求专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担任何责任。

@ -1,14 +0,0 @@
# 一个新的 ARIMA 模型
## 说明
既然你已经建立了一个 ARIMA 模型,现在使用新的数据建立一个新的模型(可以尝试[杜克大学的这些数据集](http://www2.stat.duke.edu/~mw/ts_data_sets.html))。在笔记本中对你的工作进行注释,直观展示数据和你的模型,并使用 MAPE 测试其准确性。
## 评分标准
| 标准 | 模范 | 足够 | 需要改进 |
| -------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | --------------------------- |
| | 提供了一个包含新 ARIMA 模型的笔记本,进行了测试并通过可视化和准确性说明。 | 提供的笔记本没有注释或包含错误 | 提供了不完整的笔记本 |
**免责声明**:
本文档是使用基于机器的人工智能翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担责任。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担任何责任。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的AI翻译服务进行翻译。尽管我们努力确保准确性但请注意自动翻译可能包含错误或不准确之处。应将原始文档的母语版本视为权威来源。对于关键信息建议进行专业的人类翻译。对于使用此翻译引起的任何误解或误读我们不承担任何责任。

@ -1,382 +0,0 @@
# 使用支持向量回归进行时间序列预测
在上一课中你学习了如何使用ARIMA模型进行时间序列预测。现在你将学习使用支持向量回归模型这是一种用于预测连续数据的回归模型。
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/51/)
## 介绍
在本课中,你将了解如何使用[**SVM**: **支持向量机**](https://en.wikipedia.org/wiki/Support-vector_machine)进行回归,或**SVR: 支持向量回归**。
### 时间序列背景下的SVR [^1]
在理解SVR在时间序列预测中的重要性之前这里有一些你需要了解的重要概念
- **回归:** 一种监督学习技术,用于从给定的输入集预测连续值。其思想是在特征空间中拟合一条包含最多数据点的曲线(或直线)。[点击这里](https://en.wikipedia.org/wiki/Regression_analysis)了解更多信息。
- **支持向量机 (SVM):** 一种用于分类、回归和异常检测的监督学习模型。在分类中该模型在特征空间中作为边界在回归中作为最佳拟合线。SVM中通常使用核函数将数据集转换到更高维度的空间使其更易于分离。[点击这里](https://en.wikipedia.org/wiki/Support-vector_machine)了解更多关于SVM的信息。
- **支持向量回归 (SVR):** 一种SVM用于找到包含最多数据点的最佳拟合线在SVM中是超平面
### 为什么选择SVR? [^1]
在上一课中你学习了ARIMA这是一种非常成功的统计线性方法用于预测时间序列数据。然而在许多情况下时间序列数据具有*非线性*这无法通过线性模型映射。在这种情况下SVM在回归任务中考虑数据非线性的能力使得SVR在时间序列预测中非常成功。
## 练习 - 构建一个SVR模型
数据准备的前几步与上一课的[ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA)相同。
打开本课的[_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working)文件夹,找到[_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb)文件。[ ^2 ]
1. 运行笔记本并导入必要的库: [^2]
```python
import sys
sys.path.append('../../')
```
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
```
2. 从`/data/energy.csv`文件中加载数据到Pandas数据框并查看: [^2]
```python
energy = load_data('../../data')[['load']]
```
3. 绘制2012年1月至2014年12月的所有可用能源数据: [^2]
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![完整数据](../../../../translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.zh.png)
现在让我们构建我们的SVR模型。
### 创建训练和测试数据集
现在数据已经加载你可以将其分为训练集和测试集。然后你将重塑数据以创建基于时间步长的数据集这对于SVR是必要的。你将在训练集上训练你的模型。模型训练完成后你将评估其在训练集、测试集和整个数据集上的准确性以查看整体性能。你需要确保测试集覆盖训练集之后的时间段以确保模型不会从未来时间段获取信息[^2](这种情况称为*过拟合*)。
1. 将2014年9月1日至10月31日的两个月分配给训练集。测试集将包括2014年11月1日至12月31日的两个月: [^2]
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
2. 可视化差异: [^2]
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![训练和测试数据](../../../../translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.zh.png)
### 准备训练数据
现在你需要通过对数据进行过滤和缩放来准备训练数据。过滤数据集以仅包括所需的时间段和列并缩放以确保数据在0到1的范围内。
1. 过滤原始数据集,仅包括每个集合的上述时间段,并仅包括所需的'load'列和日期: [^2]
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
2. 将训练数据缩放到01范围: [^2]
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
```
4. 现在,缩放测试数据: [^2]
```python
test['load'] = scaler.transform(test)
```
### 创建带有时间步长的数据 [^1]
对于SVR你需要将输入数据转换为`[batch, timesteps]`. So, you reshape the existing `train_data` and `test_data`的形式,使得有一个新的维度表示时间步长。
```python
# Converting to numpy arrays
train_data = train.values
test_data = test.values
```
对于这个例子,我们取`timesteps = 5`。因此模型的输入是前4个时间步长的数据输出是第5个时间步长的数据。
```python
timesteps=5
```
使用嵌套列表推导将训练数据转换为2D张量:
```python
train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0]
train_data_timesteps.shape
```
```output
(1412, 5)
```
将测试数据转换为2D张量:
```python
test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0]
test_data_timesteps.shape
```
```output
(44, 5)
```
选择训练和测试数据的输入和输出:
```python
x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]]
x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]]
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
```
```output
(1412, 4) (1412, 1)
(44, 4) (44, 1)
```
### 实现SVR [^1]
现在是时候实现SVR了。要了解更多关于此实现的信息你可以参考[此文档](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html)。对于我们的实现,我们遵循以下步骤:
1. 通过调用`SVR()` and passing in the model hyperparameters: kernel, gamma, c and epsilon
2. Prepare the model for the training data by calling the `fit()` function
3. Make predictions calling the `predict()`函数定义模型
现在我们创建一个SVR模型。这里我们使用[RBF核](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel)并将超参数gamma、C和epsilon分别设置为0.5、10和0.05。
```python
model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05)
```
#### 在训练数据上拟合模型 [^1]
```python
model.fit(x_train, y_train[:,0])
```
```output
SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5,
kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
```
#### 进行模型预测 [^1]
```python
y_train_pred = model.predict(x_train).reshape(-1,1)
y_test_pred = model.predict(x_test).reshape(-1,1)
print(y_train_pred.shape, y_test_pred.shape)
```
```output
(1412, 1) (44, 1)
```
你已经构建了你的SVR现在我们需要评估它。
### 评估你的模型 [^1]
为了评估首先我们将数据缩放回原始比例。然后为了检查性能我们将绘制原始和预测的时间序列图并打印MAPE结果。
缩放预测和原始输出:
```python
# Scaling the predictions
y_train_pred = scaler.inverse_transform(y_train_pred)
y_test_pred = scaler.inverse_transform(y_test_pred)
print(len(y_train_pred), len(y_test_pred))
```
```python
# Scaling the original values
y_train = scaler.inverse_transform(y_train)
y_test = scaler.inverse_transform(y_test)
print(len(y_train), len(y_test))
```
#### 检查模型在训练和测试数据上的表现 [^1]
我们从数据集中提取时间戳以显示在图表的x轴上。注意我们使用第一个```timesteps-1```值作为第一个输出的输入,因此输出的时间戳将从那之后开始。
```python
train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:]
test_timestamps = energy[test_start_dt:].index[timesteps-1:]
print(len(train_timestamps), len(test_timestamps))
```
```output
1412 44
```
绘制训练数据的预测:
```python
plt.figure(figsize=(25,6))
plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.title("Training data prediction")
plt.show()
```
![训练数据预测](../../../../translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.zh.png)
打印训练数据的MAPE
```python
print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
```
```output
MAPE for training data: 1.7195710200875551 %
```
绘制测试数据的预测
```python
plt.figure(figsize=(10,3))
plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![测试数据预测](../../../../translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.zh.png)
打印测试数据的MAPE
```python
print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
```
```output
MAPE for testing data: 1.2623790187854018 %
```
🏆 你在测试数据集上得到了非常好的结果!
### 检查模型在完整数据集上的表现 [^1]
```python
# Extracting load values as numpy array
data = energy.copy().values
# Scaling
data = scaler.transform(data)
# Transforming to 2D tensor as per model input requirement
data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0]
print("Tensor shape: ", data_timesteps.shape)
# Selecting inputs and outputs from data
X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]]
print("X shape: ", X.shape,"\nY shape: ", Y.shape)
```
```output
Tensor shape: (26300, 5)
X shape: (26300, 4)
Y shape: (26300, 1)
```
```python
# Make model predictions
Y_pred = model.predict(X).reshape(-1,1)
# Inverse scale and reshape
Y_pred = scaler.inverse_transform(Y_pred)
Y = scaler.inverse_transform(Y)
```
```python
plt.figure(figsize=(30,8))
plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(Y_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![完整数据预测](../../../../translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.zh.png)
```python
print('MAPE: ', mape(Y_pred, Y)*100, '%')
```
```output
MAPE: 2.0572089029888656 %
```
🏆 非常好的图表,显示了一个具有良好准确性的模型。做得好!
---
## 🚀挑战
- 尝试在创建模型时调整超参数gamma、C、epsilon并在数据上进行评估看看哪组超参数在测试数据上给出最佳结果。要了解更多关于这些超参数的信息你可以参考[此文档](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel)。
- 尝试为模型使用不同的核函数,并分析它们在数据集上的表现。可以参考[此文档](https://scikit-learn.org/stable/modules/svm.html#kernel-functions)。
- 尝试使用不同的`timesteps`值来让模型回顾以进行预测。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/52/)
## 复习与自学
本课旨在介绍SVR在时间序列预测中的应用。要了解更多关于SVR的信息你可以参考[这篇博客](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/)。这篇[scikit-learn文档](https://scikit-learn.org/stable/modules/svm.html)提供了关于SVM的一般解释[SVR](https://scikit-learn.org/stable/modules/svm.html#regression)以及其他实现细节,如可以使用的不同[核函数](https://scikit-learn.org/stable/modules/svm.html#kernel-functions)及其参数。
## 作业
[一个新的SVR模型](assignment.md)
## 致谢
[^1]: 本节中的文字、代码和输出由[@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD)贡献
[^2]: 本节中的文字、代码和输出取自[ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA)
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用此翻译而产生的任何误解或误释,我们不承担任何责任。

@ -1,16 +0,0 @@
# 一个新的 SVR 模型
## 说明 [^1]
现在你已经构建了一个 SVR 模型,使用新的数据再构建一个模型(试试[这些来自杜克大学的数据集](http://www2.stat.duke.edu/~mw/ts_data_sets.html))。在笔记本中对你的工作进行注释,直观展示数据和你的模型,并使用适当的图表和 MAPE 测试其准确性。同时尝试调整不同的超参数,并使用不同的时间步长值。
## 评分标准 [^1]
| 标准 | 优秀 | 合格 | 需要改进 |
| -------- | ------------------------------------------------------------ | --------------------------------------------------------- | ----------------------------------- |
| | 提交的笔记本中包含构建、测试并通过可视化和准确性说明的 SVR 模型。 | 提交的笔记本未注释或包含错误。 | 提交的笔记本不完整。 |
[^1]: 本节中的文字基于 [ARIMA 的作业](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md)
**免责声明**:
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对使用本翻译所产生的任何误解或误读承担责任。

@ -1,26 +0,0 @@
# 时间序列预测简介
什么是时间序列预测?它是通过分析过去的趋势来预测未来的事件。
## 区域主题:全球电力使用 ✨
在这两节课中,你将了解时间序列预测,这是一种相对较少人知的机器学习领域,但在工业和商业应用等领域中却极具价值。虽然可以使用神经网络来增强这些模型的实用性,但我们将研究它们在经典机器学习背景下的应用,因为模型有助于根据过去的表现预测未来的表现。
我们的区域重点是全球的电力使用,这是一个有趣的数据集,可以了解如何根据过去的负载模式预测未来的电力使用情况。你可以看到这种预测在商业环境中是多么有用。
![电网](../../../translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.zh.jpg)
照片由 [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 拍摄于拉贾斯坦邦的一条道路上的电塔,发布在 [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)
## 课程
1. [时间序列预测简介](1-Introduction/README.md)
2. [构建ARIMA时间序列模型](2-ARIMA/README.md)
3. [构建支持向量回归器进行时间序列预测](3-SVR/README.md)
## 鸣谢
"时间序列预测简介" 由 [Francesca Lazzeri](https://twitter.com/frlazzeri) 和 [Jen Looper](https://twitter.com/jenlooper) 用 ⚡️ 编写。这些笔记本最初出现在 [Azure "Deep Learning For Time Series" repo](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) 上,由 Francesca Lazzeri 编写。SVR 课程由 [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD) 编写。
**免责声明**
本文档是使用机器翻译服务翻译的。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档视为权威来源。对于关键信息,建议进行专业的人类翻译。我们不对使用此翻译而产生的任何误解或曲解承担责任。

@ -1,319 +0,0 @@
## 强化学习和Q-Learning简介
![机器学习中强化学习的概述](../../../../translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.zh.png)
> [Tomomi Imura](https://www.twitter.com/girlie_mac) 的手绘笔记
强化学习涉及三个重要概念:智能体、状态和每个状态的一组动作。通过在指定状态下执行一个动作,智能体会获得奖励。再次想象一下电脑游戏超级马里奥。你是马里奥,你在游戏关卡中,站在悬崖边。你上方有一个硬币。你是马里奥,在游戏关卡中,处于一个特定位置……这就是你的状态。向右移动一步(一个动作)会让你掉下悬崖,这会给你一个低分。然而,按下跳跃按钮会让你得分并且你会活下来。这是一个正面的结果,应该给你一个正的分数。
通过使用强化学习和模拟器(游戏),你可以学习如何玩游戏以最大化奖励,即尽可能多地得分和保持存活。
[![强化学习简介](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
> 🎥 点击上面的图片听 Dmitry 讨论强化学习
## [课前测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/45/)
## 先决条件和设置
在本课中我们将用Python实验一些代码。你应该能够在你的电脑或云端运行本课的Jupyter Notebook代码。
你可以打开[课程笔记本](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb)并通过本课构建。
> **注意:** 如果你从云端打开此代码,你还需要获取 [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) 文件,它在笔记本代码中使用。将其添加到与笔记本相同的目录中。
## 简介
在本课中,我们将探索**[彼得与狼](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**的世界,这个故事灵感来自俄罗斯作曲家[谢尔盖·普罗科菲耶夫](https://en.wikipedia.org/wiki/Sergei_Prokofiev)创作的音乐童话。我们将使用**强化学习**让彼得探索他的环境,收集美味的苹果并避免遇到狼。
**强化学习**RL是一种学习技术它允许我们通过运行许多实验来学习**智能体**在某些**环境**中的最佳行为。在这种环境中,智能体应该有某种**目标**,由**奖励函数**定义。
## 环境
为了简单起见,让我们将彼得的世界看作一个大小为 `width` x `height` 的正方形棋盘,如下所示:
![彼得的环境](../../../../translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.zh.png)
这个棋盘上的每个格子可以是:
* **地面**,彼得和其他生物可以在上面行走。
* **水**,显然你不能在上面行走。
* **树**或**草地**,可以休息的地方。
* **苹果**,彼得会很高兴找到它来喂饱自己。
* **狼**,很危险,应该避免。
有一个单独的Python模块 [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py)包含处理这个环境的代码。因为这些代码对于理解我们的概念并不重要所以我们将导入该模块并用它来创建示例棋盘代码块1
```python
from rlboard import *
width, height = 8,8
m = Board(width,height)
m.randomize(seed=13)
m.plot()
```
这段代码应该打印出类似上图的环境。
## 动作和策略
在我们的例子中,彼得的目标是找到一个苹果,同时避免狼和其他障碍。为此,他可以四处走动,直到找到一个苹果。
因此,在任何位置,他可以选择以下动作之一:向上、向下、向左和向右。
我们将这些动作定义为一个字典,并将它们映射到相应的坐标变化对。例如,向右移动 (`R`) would correspond to a pair `(1,0)`。(代码块2)
```python
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
action_idx = { a : i for i,a in enumerate(actions.keys()) }
```
总结一下,这个场景的策略和目标如下:
- **策略**,我们的智能体(彼得)的策略由一个所谓的**策略函数**定义。策略是一个函数,在任何给定状态下返回动作。在我们的例子中,问题的状态由棋盘表示,包括玩家的当前位置。
- **目标**,强化学习的目标是最终学习一个好的策略,能够有效地解决问题。然而,作为基线,我们考虑最简单的策略,称为**随机行走**。
## 随机行走
让我们首先通过实现随机行走策略来解决我们的问题。通过随机行走我们将从允许的动作中随机选择下一个动作直到我们到达苹果代码块3
1. 使用下面的代码实现随机行走:
```python
def random_policy(m):
return random.choice(list(actions))
def walk(m,policy,start_position=None):
n = 0 # number of steps
# set initial position
if start_position:
m.human = start_position
else:
m.random_start()
while True:
if m.at() == Board.Cell.apple:
return n # success!
if m.at() in [Board.Cell.wolf, Board.Cell.water]:
return -1 # eaten by wolf or drowned
while True:
a = actions[policy(m)]
new_pos = m.move_pos(m.human,a)
if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water:
m.move(a) # do the actual move
break
n+=1
walk(m,random_policy)
```
调用 `walk` 应该返回相应路径的长度,每次运行可能会有所不同。
1. 多次运行行走实验例如100次并打印结果统计数据代码块4
```python
def print_statistics(policy):
s,w,n = 0,0,0
for _ in range(100):
z = walk(m,policy)
if z<0:
w+=1
else:
s += z
n += 1
print(f"Average path length = {s/n}, eaten by wolf: {w} times")
print_statistics(random_policy)
```
请注意路径的平均长度大约是30-40步这相当多考虑到到最近苹果的平均距离大约是5-6步。
你还可以看到彼得在随机行走期间的移动情况:
![彼得的随机行走](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
## 奖励函数
为了让我们的策略更智能,我们需要了解哪些移动比其他移动“更好”。为此,我们需要定义我们的目标。
目标可以用**奖励函数**来定义它会为每个状态返回一些分数值。数值越高奖励函数越好。代码块5
```python
move_reward = -0.1
goal_reward = 10
end_reward = -10
def reward(m,pos=None):
pos = pos or m.human
if not m.is_valid(pos):
return end_reward
x = m.at(pos)
if x==Board.Cell.water or x == Board.Cell.wolf:
return end_reward
if x==Board.Cell.apple:
return goal_reward
return move_reward
```
关于奖励函数的一个有趣之处在于,在大多数情况下,*我们只有在游戏结束时才会得到实质性的奖励*。这意味着我们的算法应该以某种方式记住导致最终正面奖励的“好”步骤,并增加它们的重要性。同样,所有导致不良结果的移动应该被抑制。
## Q-Learning
我们将在这里讨论的算法称为**Q-Learning**。在这个算法中,策略由一个函数(或数据结构)定义,称为**Q-Table**。它记录了在给定状态下每个动作的“好坏”。
它被称为Q-Table因为将其表示为表格或多维数组通常很方便。由于我们的棋盘尺寸为 `width` x `height`,我们可以使用形状为 `width` x `height` x `len(actions)` 的numpy数组来表示Q-Table代码块6
```python
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
```
请注意我们用相等的值初始化Q-Table的所有值在我们的例子中是0.25。这对应于“随机行走”策略因为每个状态下的所有移动都同样好。我们可以将Q-Table传递给 `plot` function in order to visualize the table on the board: `m.plot(Q)`.
![Peter's Environment](../../../../translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.zh.png)
In the center of each cell there is an "arrow" that indicates the preferred direction of movement. Since all directions are equal, a dot is displayed.
Now we need to run the simulation, explore our environment, and learn a better distribution of Q-Table values, which will allow us to find the path to the apple much faster.
## Essence of Q-Learning: Bellman Equation
Once we start moving, each action will have a corresponding reward, i.e. we can theoretically select the next action based on the highest immediate reward. However, in most states, the move will not achieve our goal of reaching the apple, and thus we cannot immediately decide which direction is better.
> Remember that it is not the immediate result that matters, but rather the final result, which we will obtain at the end of the simulation.
In order to account for this delayed reward, we need to use the principles of **[dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming)**, which allow us to think about out problem recursively.
Suppose we are now at the state *s*, and we want to move to the next state *s'*. By doing so, we will receive the immediate reward *r(s,a)*, defined by the reward function, plus some future reward. If we suppose that our Q-Table correctly reflects the "attractiveness" of each action, then at state *s'* we will chose an action *a* that corresponds to maximum value of *Q(s',a')*. Thus, the best possible future reward we could get at state *s* will be defined as `max`<sub>a'</sub>*Q(s',a')* (maximum here is computed over all possible actions *a'* at state *s'*).
This gives the **Bellman formula** for calculating the value of the Q-Table at state *s*, given action *a*:
<img src="images/bellman-equation.png"/>
Here γ is the so-called **discount factor** that determines to which extent you should prefer the current reward over the future reward and vice versa.
## Learning Algorithm
Given the equation above, we can now write pseudo-code for our learning algorithm:
* Initialize Q-Table Q with equal numbers for all states and actions
* Set learning rate α ← 1
* Repeat simulation many times
1. Start at random position
1. Repeat
1. Select an action *a* at state *s*
2. Execute action by moving to a new state *s'*
3. If we encounter end-of-game condition, or total reward is too small - exit simulation
4. Compute reward *r* at the new state
5. Update Q-Function according to Bellman equation: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ max<sub>a'</sub>Q(s',a'))*
6. *s* ← *s'*
7. Update the total reward and decrease α.
## Exploit vs. explore
In the algorithm above, we did not specify how exactly we should choose an action at step 2.1. If we are choosing the action randomly, we will randomly **explore** the environment, and we are quite likely to die often as well as explore areas where we would not normally go. An alternative approach would be to **exploit** the Q-Table values that we already know, and thus to choose the best action (with higher Q-Table value) at state *s*. This, however, will prevent us from exploring other states, and it's likely we might not find the optimal solution.
Thus, the best approach is to strike a balance between exploration and exploitation. This can be done by choosing the action at state *s* with probabilities proportional to values in the Q-Table. In the beginning, when Q-Table values are all the same, it would correspond to a random selection, but as we learn more about our environment, we would be more likely to follow the optimal route while allowing the agent to choose the unexplored path once in a while.
## Python implementation
We are now ready to implement the learning algorithm. Before we do that, we also need some function that will convert arbitrary numbers in the Q-Table into a vector of probabilities for corresponding actions.
1. Create a function `probs()`
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
```
我们在原始向量中添加了一些 `eps`以避免在初始情况下向量的所有分量相同时发生除以0的情况。
通过5000次实验运行学习算法也称为**epochs**代码块8
```python
for epoch in range(5000):
# Pick initial point
m.random_start()
# Start travelling
n=0
cum_reward = 0
while True:
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
dpos = actions[a]
m.move(dpos,check_correctness=False) # we allow player to move outside the board, which terminates episode
r = reward(m)
cum_reward += r
if r==end_reward or cum_reward < -1000:
lpath.append(n)
break
alpha = np.exp(-n / 10e5)
gamma = 0.5
ai = action_idx[a]
Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())
n+=1
```
执行此算法后Q-Table 应该会更新每一步中不同动作的吸引力值。我们可以尝试通过在每个单元格绘制一个指向期望移动方向的向量来可视化Q-Table。为了简化我们画一个小圆圈代替箭头。
## 检查策略
由于Q-Table列出了每个状态下每个动作的“吸引力”因此很容易使用它来定义在我们的世界中的高效导航。在最简单的情况下我们可以选择对应于最高Q-Table值的动作代码块9
```python
def qpolicy_strict(m):
x,y = m.human
v = probs(Q[x,y])
a = list(actions)[np.argmax(v)]
return a
walk(m,qpolicy_strict)
```
> 如果你多次尝试上述代码你可能会注意到有时它会“卡住”你需要按下笔记本中的停止按钮来中断它。这是因为可能会出现两种状态在最优Q-Value方面“指向”彼此的情况在这种情况下智能体最终会在这些状态之间无限移动。
## 🚀挑战
> **任务1:** 修改 `walk` function to limit the maximum length of path by a certain number of steps (say, 100), and watch the code above return this value from time to time.
> **Task 2:** Modify the `walk` function so that it does not go back to the places where it has already been previously. This will prevent `walk` from looping, however, the agent can still end up being "trapped" in a location from which it is unable to escape.
## Navigation
A better navigation policy would be the one that we used during training, which combines exploitation and exploration. In this policy, we will select each action with a certain probability, proportional to the values in the Q-Table. This strategy may still result in the agent returning back to a position it has already explored, but, as you can see from the code below, it results in a very short average path to the desired location (remember that `print_statistics` 运行模拟100次代码块10
```python
def qpolicy(m):
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
return a
print_statistics(qpolicy)
```
运行此代码后你应该会得到比之前小得多的平均路径长度大约在3-6之间。
## 调查学习过程
正如我们所提到的,学习过程是在探索和利用已获得的关于问题空间结构的知识之间的平衡。我们已经看到学习的结果(帮助智能体找到通向目标的短路径的能力)有所改善,但观察学习过程中平均路径长度的变化也很有趣:
学习总结如下:
- **平均路径长度增加**。我们看到的是,起初平均路径长度增加。这可能是因为当我们对环境一无所知时,我们可能会陷入不良状态,如水或狼。随着我们了解更多并开始使用这些知识,我们可以更长时间地探索环境,但我们仍然不知道苹果的位置。
- **路径长度减少,随着我们学到更多**。一旦我们学到足够多,智能体更容易实现目标,路径长度开始减少。然而,我们仍然开放探索,因此我们经常偏离最佳路径,探索新选项,使路径比最优路径更长。
- **长度突然增加**。我们在这个图表上还观察到某些时候长度突然增加。这表明过程的随机性并且我们可能会在某个时候通过用新值覆盖它们来“破坏”Q-Table系数。这理想情况下应该通过降低学习率来最小化例如在训练结束时我们只调整Q-Table值一个小值
总的来说,重要的是要记住,学习过程的成功和质量在很大程度上取决于参数,如学习率、学习率衰减和折扣因子。这些通常称为**超参数**,以区别于**参数**我们在训练过程中优化例如Q-Table系数。找到最佳超参数值的过程称为**超参数优化**,它值得单独讨论。
## [课后测验](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/46/)
## 作业
[一个更真实的世界](assignment.md)
**免责声明**
本文档是使用基于机器的人工智能翻译服务翻译的。虽然我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的本国语言版本视为权威来源。对于重要信息,建议使用专业人工翻译。对于因使用此翻译而引起的任何误解或误读,我们不承担责任。

@ -1,28 +0,0 @@
# 一个更真实的世界
在我们的情境中,彼得几乎可以不感到疲倦或饥饿地四处移动。在一个更真实的世界中,他需要时不时地坐下来休息,还需要吃东西。让我们通过实现以下规则使我们的世界更加真实:
1. 从一个地方移动到另一个地方时,彼得会失去**能量**并获得一些**疲劳**。
2. 彼得可以通过吃苹果来获得更多能量。
3. 彼得可以通过在树下或草地上休息来消除疲劳(即走到有树或草的棋盘位置 - 绿色区域)。
4. 彼得需要找到并杀死狼。
5. 为了杀死狼,彼得需要有一定的能量和疲劳水平,否则他会输掉战斗。
## 指导
使用原始的 [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) 笔记本作为解决方案的起点。
根据游戏规则修改上述奖励函数,运行强化学习算法以学习赢得游戏的最佳策略,并比较随机漫步算法与您的算法在赢得和输掉游戏数量方面的结果。
> **Note**: 在您的新世界中,状态更加复杂,除了人类位置外,还包括疲劳和能量水平。您可以选择将状态表示为元组 (Board,energy,fatigue),或者为状态定义一个类(您也可以从 `Board` 派生它),甚至可以修改原始的 `Board` 类在 [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py) 中。
在您的解决方案中,请保留负责随机漫步策略的代码,并在最后将您的算法结果与随机漫步进行比较。
> **Note**: 您可能需要调整超参数以使其正常工作,尤其是训练次数。由于游戏的成功(与狼战斗)是一个罕见事件,您可以预期更长的训练时间。
## 评分标准
| 标准 | 杰出 | 合格 | 需要改进 |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| | 提供了一个定义新世界规则的笔记本Q-Learning 算法和一些文字解释。Q-Learning 能够显著改善与随机漫步相比的结果。 | 提供了笔记本Q-Learning 已实现并改善了与随机漫步相比的结果,但并不显著;或者笔记本记录不充分,代码结构不良。 | 尝试重新定义世界规则,但 Q-Learning 算法不起作用,或者奖励函数未完全定义。 |
**免责声明**
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文件视为权威来源。对于关键信息,建议进行专业的人工翻译。对于因使用本翻译而产生的任何误解或误读,我们不承担责任。

@ -1,4 +0,0 @@
**免责声明**:
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用此翻译而产生的任何误解或误读,我们不承担责任。

@ -1,4 +0,0 @@
**免责声明**
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应将原文档的母语版本视为权威来源。对于关键信息,建议进行专业的人类翻译。对于因使用此翻译而产生的任何误解或误释,我们不承担任何责任。

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

Loading…
Cancel
Save