Analytical approach using Neural Network on tabulate data

The core engine for project $\large\hat{y}$.

The dataset is from New York City Airbnb Open Data on kaggle

DATA = Path("../data")
CSV_PATH = DATA/"AB_NYC_2019.csv"

The AirBnB New York 2019 dataset

df = pd.read_csv(CSV_PATH)
df.sample(10)
id name host_id host_name neighbourhood_group neighbourhood latitude longitude room_type price minimum_nights number_of_reviews last_review reviews_per_month calculated_host_listings_count availability_365
17324 13676601 Here's a great offer on a spacious furnished r... 79598330 Nesha Brooklyn East Flatbush 40.66337 -73.92576 Private room 30 3 20 2018-03-31 0.54 1 27
20494 16323239 Spacious 2 BDR - Hell's Kitchen/Times Square 2559886 Sy Manhattan Hell's Kitchen 40.76284 -73.98849 Entire home/apt 130 4 2 2017-11-30 0.07 1 0
27546 21679639 Entire 1-Bedroom Greenpoint Apartment 4696622 James Brooklyn Greenpoint 40.72747 -73.95462 Entire home/apt 95 3 0 NaN NaN 1 0
45469 34776151 Bedroom + den + bath w/ sep. entry in Bed Stuy! 73612539 Rebecca Brooklyn Bedford-Stuyvesant 40.68602 -73.94844 Private room 68 1 8 2019-07-02 6.32 2 36
33070 26085075 Charming studio with PRIVATE DECK by McCarren ... 27530449 Estefania Brooklyn Greenpoint 40.72173 -73.94820 Private room 106 4 21 2019-06-03 1.73 2 58
19553 15634892 Adorable, NYC studio for the holiday! 15353668 Bria Manhattan Midtown 40.75228 -73.97186 Entire home/apt 144 28 0 NaN NaN 1 90
39825 30954420 Artistic apartment in the Heart of Manhattan 231298987 Austin Manhattan Lower East Side 40.71890 -73.98599 Entire home/apt 200 4 1 2019-03-16 0.26 1 0
10897 8407092 Historic Ridgewood Brick Townhouse 9684993 Randy Queens Ridgewood 40.70928 -73.89795 Entire home/apt 139 5 3 2018-07-30 0.16 1 0
10715 8247721 Charming Crown Heights Brownstone 43494916 Tilly Brooklyn Crown Heights 40.67791 -73.95337 Entire home/apt 80 3 0 NaN NaN 2 0
5187 3743048 *WARM*Beautiful*Room*ST. GEORGE steps to ferry! 19143974 Meghan Staten Island St. George 40.64408 -74.07834 Private room 58 3 93 2019-05-06 2.10 1 279

Config how we learn the columns

This is a python/console interface, that will

  • guide the user through columns one by one,
  • let user decide how should we treat a column during the learning

md5hash[source]

md5hash(x)

X input modules

class ModelInput[source]

ModelInput(rich_col) :: Module

Base class for all neural network modules.

Your models should also subclass this class.

Modules can also contain other Modules, allowing to nest them in a tree structure. You can assign the submodules as regular attributes::

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

Submodules assigned in this way will be registered, and will have their parameters converted too when you call :meth:to, etc.

class InputEmb[source]

InputEmb(rich_col) :: ModelInput

Base class for all neural network modules.

Your models should also subclass this class.

Modules can also contain other Modules, allowing to nest them in a tree structure. You can assign the submodules as regular attributes::

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

Submodules assigned in this way will be registered, and will have their parameters converted too when you call :meth:to, etc.

class InputOneHot[source]

InputOneHot(rich_col) :: ModelInput

Base class for all neural network modules.

Your models should also subclass this class.

Modules can also contain other Modules, allowing to nest them in a tree structure. You can assign the submodules as regular attributes::

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

Submodules assigned in this way will be registered, and will have their parameters converted too when you call :meth:to, etc.

class InputConti[source]

InputConti(rich_col) :: ModelInput

Base class for all neural network modules.

Your models should also subclass this class.

Modules can also contain other Modules, allowing to nest them in a tree structure. You can assign the submodules as regular attributes::

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

Submodules assigned in this way will be registered, and will have their parameters converted too when you call :meth:to, etc.

Y target encode

class YEncoder[source]

YEncoder(rich_col)

Encode the why into the required shape input of the call, numpy array

class YOneHot[source]

YOneHot(rich_col) :: YEncoder

Encode the why into the required shape input of the call, numpy array

