TensorFlow lineaarne regressioon tahke ja interaktsiooni terminiga

Sellest õpetusest saate teada, kuidas andmeid kontrollida ja valmistada ette lihtsa lineaarse regressiooniülesande loomiseks.

See õpetus on jagatud kaheks osaks:

  • Otsige suhtlust
  • Testige mudelit

aasta eelmine juhendaja, kasutasite maja mediaanhinna hindamiseks Bostoni andmestikku. Bostoni andmekogum on väike, ainult 506 vaatlusega. Seda andmekogumit peetakse võrdlusaluseks uute lineaarse regressiooni algoritmide proovimisel.

Andmekogum koosneb:

Muutuja Kirjeldus
zn Üle 25,000 XNUMX ruutjalga kruntidele tsoneeritud elamumaa osakaal.
indus Mitte-jaekaubanduse aakri osakaal linna kohta.
nox lämmastikoksiidide kontsentratsioon
rm keskmine tubade arv eluruumi kohta
vanus enne 1940. aastat ehitatud omanike kasutuses olevate üksuste osakaal
dis kaalutud vahemaad viie Bostoni tööhõivekeskuseni
maks täisväärtuslik kinnisvaramaksumäär 10,000 XNUMX dollari kohta
ptratio õpilaste ja õpetajate suhe linna lõikes
medv Omaniku kasutuses olevate kodude mediaanväärtus tuhandetes dollarites
krim kuritegevuse tase elaniku kohta linnade kaupa
Chas Charles Riveri näivmuutuja (1, kui piirneb jõega; 0 muidu)
B mustanahaliste osakaal linna järgi

Selles õpetuses hindame mediaanhinda lineaarse regresori abil, kuid keskendume ühele konkreetsele protsessile. masinõpe: "andmete ettevalmistamine."

Mudel üldistab andmete mustri. Sellise mustri jäädvustamiseks peate selle kõigepealt leidma. Hea tava on teha andmeanalüüs enne mis tahes masinõppealgoritmi käivitamist.

Õigete funktsioonide valimine muudab teie mudeli edukuse täielikult. Kujutage ette, et proovite hinnata inimeste palka, kui te ei lisa sugu muutujana, saate halva hinnangu.

Teine võimalus mudelit täiustada on vaadata sõltumatu muutuja vahelist korrelatsiooni. Tagasi näite juurde, võite mõelda haridusele kui suurepärasele kandidaadile, et ennustada palka, aga ka ametit. On aus öelda, et amet sõltub haridustasemest, nimelt annab kõrgharidus sageli parema ameti. Kui seda ideed üldistada, võime öelda, et sõltuva muutuja ja selgitava muutuja vahelist seost saab suurendada veel ühe selgitava muutuja võrra.

Et tabada hariduse piiratud mõju ametile, võime kasutada interaktsiooniterminit.

Interaktsiooni tähtaeg

Kui vaadata palgavõrrandit, on see järgmine:

Interaktsiooni tähtaeg

If Interaktsiooni tähtaeg on positiivne, siis tähendab see, et täiendav haridustase toob kaasa maja mediaanväärtuse suurema tõusu kõrge hõivatuse taseme korral. Teisisõnu, hariduse ja ameti vahel on koostoime.

Selles õpetuses proovime näha, millised muutujad võivad olla interaktsiooniterminite jaoks head kandidaadid. Testime, kas sellise teabe lisamine annab parema hinnaennustuse.

Kokkuvõtlik statistika

Enne mudeli juurde asumist saate järgida mõnda sammu. Nagu varem mainitud, on mudel andmete üldistus. Parim sobiv tava on andmete mõistmine ja ennustuste tegemine. Kui te oma andmeid ei tea, on teil vähe võimalusi oma mudelit täiustada.

Esimese sammuna laadige andmed pandade andmeraamina ja looge treeningkomplekt ja testimiskomplekt.

Nõuanded. Selle õpetuse jaoks peab teil olema installitud matplotlit ja seaborn Python. Saate installida Python pakett lennult koos Jupyter. Sa Ei peaks tee seda

!conda install -- yes matplotlib

kuid

