Šajā apmācībā jūs uzzināsiet, kā pārbaudīt datus un sagatavot tos, lai izveidotu vienkāršu lineārās regresijas uzdevumu.
Šī apmācība ir sadalīta divās daļās:
- Meklējiet mijiedarbību
- Pārbaudiet modeli
Iepriekšējā apmācībā jūs izmantojāt Bostonas datu kopu, lai aprēķinātu vidējo mājas cenu. Bostonas datu kopai ir mazs izmērs, un tajā ir tikai 506 novērojumi. Šī datu kopa tiek uzskatīta par etalonu jaunu lineārās regresijas algoritmu izmēģināšanai.
Datu kopu veido:
Mainīgs | Apraksts |
zn | Dzīvojamās zemes īpatsvars zonās, kuru platības pārsniedz 25 000 kv.m. |
indus | Mazumtirdzniecības biznesa hektāru proporcija vienā pilsētā. |
naks | slāpekļa oksīdu koncentrācija |
rm | vidējais istabu skaits vienā mājoklī |
vecums | to īpašnieku apdzīvoto vienību īpatsvars, kas uzceltas pirms 1940. gada |
dis | svērtie attālumi līdz pieciem Bostonas nodarbinātības centriem |
nodoklis | īpašuma vērtības pilnvērtīga likme par 10 000 dolāriem |
ptratio | skolēnu un skolotāju attiecība pa pilsētām |
medv | Īpašnieku apdzīvoto māju vidējā vērtība tūkstošos dolāru |
krima | noziedzības līmenis uz vienu iedzīvotāju pa pilsētām |
čas | Čārlza upes manekena mainīgais (1, ja ierobežo upi; 0 citādi) |
B | melnādaino īpatsvars pa pilsētu |
Šajā apmācībā mēs novērtēsim vidējo cenu, izmantojot lineāro regresoru, taču uzmanība tiek pievērsta vienam konkrētam mašīnmācīšanās procesam: "datu sagatavošana".
Modelis vispārina datu modeli. Lai uzņemtu šādu modeli, vispirms tas jāatrod. Laba prakse ir veikt datu analīzi pirms jebkura mašīnmācīšanās algoritma palaišanas.
Pareizo funkciju izvēle būtiski ietekmē jūsu modeļa panākumus. Iedomājieties, ka jūs mēģināt novērtēt tautas algu, ja dzimumu neiekļaujat kā kovariātu, jūs saņemat sliktu aprēķinu.
Vēl viens veids, kā uzlabot modeli, ir aplūkot korelāciju starp neatkarīgo mainīgo. Atgriežoties pie piemēra, jūs varat domāt par izglītību kā par izcilu kandidātu, lai prognozētu algu, bet arī nodarbošanos. Ir godīgi teikt, ka nodarbošanās ir atkarīga no izglītības līmeņa, proti, augstākā izglītība bieži noved pie labākas nodarbošanās. Ja mēs vispārinām šo ideju, mēs varam teikt, ka korelāciju starp atkarīgo mainīgo un skaidrojošo mainīgo var palielināt vēl viens skaidrojošais mainīgais.
Lai atspoguļotu izglītības ierobežoto ietekmi uz nodarbošanos, mēs varam izmantot mijiedarbības terminu.
Ja paskatās uz algas vienādojumu, tas kļūst par:
Ja tas ir pozitīvs, tas nozīmē, ka papildu izglītības līmenis rada augstāku mājas mediānas vērtību augstam nodarbinātības līmenim. Citiem vārdiem sakot, pastāv izglītības un nodarbošanās mijiedarbības efekts.
Šajā apmācībā mēs centīsimies noskaidrot, kuri mainīgie var būt labs mijiedarbības terminu kandidāts. Mēs pārbaudīsim, vai šāda veida informācijas pievienošana ļaus labāk prognozēt cenu.
Šajā apmācībā jūs uzzināsiet
- Kopsavilkuma statistika
- Facets pārskats
- Facets Deep Dive
- Instalējiet Facet
- Pārskats
- Grafiks
- Facets Deep Dive
- TensorFlow
- Sagatavošanas dati
- Pamata regresija: etalons
- Uzlabojiet modeli: mijiedarbības termins
Kopsavilkuma statistika
Pirms pāriet uz modeli, varat veikt dažas darbības. Kā minēts iepriekš, modelis ir datu vispārinājums. Vispiemērotākā prakse ir izprast datus un izdarīt prognozi. Ja nezināt savus datus, jums ir mazas iespējas uzlabot savu modeli.
Vispirms ielādējiet datus kā pandas datu ietvaru un izveidojiet apmācību komplektu un testēšanas komplektu.
Padomi: Lai iegūtu šo apmācību, Python ir jābūt instalētam matplotlit un seaborn. Izmantojot Jupyter, varat instalēt Python pakotni lidojumā. Jums to nevajadzētu darīt
!conda install -- yes matplotlib
bet
import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn
Ņemiet vērā, ka šī darbība nav nepieciešama, ja jums ir instalēts matplotlib un jūras dzimis.
Matplotlib ir bibliotēka, lai izveidotu grafiku Python. Seaborn ir statistiskas vizualizācijas bibliotēka, kas uzbūvēta virs matplotlib. Tas nodrošina pievilcīgus un skaistus zemes gabalus.
Zemāk esošais kods importē nepieciešamās bibliotēkas.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np
Bibliotēkas sklearn ietver Bostonas datu kopu. Lai importētu datus, varat izsaukt tā API.
boston = load_boston()df = pd.DataFrame(boston.data)
Funkcijas nosaukums tiek saglabāts masīva objektā feature_names.
boston.feature_names
Rezultāts
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='Kolonnas varat pārdēvēt.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)
Jūs konvertējat mainīgo CHAS kā virknes mainīgo un iezīmējat to ar jā, ja CHAS = 1, un nē, ja CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectIzmantojot pandas, ir vienkārši sadalīt datu kopu. Jūs nejauši sadalāt datu kopu ar 80 procentu apmācības komplektu un 20 procentu testēšanas kopu. Pandām ir iebūvēta izmaksu funkcija, lai sadalītu datu rāmja paraugu.
Pirmais parametrs frac ir vērtība no 0 līdz 1. Jūs iestatāt to uz 0,8, lai nejauši atlasītu 80 procentus no datu rāmja.
Random_state ļauj visiem lietotājiem atgriezt to pašu datu ietvaru.
### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)Jūs varat iegūt datu formu. Tam vajadzētu būt:
- Vilcienu komplekts: 506 * 0,8 = 405
- Testa komplekts: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)Rezultāts
(405, 14) (101, 14)df_test.head(5)Rezultāts
Noziedzība ZN INDUS CHAS NOX RM VECUMS DIS RAD NODOKLIS PTRATIO B LSTAT CENA 0 0,00632 18.0 2.31 Nē 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 Nē 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 Nē 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 Nē 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 Nē 0.524 6.172 96.1 5.9505 5.0 311.0 15.2 396.90 19.15 27.1 Dati ir netīri; tas bieži vien ir nelīdzsvarots un pārkaisa ar vērtībām, kas izslēdz analīzi un mašīnmācības apmācību.
Pirmais solis, lai sakoptu datu kopu, ir saprast, kur tā ir jātīra. Datu kopas tīrīšana var būt sarežģīta, it īpaši jebkurā vispārināmā veidā
Google pētījumu komanda šim darbam ir izstrādājusi rīku Facets, kas palīdz vizualizēt datus un sagriezt tos visdažādākajos veidos. Tas ir labs sākumpunkts, lai saprastu, kā datu kopa ir izkārtota.
Facets ļauj jums atrast vietu, kur dati izskatās ne visai tā, kā jūs domājat.
Izņemot viņu tīmekļa lietotni, Google atvieglo rīku komplekta iegulšanu Jupyter piezīmju grāmatiņā.
Facets ir divas daļas:
- Facets pārskats
- Facets Deep Dive
Facets pārskats
Facets pārskats sniedz datu kopas pārskatu. Facets Overview sadala datu kolonnas galvenās redzamās informācijas rindās
- trūkstošā novērojuma procentuālais daudzums
- min un max vērtības
- statistiku, piemēram, vidējo, vidējo un standartnovirzi.
- Tas arī pievieno kolonnu, kas parāda nulles vērtību procentos, kas ir noderīgi, ja lielākā daļa vērtību ir nulle.
- Pārbaudes datu kopā ir iespējams redzēt šos sadalījumus, kā arī katras funkcijas apmācību kopu. Tas nozīmē, ka jūs varat vēlreiz pārbaudīt, vai testam ir līdzīgs treniņa datu sadalījums.
Tas ir vismaz minimums, kas jādara pirms jebkura mašīnmācīšanās uzdevuma. Izmantojot šo rīku, jūs nepalaid garām šo izšķirošo soli, un tas izceļ dažas novirzes.
Facets Deep Dive
Facets Deep Dive ir foršs rīks. Tas ļauj zināmā mērā skaidrot datu kopu un līdz galam tuvināt, lai redzētu atsevišķu datu gabalu. Tas nozīmē, ka datus var sadalīt pa rindām un kolonnām jebkurā datu kopas elementā.
Mēs izmantosim šos divus rīkus kopā ar Bostonas datu kopu.
Piezīme . Vienlaicīgi nevar izmantot Facets Overview un Facets Deep Dive. Lai mainītu rīku, vispirms notīrīt piezīmju grāmatiņu.
Instalējiet Facet
Lielākajā daļā analīzes varat izmantot tīmekļa lietotni Facet. Šajā apmācībā jūs redzēsiet, kā to izmantot Jupyter piezīmjdatorā.
Pirmkārt, jums jāinstalē nbextensions. Tas tiek darīts ar šo kodu. Jūs kopējat un ielīmējat šo kodu savas mašīnas terminālī.
pip install jupyter_contrib_nbextensionsTūlīt pēc tam jums klonējiet krātuves savā datorā. Jums ir divas izvēles iespējas:
1. iespēja. Nokopējiet un ielīmējiet šo kodu terminālā (ieteicams)
Ja jūsu datorā nav instalēts Git, lūdzu, apmeklējiet šo vietni https://git-scm.com/download/win un izpildiet norādījumus. Kad esat pabeidzis, varat izmantot komandu git terminālā Mac lietotājam vai Anaconda uzvednei Windows lietotājam
git clone https://github.com/PAIR-code/facets2. iespēja) Dodieties uz vietni https://github.com/PAIR-code/facets un lejupielādējiet krātuves.
Ja izvēlaties pirmo opciju, fails nonāk lejupielādes failā. Varat ļaut failu lejupielādēt vai vilkt uz citu ceļu.
Izmantojot šo komandrindu, varat pārbaudīt, kur ir saglabāti aspekti.
echo `pwd`/`ls facets`Tagad, kad esat atradis Facets, tas jāinstalē Jupyter Notebook. Darba direktorijā jāiestata ceļam, kurā atrodas aspekti.
Jūsu pašreizējam darba direktorijai un Facets zip atrašanās vietai jābūt vienādai.
Darba direktorijā jānorāda uz Facet:
cd facetsLai instalētu Facets programmā Jupyter, jums ir divas iespējas. Ja visiem lietotājiem esat instalējis Jupyter ar Conda, kopējiet šo kodu:
var izmantot jupyter nbextension install facets-dist /
jupyter nbextension install facets-dist/Pretējā gadījumā izmantojiet:
jupyter nbextension install facets-dist/ --userLabi, viss ir kārtībā. Atveram Facet Overview.
Pārskats
Pārskatā statistikas aprēķināšanai tiek izmantots Python skripts. Jums jāimportē skripts ar nosaukumu generic_feature_statistics_generator uz Jupyter. Neuztraucieties; skripts atrodas aspektu failos.
Jums jāatrod tā ceļš. Tas ir viegli izdarāms. Jūs atverat aspektus, atverat failu facets_overview un pēc tam pitonu. Kopējiet ceļu
Pēc tam atgriezieties pie Jupyter un uzrakstiet šādu kodu. Mainiet ceļu '/ Users / Thomas / facets / facets_overview / python' uz savu ceļu.
# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')Skriptu var importēt ar zemāk redzamo kodu.
from generic_feature_statistics_generator importGenericFeatureStatisticsGeneratorLogos tas pats kods kļūst
import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorLai aprēķinātu objektu statistiku, jums jāizmanto funkcija GenericFeatureStatisticsGenerator () un jāizmanto objekts ProtoFromDataFrames. Datu rāmi var nodot vārdnīcā. Piemēram, ja mēs vēlamies izveidot apkopojošu statistiku vilcienu sastāvam, mēs varam informāciju uzglabāt vārdnīcā un izmantot objektā "ProtoFromDataFrames"
'name': 'train', 'table': df_trainNosaukums ir redzamās tabulas nosaukums, un jūs izmantojat tās tabulas nosaukumu, kurai vēlaties aprēķināt kopsavilkumu. Jūsu piemērā tabula, kurā ir dati, ir 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")Visbeidzot, jūs vienkārši nokopējat un ielīmējat zemāk esošo kodu. Kods nāk tieši no GitHub. Jums to vajadzētu redzēt:
# 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)) Grafiks
Pēc datu un to sadalījuma pārbaudes jūs varat uzzīmēt korelācijas matricu. Korelācijas matrica aprēķina Pīrsona koeficientu. Šis koeficients ir saistīts starp -1 un 1, ar pozitīvu vērtību norāda pozitīvu korelāciju un negatīvu vērtību negatīvu korelāciju.
Jūs interesē redzēt, kuri mainīgie var būt labs mijiedarbības terminu kandidāts.
## 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})Rezultāts
png
No matricas jūs varat redzēt:
- LSTAT
- RM
Ir cieši saistīti ar cenu PRICE. Vēl viena aizraujoša iezīme ir spēcīgā pozitīvā korelācija starp NOX un INDUS, kas nozīmē, ka šie divi mainīgie pārvietojas vienā virzienā. Turklāt tie ir saistīti arī ar CENU. DIS ir arī ļoti korelē ar IND un NOX.
Jums ir pirmais mājiens, ka IND un NOX var būt labi kandidāti pārtveršanas termiņam, un DIS varētu būt arī interesanti koncentrēties.
Jūs varat iet mazliet dziļāk, uzzīmējot pāru režģi. Tas detalizētāk ilustrēs korelācijas karti, kuru esat uzzīmējis iepriekš.
Pāris režģis, ko mēs veidojam, ir šāds:
- Augšējā daļa: Izkliedēšanas diagramma ar piestiprinātu līniju
- Diagonāle: kodola blīvuma diagramma
- Apakšdaļa: Daudzveidīgo kodola blīvuma diagramma
Jūs izvēlaties fokusu uz četriem neatkarīgiem mainīgajiem. Izvēle atbilst mainīgajiem, kuriem ir cieša korelācija ar PRICE
- INDUS
- NOX
- RM
- LSTAT
turklāt CENA.
Ņemiet vērā, ka standarta kļūda pēc noklusējuma tiek pievienota izkliedes diagrammai.
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)Rezultāts
Sāksim ar augšējo daļu:
- Cena ir negatīvi korelēta ar INDUS, NOX un LSTAT; pozitīvi korelē ar RM.
- LSTAT un PRICE ir nedaudz nelineāri
- Ir tāda pati līnija, kad cena ir vienāda ar 50. No datu kopas apraksta PRICE ir saīsināta par 50 vērtību
Pa diagonāli
- Šķiet, ka NOX ir divas kopas, viena ap 0,5 un otra ap 0,85.
Lai uzzinātu vairāk par to, varat apskatīt apakšējo daļu. Daudzfaktoru kodola blīvums savā ziņā ir interesants, un tas iekrāso tur, kur atrodas lielākā daļa punktu. Atšķirība ar izkliedes diagrammu uzrāda varbūtības blīvumu, kaut arī datu kopai nav punkta dotajai koordinātai. Kad krāsa ir spēcīgāka, tas norāda uz augstu punkta koncentrāciju ap šo zonu.
Pārbaudot INDUS un NOX daudzveidīgo blīvumu, jūs varat redzēt pozitīvo korelāciju un abas kopas. Kad nozares īpatsvars pārsniedz 18, slāpekļa oksīdu koncentrācija pārsniedz 0,6.
Jūs varat domāt par INDUS un NOX mijiedarbības pievienošanu lineārajās attiecībās.
Visbeidzot, jūs varat izmantot otro Google izveidoto rīku Facets Deep Dive. Interfeiss ir sadalīts četrās galvenajās sadaļās. Centra centrālais apgabals ir datu tālummaiņas pietuvināms attēls. Paneļa augšpusē ir nolaižamā izvēlne, kurā datu izkārtojumu var mainīt uz slīpēšanas, pozicionēšanas un krāsu vadību. Labajā pusē ir detalizēts konkrētas datu rindas skats. Tas nozīmē, ka varat noklikšķināt uz jebkura datu punkta centra vizualizācijā, lai redzētu detalizētu informāciju par konkrēto datu punktu.
Datu vizualizācijas posmā jūs interesē meklēt pāru korelāciju starp neatkarīgo mainīgo un mājas cenu. Tomēr tas ietver vismaz trīs mainīgos, un 3D diagrammas ir sarežģīti strādāt.
Viens no veidiem, kā risināt šo problēmu, ir izveidot kategorisku mainīgo. Tas ir, mēs varam izveidot 2D diagrammu ar punktu punktu. Varat sadalīt mainīgo PRICE četrās kategorijās, un katra kategorija ir kvartile (ti, 0,25, 0,5, 0,75). Jūs šo jauno mainīgo saucat par 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")
Facets Deep Dive
Lai atvērtu Deep Dive, dati jāpārveido json formātā. Pandas kā objekts tam. To_json var izmantot pēc datu kopas Pandas.
Pirmajā koda rindā tiek apstrādāts datu kopas lielums.
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')Tālāk redzamais kods ir iegūts no Google GitHub. Pēc koda palaišanas jums vajadzētu būt iespējai to redzēt:
# 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)) Jūs interesē, vai ir saistība starp nozares likmi, oksīda koncentrāciju, attālumu līdz darba centram un mājas cenu.
Lai to izdarītu, vispirms datus sadalījāt pēc nozares diapazona un krāsas ar cenu kvartili:
- Atlasiet fasetēšanu X un izvēlieties INDUS.
- Atlasiet Displejs un izvēlieties DIS. Tas iekrāsos punktus ar mājas cenas kvartili
šeit tumšākas krāsas nozīmē, ka attālums līdz pirmajam darba centram ir tāls.
Līdz šim tas atkal parāda to, ko jūs zināt, zemāku nozares likmi, augstāku cenu. Tagad jūs varat apskatīt sadalījumu pēc INDUX, pēc NOX.
- Atlasiet slīpēto Y un izvēlieties NOX.
Tagad jūs varat redzēt, ka mājai, kas atrodas tālu no pirmā darba centra, ir viszemākā nozares daļa un līdz ar to arī viszemākā oksīda koncentrācija. Ja izvēlaties parādīt veidu ar Q_PRICE un tuvināt apakšējo kreiso stūri, varat redzēt, kāda veida cena tā ir.
Jums ir vēl viens mājiens, ka mijiedarbība starp IND, NOX un DIS var būt laba kandidatūra modeļa uzlabošanai.
TensorFlow
Šajā sadaļā jūs novērtēsiet lineāro klasifikatoru ar TensorFlow novērtētāju API. Jūs rīkosieties šādi:
- Sagatavojiet datus
- Novērtējiet etalona modeli: nav mijiedarbības
- Novērtējiet modeli ar mijiedarbību
Atcerieties, ka mašīnmācīšanās mērķis ir samazināt kļūdu. Šajā gadījumā uzvarēs modelis ar zemāko vidējo kvadrāta kļūdu. TensorFlow aprēķinātājs automātiski aprēķina šo metriku.
Sagatavošanas dati
Lielākajā daļā gadījumu jums ir jāpārveido dati. Tāpēc aspektu pārskats ir aizraujošs. No kopsavilkuma statistikas jūs redzējāt, ka ir atšķirīgi rādītāji. Šīs vērtības ietekmē aplēses, jo tās neizskatās kā analizējamā populācija. Ārējie cilvēki parasti neobjektīvi ietekmēja rezultātus. Piemēram, pozitīvs iznākums mēdz pārvērtēt koeficientu.
Labs risinājums šīs problēmas risināšanai ir mainīgā standartizācija. Standartizācija nozīmē standarta novirzi no vienas un vidējo nulli. Standartizācijas process ietver divus posmus. Pirmkārt, tā atņem mainīgā vidējo vērtību. Otrkārt, tas dalās ar dispersiju tā, lai sadalījumam būtu dispersijas vienība
Bibliotēkas sklearn ir noderīga, lai standartizētu mainīgos. Šim nolūkam varat izmantot moduļa pirmapstrādi ar objekta skalu.
Datu kopas mērogošanai varat izmantot zemāk esošo funkciju. Ņemiet vērā, ka netiek mērogota etiķetes kolonna un kategoriskie mainīgie.
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_scaleFunkciju var izmantot, lai izveidotu mērogotu vilcienu / testa komplektu.
df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test)Pamata regresija: etalons
Pirmkārt, jūs apmācāt un pārbaudāt modeli bez mijiedarbības. Mērķis ir redzēt modeļa veiktspējas metriku.
Modeļa apmācības veids ir tieši tāds pats kā augsta līmeņa API apmācība . Jūs izmantosiet TensorFlow novērtētāju LinearRegressor.
Atgādinām, ka jums jāizvēlas:
- funkcijas, kas jāievieto modelī
- pārveidot funkcijas
- konstruēt lineāro regresoru
- konstruējiet funkciju input_fn
- apmācīt modeli
- pārbaudīt modeli
Lai apmācītu modeli, jūs izmantojat visus datu kopas mainīgos. Kopumā ir līmeņu nepārtraukti mainīgie un viens kategorisks mainīgais
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']Jūs pārveidojat līdzekļus skaitliskā kolonnā vai kategoriskajā kolonnā
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'])]Jūs izveidojat modeli ar linearRegressor. Jūs glabājat modeli mapē train_Boston
model = tf.estimator.LinearRegressor(model_dir="train_Boston",feature_columns=categorical_features + continuous_features)Rezultāts
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} Katra vilciena vai testa datu kolonna tiek pārveidota par Tensoru ar funkciju get_input_fn
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)Jūs novērtējat modeli pēc vilciena datiem.
model.train(input_fn=get_input_fn(df_train_scale,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)Rezultāts
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.Beidzot jūs novērtējat modeļa veiktspēju testa komplektā
model.evaluate(input_fn=get_input_fn(df_test_scale,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)Rezultāts
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}Modeļa zaudējums ir 1650. Šis ir metrikas rādītājs, kas jāpārspēj nākamajā sadaļā
Uzlabojiet modeli: mijiedarbības termins
Apmācības pirmās daļas laikā jūs redzējāt interesantas attiecības starp mainīgajiem. Dažādās vizualizācijas metodes atklāja, ka INDUS un NOS ir savstarpēji saistītas un pagriežas, lai palielinātu ietekmi uz cenu. Cenu ietekmē ne tikai INDUS un NOS mijiedarbība, bet arī šī ietekme ir spēcīgāka, ja tā mijiedarbojas ar DIS.
Ir pienācis laiks vispārināt šo ideju un noskaidrot, vai jūs varat uzlabot modeļa paredzēto modeli.
Katram datu kopas kopumam jāpievieno divas jaunas kolonnas: vilciens + tests. Šim nolūkam jūs izveidojat vienu funkciju mijiedarbības termiņa aprēķināšanai, bet otru - trīskāršās mijiedarbības termiņa aprēķināšanai. Katra funkcija rada vienu kolonnu. Pēc jauno mainīgo izveidošanas jūs varat tos savienot ar apmācības datu kopu un testa datu kopu.
Pirmkārt, jums ir jāizveido jauns mainīgais INDUS un NOX mijiedarbībai.
Tālāk sniegtā funkcija atgriež divus datu ietvarus, vilcienu un testu, mijiedarbojoties starp var_1 un var_2, jūsu gadījumā INDUS un 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, testJūs glabājat divas jaunās kolonnas
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')interation_ind_ns_train.shape(325,)Otrkārt, jūs izveidojat otru funkciju, lai aprēķinātu trīskāršās mijiedarbības terminu.
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')Tagad, kad jums ir visas nepieciešamās kolonnas, varat tās pievienot apmācībai un datu kopas pārbaudei. Jūs nosaucat šos divus jaunos datu ietvarus:
- 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)Rezultāts
Tas ir viss; jūs varat novērtēt jauno modeli ar mijiedarbības noteikumiem un uzzināt, kā darbojas veiktspēja.
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)Rezultāts
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} KODS
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)Rezultāts
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)Rezultāts
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}Jaunais zaudējums ir 1515. Tikai pievienojot divus jaunus mainīgos, jūs varējāt samazināt zaudējumus. Tas nozīmē, ka jūs varat labāk prognozēt nekā ar etalona modeli.