class YConti[source]

YConti(rich_col) :: YEncoder

Encode the why into the required shape input of the call, numpy array

Enhanced columns

class RichColumn[source]

RichColumn(column, is_y=False, min_occur=5, is_emb=True, hidden_size=20)

A pandas series manager

class RichDF[source]

RichDF(df, fname=None)

A pandas dataframe manager

rdf = RichDF(df,fname = "testing_case_nyc")

Use tour() to set the configuration

rdf.tour()

Here's how I set the columns

rdf.set_y("price")

This is how I set the configuration:

for col in rdf.df:
    print(">"*5,col,"<"*5)
    print(rdf.t[md5hash(col)])
>>>>> id <<<<<
{'name': 'id', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': False}
>>>>> name <<<<<
{'name': 'name', 'defined': True, 'is_conti': False, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> host_id <<<<<
{'name': 'host_id', 'defined': True, 'is_conti': False, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> host_name <<<<<
{'name': 'host_name', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': False}
>>>>> neighbourhood_group <<<<<
{'name': 'neighbourhood_group', 'defined': True, 'is_conti': False, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> neighbourhood <<<<<
{'name': 'neighbourhood', 'defined': True, 'is_conti': False, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> latitude <<<<<
{'name': 'latitude', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> longitude <<<<<
{'name': 'longitude', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> room_type <<<<<
{'name': 'room_type', 'defined': True, 'is_conti': False, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> price <<<<<
{'name': 'price', 'defined': True, 'is_conti': True, 'is_y': True, 'is_emb': False, 'use': True}
>>>>> minimum_nights <<<<<
{'name': 'minimum_nights', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> number_of_reviews <<<<<
{'name': 'number_of_reviews', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> last_review <<<<<
{'name': 'last_review', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': False}
>>>>> reviews_per_month <<<<<
{'name': 'reviews_per_month', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> calculated_host_listings_count <<<<<
{'name': 'calculated_host_listings_count', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': True}
>>>>> availability_365 <<<<<
{'name': 'availability_365', 'defined': True, 'is_conti': True, 'is_y': False, 'is_emb': True, 'use': True}
list(rdf.Xs)
[<Rich Column:name>,
 <Rich Column:host_id>,
 <Rich Column:neighbourhood_group>,
 <Rich Column:neighbourhood>,
 <Rich Column:latitude>,
 <Rich Column:longitude>,
 <Rich Column:room_type>,
 <Rich Column:minimum_nights>,
 <Rich Column:number_of_reviews>,
 <Rich Column:reviews_per_month>,
 <Rich Column:calculated_host_listings_count>,
 <Rich Column:availability_365>]
rdf["room_type"].encode("Entire home/apt")
1

class TabularModel[source]

TabularModel(rdf) :: Module

Base class for all neural network modules.

Your models should also subclass this class.

Modules can also contain other Modules, allowing to nest them in a tree structure. You can assign the submodules as regular attributes::

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

Submodules assigned in this way will be registered, and will have their parameters converted too when you call :meth:to, etc.

class TabularNN[source]

TabularNN(rich_df, batch_size=128)

rdf["room_type"].col.rc
<Rich Column:room_type>
tnn = TabularNN(rdf)
coldf = tnn.x[1].top_freq["index"]
next(tnn.batch_df())
id name host_id host_name neighbourhood_group neighbourhood latitude longitude room_type price minimum_nights number_of_reviews last_review reviews_per_month calculated_host_listings_count availability_365
0 36444734 Sunny Upper West Side Apt. 3mins from Central ... 32987938 Alex Manhattan Upper West Side 40.77889 -73.97668 Entire home/apt 143 3 0 NaN NaN 1 10
1 16987293 New, Luxury and Sunny Apartment 57455831 Maggie Brooklyn Clinton Hill 40.69440 -73.96606 Entire home/apt 150 1 1 2017-05-06 0.04 2 0
2 21154544 Huge beautiful bedroom with double exposure 66260832 Dragana Manhattan Harlem 40.81520 -73.95175 Private room 50 15 0 NaN NaN 1 0
3 2135489 Charming Studio in Brooklyn 8624212 Leon Brooklyn Carroll Gardens 40.68362 -73.99714 Entire home/apt 170 2 131 2019-06-16 2.02 1 26
4 11321187 Entire 1Br Apt on UES 59215698 Daniela Manhattan Upper East Side 40.76796 -73.95205 Entire home/apt 130 1 21 2019-07-07 0.56 2 53
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
123 15765350 Doorman 2 Bed GYM DECK 5212 16098958 Jeremy & Laura Manhattan Murray Hill 40.74437 -73.97295 Entire home/apt 190 30 4 2019-01-14 0.13 96 331
124 23307047 2 Story PRIVATE Duplex/Elevator Building in NoMad 172756149 C Manhattan Kips Bay 40.74121 -73.98139 Entire home/apt 240 1 66 2019-07-02 4.09 1 83
125 6169068 Prime Park Slope Townhouse, 4 BR and Garden 9773128 Deborah Brooklyn Park Slope 40.66798 -73.97610 Entire home/apt 345 30 0 NaN NaN 1 156
126 24122599 Cozy room in a Victorian house in Central Broo... 14905006 Myriam Brooklyn Kensington 40.63966 -73.97160 Private room 52 1 11 2019-05-27 0.81 1 0
127 18616234 UPPER EAST SIDE PRIVATE ROOM! 129317761 Lauren Manhattan East Harlem 40.78886 -73.94324 Private room 70 1 11 2017-07-15 0.42 1 0

128 rows × 16 columns

x_data,y_data = next(tnn.batch_array())
/Users/salvor/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:110: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
x_data
{'name': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0]),
 'host_id': tensor([  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  24,
           0,   0,   0,   0,   0, 153,   0,   0,   0,   0,   0,   0,   0,   0,
           0,   0,   0,   1,   0,   0, 185,   0,   0, 133,   0,   0,   0,   0,
           0,   0,   0,   0,   0,   0,   0,   0,   0,   7,  92,   0,   0,  20,
           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 106,   0,   0,
           0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
           0,   0,   0,   0,   0,   0,   0,  75,   0,   0,   0, 237,   8,   0,
         224,   0, 345,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
           0,   0,   6,   0,   0,   0,   0,  47, 464,   0,   0,   6,   0,   0,
           0,   0]),
 'neighbourhood_group': tensor([1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 3, 1, 2, 1, 3, 2, 3, 5, 1, 2, 2, 1,
         2, 2, 2, 1, 3, 1, 3, 1, 1, 2, 2, 3, 2, 3, 2, 1, 1, 2, 2, 2, 3, 1, 1, 1,
         1, 3, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 3, 1, 1, 1, 1, 2, 2, 1, 3, 2, 1,
         2, 2, 1, 3, 1, 1, 2, 1, 1, 2, 1, 1, 1, 3, 1, 1, 2, 1, 2, 1, 1, 2, 3, 3,
         1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 3, 3, 3, 4, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2,
         1, 2, 2, 1, 1, 2, 2, 1]),
 'neighbourhood': tensor([  5,  20,   3,  46,   8,   8,  11,  54,   4,   2,   4,  17,  65,   5,
          40,   8, 121,   2,  21, 126,  13,  73,   4,   3,   1,   4,   2,   8,
          15,  11,  15,  18,  62,   4,   2,  49,  61,  28,   1,   7,  10,   9,
           4,   4,  76,  11,  17,  34,   5,  93,  42,  26,  53,  16,   1,   2,
           4,   1,   7,   9,   9, 105,  27,  42,   5,  32,   1,   2,  17,  28,
           4,  26,  64,  25,  13,  15,  13,  14,   1,   7,  10,   9,   5,  14,
          14, 188,   3,   6,   2,   6,   4,  10,   7,  61,  50, 105,  26,   6,
          34,  55,  11, 109,  18,   8,   1,   5,  33,  50,  33,  85,   3,  81,
         182,   2,   5,  40,  12,   3,   8,  43,   3,   1,   2,  26,  27,  23,
          53,  11]),
 'latitude': tensor([[40.7789],
         [40.6944],
         [40.8152],
         [40.6836],
         [40.7680],
         [40.7812],
         [40.7971],
         [40.6017],
         [40.6894],
         [40.6890],
         [40.7038],
         [40.7342],
         [40.7312],
         [40.7983],
         [40.6618],
         [40.7770],
         [40.7171],
         [40.6832],
         [40.7623],
         [40.5976],
         [40.7401],
         [40.6804],
         [40.7025],
         [40.8062],
         [40.7152],
         [40.7018],
         [40.6958],
         [40.7754],
         [40.7735],
         [40.8021],
         [40.7659],
         [40.7083],
         [40.7189],
         [40.6975],
         [40.6918],
         [40.7520],
         [40.6809],
         [40.7589],
         [40.7197],
         [40.7258],
         [40.7642],
         [40.6773],
         [40.7077],
         [40.7032],
         [40.5942],
         [40.7860],
         [40.7368],
         [40.7206],
         [40.7892],
         [40.5841],
         [40.8611],
         [40.7512],
         [40.6439],
         [40.8567],
         [40.7074],
         [40.6923],
         [40.7038],
         [40.7179],
         [40.7335],
         [40.6754],
         [40.6703],
         [40.6708],
         [40.7393],
         [40.8671],
         [40.7710],
         [40.7140],
         [40.7210],
         [40.6811],
         [40.7356],
         [40.7447],
         [40.6882],
         [40.7474],
         [40.6200],
         [40.6911],
         [40.7463],
         [40.7587],
         [40.7390],
         [40.7175],
         [40.7121],
         [40.7335],
         [40.7520],
         [40.6736],
         [40.8011],
         [40.7224],
         [40.7230],
         [40.7797],
         [40.8243],
         [40.7612],
         [40.6819],
         [40.7643],
         [40.7026],
         [40.7524],
         [40.7310],
         [40.6814],
         [40.7583],
         [40.6717],
         [40.7474],
         [40.7567],
         [40.7235],
         [40.6596],
         [40.7907],
         [40.7045],
         [40.7072],
         [40.7640],
         [40.7151],
         [40.7922],
         [40.7368],
         [40.7607],
         [40.7476],
         [40.8537],
         [40.8273],
         [40.7136],
         [40.5753],
         [40.6928],
         [40.7938],
         [40.6635],
         [40.7261],
         [40.8128],
         [40.7804],
         [40.6773],
         [40.8077],
         [40.7168],
         [40.6838],
         [40.7444],
         [40.7412],
         [40.6680],
         [40.6397],
         [40.7889]]),
 'longitude': tensor([[-73.9767],
         [-73.9661],
         [-73.9518],
         [-73.9971],
         [-73.9520],
         [-73.9499],
         [-73.9347],
         [-73.9630],
         [-73.9088],
         [-73.9364],
         [-73.9192],
         [-74.0062],
         [-73.8666],
         [-73.9612],
         [-73.9822],
         [-73.9444],
         [-73.8241],
         [-73.9170],
         [-73.9297],
         [-74.0835],
         [-74.0007],
         [-74.0173],
         [-73.9206],
         [-73.9553],
         [-73.9430],
         [-73.9283],
         [-73.9408],
         [-73.9503],
         [-73.9265],
         [-73.9436],
         [-73.9083],
         [-74.0064],
         [-73.9976],
         [-73.9350],
         [-73.9286],
         [-73.8689],
         [-73.8889],
         [-73.8210],
         [-73.9602],
         [-73.9874],
         [-73.9770],
         [-73.9454],
         [-73.9231],
         [-73.9146],
         [-73.8004],
         [-73.9509],
         [-74.0024],
         [-73.9981],
         [-73.9676],
         [-73.8167],
         [-73.9296],
         [-73.9774],
         [-73.9813],
         [-73.9302],
         [-73.9501],
         [-73.9568],
         [-73.9271],
         [-73.9577],
         [-73.9890],
         [-73.9566],
         [-73.9526],
         [-73.7916],
         [-73.9776],
         [-73.9281],
         [-73.9894],
         [-73.9977],
         [-73.9601],
         [-73.9129],
         [-74.0060],
         [-73.8250],
         [-73.9163],
         [-73.9784],
         [-73.9549],
         [-73.9736],
         [-73.9914],
         [-73.9174],
         [-73.9975],
         [-73.9915],
         [-73.9584],
         [-73.9878],
         [-73.9725],
         [-73.9138],
         [-73.9652],
         [-73.9877],
         [-73.9925],
         [-73.7786],
         [-73.9451],
         [-73.9917],
         [-73.9581],
         [-73.9891],
         [-73.9170],
         [-73.9715],
         [-73.9848],
         [-73.8942],
         [-73.8801],
         [-73.7967],
         [-73.9794],
         [-73.9977],
         [-74.0041],
         [-73.9838],
         [-73.9397],
         [-73.9858],
         [-74.0104],
         [-73.9637],
         [-73.9523],
         [-73.9741],
         [-73.9244],
         [-73.8794],
         [-73.9122],
         [-73.9017],
         [-73.9453],
         [-74.0176],
         [-74.0052],
         [-73.9442],
         [-73.9659],
         [-73.9844],
         [-73.9481],
         [-73.9516],
         [-73.9466],
         [-73.9837],
         [-73.9550],
         [-73.9562],
         [-73.9215],
         [-73.9730],
         [-73.9814],
         [-73.9761],
         [-73.9716],
         [-73.9432]]),
 'room_type': tensor([1, 1, 2, 1, 1, 1, 2, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2, 3, 1, 2, 1, 1, 2, 1,
         2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2,
         1, 1, 1, 1, 2, 3, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2,
         1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 1, 3, 2, 2, 1, 2, 1, 2, 2, 1, 2, 3,
         1, 2, 2, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2,
         2, 2, 1, 1, 1, 1, 2, 2]),
 'minimum_nights': tensor([[ 3.],
         [ 1.],
         [15.],
         [ 2.],
         [ 1.],
         [50.],
         [ 6.],
         [ 1.],
         [ 1.],
         [ 4.],
         [ 2.],
         [ 9.],
         [ 2.],
         [30.],
         [ 4.],
         [ 2.],
         [ 1.],
         [ 1.],
         [ 2.],
         [ 4.],
         [ 3.],
         [ 1.],
         [ 1.],
         [ 2.],
         [ 1.],
         [ 4.],
         [ 2.],
         [ 4.],
         [ 1.],
         [ 1.],
         [ 1.],
         [29.],
         [ 2.],
         [ 2.],
         [ 2.],
         [ 2.],
         [ 1.],
         [ 1.],
         [ 2.],
         [ 5.],
         [ 6.],
         [ 3.],
         [ 7.],
         [14.],
         [ 2.],
         [ 6.],
         [ 2.],
         [ 3.],
         [ 6.],
         [ 2.],
         [26.],
         [30.],
         [ 1.],
         [ 2.],
         [ 3.],
         [ 2.],
         [14.],
         [ 7.],
         [ 2.],
         [ 5.],
         [ 1.],
         [ 1.],
         [ 5.],
         [ 2.],
         [ 2.],
         [ 2.],
         [ 1.],
         [ 5.],
         [ 1.],
         [ 3.],
         [ 2.],
         [10.],
         [ 5.],
         [ 2.],
         [ 1.],
         [ 2.],
         [30.],
         [ 2.],
         [ 3.],
         [ 1.],
         [ 3.],
         [ 2.],
         [ 2.],
         [ 1.],
         [ 2.],
         [ 2.],
         [ 2.],
         [22.],
         [ 3.],
         [ 1.],
         [ 2.],
         [ 3.],
         [ 1.],
         [ 5.],
         [ 1.],
         [ 4.],
         [30.],
         [ 2.],
         [ 1.],
         [ 3.],
         [ 3.],
         [ 2.],
         [ 1.],
         [ 3.],
         [ 2.],
         [30.],
         [ 7.],
         [ 1.],
         [ 2.],
         [ 1.],
         [ 2.],
         [ 1.],
         [ 4.],
         [ 3.],
         [30.],
         [ 1.],
         [ 3.],
         [ 3.],
         [ 5.],
         [ 1.],
         [ 1.],
         [ 1.],
         [ 2.],
         [30.],
         [ 1.],
         [30.],
         [ 1.],
         [ 1.]]),
 'number_of_reviews': tensor([[ 23.2745],
         [  1.0000],
         [ 23.2745],
         [131.0000],
         [ 21.0000],
         [ 23.2745],
         [ 14.0000],
         [  3.0000],
         [ 23.2745],
         [ 23.2745],
         [ 23.2745],
         [ 23.2745],
         [ 26.0000],
         [  1.0000],
         [  2.0000],
         [  4.0000],
         [ 10.0000],
         [  1.0000],
         [ 16.0000],
         [  6.0000],
         [ 23.2745],
         [ 50.0000],
         [ 23.2745],
         [ 11.0000],
         [ 17.0000],
         [  1.0000],
         [ 51.0000],
         [147.0000],
         [  2.0000],
         [  1.0000],
         [ 30.0000],
         [ 23.2745],
         [ 44.0000],
         [  5.0000],
         [  9.0000],
         [ 14.0000],
         [ 91.0000],
         [ 39.0000],
         [ 24.0000],
         [166.0000],
         [  3.0000],
         [ 23.2745],
         [ 28.0000],
         [ 23.2745],
         [ 35.0000],
         [  4.0000],
         [ 47.0000],
         [ 21.0000],
         [ 21.0000],
         [ 13.0000],
         [  4.0000],
         [  2.0000],
         [ 52.0000],
         [ 23.2745],
         [  2.0000],
         [ 12.0000],
         [ 23.2745],
         [ 23.2745],
         [  3.0000],
         [  1.0000],
         [ 23.2745],
         [154.0000],
         [ 13.0000],
         [120.0000],
         [  5.0000],
         [  3.0000],
         [ 12.0000],
         [ 23.2745],
         [ 23.2745],
         [ 95.0000],
         [ 92.0000],
         [ 23.2745],
         [ 15.0000],
         [ 73.0000],
         [ 23.2745],
         [  2.0000],
         [ 23.2745],
         [ 23.2745],
         [  4.0000],
         [ 39.0000],
         [ 17.0000],
         [ 49.0000],
         [ 14.0000],
         [  1.0000],
         [168.0000],
         [  6.0000],
         [ 28.0000],
         [  1.0000],
         [  1.0000],
         [147.0000],
         [  3.0000],
         [  1.0000],
         [114.0000],
         [  2.0000],
         [ 12.0000],
         [  4.0000],
         [ 23.2745],
         [290.0000],
         [ 23.2745],
         [  3.0000],
         [  4.0000],
         [150.0000],
         [  8.0000],
         [  1.0000],
         [ 59.0000],
         [ 23.2745],
         [ 23.2745],
         [296.0000],
         [ 15.0000],
         [  1.0000],
         [  9.0000],
         [ 23.2745],
         [ 23.2745],
         [ 40.0000],
         [  1.0000],
         [  7.0000],
         [  3.0000],
         [  3.0000],
         [  1.0000],
         [ 28.0000],
         [ 95.0000],
         [ 38.0000],
         [ 23.2745],
         [  4.0000],
         [ 66.0000],
         [ 23.2745],
         [ 11.0000],
         [ 11.0000]]),
 'reviews_per_month': tensor([[ 1.3732],
         [ 0.0400],
         [ 1.3732],
         [ 2.0200],
         [ 0.5600],
         [ 1.3732],
         [ 0.3500],
         [ 1.1500],
         [ 1.3732],
         [ 1.3732],
         [ 1.3732],
         [ 1.3732],
         [ 1.9600],
         [ 0.7900],
         [ 0.2800],
         [ 0.4900],
         [10.0000],
         [ 0.0400],
         [ 0.4400],
         [ 0.4100],
         [ 1.3732],
         [ 0.9200],
         [ 1.3732],
         [ 0.5100],
         [ 0.5500],
         [ 0.0200],
         [ 0.8600],
         [ 2.7600],
         [ 0.0700],
         [ 1.0000],
         [ 5.8100],
         [ 1.3732],
         [ 5.6400],
         [ 0.7900],
         [ 3.4200],
         [ 5.0000],
         [ 1.8100],
         [ 3.4900],
         [ 0.5600],
         [ 1.6800],
         [ 0.2200],
         [ 1.3732],
         [ 2.7800],
         [ 1.3732],
         [ 0.9500],
         [ 0.0600],
         [ 1.1600],
         [ 0.6300],
         [ 1.8300],
         [ 1.5400],
         [ 0.3500],
         [ 0.3800],
         [ 2.4700],
         [ 1.3732],
         [ 0.0600],
         [ 1.3500],
         [ 1.3732],
         [ 1.3732],
         [ 0.0800],
         [ 0.0400],
         [ 1.3732],
         [ 8.2400],
         [ 1.2300],
         [ 1.2700],
         [ 4.2900],
         [ 0.2100],
         [ 0.5300],
         [ 1.3732],
         [ 1.3732],
         [ 3.5200],
         [ 4.3300],
         [ 1.3732],
         [ 1.0100],
         [ 1.3900],
         [ 1.3732],
         [ 0.0800],
         [ 1.3732],
         [ 1.3732],
         [ 0.4800],
         [ 2.0000],
         [ 2.4900],
         [ 3.3100],
         [ 1.0600],
         [ 0.0200],
         [ 3.9300],
         [ 0.9500],
         [ 0.8200],
         [ 0.0900],
         [ 0.1600],
         [ 5.4500],
         [ 0.0600],
         [ 0.0300],
         [ 7.9700],
         [ 0.0600],
         [ 9.7300],
         [ 0.4100],
         [ 1.3732],
         [ 5.9200],
         [ 1.3732],
         [ 3.0000],
         [ 3.0000],
         [ 2.5700],
         [ 0.3400],
         [ 0.0500],
         [ 3.2800],
         [ 1.3732],
         [ 1.3732],
         [10.6000],
         [ 1.0200],
         [ 1.0000],
         [ 0.2900],
         [ 1.3732],
         [ 1.3732],
         [ 1.9900],
         [ 0.0500],
         [ 0.1200],
         [ 0.0600],
         [ 0.3900],
         [ 1.0000],
         [ 1.4400],
         [ 3.9300],
         [ 0.6300],
         [ 1.3732],
         [ 0.1300],
         [ 4.0900],
         [ 1.3732],
         [ 0.8100],
         [ 0.4200]]),
 'calculated_host_listings_count': tensor([[  1.],
         [  2.],
         [  1.],
         [  1.],
         [  2.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [ 32.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  8.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [327.],
         [  2.],
         [  1.],
         [  8.],
         [  1.],
         [  2.],
         [  9.],
         [  1.],
         [  2.],
         [  1.],
         [  2.],
         [  3.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  2.],
         [  1.],
         [  1.],
         [  1.],
         [ 91.],
         [ 11.],
         [  1.],
         [  1.],
         [ 34.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  2.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  3.],
         [ 10.],
         [  1.],
         [  1.],
         [  2.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [232.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  3.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  2.],
         [  1.],
         [  1.],
         [  3.],
         [  2.],
         [ 12.],
         [  1.],
         [  1.],
         [  1.],
         [  7.],
         [ 87.],
         [  1.],
         [  7.],
         [  2.],
         [  6.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  2.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  1.],
         [  3.],
         [ 96.],
         [  1.],
         [  1.],
         [  2.],
         [  1.],
         [ 17.],
         [  5.],
         [  1.],
         [  1.],
         [ 96.],
         [  1.],
         [  1.],
         [  1.],
         [  1.]]),
 'availability_365': tensor([[ 10.0000],
         [112.7813],
         [112.7813],
         [ 26.0000],
         [ 53.0000],
         [112.7813],
         [335.0000],
         [112.7813],
         [175.0000],
         [112.7813],
         [112.7813],
         [112.7813],
         [180.0000],
         [335.0000],
         [179.0000],
         [112.7813],
         [160.0000],
         [179.0000],
         [112.7813],
         [285.0000],
         [252.0000],
         [ 19.0000],
         [  5.0000],
         [ 18.0000],
         [354.0000],
         [112.7813],
         [179.0000],
         [310.0000],
         [112.7813],
         [ 17.0000],
         [ 85.0000],
         [342.0000],
         [275.0000],
         [128.0000],
         [268.0000],
         [ 32.0000],
         [255.0000],
         [342.0000],
         [112.7813],
         [365.0000],
         [351.0000],
         [112.7813],
         [ 28.0000],
         [112.7813],
         [  4.0000],
         [112.7813],
         [361.0000],
         [ 82.0000],
         [116.0000],
         [ 73.0000],
         [ 58.0000],
         [241.0000],
         [ 42.0000],
         [363.0000],
         [112.7813],
         [305.0000],
         [112.7813],
         [112.7813],
         [112.7813],
         [112.7813],
         [112.7813],
         [112.7813],
         [ 24.0000],
         [132.0000],
         [ 94.0000],
         [  5.0000],
         [112.7813],
         [356.0000],
         [112.7813],
         [ 63.0000],
         [  4.0000],
         [ 19.0000],
         [105.0000],
         [ 20.0000],
         [112.7813],
         [ 87.0000],
         [320.0000],
         [ 23.0000],
         [112.7813],
         [112.7813],
         [ 33.0000],
         [210.0000],
         [  8.0000],
         [112.7813],
         [ 65.0000],
         [169.0000],
         [ 80.0000],
         [187.0000],
         [112.7813],
         [174.0000],
         [359.0000],
         [365.0000],
         [ 38.0000],
         [112.7813],
         [112.7813],
         [365.0000],
         [365.0000],
         [ 26.0000],
         [331.0000],
         [302.0000],
         [ 90.0000],
         [309.0000],
         [ 54.0000],
         [  5.0000],
         [ 81.0000],
         [358.0000],
         [112.7813],
         [322.0000],
         [ 27.0000],
         [363.0000],
         [112.7813],
         [365.0000],
         [ 19.0000],
         [ 70.0000],
         [250.0000],
         [112.7813],
         [110.0000],
         [112.7813],
         [ 23.0000],
         [362.0000],
         [224.0000],
         [157.0000],
         [112.7813],
         [331.0000],
         [ 83.0000],
         [156.0000],
         [112.7813],
         [112.7813]])}
tnn.model.dnn
Sequential(
  (0): Linear(in_features=107, out_features=107, bias=True)
  (1): BatchNorm1d(107, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU()
  (3): Linear(in_features=107, out_features=1, bias=True)
  (4): BatchNorm1d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
ipts = list(tnn.model.inputs[xcol.name](x_data[xcol.name]) for xcol in tnn.model.rdf.Xs)
concat = torch.cat(ipts,dim=1)
concat,concat.shape
(tensor([[-0.3061,  0.5583, -1.7048,  ..., -0.1683, -0.2213, -0.8510],
         [-0.3061,  0.5583, -1.7048,  ..., -0.6799, -0.1963, -0.3392],
         [-0.3061,  0.5583, -1.7048,  ..., -0.1683, -0.2213, -0.3392],
         ...,
         [-0.3061,  0.5583, -1.7048,  ..., -0.1683, -0.2213,  0.0281],
         [-0.3061,  0.5583, -1.7048,  ..., -0.4205, -0.2213, -0.3392],
         [-0.3061,  0.5583, -1.7048,  ..., -0.5656, -0.2213, -0.3392]],
        grad_fn=<CatBackward>), torch.Size([128, 107]))
next(tnn.batch_y_pred())
/Users/salvor/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:110: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
tensor([[ 0.1854],
        [ 0.4965],
        [ 0.0657],
        [ 0.5390],
        [ 0.0346],
        [ 0.1109],
        [ 1.0257],
        [ 0.9426],
        [-1.4236],
        [-0.4027],
        [-1.3949],
        [ 1.0144],
        [ 1.6111],
        [ 0.4727],
        [-0.3963],
        [ 0.0993],
        [ 1.8734],
        [-0.5209],
        [ 1.1702],
        [-0.6602],
        [ 0.9155],
        [-0.1697],
        [-1.4661],
        [ 0.3416],
        [ 0.0491],
        [-1.4276],
        [-0.3420],
        [ 0.0853],
        [ 0.3223],
        [ 1.3579],
        [ 0.5943],
        [ 0.3173],
        [-0.9157],
        [-1.4335],
        [-1.6335],
        [-0.1290],
        [-0.4366],
        [ 2.6865],
        [-0.5450],
        [-0.8102],
        [ 0.2763],
        [-1.5096],
        [-1.4165],
        [-1.3428],
        [-0.5520],
        [ 1.3585],
        [ 0.8928],
        [ 0.5567],
        [ 0.2359],
        [-0.9065],
        [ 0.3392],
        [-0.8105],
        [-1.2481],
        [ 0.7013],
        [ 0.2318],
        [-0.7692],
        [-1.3154],
        [-0.5138],
        [-1.1481],
        [-1.4941],
        [-1.3265],
        [ 2.1126],
        [ 0.6395],
        [ 0.6270],
        [ 0.3102],
        [ 0.2761],
        [-0.5575],
        [-2.1002],
        [ 1.0423],
        [ 2.4838],
        [-1.5184],
        [ 0.7619],
        [-0.4804],
        [-1.2091],
        [ 0.2233],
        [ 0.7135],
        [ 0.5420],
        [-0.5502],
        [ 0.2483],
        [-1.1345],
        [ 0.4551],
        [-1.6280],
        [ 0.8449],
        [-0.4392],
        [-0.2708],
        [ 0.9606],
        [ 0.2369],
        [ 0.8148],
        [-0.3557],
        [ 0.7816],
        [-1.4975],
        [ 1.1632],
        [-1.2288],
        [-0.2945],
        [ 1.4050],
        [ 2.5949],
        [ 0.6319],
        [ 0.7928],
        [-1.1700],
        [-0.2946],
        [ 2.8332],
        [-0.5895],
        [ 0.3957],
        [ 0.0810],
        [-0.5038],
        [ 0.0837],
        [ 0.9681],
        [ 1.1302],
        [-0.0971],
        [ 0.5286],
        [ 0.3181],
        [-0.8433],
        [-0.8857],
        [-1.8803],
        [ 0.2565],
        [-0.3163],
        [-1.0606],
        [ 0.2665],
        [ 0.0986],
        [-0.5930],
        [ 0.9827],
        [ 0.1503],
        [-0.4754],
        [ 0.1420],
        [ 0.5774],
        [ 0.1458],
        [-1.0844],
        [ 0.9949]], grad_fn=<NativeBatchNormBackward>)