import sys
!{sys.executable} -m pip install matplotlib # Already installed
!{sys.executable} -m pip install seaborn 

Pange tähele, et see samm pole vajalik, kui teil on installitud matplotlib ja seaborn.

Matplotlib on teek graafiku loomiseks Python. Seaborn on matplotlibi peale ehitatud statistilise visualiseerimise raamatukogu. See pakub atraktiivseid ja ilusaid krunte.

Allolev kood impordib vajalikud teegid.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as np

Raamatukogu sklearn sisaldab Bostoni andmestikku. Andmete importimiseks saate helistada selle API-le.

boston = load_boston()
df = pd.DataFrame(boston.data)

Objekti nimi salvestatakse massiivi objektile tunnuse_nimed.

boston.feature_names

Väljund

array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')

Saate veerge ümber nimetada.

df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)

Lineaarne regressioon tahke ja interaktsiooni terminiga

Teisendate muutuja CHAS stringmuutujaks ja märgite selle jah-ga, kui CHAS = 1 ja ei, kui CHAS = 0

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})
df['CHAS'].head(5)
0    no
1    no
2    no
3    no
4    no
Name: CHAS, dtype: object

Pandade puhul on andmekogumit lihtne jagada. Jagate andmestiku juhuslikult 80-protsendilise treeningkomplekti ja 20-protsendilise testimiskomplektiga. Pandad neil on sisseehitatud kulufunktsioon andmekaadri näidise jagamiseks.

Esimene parameeter frac on väärtus vahemikus 0 kuni 1. Määrate selle väärtuseks 0.8, et valida juhuslikult 80 protsenti andmekaadrist.

Random_state võimaldab tagastada kõigile sama andmeraami.

### Create train/test set
df_train=df.sample(frac=0.8,random_state=200)
df_test=df.drop(df_train.index)

Saate määrata andmete kuju. See peaks olema:

  • Rongikomplekt: 506*0.8 = 405
  • Testikomplekt: 506*0.2 = 101
print(df_train.shape, df_test.shape)

Väljund

(405, 14) (101, 14)
df_test.head(5)

Väljund

KURITEGEVUS ZN INDUS CHAS NOX RM AGE DIS RAD MAKS PTRATIO B LSTAT HIND
0 0.00632 18.0 2.31 ei 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 ei 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14 21.6
3 0.03237 0.0 2.18 ei 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94 33.4
6 0.08829 12.5 7.87 ei 0.524 6.012 66.6 5.5605 5.0 311.0 15.2 395.60 12.43 22.9
7 0.14455 12.5 7.87 ei 0.524 6.172 96.1 5.9505 5.0 311.0 15.2 396.90 19.15 27.1

Andmed on segased; see on sageli tasakaalust väljas ja üle puistatud kõrvalekallete väärtustega, mis viskavad analüüsi ja masinõppe koolituse kõrvale.

Esimene samm andmestiku puhastamiseks on mõista, kus see puhastamist vajab. Andmestiku puhastamine võib olla keeruline, eriti mis tahes üldistaval viisil

Google'i uurimisrühm on selle töö jaoks välja töötanud tööriista nimega Tahked mis aitavad andmeid visualiseerida ja kõikvõimalikel viisidel tükeldada. See on hea lähtepunkt andmestiku paigutuse mõistmiseks.

Aspektid võimaldavad teil leida kohad, kus andmed ei tundu päris nii, nagu te arvate.

Välja arvatud nende veebirakendus, muudab Google tööriistakomplekti hõlpsaks manustamise a Jupyter märkmik.

Facetsil on kaks osa:

  • Aspektide ülevaade
  • Facets Deep Dive

Aspektide ülevaade

Facets Overview annab andmestikust ülevaate. Facets Overview jagab andmete veerud oluliste kuvatud teabe ridadeks

  1. puuduvate vaatluste protsent
  2. min ja max väärtused
  3. statistika, nagu keskmine, mediaan ja standardhälve.
  4. See lisab ka veeru, mis näitab nullidega väärtuste protsenti, mis on kasulik, kui enamik väärtusi on nullid.
  5. Neid jaotusi on võimalik näha nii testandmestikul kui ka iga funktsiooni koolituskomplektis. See tähendab, et saate veel kord kontrollida, kas testil on treeningandmetega sarnane jaotus.

