Iti0210lab15: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
PriitJ (arutelu | kaastöö)
PriitJ (arutelu | kaastöö)
 
(ei näidata sama kasutaja 6 vahepealset redaktsiooni)
6. rida: 6. rida:
* lineaarse mudeli treenimine ''gradient descent'' meetodiga
* lineaarse mudeli treenimine ''gradient descent'' meetodiga
* klassifitseerimine (logistiline regressioon)
* klassifitseerimine (logistiline regressioon)
Logistiline regressioon on muuhulgas kasutuses tänapäevaste sügavate närvivõrkude viimases kihis.


== Ettevalmistus ==
== Ettevalmistus ==
24. rida: 25. rida:
</pre>
</pre>


Selles harjutuses võiks kasutada [https://scipy.org/install.html NumPy] paketti.
Selles harjutuses võiks kasutada [https://scipy.org/install.html NumPy] paketti. Kui arvutis on juba Anaconda, pole vaja midagi installida.


Andmete laadimine:
Andmete laadimine:
47. rida: 48. rida:


Massiiv <code>X</code> on meil nüüd 2-mõõtmeline, kus sees kõik sensoriandmed, iga rida üks mõõtmine. <code>y</code> on, kas samal ajal inimene oli ruumis või mitte, väärtused 1 ja 0. NumPy massiivide suurust saab vaadata nii: <code>X.shape</code>
Massiiv <code>X</code> on meil nüüd 2-mõõtmeline, kus sees kõik sensoriandmed, iga rida üks mõõtmine. <code>y</code> on, kas samal ajal inimene oli ruumis või mitte, väärtused 1 ja 0. NumPy massiivide suurust saab vaadata nii: <code>X.shape</code>
[https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Numpy_Python_Cheat_Sheet.pdf NumPy cheat sheet]


== Treenimine ja testimine ==
== Treenimine ja testimine ==
83. rida: 86. rida:


<pre>
<pre>
def test_model(W, X, y, threshold=0.5):
def test_model(w, X, y, threshold=0.5):
     yhat = W[0] + (W[1:] * X).sum(axis=1)      # value from linear model
     yhat = w[0] + (w[1:] * X).sum(axis=1)      # value from linear model
     ypred = (yhat > threshold).astype(int)    # prediction (is somebody in the room?)
     ypred = (yhat > threshold).astype(int)    # prediction (is somebody in the room?)
     ytrue = (ypred == y).astype(int)          # compare to true value
     ytrue = (ypred == y).astype(int)          # compare to true value
91. rida: 94. rida:
X_test = normalize(test[:,:5])
X_test = normalize(test[:,:5])
y_test = normalize(test[:,5])
y_test = normalize(test[:,5])
print(test_model(W, X_test, y_test))
print(test_model(w, X_test, y_test))
</pre>
</pre>


101. rida: 104. rida:


<pre>
<pre>
def sse_loss(W, X, y):
def sse_loss(w, X, y):
     yhat = W[0] + (W[1:] * X).sum(axis=1)
     yhat = w[0] + (w[1:] * X).sum(axis=1)
     err = y - yhat
     err = y - yhat
     return np.square(err).sum()
     return np.square(err).sum()
120. rida: 123. rida:
# Kui kasutad <code>sse_loss()</code> funktsiooni, siis ka seal <code>yhat</code> arvutust
# Kui kasutad <code>sse_loss()</code> funktsiooni, siis ka seal <code>yhat</code> arvutust


Logistiline regressioon SSE kadufunktsiooniga võib õppida üsna aeglaselt. Väike trikk, mida võib teha: Kasuta kaalude uuendamiseks sama gradiendi valemit, nagu lineaarse regressiooni juures. See tähendab sisuliselt, et valisime uue [https://artint.info/2e/html/ArtInt2e.Ch7.S2.SS1.html#Ch7.S2.I4.i2 viisi kadu (''loss'') arvutada].
Logistiline regressioon SSE kaofunktsiooniga võib õppida üsna aeglaselt. Väike trikk, mida võib teha: Kasuta kaalude uuendamiseks sama gradiendi valemit, nagu lineaarse regressiooni juures (ehk siis, muuda tagasi selliseks nagu enne oli).
 
See tähendab sisuliselt, et me ei kasuta enam SSE-d, vaid valisime uue [https://artint.info/2e/html/ArtInt2e.Ch7.S2.SS1.html#Ch7.S2.I4.i2 viisi kadu (''loss'') arvutada].


== Viited ==
== Viited ==


Candanedo, L. M., & Feldheim, V. (2016). Accurate occupancy detection of an office room from light, temperature, humidity and CO2 measurements using statistical learning models. ''Energy and Buildings'', 112, 28-39.
Candanedo, L. M., & Feldheim, V. (2016). Accurate occupancy detection of an office room from light, temperature, humidity and CO2 measurements using statistical learning models. ''Energy and Buildings'', 112, 28-39.

Viimane redaktsioon: 1. mai 2019, kell 20:03

Lineaarsed mudelid

Sissejuhatus

Kasutame lineaarset mudelit, et sensorite andmete pealt tuvastada, kas ruumis viibib inimene või mitte [1]. Ülesandes tuleb kirjutada lihtne programm, mis suudab treeningandmed lineaarse mudeliga sobitada ja siis testandmetega kontrollida, kui täpne leitud mudel on. Eesmärgiks saada aru, kuidas töötab:

  • lineaarse mudeli treenimine gradient descent meetodiga
  • klassifitseerimine (logistiline regressioon)

Logistiline regressioon on muuhulgas kasutuses tänapäevaste sügavate närvivõrkude viimases kihis.

Ettevalmistus

Andmed treenimiseks ja testimiseks:

Sisendandmete kirjeldus (veergude kaupa):

Temperature, in Celsius 
Relative Humidity, % 
Light, in Lux 
CO2, in ppm 
Humidity Ratio, Derived quantity from temperature and relative humidity, in kgwater-vapor/kg-air 
Occupancy, 0 or 1, 0 for not occupied, 1 for occupied status

Selles harjutuses võiks kasutada NumPy paketti. Kui arvutis on juba Anaconda, pole vaja midagi installida.

Andmete laadimine:

import numpy as np

train = np.loadtxt("train.csv", delimiter=",")
test = np.loadtxt("test.csv", delimiter=",")

Skaleerime kohe andmed (kui ei kasuta NumPy-t, siis idee on väärtused läbi jagada sama veeru maksimumiga, tekivad numbrid vahemikus [0, 1]).

Numpy 2-mõõtmelise massiivi indeksid on A[i,j], kusjuures võib kasutada ka : - kõik väärtused ja tavalises Pythoni stiilis from:to, mis valib mingi lõigu.

def normalize(X):
    return X / np.max(np.abs(X), axis=0)

X = normalize(train[:,:5])  # columns 0..4
y = normalize(train[:,5])   # column 5  (classification, 0 or 1)

Massiiv X on meil nüüd 2-mõõtmeline, kus sees kõik sensoriandmed, iga rida üks mõõtmine. y on, kas samal ajal inimene oli ruumis või mitte, väärtused 1 ja 0. NumPy massiivide suurust saab vaadata nii: X.shape

NumPy cheat sheet

Treenimine ja testimine

Kasutame stohhastilist (tähendab, juhuslikkusel põhinevat) gradientmeetodit (SGD).

def fit_sgd(X, y, niter=100, alpha=0.01):
    # initialize weights vector w

    # loop niter times
        # select random sample from X
        #    (and corresponding value in y)
        # let's say X[n], y[n]

        # calculate the estimate yhat from X[n] and weights

        # calculate error y[n]-yhat

        # update w_0
        # for each weight w_i in w_1, ...
            # update w_i

    return w    # weights vector

Vajalikud valemid:

Õppimise kiiruse alpha võib valida vahemikus 0.001...0.5 ja vaadata, mis juhtub.

Kuidas me teame, et treenimine on lõppenud?

Üks variant oleks lihtsalt katsetada, kui hea meie meetod on:

def test_model(w, X, y, threshold=0.5):
    yhat = w[0] + (w[1:] * X).sum(axis=1)      # value from linear model
    ypred = (yhat > threshold).astype(int)     # prediction (is somebody in the room?)
    ytrue = (ypred == y).astype(int)           # compare to true value
    return ytrue.sum() / y.shape[0]            # true count / total count

X_test = normalize(test[:,:5])
y_test = normalize(test[:,5])
print(test_model(w, X_test, y_test))

Kasvata iteratsioonide arvu, kuni ennustustäpsus enam ei parane.

Number, mis tagastatakse, on testjuhtude protsent, kus me leidsime sensoriandmete põhjal õigesti, kas inimene on ruumis või mitte.

Kavalam viis oleks jälgida, kuidas täpsuse kadu (SSE loss) kahaneb treenimise ajal. Kui see enam ei kahane, pole mõtet treenida. Antud funktsiooni on mõtet kasutada mingi arvu tsüklite järel, mitte igas treeningtsüklis:

def sse_loss(w, X, y):
    yhat = w[0] + (w[1:] * X).sum(axis=1)
    err = y - yhat
    return np.square(err).sum()

Logistiline mudel

Muudame, kuidas mudel ennustuse 1 või 0 arvutab ja kuidas treenitakse:

Selleks, et logistilist mudelit kasutada, tuleks muuta:

  1. yhat arvutamist fit_sgd() funktsioonis
  2. Samas muuta kaalude õppimise valemit
  3. yhat arvutamist test_model() funktsioonis
  4. Kui kasutad sse_loss() funktsiooni, siis ka seal yhat arvutust

Logistiline regressioon SSE kaofunktsiooniga võib õppida üsna aeglaselt. Väike trikk, mida võib teha: Kasuta kaalude uuendamiseks sama gradiendi valemit, nagu lineaarse regressiooni juures (ehk siis, muuda tagasi selliseks nagu enne oli).

See tähendab sisuliselt, et me ei kasuta enam SSE-d, vaid valisime uue viisi kadu (loss) arvutada.

Viited

Candanedo, L. M., & Feldheim, V. (2016). Accurate occupancy detection of an office room from light, temperature, humidity and CO2 measurements using statistical learning models. Energy and Buildings, 112, 28-39.