Ebben az oktatóanyagban megtudhatja, hogyan ellenőrizheti az adatokat és hogyan készítheti elő őket egy egyszerű lineáris regressziós feladat létrehozására.
Ez az oktatóanyag két részre oszlik:
- Keresse az interakciót
- Tesztelje a modellt
Az előző oktatóanyagban a bostoni adatkészlettel becsülted meg a ház középárát. A bostoni adatkészlet kis méretű, mindössze 506 megfigyeléssel. Ezt az adatkészletet referenciaértéknek tekintik az új lineáris regressziós algoritmusok kipróbálására.
Az adatkészlet a következőkből áll:
Változó | Leírás |
zn | A 25.000 négyzetméter feletti telkekre elosztott lakóterület aránya |
indus | A nem kiskereskedelmi üzleti hektárok aránya városonként. |
nox | nitrogén-oxid-koncentráció |
rm | lakásonkénti átlagos szobák száma |
kor | az 1940 előtt épített tulajdonosok által használt egységek aránya |
dis | súlyozott távolságok öt bostoni munkaügyi központig |
adó | teljes értékű ingatlanadó mértéke dollárenként 10 000 |
ptratio | a tanuló-tanár arány városonként |
medv | A tulajdonosok által használt lakások mediánértéke ezer dollárban |
krim | az egy főre eső bűnözés mértéke városonként |
chas | Charles River dummy változó (1, ha a folyót korlátozza; különben 0) |
B | a feketék aránya a város szerint |
Ebben az oktatóanyagban egy lineáris regresszor segítségével megbecsüljük a medián árat, de a hangsúly a gépi tanulás egy bizonyos folyamatán van: az "adatok előkészítésén".
Egy modell általánosítja az adatok mintázatát. Egy ilyen minta rögzítéséhez először meg kell találnia. Jó gyakorlat az adatelemzés elvégzése a gépi tanulási algoritmus futtatása előtt.
A megfelelő funkciók kiválasztása minden különbséget jelent a modell sikerében. Képzelje el, hogy megpróbálja megbecsülni egy nép bérét, ha nem tartalmazza a nemet kovariátorként, akkor rossz becsléssel jár.
A modell továbbfejlesztésének másik módja a független változó közötti összefüggés vizsgálata. Visszatérve a példához, úgy gondolhatja az oktatást, mint kiváló jelöltet a bér, de a foglalkozás előrejelzésére is. Igaz mondani, hogy a foglalkozás az iskolázottság szintjétől függ, nevezetesen a felsőoktatás gyakran jobb foglalkozáshoz vezet. Ha ezt az elképzelést általánosítjuk, elmondhatjuk, hogy a függő változó és egy magyarázó változó közötti összefüggés felnagyítható egy újabb magyarázó változóval.
Az oktatás korlátozott hatásának megragadására használhatunk interakciós kifejezést.
Ha megnézzük a béregyenletet, akkor ez a következő lesz:
Ha pozitív, akkor ez azt jelenti, hogy egy további végzettség magasabb házi mediánérték-növekedést eredményez magas foglalkozási szint mellett. Más szavakkal, kölcsönhatás van az oktatás és a foglalkozás között.
Ebben az oktatóanyagban megpróbáljuk megtudni, hogy mely változók lehetnek jó jelöltek az interakciós kifejezésekre. Megvizsgáljuk, hogy az ilyen típusú információk hozzáadása jobb árjóslathoz vezet-e.
Ebben az oktatóanyagban megtanulja
- Összefoglaló statisztikák
- Áttekintés áttekintése
- Facets Deep Dive
- Telepítse a Facet alkalmazást
- Áttekintés
- Grafikon
- Facets Deep Dive
- TensorFlow
- Előkészítési adatok
- Alapvető regresszió: benchmark
- Javítsa a modellt: Interakciós kifejezés
Összefoglaló statisztikák
Néhány lépést követhet, mielőtt folytatja a modellt. Mint korábban említettük, a modell az adatok általánosítása. A legjobb illeszkedési gyakorlat az adatok megértése és az előrejelzés. Ha nem ismeri az adatait, akkor kicsi az esélye a modell fejlesztésére.
Első lépésként töltse be az adatokat pandás adatkeretként, és hozzon létre egy edzéskészletet és tesztkészletet.
Tippek: Ehhez az oktatóanyaghoz matplotlit és seaborn telepítve kell lennie a Pythonban. A Python csomagot menet közben is telepítheti a Jupyterrel. Nem szabad ezt megtenni
!conda install -- yes matplotlib
de
import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn
Ne feledje, hogy ez a lépés nem szükséges, ha a matplotlib és a seaborn telepítve van.
A Matplotlib az a könyvtár, amely grafikont hoz létre a Pythonban. A Seaborn egy statisztikai vizualizációs könyvtár, amely a matplotlib tetejére épül. Vonzó és szép telkeket kínál.
Az alábbi kód importálja a szükséges könyvtárakat.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np
A könyvtár sklearn tartalmazza a bostoni adatkészletet. Hívhatja az API-t az adatok importálásához.
boston = load_boston()df = pd.DataFrame(boston.data)
A szolgáltatás nevét egy tömb objektum_nevei tárolják.
boston.feature_names
Kimenet
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='Átnevezheti az oszlopokat.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)A CHAS változót karakterlánc változóvá konvertálja, és ha igen, ha CHAS = 1, akkor nem, ha CHAS = 0, akkor nem
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectA pandák esetében egyértelmű az adatkészlet felosztása. Véletlenszerűen osztja fel az adatkészletet 80 százalékos edzéskészlettel és 20 százalékos tesztkészlettel. A pandák beépített költségfunkcióval rendelkeznek az adatkeret-minta felosztásához.
Az első paraméter frac 0 és 1 közötti érték. Ha 0,8-ra állítja, az adatkeret véletlenszerűen 80 százalékát választja ki.
A Random_state lehetővé teszi, hogy mindenkinek ugyanazt az adatkeretet adja vissza.
### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)Megkaphatja az adatok alakját. Kellene lennie:
- Vonatkészlet: 506 * 0,8 = 405
- Tesztkészlet: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)Kimenet
(405, 14) (101, 14)df_test.head(5)Kimenet
BŰNÖZÉS ZN INDUS CHAS NOX RM KOR DIS RAD ADÓ PTRATIO B LSTAT ÁR 0 0,00632 18.0 2.31 nem 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 nem 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 nem 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 nem 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 nem 0,524 6.172 96.1 5.9505 5.0 311.0 15.2 396.90 19.15 27.1 Az adatok rendetlenek; gyakran kiegyensúlyozatlan, és olyan kiugró értékekkel van megszórva, amelyek eldobják az elemzést és a gépi tanulási képzést.
Az adatkészlet megtisztításának első lépése annak megértése, hogy hol kell tisztítani. Az adatkészlet megtisztítása bonyolult, különösen bármilyen általánosítható módon
A Google Research csapata kifejlesztett ehhez a munkához egy Facets nevű eszközt, amely segít az adatok vizualizálásában és mindenféle módon szeletelésében. Ez egy jó kiindulópont annak megértéséhez, hogy az adatkészlet hogyan kerül elrendezésre.
A szempontok lehetővé teszik, hogy megtalálja, ahol az adatok nem egészen úgy néznek ki, ahogy gondolkodik.
Webes alkalmazásuk kivételével a Google megkönnyíti az eszköztár Jupyter notebookba történő beágyazását.
A Facets két részből áll:
- Áttekintés áttekintése
- Facets Deep Dive
Áttekintés áttekintése
A Facets Overview áttekintést nyújt az adatkészletről. A Facets Overview felosztja az adatok oszlopait kiemelt információk soraira
- a hiányzó megfigyelés százalékos aránya
- min és max értékek
- statisztikák, mint az átlag, a medián és a szórás.
- Ezenkívül hozzáad egy oszlopot, amely megmutatja az értékek százalékos értékét, ami nulla, ami akkor hasznos, ha az értékek nagy része nulla.
- Látható ezek az eloszlások a tesztadatkészleten, valamint az egyes jellemzők képzési halmaza. Ez azt jelenti, hogy kétszer ellenőrizheti, hogy a teszt hasonló eloszlású-e, mint az edzés adatai.
Ez legalább a gépi tanulási feladatok előtt elvégzendő minimum. Ezzel az eszközzel nem hagyja ki ezt a döntő lépést, és kiemel néhány rendellenességet.
Facets Deep Dive
A Facets Deep Dive klassz eszköz. Lehetővé teszi, hogy tisztázza az adatkészletet, és végig nagyíthatja az egyes adatok megtekintését. Ez azt jelenti, hogy sorba és oszlopba sorolhatja az adatokat az adatkészlet bármely jellemzőjén keresztül.
Ezt a két eszközt fogjuk használni a bostoni adatkészlettel.
Megjegyzés : A Facets Overview és a Facets Deep Dive egyszerre nem használható. Először ki kell törölnie a jegyzetfüzetet az eszköz megváltoztatásához.
Telepítse a Facet alkalmazást
Az elemzés nagy részében használhatja a Facet webalkalmazást. Ebben az oktatóanyagban megismerheti a Jupyter Notebook használatát.
Először telepítenie kell az nbextensions programot. Ezzel a kóddal történik. Másolja és beilleszti a következő kódot a gép termináljába.
pip install jupyter_contrib_nbextensionsRögtön ezután klónoznia kell a tárolókat a számítógépén. Két lehetőséged van:
1. lehetőség: Másolja és illessze be ezt a kódot a terminálba (ajánlott)
Ha még nincs telepítve a Git a számítógépére, kérjük, látogasson el erre az URL-re: https://git-scm.com/download/win, és kövesse az utasításokat. Ha elkészült, használhatja a terminál git parancsát a Mac Felhasználóhoz vagy az Anaconda parancsot a Windows felhasználóhoz
git clone https://github.com/PAIR-code/facets2. lehetőség: Nyissa meg a https://github.com/PAIR-code/facets webhelyet, és töltse le a tárakat.
Ha az első lehetőséget választja, a fájl a letöltési fájlba kerül. Vagy engedélyezheti a fájl letöltését, vagy áthúzhatja egy másik útvonalra.
Ezzel a parancssorral ellenőrizheti, hogy a Facets hol van tárolva:
echo `pwd`/`ls facets`Most, hogy megtalálta a Facets alkalmazást, telepítenie kell a Jupyter Notebookba. Be kell állítania a munkakönyvtárat arra az útvonalra, ahol a aspektusok találhatók.
Jelenlegi munkakönyvtárának és a Facets zip helyének meg kell egyeznie.
A munkakönyvtárat a Facet pontra kell mutatnia:
cd facetsA Facets Jupyter programba történő telepítéséhez két lehetőség áll rendelkezésre. Ha az összes felhasználó számára telepítette a Jupyter-t a Condával, másolja ezt a kódot:
használhatja a jupyter nbextension telepítését facets-dist /
jupyter nbextension install facets-dist/Ellenkező esetben használja:
jupyter nbextension install facets-dist/ --userRendben, minden rendben van. Nyissuk meg a Facet Overview alkalmazást.
Áttekintés
Az Áttekintés Python szkriptet használ a statisztikák kiszámításához. Importálni kell a generic_feature_statistics_generator nevű szkriptet a Jupyterbe. Ne aggódj; a szkript a facets fájlokban található.
Meg kell találnia az útját. Ez könnyen elvégezhető. Megnyitja a aspektusokat, megnyitja a facets_overview fájlt, majd python. Másolja az utat
Ezt követően térjen vissza a Jupyterhez, és írja be a következő kódot. Módosítsa a "/ Users / Thomas / facets / facets_overview / python" elérési utat az Ön elérési útjához.
# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')Az alábbi kóddal importálhatja a szkriptet.
from generic_feature_statistics_generator importGenericFeatureStatisticsGeneratorA Windows rendszerben ugyanaz a kód lesz
import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorA szolgáltatás statisztikájának kiszámításához használja a GenericFeatureStatisticsGenerator () függvényt, és a ProtoFromDataFrames objektumot. Az adatkeretet átadhatja egy szótárban. Például, ha összefoglaló statisztikát akarunk létrehozni a vonatkészletről, akkor tárolhatjuk az információkat egy szótárban, és felhasználhatjuk a "ProtoFromDataFrames" objektumban.
'name': 'train', 'table': df_trainA név a megjelenített tábla neve, és Ön annak a táblának a nevét használja, amelyre az összefoglalót szeretné kiszámítani. A példádban az adatokat tartalmazó tábla 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")Végül csak másolja és illessze be az alábbi kódot. A kód közvetlenül a GitHub-ból származik. Ezt látnia kell:
# 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)) Grafikon
Miután ellenőrizte az adatokat és azok eloszlását, megrajzolhat egy korrelációs mátrixot. A korrelációs mátrix kiszámítja a Pearson-együtthatót. Ez az együttható -1 és 1 között van összekötve, pozitív érték pozitív, negatív érték pedig negatív korrelációt jelez.
Érdekel, hogy mely változók lehetnek jó jelöltek az interakciós kifejezésekre.
## 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})Kimenet
png
A mátrixból láthatja:
- LSTAT
- RM
Erősen korrelálnak a PRICE-val. Egy másik izgalmas jellemző az erős pozitív korreláció a NOX és az INDUS között, ami azt jelenti, hogy ez a két változó ugyanabba az irányba mozog. Emellett vannak összefüggésben az ÁR-val is. A DIS szintén szorosan korrelál az IND és NOX értékekkel.
Van néhány első utalásod arra, hogy az IND és a NOX jó jelölt lehet az elfogási ciklusra, és a DIS-re is érdekes lehet összpontosítani.
Kicsit elmélyülhet, ha megrajzol egy pár rácsot. Ez részletesebben szemlélteti a korábban ábrázolt korrelációs térképet.
Az általunk összeállított párrács a következőképpen alakul:
- Felső rész: Szóródeszka illesztett vonallal
- Átló: Kernel sűrűség ábrája
- Alsó rész: Többváltozós kernelsűrűség-diagram
Négy független változóra fókuszál. A választás megfelel a PRICE-val szorosan összefüggő változóknak
- INDUS
- NOX
- RM
- LSTAT
ráadásul az ÁR.
Ne feledje, hogy a standard hiba alapértelmezés szerint hozzáadódik a szórási diagramhoz.
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)Kimenet
Kezdjük a felsővel:
- Az ár negatívan korrelál az INDUS, a NOX és az LSTAT értékkel; pozitívan korrelál az RM-vel.
- Kicsit nemlineáris az LSTAT és az PRICE
- Van olyan, mint egy egyenes, amikor az ár egyenlő 50-vel. Az adatkészlet leírásából a PRICE-t 50-es értéken csonkították.
Átlós
- Úgy tűnik, hogy a NOX-nak két klasztere van, az egyik 0,5 körül, a másik pedig 0,85 körül.
Ha többet szeretne megtudni róla, megnézheti az alsó részt. A többváltozós kernelsűrűség bizonyos értelemben érdekes, ahol a legtöbb pont színeződik. A szórási ábrával való különbség valószínűségi sűrűséget rajzol, annak ellenére, hogy az adatkészletben nincs pont egy adott koordinátára. Ha a szín erősebb, ez a pont körüli magas koncentrációra utal.
Ha ellenőrzi az INDUS és NOX többváltozósűrűségét, láthatja a pozitív korrelációt és a két klasztert. Amikor az ipar részaránya meghaladja a 18-at, a nitrogén-oxid-koncentráció meghaladja a 0,6-ot.
Elgondolkodhat az INDUS és a NOX közötti kölcsönhatás felvételén a lineáris összefüggésen.
Végül használhatja a Google által létrehozott második eszközöket, a Facets Deep Dive-t. Az interfész négy fő részre oszlik. A központ középső része az adatok nagyítható megjelenítése. A panel tetején található egy legördülő menü, ahol megváltoztathatja az adatok elrendezését a fasírozás, a pozicionálás és a szín vezérlésére. A jobb oldalon egy adott adatsor részletes nézete látható. Ez azt jelenti, hogy a középső megjelenítés bármely adatpontjára kattintva megtekintheti az adott adat részleteit.
Az adatmegjelenítés során érdeklődni kíván a páros összefüggésről a független változó és a ház ára között. Ez azonban legalább három változót tartalmaz, és a 3D-s ábrák használata bonyolult.
A probléma kezelésének egyik módja egy kategorikus változó létrehozása. Vagyis létrehozhatunk egy 2D-s ábrát a pont színével. A PRICE változót négy kategóriára oszthatja, mindegyik kategória egy kvartilis (azaz 0,25, 0,5, 0,75). Ezt az új változót hívja: 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
A Deep Dive megnyitásához át kell alakítania az adatokat json formátumba. A pandák mint tárgy erre. Használhatja a to_json fájlt a Pandas adatkészlet után.
Az első kódsor az adatkészlet méretét kezeli.
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')Az alábbi kód a Google GitHub-tól származik. A kód futtatása után látnia kell ezt:
# 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)) Érdekel, hogy van-e összefüggés az ipari ráta, az oxidkoncentráció, az állásközponttól való távolság és a ház ára között.
Ehhez először fel kell osztani az adatokat az ipari tartomány és szín szerint az árnegyedre:
- Válassza ki a faceting X elemet, majd válassza az INDUS lehetőséget.
- Válassza a Megjelenítés lehetőséget, és válassza a DIS lehetőséget. A pontokat a ház árának kvartilisával fogja színezni
itt a sötétebb színek azt jelentik, hogy az első munkaközpont távolsága messze van.
Eddig ismét megmutatja, amit tud, alacsonyabb ipari ráta, magasabb ár. Most megnézheti az INDUX, NOX szerinti bontást.
- Válassza ki az Y csíkozást és válassza a NOX lehetőséget.
Most már láthatja, hogy az első munkaközponttól távol eső házban a legkisebb az ipari részesedés, ezért a legalacsonyabb az oxidkoncentráció. Ha úgy dönt, hogy a típust a Q_PRICE értékkel jeleníti meg, és nagyítja a bal alsó sarkot, láthatja, hogy milyen típusú árról van szó.
Van még egy tipped arra, hogy az IND, NOX és DIS közötti kölcsönhatás jó jelölt lehet a modell fejlesztésére.
TensorFlow
Ebben a szakaszban a lineáris osztályozót a TensorFlow becslők API-val becsüli meg. Az alábbiak szerint jár el:
- Készítse elő az adatokat
- Becsüljön meg egy benchmark modellt: Nincs interakció
- Becsüljön meg egy modellt interakcióval
Ne feledje, hogy a gépi tanulás célja a hiba minimalizálása. Ebben az esetben az a modell nyer, amelynek a legalacsonyabb az átlagos négyzetes hibája. A TensorFlow becslő automatikusan kiszámítja ezt a mutatót.
Előkészítési adatok
Az esetek többségében átalakítania kell adatait. Ezért a Facets Overview lenyűgöző. Az összefoglaló statisztikából láthattad, hogy vannak kiugró értékek. Ezek az értékek befolyásolják a becsléseket, mert nem hasonlítanak az általad elemzett népességre. A kiugró emberek általában elfogulták az eredményeket. Például egy pozitív kiugró érték túlértékeli az együtthatót.
A probléma megoldására jó megoldás a változó szabványosítása. A standardizálás egy és szórás szórását jelenti. A szabványosítás folyamata két lépést foglal magában. Mindenekelőtt kivonja a változó átlagértékét. Másodszor, elosztja a varianciával, így az eloszlás egységnyi varianciával rendelkezik
A sklearn könyvtár segít a változók szabványosításában. Erre a célra használhatja a modul előfeldolgozását az objektum skálával.
Az alábbi függvény segítségével méretezhet egy adatsort. Ne feledje, hogy nem méretezi a címke oszlopot és a kategorikus változókat.
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_scaleA függvény segítségével elkészítheti a méretezett vonatot / tesztkészletet.
df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test)Alapvető regresszió: benchmark
Mindenekelőtt interakció nélkül edz és tesztel egy modellt. A cél a modell teljesítménymutatójának megtekintése.
A modell kiképzésének módja pontosan olyan, mint a magas szintű API oktatóanyaga . A TensorFlow LinearRegressor becslőt fogja használni.
Emlékeztetőül: a következőket kell választania:
- a modellbe beillesztendő jellemzők
- alakítsa át a jellemzőket
- konstruálja a lineáris regresszort
- konstruálja az input_fn függvényt
- képezze ki a modellt
- tesztelje a modellt
A modell kiképzéséhez az adatkészlet összes változóját használja. Összesen vannak folyamatos szintű változók és egy kategorikus változó
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']A szolgáltatásokat numerikus oszlopokká vagy kategorikus oszlopokká konvertálja
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'])]A modellt a linearRegressor segítségével hozza létre. A modellt a train_Boston mappában tárolja
model = tf.estimator.LinearRegressor(model_dir="train_Boston",feature_columns=categorical_features + continuous_features)Kimenet
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} A vonat vagy a tesztadatok minden oszlopát Tensorrá konvertáljuk a get_input_fn függvénnyel
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)A modellt a vonat adatai alapján becsüli meg.
model.train(input_fn=get_input_fn(df_train_scale,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)Kimenet
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.Végül megbecsüli a modell teljesítményét a tesztkészleten
model.evaluate(input_fn=get_input_fn(df_test_scale,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)Kimenet
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}A modell vesztesége 1650. Ezt a mutatót kell legyőzni a következő szakaszban
Javítsa a modellt: Interakciós kifejezés
Az oktatóanyag első részében érdekes összefüggést látott a változók között. A különböző megjelenítési technikák feltárták, hogy az INDUS és a NOS összekapcsolódnak, és megfordulnak, hogy felnagyítsák az árra gyakorolt hatást. Nemcsak az INDUS és a NOS közötti kölcsönhatás befolyásolja az árat, hanem ez a hatás is erősebb, ha kölcsönhatásba lép a DIS-szel.
Ideje általánosítani ezt az elképzelést, és megnézni, hogy javíthatja-e a modell előre jelzett modelljét.
Minden egyes adatkészlethez két új oszlopot kell hozzáadnia: vonat + teszt. Ehhez egy függvényt hoz létre az interakció kifejezés kiszámításához, egy másik pedig a tripla interakció kifejezés kiszámításához. Minden függvény egyetlen oszlopot hoz létre. Az új változók létrehozása után összefűzheti őket az oktatási és a tesztelési adatkészlettel.
Először is létre kell hoznia egy új változót az INDUS és a NOX közötti interakcióhoz.
Az alábbi függvény két adatkeretet ad vissza, a vonatot és a tesztet, a var_1 és a var_2, az Ön esetében az INDUS és a NOX kölcsönhatásával.
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Ön tárolja a két új oszlopot
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')interation_ind_ns_train.shape(325,)Másodszor létrehoz egy második függvényt a hármas interakció kifejezés kiszámításához.
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')Most, hogy minden szükséges oszlop megvan, felveheti őket az edzéshez és az adatkészlet teszteléséhez. Ezt a két új adatkeretet nevezi meg:
- 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)Kimenet
Ez az; megbecsülheti az új modellt az interakciós kifejezésekkel, és megnézheti, hogyan áll a teljesítménymutató.
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)Kimenet
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} KÓD
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)Kimenet
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)Kimenet
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}Az új veszteség 1515. Csak két új változó hozzáadásával csökkenteni tudta a veszteséget. Ez azt jelenti, hogy jobb előrejelzést tehet, mint a benchmark modellel.