See on vähemalt miinimum, mis tuleb enne mis tahes masinõppetoimingut teha. Selle tööriistaga ei jäta te seda olulist sammu vahele ja see toob esile mõned kõrvalekalded.

Facets Deep Dive

Facets Deep Dive on lahe tööriist. See võimaldab teil oma andmestiku osas selgust saada ja üksikute andmete nägemiseks täielikult sisse suumida. See tähendab, et saate andmeid ridade ja veergude kaupa jaotada kõigi andmestiku funktsioonide lõikes.

Kasutame neid kahte tööriista Bostoni andmekogumiga.

märkused: Te ei saa samaaegselt kasutada funktsiooni Facets Overview ja Facets Deep Dive. Tööriista vahetamiseks peate esmalt sülearvuti tühjendama.

Installige Facet

Enamiku analüüside jaoks saate kasutada veebirakendust Facet. Selles õpetuses näete, kuidas seda kasutada a Jupyter Märkmik.

Kõigepealt peate installima nbextensions. Seda tehakse selle koodiga. Kopeerite ja kleepite järgmise koodi oma masina terminali.

pip install jupyter_contrib_nbextensions

Kohe pärast seda peate oma arvutis olevad hoidlad kloonima. Teil on kaks valikut:

Valik 1) Kopeerige ja kleepige see kood terminali (Soovitatav)

Kui teie arvutisse pole Git installitud, minge sellele URL-ile https://git-scm.com/download/win ja järgige juhiseid. Kui olete lõpetanud, saate kasutada Maci kasutaja terminalis käsku git või Anaconda viipa Windows kasutaja

git clone https://github.com/PAIR-code/facets

Valik 2) Minna https://github.com/PAIR-code/facets ja laadige hoidlad alla.

Installige Facet

Kui valite esimese valiku, jõuab fail teie allalaaditavasse faili. Saate lasta failil alla laadida või lohistada selle teisele teele.

Selle käsurealt saate kontrollida, kus tahke on salvestatud:

echo `pwd`/`ls facets`

Nüüd, kui olete Facetsi leidnud, peate selle installima Jupyter Märkmik. Peate määrama töökataloogi teele, kus tahud asuvad.

Teie praegune töökataloog ja Facetsi ZIP-i asukoht peaksid olema samad.

Installige Facet

Peate suunama töökataloogi Facet:

cd facets

Facetsi installimiseks Jupyter, on teil kaks võimalust. Kui olete installinud Jupyter Condaga kõigi kasutajate jaoks kopeerige see kood:

saab kasutada jupyter nbextension install facets-dist/

jupyter nbextension install facets-dist/

Vastasel juhul kasutage:

jupyter nbextension install facets-dist/ --user

Olgu, kõik on valmis. Avame aspektide ülevaate.

Ülevaade

Ülevaade kasutab a Python skript statistika arvutamiseks. Peate importima skripti nimega generic_feature_statistics_generator Jupyter. Ärge muretsege; skript asub tahkude failides.

Peate leidma selle tee. Seda tehakse lihtsalt. Avate tahud, avate faili facets_overview ja seejärel python. Kopeeri tee

Ülevaade aspekt

Pärast seda minge tagasi juurde Jupyterja kirjutage järgmine kood. Muutke tee '/Users/Thomas/facets/facets_overview/python' oma teeks.

# Add the facets overview python code to the python path# Add t 
import sys
sys.path.append('/Users/Thomas/facets/facets_overview/python')

Saate skripti importida alloleva koodiga.

from generic_feature_statistics_generator import 
GenericFeatureStatisticsGenerator

Windowsis muutub sama kood

import sys
sys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")

from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

Funktsioonide statistika arvutamiseks peate kasutama funktsiooni GenericFeatureStatisticsGenerator() ja kasutate objekti ProtoFromDataFrames. Andmeraami saate edastada sõnastikus. Näiteks kui tahame koostada rongikogumi kohta kokkuvõtvat statistikat, saame salvestada teabe sõnastikku ja kasutada seda objektis "ProtoFromDataFrames"

  • 'name': 'train', 'table': df_train

