Selles õpetuses saate teada, kuidas andmeid kontrollida ja valmistada need ette lihtsa lineaarse regressiooni ülesande loomiseks.
See õpetus on jagatud kaheks osaks:
- Otsige suhtlemist
- Testige mudelit
Eelmises õpetuses kasutasite maja mediaanhinna hindamiseks Bostoni andmekogumit. Bostoni andmekogumil on väike suurus, ainult 506 vaatlust. Seda andmekogumit peetakse uute lineaarse regressiooni algoritmide proovimisel võrdlusaluseks.
Andmekogum koosneb järgmistest osadest:
Muutuv | Kirjeldus |
zn | Üle 25 000 ruutmeetri suuruste kruntide jaoks eraldatud elamumaa osakaal |
indus | Mittekaubandusettevõtete hektarite 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öökeskuse juurde |
maks | täisväärtuslik kinnisvara maksumäär 10 000 dollari kohta |
ptratio | õpilase ja õpetaja suhe linna järgi |
medv | Omanike kasutuses olevate kodude mediaanväärtus tuhandetes dollarites |
krimm | elanikkonna kuritegevuse määr linnade kaupa |
chas | Charles Riveri näiv muutuja (1, kui piirab jõge; 0 muul juhul) |
B | mustanahaliste osakaal linna järgi |
Selles õpetuses hindame mediaanhinda lineaarse regressori abil, kuid keskendutakse ühele konkreetsele masinõppe protsessile: "andmete ettevalmistamine".
Mudel üldistab andmete mustri. Sellise mustri jäädvustamiseks peate selle kõigepealt üles leidma. Hea tava on enne mis tahes masinõppe algoritmi käivitamist teha andmete analüüs.
Õigete funktsioonide valimine muudab teie mudeli edukust täielikult erinevaks. Kujutage ette, et proovite hinnata inimeste palka, kui te ei arvesta sugu kovariaadina, saate lõpuks halva hinnangu.
Teine viis mudeli täiustamiseks on vaadata sõltumatu muutuja vahelist korrelatsiooni. Näite juurde tagasi tulles võite mõelda haridusest kui suurepärasest kandidaadist, et ennustada palka, aga ka ametit. On õiglane öelda, et amet sõltub haridustasemest, nimelt viib kõrgharidus sageli parema ametini. Kui me selle mõtte üldistame, võime öelda, et sõltuva muutuja vahelist korrelatsiooni ja selgitavat muutujat saab suurendada veel ühe selgitava muutujaga.
Hariduse piiratud mõju okupeerimiseks võime kasutada suhtlemisterminit.
Kui vaatate palgavõrrandit, saab see:
Kui see on positiivne, tähendab see, et täiendav haridustase annab maja keskmise väärtuse kõrgema tõusu kõrge ametitaseme jaoks. Teisisõnu, hariduse ja ameti vahel on vastasmõju.
Selles õpetuses proovime näha, millised muutujad võivad olla head interaktsiooniterminite kandidaadid. Testime, kas sellise teabe lisamine aitab paremat hinda ennustada.
Selles õpetuses saate teada
- Kokkuvõtlik statistika
- Ülevaade tahkudest
- Tahud sügav sukeldumine
- Installige Facet
- Ülevaade
- Graafik
- Tahud sügav sukeldumine
- TensorFlow
- Ettevalmistusandmed
- Põhiregressioon: võrdlusalus
- Parandage mudelit: suhtlemistermin
Kokkuvõtlik statistika
Enne mudeli juurde liikumist võite järgida mõnda sammu. Nagu varem mainitud, on mudel andmete üldistus. Parim sobivuspraktika on andmete mõistmine ja prognoosimine. Kui te ei tea oma andmeid, on teil vähe võimalusi oma mudelit täiustada.
Esimese sammuna laadige andmed pandade andmekaadrina ning looge treeningukomplekt ja testimiskomplekt.
Nõuanded: selle õpetuse jaoks peab teil olema Pythonisse installitud matplotlit ja seaborn. Jupyteriga saate Pythoni paketi lennult installida. Sa ei tohiks seda teha
!conda install -- yes matplotlib
aga
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 olete installinud matplotlibi ja meresündinud.
Matplotlib on Pythonis graafiku loomiseks mõeldud teek. Seaborn on matplotlibi peale ehitatud statistiline visualiseerimisraamatukogu. See pakub atraktiivseid ja ilusaid krunte.
Allolev kood impordib vajalikud teegid.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np
Raamatukogu sklearn sisaldab Bostoni andmekogumit. Andmete importimiseks võite helistada selle API-le.
boston = load_boston()df = pd.DataFrame(boston.data)
Funktsiooni nimi salvestatakse massiivi objekti feature_names alla.
boston.feature_names
Väljund
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='Võite veerud ümber nimetada.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)
Teisendate muutuja CHAS stringimuutujaks ja märkige see jah-ga, kui CHAS = 1, ja ei, kui CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectPandade puhul on andmekogumi jagamine lihtne. Jagate juhuslikult andmekogumi 80-protsendilise treeningkomplekti ja 20-protsendilise testimiskomplektiga. Pandadel on sisseehitatud kulufunktsioon andmeraami valimi jagamiseks.
Esimene parameeter frac on väärtus vahemikus 0 kuni 1. Andmeraamist juhuslikult 80 protsendi valimiseks määrate selle väärtuseks 0,8.
Random_state võimaldab kõigile sama andmekaadri tagastada.
### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)Saate 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 VANUS 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 puistatakse väljapoole jäävate väärtustega, mis heidavad analüüsi ja masinõppe koolituse.
Esimene samm andmekogumi puhastamiseks on mõista, kus see puhastamist vajab. Andmekogumi puhastamine võib olla keeruline, eriti mis tahes üldistataval viisil
Google Researchi meeskond on selle töö jaoks välja töötanud tööriista Facets, mis aitab andmeid visualiseerida ja viilutada kõikvõimalikel viisidel. See on hea lähtepunkt, et mõista, kuidas andmekogum on paigutatud.
Fassaadid võimaldavad teil leida koha, kus andmed ei paista päris nii, nagu te mõtlete.
Välja arvatud nende veebirakendus, muudab Google tööriistakomplekti Jupyteri märkmikku hõlpsaks manustamise.
Facetsil on kaks osa:
- Ülevaade tahkudest
- Tahud sügav sukeldumine
Ülevaade tahkudest
Facetsi ülevaade annab ülevaate andmekogumist. Facetsi ülevaade jagab andmete veerud olulise teabe ridadeks
- puuduva vaatluse protsent
- min ja max väärtused
- statistika, nagu keskmine, mediaan ja standardhälve.
- Samuti lisatakse veerg, mis näitab nullide väärtuste protsenti, mis on kasulik, kui enamik väärtustest on nullid.
- Neid jaotusi on võimalik testiandmekogumites näha ja iga funktsiooni treeningkomplekti. See tähendab, et saate uuesti kontrollida, kas test on jaotatud treeningandmetega sarnaselt.
See on vähemalt miinimum, mida teha enne mis tahes masinõppeülesannet. Selle tööriista abil ei jäta te seda üliolulist sammu vahele ja see toob esile mõned kõrvalekalded.
Tahud sügav sukeldumine
Facets Deep Dive on lahe tööriist. See võimaldab teie andmekogumil veidi selgust saada ja üksiku andmestiku nägemiseks suumida lõpuni. See tähendab, et saate andmeid rida ja veergude kaupa kuvada andmekogumi mis tahes funktsioonides.
Neid kahte tööriista kasutame koos Bostoni andmekogumiga.
Märkus . Te ei saa korraga kasutada funktsiooni Facets Overview ja Facets Deep Dive. Tööriista vahetamiseks peate kõigepealt märkmiku tühjendama.
Installige Facet
Enamiku analüüsi jaoks saate kasutada veebirakendust Facet. Selles õpetuses näete, kuidas seda Jupyteri märkmikus kasutada.
Kõigepealt peate installima nbextensions. Seda tehakse selle koodiga. Kopeerite ja kleepite järgmise koodi oma masina terminali.
pip install jupyter_contrib_nbextensionsKohe pärast seda peate kloonima oma arvuti hoidlad. Teil on kaks valikut:
Variant 1) Kopeerige ja kleepige see kood terminali (soovitatav)
Kui teie arvutisse pole Git installitud, minge sellele aadressile https://git-scm.com/download/win ja järgige juhiseid. Kui olete lõpetanud, saate kasutada Maci kasutaja terminalis käsku git või Windowsi kasutaja jaoks Anaconda viiba
git clone https://github.com/PAIR-code/facetsVariant 2) Minge aadressile https://github.com/PAIR-code/facets ja laadige hoidlad alla.
Kui valite esimese võimaluse, jõuab fail teie allalaaditavasse faili. Võite lasta faili alla laadida või lohistada teisele teele.
Selle käsurea abil saate kontrollida, kuhu Facets on salvestatud:
echo `pwd`/`ls facets`Nüüd, kui olete Facets'i leidnud, peate selle installima Jupyteri märkmikku. Töökataloog peate määrama teele, kus tahud asuvad.
Teie praegune töökataloog ja Facetsi ZIP-i asukoht peaksid olema samad.
Töökataloog peate suunama Facetile:
cd facetsFacetsi installimiseks Jupyterisse on teil kaks võimalust. Kui installisite kõigi kasutajate jaoks Jupyteri koos Condaga, kopeerige see kood:
saab kasutada jupyterit nbextension installida facets-dist /
jupyter nbextension install facets-dist/Muul juhul kasutage:
jupyter nbextension install facets-dist/ --userOlgu, kõik on korras. Avame Faceti ülevaate.
Ülevaade
Ülevaade kasutab statistika arvutamiseks Pythoni skripti. Peate Jupyterisse importima skripti nimega generic_feature_statistics_generator. Ära muretse; skript asub tahkude failides.
Peate leidma selle tee. Seda saab lihtsalt teha. Avate tahud, avate faili facets_overview ja seejärel pythoni. Kopeerige tee
Pärast seda minge tagasi Jupyteri juurde ja kirjutage järgmine kood. Muutke tee "/ Users / Thomas / facets / facets_overview / python" oma teele.
# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')Skripti saate importida alloleva koodiga.
from generic_feature_statistics_generator importGenericFeatureStatisticsGeneratorAkendes saab sama kood
import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorFunktsioonistatistika arvutamiseks peate kasutama funktsiooni GenericFeatureStatisticsGenerator () ja kasutama objekti ProtoFromDataFrames. Andmeraami saate edastada sõnastikus. Näiteks kui soovime koostada rongikomplekti kohta kokkuvõtliku statistika, saame teabe salvestada sõnastikku ja kasutada seda objektis „ProtoFromDataFrames”.
'name': 'train', 'table': df_trainNimi on kuvatava tabeli nimi ja kokkuvõtte arvutamiseks kasutate 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 overviewimport base64gfsg = 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 lihtsalt allolev kood. Kood pärineb otse GitHubist. Seda peaksite nägema:
# Display the facets overview visualization for this data# Displfrom IPython.core.display import display, HTMLHTML_TEMPLATE = """"""html = HTML_TEMPLATE.format(protostr=protostr)display(HTML(html)) Graafik
Pärast andmete ja nende jaotuse kontrollimist saate koostada korrelatsioonimaatriksi. Korrelatsioonimaatriks arvutab Pearsoni koefitsiendi. See koefitsient on seotud -1 ja 1 vahel, positiivne väärtus näitab positiivset korrelatsiooni ja negatiivne väärtus negatiivset korrelatsiooni.
Olete huvitatud sellest, millised muutujad võivad olla interaktsiooniterminite jaoks head kandidaadid.
## Choose important feature and further check with Dive%matplotlib inlineimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="ticks")# Compute the correlation matrixcorr = df.corr('pearson')# Generate a mask for the upper trianglemask = np.zeros_like(corr, dtype=np.bool)mask[np.triu_indices_from(mask)] = True# Set up the matplotlib figuref, ax = plt.subplots(figsize=(11, 9))# Generate a custom diverging colormapcmap = sns.diverging_palette(220, 10, as_cmap=True)# Draw the heatmap with the mask and correct aspect ratiosns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,square=True, linewidths=.5, cbar_kws={"shrink": .5})Väljund
png
Maatriksist näete:
- LSTAT
- RM
On tugevalt seotud PRICE-ga. 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 seotud ka HINNAGA. DIS on samuti korrelatsioonis IND ja NOX-ga.
Teil on mõned esimesed vihjed, et IND ja NOX võivad olla vahekokkuvõtte ajaks head kandidaadid ja DIS võib olla ka huvitav keskenduda.
Paariruudustiku joonistamise abil saate minna natuke sügavamale. See illustreerib üksikasjalikumalt varem koostatud korrelatsioonikaarti.
Paarisruudustik, mille me koostame, on järgmine:
- Ülemine osa: hajutatud joon koos sobiva joonega
- Diagonaal: tuuma tiheduse graafik
- Alumine osa: Mitmemõõtmeline tuuma tiheduse graafik
Valite fookuse neljale sõltumatule muutujale. Valik vastab muutujatele, millel on tugev seos PRICE-ga
- INDUS
- NOX
- RM
- LSTAT
pealegi HIND.
Pange tähele , et standardviga lisatakse hajumisdiagrammile vaikimisi.
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 ülaosaga:
- Hind on negatiivses korrelatsioonis INDUS, NOX ja LSTAT; positiivselt korrelatsioonis RM-iga.
- LSTAT ja PRICE puhul on veidi mittelineaarsus
- Seal on nagu sirge joon, kui hind on võrdne 50. Andmekogumi kirjeldusest on PRICE kärbitud väärtusega 50
Diagonaal
- Tundub, et NOX-il on kaks klastrit, üks umbes 0,5 ja teine umbes 0,85.
Selle kohta lisateabe saamiseks võite vaadata selle alumist osa. Mitmemõõtmeline tuuma tihedus on teatud mõttes huvitav, sest see värvib seal, kus enamik punkte on. Erinevus hajumisdiagrammiga juhib tõenäosustihedust, kuigi andmekogumis pole antud koordinaadi jaoks mõtet. Kui värv on tugevam, näitab see punkti suurt kontsentratsiooni selle ala ümber.
Kui kontrollite INDUSi ja NOX-i mitmemõõtmelist 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 INDUSi ja NOXi interaktsiooni lisamisele lineaarsesse seosesse.
Lõpuks võite kasutada teist Google'i loodud tööriista Facets Deep Dive. Liides on jagatud neljaks põhiosaks. Keskel asuv keskne ala on andmete suumitav kuva. Paneeli ülaosas on rippmenüü, kus saate muuta andmete paigutust juhtimiseks lihvimise, positsioneerimise ja värviga. Paremal on konkreetse andmerea üksikasjalik vaade. See tähendab, et saate klõpsata mis tahes andmepunktil kesksel visualiseerimisel, et näha selle konkreetse andmepunkti üksikasju.
Andmete visualiseerimise etapis olete huvitatud paarishinnangu otsimisest maja hinna sõltumatu muutuja vahel. Kuid see hõlmab vähemalt kolme muutujat ja 3D-graafikute kasutamine on keeruline.
Üks võimalus selle probleemiga toime tulla on luua kategooriline muutuja. See tähendab, et saame 2D-graafiku luua punkti värvi. 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 featuresdf['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])## Show non linearity between RM and LSTATax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")
Tahud sügav sukeldumine
Sügava sukeldumise avamiseks peate andmed teisendama jsoni vormingusse. Pandad selle objektina. Saate kasutada to_jsonit pärast Pandase andmekogumit.
Koodi esimene rida käsitleb andmekogumi suurust.
df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])sprite_size = 32 if len(df.index)>50000 else 64jsonstr = df.to_json(orient='records')Allolev kood pärineb Google GitHubist. Pärast koodi käivitamist peaksite seda nägema:
# Display thde Dive visualization for this datafrom IPython.core.display import display, HTML# Create Facets templateHTML_TEMPLATE = """"""# Load the json dataset and the sprite_size into the templatehtml = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)# Display the templatedisplay(HTML(html)) Olete huvitatud sellest, kas on olemas seos tööstusharu määra, oksiidide kontsentratsiooni, töökeskuse kauguse ja maja hinna vahel.
Selleks jagasite kõigepealt andmed tootmisharu vahemiku ja värvi järgi hinna kvartiiliga:
- Valige lihvitud X ja valige INDUS.
- Valige Kuva ja valige DIS. See värvib täpid maja hinna kvartiiliga
siin tähendavad tumedamad värvid kaugust esimesest töökeskusest kaugel.
Siiani näitab see taas seda, mida teate, madalam tööstusharu määr, kõrgem hind. Nüüd saate vaadata jaotust INDUX, NOX järgi.
- Valige tahk Y ja valige NOX.
Nüüd näete, et maja, mis asub kaugel esimesest töökeskusest, on madalaima tööstusharu osakaaluga ja seetõttu madalaima oksiidisisaldusega. Kui otsustate tüübi kuvada hinnaga Q_PRICE ja suumida vasakus alanurgas, näete, mis tüüpi hind see on.
Teil on veel üks vihje, et IND, NOX ja DIS vastastikune mõju võib olla hea kandidaat mudeli täiustamiseks.
TensorFlow
Selles jaotises hindate lineaarset klassifikaatorit TensorFlow hinnangute API-ga. Te jätkate järgmiselt:
- Valmistage andmed ette
- Hinnake võrdlusmudelit: koostoime puudub
- Hinnake interaktsiooniga mudelit
Pidage meeles, et masinõppe eesmärk on vea minimeerimine. Sellisel juhul võidab madalaima keskmise ruutveaga mudel. TensorFlow'i prognoosija arvutab selle mõõdiku automaatselt.
Ettevalmistusandmed
Enamasti peate oma andmed muutma. Sellepärast on tahkude ülevaade põnev. Kokkuvõtlikust statistikast nägite, et on kõrvalekaldeid. Need väärtused mõjutavad hinnanguid, kuna need ei sarnane teie analüüsitava populatsiooniga. Kõrvalekaldujad kallutasid tavaliselt tulemusi. Näiteks kipub positiivne hälbe koefitsienti üle hindama.
Hea lahendus selle probleemi lahendamiseks on muutuja standardiseerimine. Standardimine tähendab ühe ja keskmise nulli standardhälvet. Standardimisprotsess hõlmab kahte etappi. Esiteks lahutab see muutuja keskmise väärtuse. Teiseks jagatakse see dispersiooniga nii, et jaotusel oleks dispersioon ühikus
Raamatukogu sklearn on abiks muutujate standardiseerimisel. Sel eesmärgil saate kasutada mooduli eeltöötlust koos objekti skaalaga.
Andmekogumi skaleerimiseks võite kasutada allolevat funktsiooni. Pange tähele, et te ei laienda sildi veergu ja kategoorilisi muutujaid.
from sklearn import preprocessingdef 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_scaleFunktsiooni saate kasutada skaleeritud rongi / testikomplekti koostamiseks.
df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test)Põhiregressioon: võrdlusalus
Kõigepealt treenite ja katsetate mudelit ilma suhtlemiseta. Selle eesmärk on näha mudeli jõudlusmõõdikut.
Mudeli koolitamise viis on täpselt nagu kõrgetasemelise API õpetus . Kasutate TensorFlow hinnangut LinearRegressor.
Meeldetuletuseks peate valima:
- mudelisse pandud funktsioonid
- funktsioone muuta
- konstrueerida lineaarne regressor
- konstrueerige funktsioon input_fn
- koolitada mudelit
- katsetada mudelit
Mudeli koolitamiseks kasutate kõiki andmekogumi muutujaid. Kokku on tasemel pidevaid muutujaid ja üks kategooriline muutuja
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']Teisendate funktsioonid numbriliseks veerguks 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 linearRegressoriga. Te salvestate mudeli 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':, '_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 veerg rongi- või testiandmetes teisendatakse funktsiooniks 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)Mudeli hindate rongi andmetel.
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 = 1INFO:tensorflow:global_step/sec: 144.457INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)INFO:tensorflow:global_step/sec: 258.392INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)INFO:tensorflow:global_step/sec: 227.998INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)INFO:tensorflow:global_step/sec: 210.739INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)INFO:tensorflow:global_step/sec: 234.237INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)INFO:tensorflow:global_step/sec: 238.1INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)INFO:tensorflow:global_step/sec: 237.934INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)INFO:tensorflow:global_step/sec: 220.687INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)INFO:tensorflow:global_step/sec: 232.702INFO: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.Lõpuks hindate mudeli jõudlust testikomplektis
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:43INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43INFO: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 näitaja, mida järgmises osas ületada
Parandage mudelit: suhtlemistermin
Õpetuse esimese osa jooksul nägite muutujate vahel huvitavat suhet. Erinevad visualiseerimistehnikad näitasid, et INDUS ja NOS on omavahel seotud ja pöörduvad, et suurendada mõju hinnale. Hinda mõjutab mitte ainult INDUS-i ja NOS-i vastasmõju, vaid ka see mõju on tugevam, kui see suhtleb DIS-iga.
On aeg seda mõtet üldistada ja vaadata, kas saate mudeli ennustatud mudelit paremaks muuta.
Igale andmekogumi komplektile peate lisama kaks uut veergu: rong + test. Selleks loote ühe funktsiooni interaktsioonitermini arvutamiseks ja teise kolmekordse interaktsiooni termini arvutamiseks. Iga funktsioon loob ühe veeru. Pärast uute muutujate loomist saate need liita koolituse andmekogumisse ja testida.
Kõigepealt peate looma uue muutuja INDUSi ja NOXi interaktsiooniks.
Allpool toodud funktsioon tagastab kaks andmekaadrit, rongi ja testi koos vastastikmõjuga 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, testTe 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 interaktsiooni mõiste 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, testinteration_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 olemas, saate need lisada andmekogumi koolitamiseks ja testimiseks. Nimetate need kaks uut andmekaadrit:
- 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 hinnata uut mudelit koostoimeterminite abil 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 listcontinuous_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':, '_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 = 1INFO:tensorflow:global_step/sec: 124.844INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)INFO:tensorflow:global_step/sec: 182.704INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)INFO:tensorflow:global_step/sec: 208.189INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)INFO:tensorflow:global_step/sec: 213.855INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)INFO:tensorflow:global_step/sec: 209.758INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)INFO:tensorflow:global_step/sec: 196.618INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)INFO:tensorflow:global_step/sec: 196.472INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)INFO:tensorflow:global_step/sec: 172.82INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)INFO:tensorflow:global_step/sec: 168.916INFO: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.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:14INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14INFO: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. Lihtsalt kahe uue muutuja lisamisega suutsite kahjumit vähendada. See tähendab, et saate ennustada paremini kui võrdlusmudeliga.