TensorFlow lineaarne regressioon tahke ja interaktsiooni terminiga
โก Nutikas kokkuvรตte
Bostoni eluasemeandmete lineaarne regressioon paraneb, kui esmalt leitakse รตiged interaktsiooniterminid. Google Tahked elemendid paljastavad need seosed visuaalselt ja kaks ristunud tunnust vรคhendavad TensorFlow testi kaotust 1650-lt 1515-le.
TensorFlow lineaarne regressioon
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.
Kui vaadata palgavรตrrandit, on see jรคrgmine:
If 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.
Sama hinnangute perekond annab jรตudu ka lineaarne klassifikaator kui silt on klass, mitte hind. Selles รตpetuses pรผรผame nรคha, millised muutujad sobivad hรคsti interaktsiooniterminiteks. Testime, kas sellise teabe lisamine viib parema hinnaennustuseni.
Kokkuvรตtlik statistika
Enne mudeliga jรคtkamist on mรตned sammud, mida saate jรคrgida. Nagu varem mainitud, on mudel andmete รผldistus. Parim tava on kรตigepealt andmeid mรตista ja seejรคrel ennustus teha. Kui te oma andmeid ei tunne, on teil mudeli tรคiustamiseks vรคhe vรตimalusi.
Esimese sammuna laadige andmed pandade andmeraamina ja looge treeningkomplekt ja testimiskomplekt.
Nรคpunรคited: Selle รตpetuse jaoks peavad teil olema installitud matplotlib ja seaborn. PythonSaate 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 PythonSeaborn on statistilise visualiseerimise teek, mis on loodud matplotlibi baasil. See pakub jรคrgmist:tractive ja ilusaid sรผลพeesid.
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.
Versiooni mรคrkus: load_boston oli scikit-learn 1.0-s aegunud ja eemaldatud scikit-learn 1.2-st kuna andmestik kodeerib rassiliselt laetud funktsiooni. Praeguse installi korral kasutage fetch_california_housing selle asemel vรตi laadige toorfail ise. Allpool nรคidatud tรถรถvoog jรครคb samaks; erineb ainult laadur.
boston = load_boston() df = pd.DataFrame(boston.data)
Funktsioonide nimed salvestatakse objektis feature_names massiivina.
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)
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 on sisseehitatud valimfunktsioon andmeraami 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 parandab segase jรคrjestuse, nii et kรตigile tagastatakse samad read.
### 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 Uurimisrรผhm on selle tรถรถ jaoks vรคlja tรถรถtanud tรถรถriista nimega Tahked mis aitab andmeid visualiseerida ja neid igasugustel viisidel tรผkeldada. See on hea alguspunkt andmestiku รผlesehituse mรตistmiseks.
Tahked elemendid vรตimaldavad teil leida kohti, kus andmed ei nรคe pรคris sellised vรคlja, nagu ootate.
Vรคlja arvatud nende veebirakendus, Google muudab tรถรถriistakomplekti manustamise lihtsaks 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
- puuduvate vaatluste protsent
- min ja max vรครคrtused
- statistika, nagu keskmine, mediaan ja standardhรคlve.
- See lisab ka veeru, mis nรคitab nullidega vรครคrtuste protsenti, mis on kasulik, kui enamik vรครคrtusi on nullid.
- 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
Deep Dive on lahe tรถรถriist. See vรตimaldab teil oma andmestikust selgust saada ja suumida, et nรคha รผksikut andmestikku. See tรคhendab, et saate andmeid ridade ja veergude kaupa detailselt analรผรผsida, lรคhtudes andmestiku mis tahes funktsioonist.
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.
Enne kummagi tรถรถriista kasutamist tuleb Facets installida sรผlearvuti keskkonda.
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 arvutis pole Giti installitud, minge palun sellele lehele URL Git for Windows lae leht 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 PAIR-koodi/tahkude hoidla ja laadige hoidlad alla.
รlaltoodud hoidla lehel on 2. valiku puhul kasutatav allalaadimisnupp. Esimese valiku korral jรตuab fail teie allalaadimiskausta. Saate faili kas alla laadida lasta 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.
รlaltoodud terminali loend kinnitab, et facets asub praeguses tรถรถkataloogis. Tรถรถkataloogiks tuleb suunata Facet:
cd facets
Facetsi installimiseks Jupyter, on teil kaks vรตimalust. Kui olete installinud Jupyter Condaga kรตigi kasutajate jaoks kopeerige see kood:
jupyter nbextension install facets-dist/
Vastasel juhul kasutage:
jupyter nbextension install facets-dist/ --user
Olgu, kรตik on valmis. Avame aspektide รผlevaate.
Kรคivita aspektide รผlevaade Jupyter
ร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
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:
# Display the facets overview visualization for this data# Displ from IPython.core.display import display, HTML HTML_TEMPLATE = """<link rel="import" href="/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))
Korrelatsioonigraaf ja paarisvรตrk
Pรคrast andmete ja nende jaotuse kontrollimist saate joonistada korrelatsioonimaatriksi. Korrelatsioonimaatriks arvutab Pearsoni koefitsiendi. See koefitsient on piiratud vahemikuga -1 ja 1, kus positiivne vรครคrtus nรคitab positiivset korrelatsiooni ja negatiivne vรครคrtus negatiivset korrelatsiooni.
Teid huvitab, millised muutujad vรตivad olla interaktsiooniterminite jaoks head kandidaadid.
Versiooni mรคrkus: allolev mask kutsub np.bool, alias, mis oli NumPy 1.20-s aegunud ja eemaldatud NumPy 1.24-sHiljutisel NumPy-l tekitab sama rida AttributeError: module 'numpy' has no attribute 'bool'sisseehitatud bool on sisse lรผlitatav asendus.
## 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>
รlaltoodud soojuskaardil tรคhistavad tumedamad ruudud tugevamaid korrelatsioone. Maatriksilt nรคete:
- LSTAT
- RM
On tugevalt korrelatsioonis PRICE'iga. Teine pรตnev omadus on tugev positiivne korrelatsioon NOX-i ja INDUS-i vahel, mis tรคhendab, et need kaks muutujat liiguvad samas suunas. Mรตlemad on samuti korrelatsioonis PRICE'iga. DIS on samuti tugevalt korrelatsioonis INDUS-i ja NOX-iga.
Teil on esimene vihje, et INDUS ja NOX vรตivad olla head kandidaadid interaktsiooniterminiks ning ka DIS-ile keskendumine vรตib olla huvitav.
Vรตite minna veidi sรผgavamale, joonistades paarisruudustiku. See illustreerib รผksikasjalikumalt varem joonistatud korrelatsioonikaarti.
Paarivรตrk on koostatud jรคrgmiselt:
- รlemine osa: sobitatud joonega hajuvusdiagramm
- Diagonaal: tuuma tiheduse graafik
- Alumine osa: mitme muutujaga tuuma tiheduse graafik
Sa keskendud neljale sรตltumatule muutujale. Valik vastab muutujatele, millel on tugev korrelatsioon PRICE'iga.
- 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
Alustame รผlemisest osast:
- Hind on negatiivses korrelatsioonis INDUSe, NOXi ja LSTATiga; positiivses korrelatsioonis RM-iga.
- LSTATi ja PRICE'i vahel on kerge mittelineaarsus.
- 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 loodud tรถรถriista Google, Tahkude sรผvaanalรผรผs. Liides on jagatud neljaks pรตhiosaks. Keskel asuv keskosa on suumitav andmete kuva. Paneeli รผlaosas on rippmenรผรผ, kus saate muuta andmete paigutust, et juhtida tahkumist, positsioneerimist ja vรคrvi. Paremal on konkreetse andmerea detailne vaade. See tรคhendab, et saate klรตpsata mis tahes andmepunktil keskmises visualiseeringus, 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 2D-graafiku ja vรคrvida punktid. Muutuja PRICE saab jagada nelja kategooriasse, kus iga kategooria on kvartiil (nt 0.25, 0.5, 0.75). Seda uut muutujat nimetatakse Q_PRICE-iks.
## 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")
Fasettide kasutamise sรผvaanalรผรผs
Deep Dive'i avamiseks peate andmed teisendama JSON-vormingusse. Pandasil on selleks meetod: kutsuge DataFrame'is vรคlja to_json.
Esimene koodirida mรครคrab ัะฟัะฐะนdi suuruse vastavalt sellele, mitu rida andmestikus on.
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 GitHub. Pรคrast koodi kรคivitamist peaksite nรคgema jรคrgmist:
# Display thde Dive visualization for this data from IPython.core.display import display, HTML # Create Facets template HTML_TEMPLATE = """<link rel="import" href="/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 suuremat kaugust esimesest tรถรถkeskusest.
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.
Uuringu kรคigus on leitud kaks potentsiaalset interaktsiooni, seega on jรคrgmine samm nende testimine tegelikus mudelis.
Lineaarne regressioon TensorFlow'ga
Selles osas hindate lineaarse regressioonimudelit, mille abil TensorFlow Hinnangu API. Jรคtkake jรคrgmiselt:
- Valmistage andmed ette
- Vรตrdlusmudeli hindamine: interaktsioon puudub
- Hinnake interaktsiooniga mudelit
Versiooni mรคrkus: the,en tf-estimator pakett tarniti oma lรตpliku versiooniga TensorFlow 2.15 ja puudub TensorFlow 2.16-st ja hilisematest versioonidest, seega tf.estimator.LinearRegressor tรถรถtab ainult TensorFlow 1.x peal, vรคlja arvatud juhul, kui migreerite selle Kerase lineaarsele mudelile.
Pea meeles, et masinรตppe eesmรคrk on vea minimeerimine. Sellisel juhul vรตidab mudel, millel on vรคikseim keskmine ruutviga. TensorFlow hindaja arvutab selle mรตรตdiku automaatselt.
Ettevalmistuse andmed
Enamasti on vaja andmeid teisendada. Seetรตttu ongi tahkude รผlevaade pรตnev. Kokkuvรตtlikust statistikast nรคgite, et esineb kรตrvalekaldeid. Need vรครคrtused mรตjutavad hinnanguid, kuna need ei sarnane analรผรผsitava populatsiooniga. Kรตrvalvรครคrtused tavaliselt kallutavad tulemusi. Nรคiteks positiivne kรตrvalekalle kipub koefitsienti รผle hindama.
Hea lahendus selle probleemi lahendamiseks on muutuja standardiseerimine. Standardiseerimine tรคhendab standardhรคlvet รผhe ja keskmist nulli. Standardiseerimisprotsess hรตlmab kahte etappi. Esiteks, see hรตlmabtract on muutuja keskmine vรครคrtus. Teiseks jagab see standardhรคlbega nii, et jaotuse standardhรคlve on รผhik.
Raamatukogu skikit รตppima on kasulik muutujate standardiseerimiseks. Selleks saate kasutada mooduli eeltรถรถtlust objekti skaleerimisega.
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.
Mudeli treenimise viis on tรคpselt sama, mis รต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 treenimiseks kasutate kรตiki andmestikus olevaid muutujaid. Kokku on kaksteist pidevat muutujat 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 testandmete 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.9785. See on mรตรตdik, mida jรคrgmises jaotises รผletada
Tรคiustage mudelit: interaktsiooni termin
รpetuse esimeses osas nรคgite huvitavat seost muutujate vahel. Erinevad visualiseerimistehnikad nรคitasid, et INDUS ja NOX on omavahel seotud ning vรตimendavad teineteise mรตju hinnale. Lisaks INDUSe ja NOXi vastastikmรตjule mรตjutab hinda ka see mรตju, mis on tugevam koos DISiga.
On aeg seda ideed รผldistada ja vaadata, kas saate mudeli ennustust parandada.
Igale andmestikule tuleb lisada kaks uut veergu: train ja test. Selleks tuleb luua รผks funktsioon interaktsioonitermini arvutamiseks ja teine โโkolmiktermini arvutamiseks. Iga funktsioon loob รผhe veeru. Pรคrast uute muutujate loomist saab need treening- ja testandmestikuga รผhendada.
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
See on kรตik: saate uut mudelit interaktsiooniterminite abil hinnata ja vaadata, kuidas on toimivusmรตรตdik.
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}
Code
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.9863. Kahe uue muutuja lisamisega oli vรตimalik kahjumit vรคhendada. See tรคhendab, et saate teha paremaid ennustusi kui vรตrdlusmudeli puhul.
| MUDEL | Funktsioonide komplekt | Mudelikataloog | keskmine_kaotus | kaotus |
|---|---|---|---|---|
| vรตrrelda | 12 standardiseeritud pidevat veergu pluss CHAS | rong_Boston | 86.89361 | 1650.9785 |
| Koostoimega | Vรตrdlusnรคitaja pluss INDUS_NOS ja INDUS_NOS_DIS | rong_Boston_1 | 79.78876 | 1515.9863 |
Mรตlemad arvud pรคrinevad samast 101-realisest testjaotusest, seega on keskmise kaotuse umbes 8-protsendiline langus omistatav ainult kahele interaktsiooniveerule.