Nimi on kuvatava tabeli nimi ja te kasutate kokkuvõtte arvutamiseks selle tabeli nime. Teie näites on andmeid sisaldav tabel df_train

# Calculate the feature statistics proto from the datasets and stringify it for use in facets overview
import base64

gfsg = GenericFeatureStatisticsGenerator()

proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train},
                                  {'name': 'test', 'table': df_test}])

#proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}])
protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")

Lõpuks kopeerige ja kleepige allolev kood. Kood pärineb otse GitHubist. Peaksite nägema seda:

Ülevaade aspekt

# Display the facets overview visualization for this data# Displ 
from IPython.core.display import display, HTML

HTML_TEMPLATE = """<link rel="import" href="/et/nbextensions/facets-dist/facets-jupyter.html" >
        <facets-overview id="elem"></facets-overview>
        <script>
          document.querySelector("#elem").protoInput = "{protostr}";
        </script>"""
html = HTML_TEMPLATE.format(protostr=protostr)
display(HTML(html))

Graafik

Pärast andmete ja nende jaotuse kontrollimist saate joonistada korrelatsioonimaatriksi. Korrelatsioonimaatriks arvutab Pearsoni koefitsiendi. See koefitsient on seotud -1 ja 1 vahel, kusjuures positiivne väärtus näitab positiivset ja negatiivne väärtus negatiivset korrelatsiooni.

Teid huvitab, millised muutujad võivad olla interaktsiooniterminite jaoks head kandidaadid.

## Choose important feature and further check with Dive
%matplotlib inline  
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="ticks")
# Compute the correlation matrix
corr = df.corr('pearson')
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))

# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})

Väljund

<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>

png

Tahkegraafik

Maatriksist näete:

  • LSTAT
  • RM

on tugevas korrelatsioonis hinnaga PRICE. Teine põnev omadus on tugev positiivne korrelatsioon NOX ja INDUS vahel, mis tähendab, et need kaks muutujat liiguvad samas suunas. Pealegi on need ka korrelatsioonis HINNAGA. DIS on samuti tugevas korrelatsioonis IND ja NOX-iga.

Teil on esimene vihje, et IND ja NOX võivad olla head kandidaadid pealtkuulamistermini jaoks ja DIS võib samuti olla huvitav keskenduda.

Võite minna veidi sügavamale, joonistades paarisruudustiku. See illustreerib üksikasjalikumalt varem joonistatud korrelatsioonikaarti.

Paariruudustik, mille me koostame järgmiselt:

  • Ülemine osa: sobitatud joonega hajuvusdiagramm
  • Diagonaal: tuuma tiheduse graafik
  • Alumine osa: mitme muutujaga tuuma tiheduse graafik

Valite fookuse neljale sõltumatule muutujale. Valik vastab muutujatele, millel on tugev korrelatsioon hinnaga HIND

  • INDUS
  • NOX
  • RM
  • LSTAT

pealegi HIND.

märkused et standardviga lisatakse vaikimisi hajuvusgraafikule.

attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"]

g = sns.PairGrid(df[attributes])
g = g.map_upper(sns.regplot, color="g")
g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False)
g = g.map_diag(sns.kdeplot)

Väljund

Tahkegraafik

Alustame ülemisest osast:

  • Hind on negatiivses korrelatsioonis INDUSe, NOXi ja LSTATiga; positiivses korrelatsioonis RM-iga.
  • LSTAT-i ja PRICE-ga on veidi ebalineaarsust
  • Kui hind on 50, on nagu sirgjoon. Andmestiku kirjeldusest on PRICE kärbitud väärtusega 50

diagonaal

  • NOXil näib olevat kaks klastrit, üks umbes 0.5 ja teine ​​umbes 0.85.

Selle kohta lisateabe saamiseks võite vaadata alumist osa. Multivariate Kernel Density on selles mõttes huvitav, et see värvib seal, kus asub enamik punkte. Erinevus hajuvusdiagrammiga joonistab tõenäosustiheduse, kuigi antud koordinaadi jaoks pole andmekogumil mingit mõtet. Kui värv on tugevam, näitab see punkti suurt kontsentratsiooni selle piirkonna ümber.

Kui kontrollite INDUS-i ja NOX-i mitme muutujaga tihedust, näete positiivset korrelatsiooni ja kahte klastrit. Kui tööstuse osakaal on üle 18, on lämmastikoksiidide kontsentratsioon üle 0.6.

Võite mõelda INDUSe ja NOX-i vahelise interaktsiooni lisamisele lineaarses seoses.

Lõpuks saate kasutada teist Google'i loodud tööriista Facets Deep Dive. Liides on jagatud neljaks põhiosaks. Keskne ala keskel on andmete suumitav kuva. Paneeli ülaosas on rippmenüü, kus saate muuta andmete paigutust, et juhtida lihvimist, positsioneerimist ja värvi. Paremal on konkreetse andmerea üksikasjalik vaade. See tähendab, et saate klõpsata mis tahes andmepunktil keskmises visualiseerimises, et näha selle konkreetse andmepunkti üksikasju.

Andmete visualiseerimise etapis olete huvitatud maja hinna sõltumatu muutuja paaripõhise korrelatsiooni otsimisest. See hõlmab aga vähemalt kolme muutujat ja 3D-graafikutega on keeruline töötada.

Üks viis selle probleemi lahendamiseks on luua kategooriline muutuja. See tähendab, et saame luua punkti värvi 2D-skeemi. Muutuja PRICE saab jagada nelja kategooriasse, kusjuures iga kategooria on kvartiil (st 0.25, 0.5, 0.75). Nimetate seda uut muutujat Q_PRICE.

## Check non linearity with important features
df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
## Show non linearity between RM and LSTAT
ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")

Tahkegraafik

Facets Deep Dive

Deep Dive'i avamiseks peate andmed teisendama JSON-vormingusse. Pandad selleks objektiks. Pärast Pandase andmestikku saate kasutada to_jsonit.

Koodi esimene rida käsitleb andmestiku suurust.

df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
sprite_size = 32 if len(df.index)>50000 else 64
jsonstr = df.to_json(orient='records')

Allolev kood pärineb Google GitHubist. Pärast koodi käivitamist peaksite nägema järgmist:

Facets Deep Dive

# Display thde Dive visualization for this data
from IPython.core.display import display, HTML

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/et/nbextensions/facets-dist/facets-jupyter.html">
        <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive>
        <script>
          document.querySelector("#elem").data = {jsonstr};
        </script>"""

# Load the json dataset and the sprite_size into the template
html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)

# Display the template
display(HTML(html))

Teid huvitab, kas tööstuse määra, oksiidikontsentratsiooni, töökeskuse kauguse ja maja hinna vahel on seos.

Selleks jagage esmalt andmed hinnakvartiiliga tööstusharu ja värvi järgi:

  • Valige lihvimine X ja valige INDUS.
  • Valige Kuva ja valige DIS. See värvib täpid majahinna kvartiiliga

siin tähendavad tumedamad värvid, et kaugus esimesest töökeskusest on kaugel.

Siiani näitab see jälle seda, mida sa tead, madalamat tööstuse intressimäära, kõrgemat hinda. Nüüd saate vaadata jaotust INDUXi ja NOXi järgi.

  • Valige tahk Y ja valige NOX.

Nüüd näete, et esimesest töökeskusest kaugel asuval majal on madalaim tööstusharu osakaal ja seega ka madalaim oksiidikontsentratsioon. Kui valite tüübi kuvamise Q_PRICE-ga ja suumite alumist vasakut nurka, näete, mis tüüpi hind see on.

Teil on veel üks vihje, et IND, NOX ja DIS vaheline interaktsioon võib olla mudeli täiustamiseks head kandidaadid.

TensorFlow

Selles jaotises hindate lineaarset klassifikaatorit TensorFlow hinnangute API-ga. Te jätkate järgmiselt:

  • Valmistage andmed ette
  • Võrdlusmudeli hindamine: interaktsioon puudub
  • Hinnake interaktsiooniga mudelit

Pidage meeles, et masinõppe eesmärk on vigade minimeerimine. Sel juhul võidab väikseima keskmise ruudu veaga mudel. TensorFlow hindaja arvutab selle mõõdiku automaatselt.

Ettevalmistuse andmed

Enamikul juhtudel peate oma andmeid muutma. Seetõttu on Facets Overview põnev. Kokkuvõtvast statistikast nägite, et seal on kõrvalekaldeid. Need väärtused mõjutavad hinnanguid, kuna need ei sarnane teie analüüsitava populatsiooniga. Kõrvalekalduvad tulemused tavaliselt kallutasid tulemusi. Näiteks kaldub positiivne kõrvalekalle koefitsienti üle hindama.

Hea lahendus selle probleemi lahendamiseks on muutuja standardimine. Standardimine tähendab standardhälvet ühe ja nulli keskmist. Standardimisprotsess koosneb kahest etapist. Esiteks lahutab see muutuja keskmise väärtuse. Teiseks jagab see standardhälbega nii, et jaotusel on ühikuline standardhälve.

Teek sklearn on abiks muutujate standardiseerimiseks. Selleks saate kasutada mooduli eeltöötlust koos objekti skaalaga.

Andmestiku skaleerimiseks saate kasutada allolevat funktsiooni. Pange tähele, et te ei skaleeri sildi veergu ja kategooria muutujaid.

from sklearn import preprocessing
def standardize_data(df): 
    X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT']])
    X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'])
    df_scale = pd.concat([X_scaled_df,
                       df['CHAS'],
                       df['PRICE']],axis=1, join='inner')
    return df_scale

Funktsiooni saate kasutada skaleeritud rongi/katsekomplekti koostamiseks.

df_train_scale = standardize_data(df_train)
df_test_scale = standardize_data(df_test)

Põhiline regressioon: etalon

Esiteks treenite ja testite mudelit ilma suhtlemiseta. Eesmärk on näha mudeli jõudlusmõõdikut.

Modelli koolitamise viis on täpselt nii, nagu õpetuses Kõrgetasemeline API. Kasutate TensorFlow hindajat LinearRegressor.

Meeldetuletuseks peate valima:

  • mudelisse lisatavad omadused
  • funktsioone muuta
  • konstrueerida lineaarne regressor
  • konstrueerida funktsioon input_fn
  • koolitada modelli
  • testi mudelit

Mudeli koolitamiseks kasutate kõiki andmestiku muutujaid. Kokku on tasandi pidevad muutujad ja üks kategooriline muutuja

## Add features to the bucket: 
### Define continuous list
CONTI_FEATURES  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']
CATE_FEATURES = ['CHAS']

Funktsioonid teisendate numbriveeruks või kategooriliseks veerguks

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
#categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000)
categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]

Mudeli loote lineaarregressori abil. Mudeli salvestate kausta train_Boston

model = tf.estimator.LinearRegressor(    
	model_dir="train_Boston",     
    feature_columns=categorical_features + continuous_features)

Väljund

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a19e76ac8>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

Iga rongi- või katseandmete veerg teisendatakse funktsiooniga get_input_fn Tensoriks

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS']
LABEL= 'PRICE'
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

Hindate mudelit rongi andmete põhjal.

model.train(input_fn=get_input_fn(df_train_scale, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Väljund

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train_Boston/model.ckpt.
INFO:tensorflow:loss = 56417.703, step = 1
INFO:tensorflow:global_step/sec: 144.457
INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)
INFO:tensorflow:global_step/sec: 258.392
INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)
INFO:tensorflow:global_step/sec: 227.998
INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)
INFO:tensorflow:global_step/sec: 210.739
INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)
INFO:tensorflow:global_step/sec: 234.237
INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)
INFO:tensorflow:global_step/sec: 238.1
INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)
INFO:tensorflow:global_step/sec: 237.934
INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)
INFO:tensorflow:global_step/sec: 220.687
INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)
INFO:tensorflow:global_step/sec: 232.702
INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt.
INFO:tensorflow:Loss for final step: 23228.568.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>

Lõpuks hindate testikomplekti mudeli jõudlust

model.evaluate(input_fn=get_input_fn(df_test_scale, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Väljund

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785


{'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}

Mudeli kaotus on 1650. See on mõõdik, mida järgmises jaotises ületada

Täiustage mudelit: interaktsiooni termin

Õpetuse esimeses osas nägite muutujate vahel huvitavat seost. Erinevad visualiseerimistehnikad näitasid, et INDUS ja NOS on omavahel seotud ja pöörded suurendavad mõju hinnale. Hinda ei mõjuta mitte ainult interaktsioon INDUSe ja NOS-i vahel, vaid ka see mõju on tugevam, kui see suhtleb DIS-iga.

On aeg seda ideed üldistada ja vaadata, kas saate mudeli ennustatud mudelit täiustada.

Peate igale andmekogumile lisama kaks uut veergu: trenn + test. Selleks loote interaktsiooniliikme arvutamiseks ühe funktsiooni ja kolme interaktsiooniliikme arvutamiseks teise. Iga funktsioon loob ühe veeru. Pärast uute muutujate loomist saate need ühendada treening- ja testiandmestikuga.

Kõigepealt peate looma uue muutuja INDUSe ja NOX-i interaktsiooni jaoks.

Allolev funktsioon tagastab kaks andmekaadrit, koolitus ja test, interaktsiooniga var_1 ja var_2, teie puhul INDUS ja NOX.

def interaction_term(var_1, var_2, name):
    t_train = df_train_scale[var_1]*df_train_scale[var_2]
    train = t_train.rename(name)
    t_test = df_test_scale[var_1]*df_test_scale[var_2]
    test = t_test.rename(name)
    return train, test

Salvestate kaks uut veergu

interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')
interation_ind_ns_train.shape
(325,)

Teiseks loote kolmekordse interaktsiooniliikme arvutamiseks teise funktsiooni.

def triple_interaction_term(var_1, var_2,var_3, name):
    t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3]
    train = t_train.rename(name)
    t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3]
    test = t_test.rename(name)
    return train, test
interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')

Nüüd, kui teil on kõik vajalikud veerud, saate need lisada koolitus- ja testimisandmekomplekti. Nimetate need kaks uut andmeraami:

  • df_train_new
  • df_test_new
df_train_new = pd.concat([df_train_scale,
                          interation_ind_ns_train,
                          interation_ind_ns_dis_train],
                         axis=1, join='inner')
df_test_new = pd.concat([df_test_scale,
                         interation_ind_ns_test,
                         interation_ind_ns_dis_test],
                         axis=1, join='inner')
df_train_new.head(5)

Väljund

Täiustage mudeli interaktsiooni terminit

See on kõik; saate hinnata uut mudelit koos interaktsioonitingimustega ja vaadata, kuidas toimivusmõõdik on.

CONTI_FEATURES_NEW  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT',
                       'INDUS_NOS', 'INDUS_NOS_DIS']
### Define categorical list
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]
model = tf.estimator.LinearRegressor(
    model_dir="train_Boston_1", 
    feature_columns= categorical_features + continuous_features_new)

Väljund

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a1a5d5860>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

KOOD

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS']
LABEL= 'PRICE'
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)
model.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Väljund

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train_Boston_1/model.ckpt.
INFO:tensorflow:loss = 56417.703, step = 1
INFO:tensorflow:global_step/sec: 124.844
INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)
INFO:tensorflow:global_step/sec: 182.704
INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)
INFO:tensorflow:global_step/sec: 208.189
INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)
INFO:tensorflow:global_step/sec: 213.855
INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)
INFO:tensorflow:global_step/sec: 209.758
INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)
INFO:tensorflow:global_step/sec: 196.618
INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)
INFO:tensorflow:global_step/sec: 196.472
INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)
INFO:tensorflow:global_step/sec: 172.82
INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)
INFO:tensorflow:global_step/sec: 168.916
INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt.
INFO:tensorflow:Loss for final step: 19598.387.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
model.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Väljund

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863


{'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}

Uus kahjum on 1515. Kahe uue muutuja lisamisega oli võimalik kahjumit vähendada. See tähendab, et saate teha paremaid ennustusi kui võrdlusmudeli puhul.