Welcome!¶

👋🏻 I'm Pamela Fox (@pamelafox everywhere)

Today we will..

  • Build a regression model using Python and scikit-learn
  • Deploy the model as an API using Python on Azure Functions

tinyurl.com/regression-slides¶

tinyurl.com/regression-repo¶

Exploring the data¶

https://insights.stackoverflow.com/survey

Downloading the data¶

In [1]:
import urllib.request
import zipfile
import pandas as pd

url = 'https://info.stackoverflowsolutions.com/rs/719-EMH-566/images/stack-overflow-developer-survey-2022.zip'
filehandle, _ = urllib.request.urlretrieve(url)
zip_file_object = zipfile.ZipFile(filehandle, 'r')
file = zip_file_object.open('survey_results_public.csv')

survey_data = pd.read_csv(file)

pd.set_option('display.max_columns', None)
pd.set_option('display.float_format', lambda x: '%.5f' % x)

survey_data.tail(3)
Out[1]:
ResponseId MainBranch Employment RemoteWork CodingActivities EdLevel LearnCode LearnCodeOnline LearnCodeCoursesCert YearsCode YearsCodePro DevType OrgSize PurchaseInfluence BuyNewTool Country Currency CompTotal CompFreq LanguageHaveWorkedWith LanguageWantToWorkWith DatabaseHaveWorkedWith DatabaseWantToWorkWith PlatformHaveWorkedWith PlatformWantToWorkWith WebframeHaveWorkedWith WebframeWantToWorkWith MiscTechHaveWorkedWith MiscTechWantToWorkWith ToolsTechHaveWorkedWith ToolsTechWantToWorkWith NEWCollabToolsHaveWorkedWith NEWCollabToolsWantToWorkWith OpSysProfessional use OpSysPersonal use VersionControlSystem VCInteraction VCHostingPersonal use VCHostingProfessional use OfficeStackAsyncHaveWorkedWith OfficeStackAsyncWantToWorkWith OfficeStackSyncHaveWorkedWith OfficeStackSyncWantToWorkWith Blockchain NEWSOSites SOVisitFreq SOAccount SOPartFreq SOComm Age Gender Trans Sexuality Ethnicity Accessibility MentalHealth TBranch ICorPM WorkExp Knowledge_1 Knowledge_2 Knowledge_3 Knowledge_4 Knowledge_5 Knowledge_6 Knowledge_7 Frequency_1 Frequency_2 Frequency_3 TimeSearching TimeAnswering Onboarding ProfessionalTech TrueFalse_1 TrueFalse_2 TrueFalse_3 SurveyLength SurveyEase ConvertedCompYearly
73265 73266 I am not primarily a developer, but I write co... Employed, full-time Hybrid (some remote, some in-person) Hobby;School or academic work Bachelor’s degree (B.A., B.S., B.Eng., etc.) Books / Physical media;Other online resources ... Technical documentation;Programming Games;Stac... Udemy;Codecademy;Pluralsight;edX 42 33 Developer, full-stack;Developer, desktop or en... 20 to 99 employees I have a great deal of influence Start a free trial;Ask developers I know/work ... United States of America USD\tUnited States dollar NaN NaN HTML/CSS;JavaScript;PHP;Python;SQL C#;HTML/CSS;JavaScript;PHP;Python;SQL MariaDB;Microsoft SQL Server;MySQL;PostgreSQL;... MariaDB;Microsoft SQL Server;MySQL;PostgreSQL;... Managed Hosting;Microsoft Azure;VMware Firebase;Linode;Managed Hosting;Microsoft Azur... ASP.NET;React.js ASP.NET;ASP.NET Core ;Blazor;Laravel;Next.js;R... .NET;Pandas;React Native .NET;Cordova;Ionic;Pandas;React Native;Xamarin npm npm;Unreal Engine Spyder;Visual Studio;Visual Studio Code Spyder;Visual Studio;Visual Studio Code Windows Windows Git Code editor;Command-line;Version control hosti... NaN NaN Microsoft Lists Microsoft Lists Microsoft Teams;Zoom Microsoft Teams;Zoom Very unfavorable Stack Overflow;Stack Exchange Multiple times per day Yes Less than once per month or monthly Yes, somewhat 55-64 years old Man No Straight / Heterosexual Multiracial None of the above None of the above Yes Independent contributor 42.00000 Disagree Neither agree nor disagree Disagree Agree Agree Agree Neither agree nor disagree Never Never Never 30-60 minutes a day 60-120 minutes a day Just right None of these No No No Appropriate in length Easy NaN
73266 73267 I am a developer by profession Employed, full-time Hybrid (some remote, some in-person) Hobby Bachelor’s degree (B.A., B.S., B.Eng., etc.) Books / Physical media;On the job training NaN NaN 50 31 Developer, front-end;Developer, desktop or ent... 10 to 19 employees I have a great deal of influence Start a free trial;Visit developer communities... United Kingdom of Great Britain and Northern I... GBP\tPound sterling 58500.00000 Yearly C#;Delphi;VBA Delphi Microsoft SQL Server;MongoDB;Oracle NaN NaN NaN NaN NaN NaN NaN NaN NaN RAD Studio (Delphi, C++ Builder);Visual Studio RAD Studio (Delphi, C++ Builder);Visual Studio Windows Windows SVN Dedicated version control GUI application NaN NaN NaN NaN Zoom Zoom Indifferent Stack Overflow Daily or almost daily Yes I have never participated in Q&A on Stack Over... No, not at all 55-64 years old Man No Straight / Heterosexual European None of the above None of the above No NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Appropriate in length Easy NaN
73267 73268 I used to be a developer by profession, but no... Independent contractor, freelancer, or self-em... Fully remote Hobby;Contribute to open-source projects;Boots... Bachelor’s degree (B.A., B.S., B.Eng., etc.) Books / Physical media;Friend or family member... Technical documentation;Blogs;Programming Game... Udemy;Pluralsight 16 5 Developer, front-end;Engineer, data;Engineer, ... NaN NaN Start a free trial;Visit developer communities... Canada NaN NaN NaN C#;JavaScript;Lua;PowerShell;SQL;TypeScript PowerShell;Rust;TypeScript Microsoft SQL Server;Neo4j;Redis Neo4j;Redis Microsoft Azure AWS;Google Cloud;Microsoft Azure;OpenStack ASP.NET Core ;Blazor;Node.js;React.js;Svelte ASP.NET Core ;Node.js;Svelte Apache Kafka;Apache Spark NaN Docker;Kubernetes;npm;Pulumi;Terraform Docker;Kubernetes;npm;Pulumi;Terraform Visual Studio;Visual Studio Code Neovim;Visual Studio Code Linux-based;Windows Linux-based;Windows Git Code editor;Command-line;Version control hosti... NaN NaN Confluence;Jira Work Management;Trello;Wrike NaN Microsoft Teams;Slack;Zoom Slack;Zoom Favorable Collectives on Stack Overflow;Stack Overflow;S... Daily or almost daily Yes Less than once per month or monthly Yes, somewhat 25-34 years old Man No Straight / Heterosexual Or, in your own words: None of the above None of the above NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Appropriate in length Easy NaN

Cleaning the data¶

In [2]:
label = "ConvertedCompYearly"

# Drop rows with no data
survey_data = survey_data.dropna(subset = [label])

# Drop rows with extreme outliers
survey_data = survey_data.drop(survey_data[survey_data[label] > 400000].index)

# Check if the numbers look reasonable
survey_data[[label]].describe()
Out[2]:
ConvertedCompYearly
count 36260.00000
mean 80720.59956
std 65852.55164
min 1.00000
25% 33888.75000
50% 63986.00000
75% 110000.00000
max 400000.00000

Cleaning more columns¶

In [3]:
numeric_features = ['YearsCode', 'YearsCodePro']

for col_name in numeric_features:
    survey_data[col_name] = pd.to_numeric(survey_data[col_name], errors='coerce')
    survey_data = survey_data.dropna(subset = [col_name])  

survey_data[numeric_features].describe()
Out[3]:
YearsCode YearsCodePro
count 34685.00000 34685.00000
mean 14.65435 9.84965
std 9.39327 8.06248
min 1.00000 1.00000
25% 8.00000 4.00000
50% 12.00000 7.00000
75% 20.00000 14.00000
max 50.00000 50.00000

Visualizing the label column¶

In [4]:
import matplotlib.pyplot as plt

label_data = survey_data[label]
fig = plt.figure(figsize=(6, 4))
ax = fig.gca()
ax.hist(label_data, bins=100)
ax.set_ylabel('Frequency')
ax.axvline(label_data.mean(), color='magenta', linestyle='dashed', linewidth=2)
ax.axvline(label_data.median(), color='cyan', linestyle='dashed', linewidth=2)
Out[4]:
<matplotlib.lines.Line2D at 0x7f69c069bbe0>

Visualizing the feature columns¶

In [5]:
fig, axes = plt.subplots(nrows=1, ncols=len(numeric_features), figsize=(12, 4))

for ind, col_name in enumerate(numeric_features):
    feature = survey_data[col_name]
    axis = axes[ind]
    feature.hist(bins=100, ax = axis)
    axis.axvline(feature.mean(), color='magenta', linestyle='dashed', linewidth=2)
    axis.axvline(feature.median(), color='cyan', linestyle='dashed', linewidth=2)
    axis.set_title(col_name)

Measuring correlations¶

In [6]:
fig, axes = plt.subplots(nrows=1, ncols=len(numeric_features), figsize=(12, 4), sharey=True)

for ind, feature in enumerate(numeric_features):
    label_data = survey_data[label]
    feature_data = survey_data[feature]
    correlation = feature_data.corr(label_data)
    axis = axes[ind]
    axis.scatter(x=feature_data, y=label_data)
    axis.set_xlabel(feature)
    axis.set_ylabel(label)
    axis.set_title(f'{label} vs {feature}\n Correlation: {correlation}')

Building a model¶

Separating test and train data¶

In [7]:
# Separate features and labels
X = survey_data[numeric_features].values
y = survey_data[label].values
print('Features:', X[:5], '\nLabels:', y[:5], sep='\n')
Features:
[[14.  5.]
 [20. 17.]
 [ 6.  6.]
 [ 5.  2.]
 [12. 10.]]

Labels:
[ 40205. 215232.  49056.  60307. 194400.]
In [8]:
from sklearn.model_selection import train_test_split

# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

print(f'Training Set: {X_train.shape[0]} rows\n    Test Set: {X_test.shape[0]} rows')
Training Set: 24279 rows
    Test Set: 10406 rows

Training the model¶

In [9]:
from sklearn.linear_model import LinearRegression

model = LinearRegression().fit(X_train, y_train)

print(model.coef_)
print(model.intercept_)
[1217.86632664 1368.82985741]
50980.52584717244

Evaluating model on test data¶

In [10]:
import numpy as np

predictions = model.predict(X_test)
np.set_printoptions(suppress=True)

print('Predicted labels: ', np.round(predictions)[:8])
print('Actual labels   : ', y_test[:8])
Predicted labels:  [83853. 61176. 72590. 59958. 78679. 65897. 67266. 65897.]
Actual labels   :  [47350. 51763. 13212.    50. 38392.  3864. 14952. 58654.]

Visualizing the predictions¶

In [11]:
plt.scatter(y_test, predictions)
plt.xlabel(f'Actual {label}')
plt.ylabel(f'Predicted {label}')

# Overlay the regression line
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test, p(y_test), color='magenta')
Out[11]:
[<matplotlib.lines.Line2D at 0x7f69aa140730>]

Calculating evaluation metrics¶

In [12]:
from sklearn.metrics import mean_squared_error, r2_score

mse = mean_squared_error(y_test, predictions)
print(" MSE:", mse)

rmse = mean_squared_error(y_test, predictions, squared=False)
print("RMSE:", rmse)

r2 = r2_score(y_test, predictions)
print("  R2:", r2)
 MSE: 3842062015.322757
RMSE: 61984.36912095465
  R2: 0.11560901481494401

Experimenting with more models¶

  • Linear algorithms: Besides the one already used (an Ordinary Least Squares algorithm), there are other variants such as Lasso and Ridge.
  • Tree-based algorithms: Algorithms that build a decision tree to reach a prediction.
  • Ensemble algorithms: Algorithms that combine the outputs of multiple base algorithms to improve generalizability.

https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

Generalizing the evaluation process¶

In [13]:
eval_results = pd.DataFrame(columns=['Model', 'RMSE', 'R2'])

def evaluate_model():
    predictions = model.predict(X_test)
    rmse = mean_squared_error(y_test, predictions, squared=False)
    r2 = r2_score(y_test, predictions)
    eval_results.loc[len(eval_results.index)] = [str(model), round(rmse, 4), round(r2, 4)]
    print(eval_results)
    # Plot predicted vs actual
    plt.figure(figsize=(4, 3)) 
    plt.scatter(y_test, predictions)
    plt.xlabel(f'Actual {label}')
    plt.ylabel(f'Predicted {label}')
    # Overlay the regression line
    z = np.polyfit(y_test, predictions, 1)
    p = np.poly1d(z)
    plt.plot(y_test,p(y_test), color='magenta')
    

evaluate_model()  
                Model        RMSE      R2
0  LinearRegression() 61984.36910 0.11560

Lasso (linear regression)¶

Lasso works well when only a few features predict the label.

In [14]:
from sklearn.linear_model import Lasso

model = Lasso().fit(X_train, y_train)

evaluate_model()
                Model        RMSE      R2
0  LinearRegression() 61984.36910 0.11560
1             Lasso() 61984.38170 0.11560

Decision tree¶

Decision trees can be used for both regression and classification problems.

In [15]:
from sklearn.tree import DecisionTreeRegressor
from sklearn.tree import export_text, plot_tree

model = DecisionTreeRegressor().fit(X_train, y_train)

print(export_text(model))
|--- feature_1 <= 5.50
|   |--- feature_1 <= 3.50
|   |   |--- feature_0 <= 5.50
|   |   |   |--- feature_1 <= 2.50
|   |   |   |   |--- feature_1 <= 1.50
|   |   |   |   |   |--- feature_0 <= 4.50
|   |   |   |   |   |   |--- feature_0 <= 2.50
|   |   |   |   |   |   |   |--- feature_0 <= 1.50
|   |   |   |   |   |   |   |   |--- value: [37270.89]
|   |   |   |   |   |   |   |--- feature_0 >  1.50
|   |   |   |   |   |   |   |   |--- value: [36898.44]
|   |   |   |   |   |   |--- feature_0 >  2.50
|   |   |   |   |   |   |   |--- feature_0 <= 3.50
|   |   |   |   |   |   |   |   |--- value: [35367.96]
|   |   |   |   |   |   |   |--- feature_0 >  3.50
|   |   |   |   |   |   |   |   |--- value: [33697.34]
|   |   |   |   |   |--- feature_0 >  4.50
|   |   |   |   |   |   |--- value: [40808.42]
|   |   |   |   |--- feature_1 >  1.50
|   |   |   |   |   |--- feature_0 <= 1.50
|   |   |   |   |   |   |--- value: [11964.00]
|   |   |   |   |   |--- feature_0 >  1.50
|   |   |   |   |   |   |--- feature_0 <= 3.50
|   |   |   |   |   |   |   |--- feature_0 <= 2.50
|   |   |   |   |   |   |   |   |--- value: [39385.97]
|   |   |   |   |   |   |   |--- feature_0 >  2.50
|   |   |   |   |   |   |   |   |--- value: [44161.23]
|   |   |   |   |   |   |--- feature_0 >  3.50
|   |   |   |   |   |   |   |--- feature_0 <= 4.50
|   |   |   |   |   |   |   |   |--- value: [40965.31]
|   |   |   |   |   |   |   |--- feature_0 >  4.50
|   |   |   |   |   |   |   |   |--- value: [41233.60]
|   |   |   |--- feature_1 >  2.50
|   |   |   |   |--- feature_0 <= 1.50
|   |   |   |   |   |--- value: [7342.33]
|   |   |   |   |--- feature_0 >  1.50
|   |   |   |   |   |--- feature_0 <= 3.50
|   |   |   |   |   |   |--- feature_0 <= 2.50
|   |   |   |   |   |   |   |--- value: [49890.40]
|   |   |   |   |   |   |--- feature_0 >  2.50
|   |   |   |   |   |   |   |--- value: [51303.05]
|   |   |   |   |   |--- feature_0 >  3.50
|   |   |   |   |   |   |--- feature_0 <= 4.50
|   |   |   |   |   |   |   |--- value: [49140.62]
|   |   |   |   |   |   |--- feature_0 >  4.50
|   |   |   |   |   |   |   |--- value: [47903.70]
|   |   |--- feature_0 >  5.50
|   |   |   |--- feature_0 <= 7.50
|   |   |   |   |--- feature_1 <= 2.50
|   |   |   |   |   |--- feature_1 <= 1.50
|   |   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |   |--- value: [50489.73]
|   |   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |   |--- value: [57876.80]
|   |   |   |   |   |--- feature_1 >  1.50
|   |   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |   |--- value: [51929.98]
|   |   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |   |--- value: [49263.41]
|   |   |   |   |--- feature_1 >  2.50
|   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |--- value: [54447.70]
|   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |--- value: [51662.45]
|   |   |   |--- feature_0 >  7.50
|   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |--- feature_1 <= 2.50
|   |   |   |   |   |   |--- feature_1 <= 1.50
|   |   |   |   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |   |   |   |--- value: [62745.59]
|   |   |   |   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |   |   |   |--- value: [60201.12]
|   |   |   |   |   |   |--- feature_1 >  1.50
|   |   |   |   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |   |   |   |--- value: [50811.06]
|   |   |   |   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |   |   |   |--- value: [59180.19]
|   |   |   |   |   |--- feature_1 >  2.50
|   |   |   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |   |   |--- value: [62011.19]
|   |   |   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |   |   |--- value: [59750.55]
|   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |--- feature_0 <= 11.50
|   |   |   |   |   |   |--- feature_1 <= 2.50
|   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 1.50
|   |   |   |   |   |   |   |   |   |--- value: [55476.51]
|   |   |   |   |   |   |   |   |--- feature_1 >  1.50
|   |   |   |   |   |   |   |   |   |--- value: [60625.45]
|   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 1.50
|   |   |   |   |   |   |   |   |   |--- value: [65397.75]
|   |   |   |   |   |   |   |   |--- feature_1 >  1.50
|   |   |   |   |   |   |   |   |   |--- value: [69882.32]
|   |   |   |   |   |   |--- feature_1 >  2.50
|   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |--- value: [70844.88]
|   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |--- value: [81321.95]
|   |   |   |   |   |--- feature_0 >  11.50
|   |   |   |   |   |   |--- feature_1 <= 2.50
|   |   |   |   |   |   |   |--- feature_0 <= 23.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 20.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 1.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 19.00
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  19.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [140000.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  1.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [56428.32]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 7
|   |   |   |   |   |   |   |   |--- feature_0 >  20.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 1.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [35138.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [39210.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  1.50
|   |   |   |   |   |   |   |   |   |   |--- value: [18552.00]
|   |   |   |   |   |   |   |--- feature_0 >  23.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 26.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 25.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 24.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  24.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_0 >  25.50
|   |   |   |   |   |   |   |   |   |   |--- value: [125639.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  26.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 28.50
|   |   |   |   |   |   |   |   |   |   |--- value: [56538.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  28.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 31.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [93000.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  31.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [61853.00]
|   |   |   |   |   |   |--- feature_1 >  2.50
|   |   |   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |   |   |--- value: [66735.76]
|   |   |   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 25.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 17.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [63424.17]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  17.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 19.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  19.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |--- feature_0 >  25.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 32.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 28.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  28.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [33976.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  32.50
|   |   |   |   |   |   |   |   |   |   |--- value: [10716.00]
|   |--- feature_1 >  3.50
|   |   |--- feature_0 <= 17.50
|   |   |   |--- feature_1 <= 4.50
|   |   |   |   |--- feature_0 <= 11.50
|   |   |   |   |   |--- feature_0 <= 2.50
|   |   |   |   |   |   |--- feature_0 <= 1.50
|   |   |   |   |   |   |   |--- value: [8112.00]
|   |   |   |   |   |   |--- feature_0 >  1.50
|   |   |   |   |   |   |   |--- value: [22749.00]
|   |   |   |   |   |--- feature_0 >  2.50
|   |   |   |   |   |   |--- feature_0 <= 5.50
|   |   |   |   |   |   |   |--- feature_0 <= 4.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 3.50
|   |   |   |   |   |   |   |   |   |--- value: [61238.55]
|   |   |   |   |   |   |   |   |--- feature_0 >  3.50
|   |   |   |   |   |   |   |   |   |--- value: [59011.41]
|   |   |   |   |   |   |   |--- feature_0 >  4.50
|   |   |   |   |   |   |   |   |--- value: [69155.02]
|   |   |   |   |   |   |--- feature_0 >  5.50
|   |   |   |   |   |   |   |--- feature_0 <= 7.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |   |   |   |--- value: [56760.06]
|   |   |   |   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |   |   |   |--- value: [58390.93]
|   |   |   |   |   |   |   |--- feature_0 >  7.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |   |   |   |   |--- value: [60900.99]
|   |   |   |   |   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |   |   |   |   |   |--- value: [62614.07]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [61737.77]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [61338.88]
|   |   |   |   |--- feature_0 >  11.50
|   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |--- value: [85789.59]
|   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |--- feature_0 <= 13.50
|   |   |   |   |   |   |   |   |--- value: [62401.15]
|   |   |   |   |   |   |   |--- feature_0 >  13.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 14.50
|   |   |   |   |   |   |   |   |   |--- value: [71848.38]
|   |   |   |   |   |   |   |   |--- feature_0 >  14.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 15.50
|   |   |   |   |   |   |   |   |   |   |--- value: [62095.58]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  15.50
|   |   |   |   |   |   |   |   |   |   |--- value: [69123.57]
|   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |--- value: [98242.50]
|   |   |   |--- feature_1 >  4.50
|   |   |   |   |--- feature_0 <= 4.50
|   |   |   |   |   |--- feature_0 <= 1.50
|   |   |   |   |   |   |--- value: [6270.00]
|   |   |   |   |   |--- feature_0 >  1.50
|   |   |   |   |   |   |--- feature_0 <= 3.50
|   |   |   |   |   |   |   |--- feature_0 <= 2.50
|   |   |   |   |   |   |   |   |--- value: [48948.00]
|   |   |   |   |   |   |   |--- feature_0 >  2.50
|   |   |   |   |   |   |   |   |--- value: [69546.50]
|   |   |   |   |   |   |--- feature_0 >  3.50
|   |   |   |   |   |   |   |--- value: [30560.14]
|   |   |   |   |--- feature_0 >  4.50
|   |   |   |   |   |--- feature_0 <= 7.50
|   |   |   |   |   |   |--- feature_0 <= 5.50
|   |   |   |   |   |   |   |--- value: [66301.90]
|   |   |   |   |   |   |--- feature_0 >  5.50
|   |   |   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |   |   |--- value: [71395.08]
|   |   |   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |   |   |--- value: [72325.06]
|   |   |   |   |   |--- feature_0 >  7.50
|   |   |   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |   |   |--- value: [62850.38]
|   |   |   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |   |   |   |--- value: [73502.41]
|   |   |   |   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 11.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [67141.14]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [66073.46]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  11.50
|   |   |   |   |   |   |   |   |   |   |--- value: [62369.34]
|   |   |   |   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 13.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [76903.76]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  13.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |   |   |--- value: [56244.67]
|   |   |--- feature_0 >  17.50
|   |   |   |--- feature_0 <= 39.50
|   |   |   |   |--- feature_0 <= 31.50
|   |   |   |   |   |--- feature_0 <= 26.50
|   |   |   |   |   |   |--- feature_0 <= 25.50
|   |   |   |   |   |   |   |--- feature_0 <= 23.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 21.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 19.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_0 >  19.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 4.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [113629.44]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  4.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |--- feature_0 >  21.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 4.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [69487.67]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [53421.50]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  4.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [70791.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [75503.60]
|   |   |   |   |   |   |   |--- feature_0 >  23.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 4.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 24.50
|   |   |   |   |   |   |   |   |   |   |--- value: [210000.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  24.50
|   |   |   |   |   |   |   |   |   |   |--- value: [102000.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  4.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 24.50
|   |   |   |   |   |   |   |   |   |   |--- value: [30000.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  24.50
|   |   |   |   |   |   |   |   |   |   |--- value: [110430.50]
|   |   |   |   |   |   |--- feature_0 >  25.50
|   |   |   |   |   |   |   |--- value: [18528.00]
|   |   |   |   |   |--- feature_0 >  26.50
|   |   |   |   |   |   |--- feature_1 <= 4.50
|   |   |   |   |   |   |   |--- feature_0 <= 29.50
|   |   |   |   |   |   |   |   |--- value: [67186.00]
|   |   |   |   |   |   |   |--- feature_0 >  29.50
|   |   |   |   |   |   |   |   |--- value: [55782.00]
|   |   |   |   |   |   |--- feature_1 >  4.50
|   |   |   |   |   |   |   |--- feature_0 <= 27.50
|   |   |   |   |   |   |   |   |--- value: [180580.67]
|   |   |   |   |   |   |   |--- feature_0 >  27.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 29.00
|   |   |   |   |   |   |   |   |   |--- value: [106157.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  29.00
|   |   |   |   |   |   |   |   |   |--- value: [129192.50]
|   |   |   |   |--- feature_0 >  31.50
|   |   |   |   |   |--- feature_0 <= 38.50
|   |   |   |   |   |   |--- feature_1 <= 4.50
|   |   |   |   |   |   |   |--- value: [47772.00]
|   |   |   |   |   |   |--- feature_1 >  4.50
|   |   |   |   |   |   |   |--- feature_0 <= 35.00
|   |   |   |   |   |   |   |   |--- value: [63000.00]
|   |   |   |   |   |   |   |--- feature_0 >  35.00
|   |   |   |   |   |   |   |   |--- feature_0 <= 37.50
|   |   |   |   |   |   |   |   |   |--- value: [53322.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  37.50
|   |   |   |   |   |   |   |   |   |--- value: [58654.00]
|   |   |   |   |   |--- feature_0 >  38.50
|   |   |   |   |   |   |--- value: [19200.00]
|   |   |   |--- feature_0 >  39.50
|   |   |   |   |--- feature_0 <= 43.00
|   |   |   |   |   |--- value: [200000.00]
|   |   |   |   |--- feature_0 >  43.00
|   |   |   |   |   |--- value: [276407.00]
|--- feature_1 >  5.50
|   |--- feature_0 <= 19.50
|   |   |--- feature_1 <= 8.50
|   |   |   |--- feature_0 <= 5.50
|   |   |   |   |--- feature_0 <= 2.50
|   |   |   |   |   |--- feature_0 <= 1.50
|   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |--- value: [10056.00]
|   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |--- value: [45230.00]
|   |   |   |   |   |--- feature_0 >  1.50
|   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |--- value: [74651.00]
|   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |--- value: [149101.50]
|   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |--- value: [20124.00]
|   |   |   |   |--- feature_0 >  2.50
|   |   |   |   |   |--- feature_0 <= 4.50
|   |   |   |   |   |   |--- feature_0 <= 3.50
|   |   |   |   |   |   |   |--- feature_1 <= 7.00
|   |   |   |   |   |   |   |   |--- value: [26684.00]
|   |   |   |   |   |   |   |--- feature_1 >  7.00
|   |   |   |   |   |   |   |   |--- value: [23513.00]
|   |   |   |   |   |   |--- feature_0 >  3.50
|   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |--- value: [56303.00]
|   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |--- value: [40803.67]
|   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |--- value: [51324.33]
|   |   |   |   |   |--- feature_0 >  4.50
|   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |--- value: [13128.00]
|   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |--- value: [40025.33]
|   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |--- value: [29270.80]
|   |   |   |--- feature_0 >  5.50
|   |   |   |   |--- feature_0 <= 13.50
|   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |--- feature_0 <= 11.50
|   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 7.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [75655.17]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |   |   |   |   |   |--- value: [68790.96]
|   |   |   |   |   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |   |   |   |   |--- value: [80716.18]
|   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |--- value: [71193.77]
|   |   |   |   |   |   |--- feature_0 >  11.50
|   |   |   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |   |   |--- value: [88607.60]
|   |   |   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |   |   |--- value: [82968.30]
|   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |--- value: [36515.00]
|   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |--- value: [28471.50]
|   |   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 7.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [80075.20]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [73154.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  7.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [80104.82]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [81408.60]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |--- value: [67261.49]
|   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |--- value: [85483.88]
|   |   |   |   |--- feature_0 >  13.50
|   |   |   |   |   |--- feature_0 <= 17.50
|   |   |   |   |   |   |--- feature_0 <= 14.50
|   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |   |--- value: [88952.04]
|   |   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |   |--- value: [85756.15]
|   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |--- value: [96456.45]
|   |   |   |   |   |   |--- feature_0 >  14.50
|   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 15.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |   |   |--- value: [91810.31]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [76975.14]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [85768.50]
|   |   |   |   |   |   |   |   |--- feature_0 >  15.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |   |   |--- value: [69859.35]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [103722.58]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [79903.42]
|   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |   |--- value: [72882.11]
|   |   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |   |--- value: [86950.23]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |   |--- value: [99023.78]
|   |   |   |   |   |--- feature_0 >  17.50
|   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |--- value: [133479.65]
|   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |--- value: [49904.50]
|   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |   |--- value: [88563.89]
|   |   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |   |--- value: [112462.14]
|   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |   |--- value: [76315.25]
|   |   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |   |--- value: [87300.67]
|   |   |--- feature_1 >  8.50
|   |   |   |--- feature_1 <= 10.50
|   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |--- feature_0 <= 1.50
|   |   |   |   |   |   |--- value: [65433.00]
|   |   |   |   |   |--- feature_0 >  1.50
|   |   |   |   |   |   |--- feature_0 <= 5.00
|   |   |   |   |   |   |   |--- feature_0 <= 2.50
|   |   |   |   |   |   |   |   |--- value: [31968.00]
|   |   |   |   |   |   |   |--- feature_0 >  2.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 3.50
|   |   |   |   |   |   |   |   |   |--- value: [15480.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  3.50
|   |   |   |   |   |   |   |   |   |--- value: [4096.00]
|   |   |   |   |   |   |--- feature_0 >  5.00
|   |   |   |   |   |   |   |--- feature_0 <= 7.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |   |   |   |--- value: [40188.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |   |   |   |--- value: [53112.00]
|   |   |   |   |   |   |   |--- feature_0 >  7.50
|   |   |   |   |   |   |   |   |--- value: [38538.00]
|   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |--- feature_0 <= 13.50
|   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |   |   |   |   |--- value: [94047.95]
|   |   |   |   |   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |   |   |   |   |--- value: [85484.10]
|   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |   |   |   |   |--- value: [63903.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |   |   |   |   |--- value: [95114.31]
|   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |--- feature_0 <= 11.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |   |--- value: [91335.11]
|   |   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |   |--- value: [73761.88]
|   |   |   |   |   |   |   |--- feature_0 >  11.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |   |   |   |   |--- value: [82751.88]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |   |   |   |   |--- value: [85572.50]
|   |   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |   |   |   |   |--- value: [95552.22]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |   |   |   |   |--- value: [86408.14]
|   |   |   |   |   |--- feature_0 >  13.50
|   |   |   |   |   |   |--- feature_0 <= 17.50
|   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 14.50
|   |   |   |   |   |   |   |   |   |--- value: [86368.74]
|   |   |   |   |   |   |   |   |--- feature_0 >  14.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 15.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [98423.71]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  15.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [94715.04]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |   |   |--- value: [100216.53]
|   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 15.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 14.50
|   |   |   |   |   |   |   |   |   |   |--- value: [92609.31]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  14.50
|   |   |   |   |   |   |   |   |   |   |--- value: [90807.90]
|   |   |   |   |   |   |   |   |--- feature_0 >  15.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |   |   |--- value: [86561.01]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |   |   |--- value: [89418.60]
|   |   |   |   |   |   |--- feature_0 >  17.50
|   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |   |--- value: [89401.05]
|   |   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |   |--- value: [70036.10]
|   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |   |--- value: [105519.88]
|   |   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |   |--- value: [93141.80]
|   |   |   |--- feature_1 >  10.50
|   |   |   |   |--- feature_1 <= 15.50
|   |   |   |   |   |--- feature_0 <= 12.50
|   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |--- feature_0 <= 11.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 7.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |   |--- value: [75717.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 6.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  6.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [176628.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  7.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [122641.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [87681.79]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [185000.00]
|   |   |   |   |   |   |   |--- feature_0 >  11.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |--- value: [135786.17]
|   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |--- value: [108813.10]
|   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |--- feature_1 <= 14.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 13.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 10.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [59032.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [8784.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  10.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 11.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [59262.67]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  11.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [60132.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  13.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 8.50
|   |   |   |   |   |   |   |   |   |   |--- value: [157836.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  8.50
|   |   |   |   |   |   |   |   |   |   |--- value: [100000.00]
|   |   |   |   |   |   |   |--- feature_1 >  14.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 6.00
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 4.00
|   |   |   |   |   |   |   |   |   |   |--- value: [37740.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  4.00
|   |   |   |   |   |   |   |   |   |   |--- value: [7496.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  6.00
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 9.50
|   |   |   |   |   |   |   |   |   |   |--- value: [42657.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  9.50
|   |   |   |   |   |   |   |   |   |   |--- value: [42003.67]
|   |   |   |   |   |--- feature_0 >  12.50
|   |   |   |   |   |   |--- feature_1 <= 13.50
|   |   |   |   |   |   |   |--- feature_0 <= 15.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 13.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [94498.45]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [85448.43]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |   |   |   |--- value: [111978.16]
|   |   |   |   |   |   |   |   |--- feature_0 >  13.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 14.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  14.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 14.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [82309.15]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  14.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [78303.12]
|   |   |   |   |   |   |   |--- feature_0 >  15.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 17.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [99169.47]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [107152.30]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  17.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [87812.84]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [99527.41]
|   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [99115.90]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 17.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  17.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |--- feature_1 >  13.50
|   |   |   |   |   |   |   |--- feature_0 <= 13.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 14.50
|   |   |   |   |   |   |   |   |   |--- value: [49956.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  14.50
|   |   |   |   |   |   |   |   |   |--- value: [12024.00]
|   |   |   |   |   |   |   |--- feature_0 >  13.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 15.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 14.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  14.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_0 >  15.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 16.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  16.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 14.50
|   |   |   |   |   |   |   |   |   |   |--- value: [107201.12]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  14.50
|   |   |   |   |   |   |   |   |   |   |--- value: [108224.74]
|   |   |   |   |--- feature_1 >  15.50
|   |   |   |   |   |--- feature_1 <= 23.50
|   |   |   |   |   |   |--- feature_0 <= 18.50
|   |   |   |   |   |   |   |--- feature_0 <= 4.00
|   |   |   |   |   |   |   |   |--- feature_1 <= 19.00
|   |   |   |   |   |   |   |   |   |--- value: [13908.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  19.00
|   |   |   |   |   |   |   |   |   |--- value: [63986.00]
|   |   |   |   |   |   |   |--- feature_0 >  4.00
|   |   |   |   |   |   |   |   |--- feature_0 <= 8.00
|   |   |   |   |   |   |   |   |   |--- value: [220000.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  8.00
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 18.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 11.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [180000.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  11.00
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 7
|   |   |   |   |   |   |   |   |   |--- feature_1 >  18.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 15.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  15.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |--- feature_0 >  18.50
|   |   |   |   |   |   |   |--- feature_1 <= 21.00
|   |   |   |   |   |   |   |   |--- feature_1 <= 18.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 17.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 16.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [80254.50]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  16.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [80477.50]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  17.50
|   |   |   |   |   |   |   |   |   |   |--- value: [74679.20]
|   |   |   |   |   |   |   |   |--- feature_1 >  18.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 19.50
|   |   |   |   |   |   |   |   |   |   |--- value: [64942.67]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  19.50
|   |   |   |   |   |   |   |   |   |   |--- value: [41580.00]
|   |   |   |   |   |   |   |--- feature_1 >  21.00
|   |   |   |   |   |   |   |   |--- value: [220000.00]
|   |   |   |   |   |--- feature_1 >  23.50
|   |   |   |   |   |   |--- feature_1 <= 30.00
|   |   |   |   |   |   |   |--- value: [35196.00]
|   |   |   |   |   |   |--- feature_1 >  30.00
|   |   |   |   |   |   |   |--- value: [24928.00]
|   |--- feature_0 >  19.50
|   |   |--- feature_1 <= 22.50
|   |   |   |--- feature_1 <= 13.50
|   |   |   |   |--- feature_0 <= 29.50
|   |   |   |   |   |--- feature_0 <= 27.50
|   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 21.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 20.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [88233.48]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  20.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [44796.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  21.50
|   |   |   |   |   |   |   |   |   |   |--- value: [119659.75]
|   |   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 26.00
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 24.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [59512.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  24.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [63986.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  26.00
|   |   |   |   |   |   |   |   |   |   |--- value: [115600.00]
|   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 23.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 21.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  21.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 8.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  8.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |--- feature_0 >  23.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 6
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 26.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  26.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [158997.00]
|   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 21.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 20.50
|   |   |   |   |   |   |   |   |   |   |--- value: [90337.61]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  20.50
|   |   |   |   |   |   |   |   |   |   |--- value: [92938.50]
|   |   |   |   |   |   |   |   |--- feature_0 >  21.50
|   |   |   |   |   |   |   |   |   |--- value: [110061.26]
|   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 26.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 25.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 24.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  24.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [93772.60]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  25.50
|   |   |   |   |   |   |   |   |   |   |--- value: [51799.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  26.50
|   |   |   |   |   |   |   |   |   |--- value: [98024.15]
|   |   |   |   |   |--- feature_0 >  27.50
|   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 28.50
|   |   |   |   |   |   |   |   |   |--- value: [350000.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  28.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 8.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [99000.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  7.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [96801.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  8.50
|   |   |   |   |   |   |   |   |   |   |--- value: [145000.00]
|   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 10.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 28.50
|   |   |   |   |   |   |   |   |   |   |--- value: [83828.67]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  28.50
|   |   |   |   |   |   |   |   |   |   |--- value: [80553.67]
|   |   |   |   |   |   |   |   |--- feature_1 >  10.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 28.50
|   |   |   |   |   |   |   |   |   |   |--- value: [129634.25]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  28.50
|   |   |   |   |   |   |   |   |   |   |--- value: [101318.00]
|   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |--- feature_0 <= 28.50
|   |   |   |   |   |   |   |   |--- value: [193408.00]
|   |   |   |   |   |   |   |--- feature_0 >  28.50
|   |   |   |   |   |   |   |   |--- value: [156168.00]
|   |   |   |   |--- feature_0 >  29.50
|   |   |   |   |   |--- feature_1 <= 10.50
|   |   |   |   |   |   |--- feature_0 <= 37.50
|   |   |   |   |   |   |   |--- feature_1 <= 8.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 36.00
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 34.00
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 31.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  31.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |--- feature_0 >  34.00
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [67845.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [182850.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  36.00
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |   |   |--- value: [65000.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |   |   |--- value: [49908.00]
|   |   |   |   |   |   |   |--- feature_1 >  8.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 34.00
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 30.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [130000.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [61990.71]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  30.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |--- feature_0 >  34.00
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |   |   |--- value: [56538.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |   |   |--- value: [46850.00]
|   |   |   |   |   |   |--- feature_0 >  37.50
|   |   |   |   |   |   |   |--- feature_1 <= 8.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 42.00
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 6.50
|   |   |   |   |   |   |   |   |   |   |--- value: [82728.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  6.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 40.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [42634.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  40.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [17916.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  42.00
|   |   |   |   |   |   |   |   |   |--- value: [147000.00]
|   |   |   |   |   |   |   |--- feature_1 >  8.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 39.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 38.50
|   |   |   |   |   |   |   |   |   |   |--- value: [112744.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  38.50
|   |   |   |   |   |   |   |   |   |   |--- value: [60787.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  39.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 9.50
|   |   |   |   |   |   |   |   |   |   |--- value: [101550.50]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  9.50
|   |   |   |   |   |   |   |   |   |   |--- value: [173950.50]
|   |   |   |   |   |--- feature_1 >  10.50
|   |   |   |   |   |   |--- feature_0 <= 33.50
|   |   |   |   |   |   |   |--- feature_0 <= 31.00
|   |   |   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |   |--- value: [84325.33]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |   |--- value: [89986.43]
|   |   |   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |   |   |--- value: [135019.00]
|   |   |   |   |   |   |   |--- feature_0 >  31.00
|   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |--- value: [346000.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 32.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [43512.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [95979.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  32.50
|   |   |   |   |   |   |   |   |   |   |--- value: [199424.00]
|   |   |   |   |   |   |--- feature_0 >  33.50
|   |   |   |   |   |   |   |--- feature_0 <= 34.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 11.50
|   |   |   |   |   |   |   |   |   |--- value: [62828.50]
|   |   |   |   |   |   |   |   |--- feature_1 >  11.50
|   |   |   |   |   |   |   |   |   |--- value: [47646.00]
|   |   |   |   |   |   |   |--- feature_0 >  34.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 41.00
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 39.00
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 36.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  36.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [95979.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  39.00
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 12.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [59724.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  12.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [80000.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  41.00
|   |   |   |   |   |   |   |   |   |--- value: [94230.00]
|   |   |   |--- feature_1 >  13.50
|   |   |   |   |--- feature_0 <= 20.50
|   |   |   |   |   |--- feature_1 <= 15.50
|   |   |   |   |   |   |--- feature_1 <= 14.50
|   |   |   |   |   |   |   |--- value: [97828.80]
|   |   |   |   |   |   |--- feature_1 >  14.50
|   |   |   |   |   |   |   |--- value: [98075.09]
|   |   |   |   |   |--- feature_1 >  15.50
|   |   |   |   |   |   |--- feature_1 <= 21.00
|   |   |   |   |   |   |   |--- feature_1 <= 18.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 17.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 16.50
|   |   |   |   |   |   |   |   |   |   |--- value: [111379.70]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  16.50
|   |   |   |   |   |   |   |   |   |   |--- value: [112060.26]
|   |   |   |   |   |   |   |   |--- feature_1 >  17.50
|   |   |   |   |   |   |   |   |   |--- value: [102288.51]
|   |   |   |   |   |   |   |--- feature_1 >  18.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 19.50
|   |   |   |   |   |   |   |   |   |--- value: [120266.40]
|   |   |   |   |   |   |   |   |--- feature_1 >  19.50
|   |   |   |   |   |   |   |   |   |--- value: [113223.48]
|   |   |   |   |   |   |--- feature_1 >  21.00
|   |   |   |   |   |   |   |--- value: [85867.40]
|   |   |   |   |--- feature_0 >  20.50
|   |   |   |   |   |--- feature_0 <= 42.50
|   |   |   |   |   |   |--- feature_0 <= 36.50
|   |   |   |   |   |   |   |--- feature_0 <= 24.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 16.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 21.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 14.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [130558.29]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  14.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_0 >  21.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |--- feature_1 >  16.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 17.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_1 >  17.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 23.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 6
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  23.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |--- feature_0 >  24.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 26.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 16.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 14.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  14.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |--- feature_1 >  16.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 19.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  19.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |--- feature_0 >  26.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 27.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 19.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  19.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |--- feature_0 >  27.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 35.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 12
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  35.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 6
|   |   |   |   |   |   |--- feature_0 >  36.50
|   |   |   |   |   |   |   |--- feature_1 <= 14.50
|   |   |   |   |   |   |   |   |--- value: [31993.00]
|   |   |   |   |   |   |   |--- feature_1 >  14.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 16.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 39.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 37.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  37.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |--- feature_0 >  39.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 15.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [99516.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  15.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [59554.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  16.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 20.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 37.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [46708.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  37.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |   |--- feature_1 >  20.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 21.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  21.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |--- feature_0 >  42.50
|   |   |   |   |   |   |--- feature_0 <= 45.50
|   |   |   |   |   |   |   |--- feature_0 <= 44.00
|   |   |   |   |   |   |   |   |--- value: [160000.00]
|   |   |   |   |   |   |   |--- feature_0 >  44.00
|   |   |   |   |   |   |   |   |--- feature_1 <= 17.50
|   |   |   |   |   |   |   |   |   |--- value: [180000.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  17.50
|   |   |   |   |   |   |   |   |   |--- value: [200000.00]
|   |   |   |   |   |   |--- feature_0 >  45.50
|   |   |   |   |   |   |   |--- value: [95979.00]
|   |   |--- feature_1 >  22.50
|   |   |   |--- feature_0 <= 37.50
|   |   |   |   |--- feature_0 <= 25.50
|   |   |   |   |   |--- feature_0 <= 21.00
|   |   |   |   |   |   |--- feature_1 <= 26.00
|   |   |   |   |   |   |   |--- feature_1 <= 24.00
|   |   |   |   |   |   |   |   |--- value: [79934.00]
|   |   |   |   |   |   |   |--- feature_1 >  24.00
|   |   |   |   |   |   |   |   |--- value: [10332.00]
|   |   |   |   |   |   |--- feature_1 >  26.00
|   |   |   |   |   |   |   |--- feature_1 <= 28.50
|   |   |   |   |   |   |   |   |--- value: [149301.00]
|   |   |   |   |   |   |   |--- feature_1 >  28.50
|   |   |   |   |   |   |   |   |--- value: [61627.67]
|   |   |   |   |   |--- feature_0 >  21.00
|   |   |   |   |   |   |--- feature_1 <= 24.50
|   |   |   |   |   |   |   |--- feature_1 <= 23.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 24.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 23.50
|   |   |   |   |   |   |   |   |   |   |--- value: [136610.43]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  23.50
|   |   |   |   |   |   |   |   |   |   |--- value: [163801.29]
|   |   |   |   |   |   |   |   |--- feature_0 >  24.50
|   |   |   |   |   |   |   |   |   |--- value: [126186.66]
|   |   |   |   |   |   |   |--- feature_1 >  23.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 24.50
|   |   |   |   |   |   |   |   |   |--- value: [130249.84]
|   |   |   |   |   |   |   |   |--- feature_0 >  24.50
|   |   |   |   |   |   |   |   |   |--- value: [173364.60]
|   |   |   |   |   |   |--- feature_1 >  24.50
|   |   |   |   |   |   |   |--- feature_0 <= 22.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 26.50
|   |   |   |   |   |   |   |   |   |--- value: [178229.50]
|   |   |   |   |   |   |   |   |--- feature_1 >  26.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 30.50
|   |   |   |   |   |   |   |   |   |   |--- value: [125973.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  30.50
|   |   |   |   |   |   |   |   |   |   |--- value: [184005.00]
|   |   |   |   |   |   |   |--- feature_0 >  22.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 24.00
|   |   |   |   |   |   |   |   |   |--- value: [74651.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  24.00
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 32.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 27.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [120378.40]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  27.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [124103.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  32.50
|   |   |   |   |   |   |   |   |   |   |--- value: [85435.00]
|   |   |   |   |--- feature_0 >  25.50
|   |   |   |   |   |--- feature_0 <= 33.50
|   |   |   |   |   |   |--- feature_1 <= 32.50
|   |   |   |   |   |   |   |--- feature_0 <= 31.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 25.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 30.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 27.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  27.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |--- feature_0 >  30.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 23.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [67538.40]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  23.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |--- feature_1 >  25.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 31.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 29.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 7
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  29.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |--- feature_1 >  31.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 28.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [166368.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  28.00
|   |   |   |   |   |   |   |   |   |   |   |--- value: [200000.00]
|   |   |   |   |   |   |   |--- feature_0 >  31.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 24.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 23.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 32.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [121892.62]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  32.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [70806.67]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  23.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 32.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [131631.14]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  32.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [219110.25]
|   |   |   |   |   |   |   |   |--- feature_1 >  24.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 31.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 30.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  30.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [71287.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  31.50
|   |   |   |   |   |   |   |   |   |   |--- value: [127642.56]
|   |   |   |   |   |   |--- feature_1 >  32.50
|   |   |   |   |   |   |   |--- feature_1 <= 34.00
|   |   |   |   |   |   |   |   |--- value: [52916.67]
|   |   |   |   |   |   |   |--- feature_1 >  34.00
|   |   |   |   |   |   |   |   |--- feature_1 <= 38.00
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 28.50
|   |   |   |   |   |   |   |   |   |   |--- value: [85000.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  28.50
|   |   |   |   |   |   |   |   |   |   |--- value: [79983.00]
|   |   |   |   |   |   |   |   |--- feature_1 >  38.00
|   |   |   |   |   |   |   |   |   |--- value: [57588.00]
|   |   |   |   |   |--- feature_0 >  33.50
|   |   |   |   |   |   |--- feature_1 <= 39.00
|   |   |   |   |   |   |   |--- feature_1 <= 35.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 33.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 28.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 26.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 7
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  26.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |--- feature_1 >  28.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 29.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  29.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 6
|   |   |   |   |   |   |   |   |--- feature_1 >  33.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 34.50
|   |   |   |   |   |   |   |   |   |   |--- value: [180000.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  34.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 34.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  34.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |--- feature_1 >  35.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 36.50
|   |   |   |   |   |   |   |   |   |--- value: [80674.60]
|   |   |   |   |   |   |   |   |--- feature_1 >  36.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 37.50
|   |   |   |   |   |   |   |   |   |   |--- value: [93625.20]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  37.50
|   |   |   |   |   |   |   |   |   |   |--- value: [90456.00]
|   |   |   |   |   |   |--- feature_1 >  39.00
|   |   |   |   |   |   |   |--- value: [250000.00]
|   |   |   |--- feature_0 >  37.50
|   |   |   |   |--- feature_1 <= 45.50
|   |   |   |   |   |--- feature_1 <= 44.50
|   |   |   |   |   |   |--- feature_0 <= 40.50
|   |   |   |   |   |   |   |--- feature_1 <= 41.00
|   |   |   |   |   |   |   |   |--- feature_1 <= 35.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 24.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 39.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  39.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_1 >  24.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 39.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 6
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  39.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 9
|   |   |   |   |   |   |   |   |--- feature_1 >  35.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 38.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 36.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [65817.00]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  36.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |--- feature_0 >  38.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 37.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  37.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 4
|   |   |   |   |   |   |   |--- feature_1 >  41.00
|   |   |   |   |   |   |   |   |--- value: [300000.00]
|   |   |   |   |   |   |--- feature_0 >  40.50
|   |   |   |   |   |   |   |--- feature_0 <= 42.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 25.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 23.50
|   |   |   |   |   |   |   |   |   |   |--- value: [135000.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  23.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 41.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  41.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 2
|   |   |   |   |   |   |   |   |--- feature_1 >  25.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 26.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 41.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [103610.20]
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  41.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [93701.00]
|   |   |   |   |   |   |   |   |   |--- feature_1 >  26.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 33.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 6
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  33.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 7
|   |   |   |   |   |   |   |--- feature_0 >  42.50
|   |   |   |   |   |   |   |   |--- feature_1 <= 38.50
|   |   |   |   |   |   |   |   |   |--- feature_1 <= 34.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 30.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 7
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  30.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 6
|   |   |   |   |   |   |   |   |   |--- feature_1 >  34.50
|   |   |   |   |   |   |   |   |   |   |--- feature_0 <= 47.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 7
|   |   |   |   |   |   |   |   |   |   |--- feature_0 >  47.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 3
|   |   |   |   |   |   |   |   |--- feature_1 >  38.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 49.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 39.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 5
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  39.50
|   |   |   |   |   |   |   |   |   |   |   |--- truncated branch of depth 8
|   |   |   |   |   |   |   |   |   |--- feature_0 >  49.50
|   |   |   |   |   |   |   |   |   |   |--- feature_1 <= 40.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [212214.67]
|   |   |   |   |   |   |   |   |   |   |--- feature_1 >  40.50
|   |   |   |   |   |   |   |   |   |   |   |--- value: [185000.00]
|   |   |   |   |   |--- feature_1 >  44.50
|   |   |   |   |   |   |--- feature_0 <= 47.50
|   |   |   |   |   |   |   |--- feature_0 <= 46.00
|   |   |   |   |   |   |   |   |--- value: [171211.00]
|   |   |   |   |   |   |   |--- feature_0 >  46.00
|   |   |   |   |   |   |   |   |--- value: [180000.00]
|   |   |   |   |   |   |--- feature_0 >  47.50
|   |   |   |   |   |   |   |--- feature_0 <= 48.50
|   |   |   |   |   |   |   |   |--- value: [400000.00]
|   |   |   |   |   |   |   |--- feature_0 >  48.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 49.50
|   |   |   |   |   |   |   |   |   |--- value: [202500.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  49.50
|   |   |   |   |   |   |   |   |   |--- value: [175000.00]
|   |   |   |   |--- feature_1 >  45.50
|   |   |   |   |   |--- feature_0 <= 48.50
|   |   |   |   |   |   |--- feature_1 <= 47.50
|   |   |   |   |   |   |   |--- feature_0 <= 45.00
|   |   |   |   |   |   |   |   |--- value: [135000.00]
|   |   |   |   |   |   |   |--- feature_0 >  45.00
|   |   |   |   |   |   |   |   |--- feature_0 <= 47.50
|   |   |   |   |   |   |   |   |   |--- feature_0 <= 46.50
|   |   |   |   |   |   |   |   |   |   |--- value: [80000.00]
|   |   |   |   |   |   |   |   |   |--- feature_0 >  46.50
|   |   |   |   |   |   |   |   |   |   |--- value: [72492.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  47.50
|   |   |   |   |   |   |   |   |   |--- value: [100000.00]
|   |   |   |   |   |   |--- feature_1 >  47.50
|   |   |   |   |   |   |   |--- value: [142618.00]
|   |   |   |   |   |--- feature_0 >  48.50
|   |   |   |   |   |   |--- feature_1 <= 49.50
|   |   |   |   |   |   |   |--- feature_1 <= 48.50
|   |   |   |   |   |   |   |   |--- feature_0 <= 49.50
|   |   |   |   |   |   |   |   |   |--- value: [75010.00]
|   |   |   |   |   |   |   |   |--- feature_0 >  49.50
|   |   |   |   |   |   |   |   |   |--- value: [42657.00]
|   |   |   |   |   |   |   |--- feature_1 >  48.50
|   |   |   |   |   |   |   |   |--- value: [7500.00]
|   |   |   |   |   |   |--- feature_1 >  49.50
|   |   |   |   |   |   |   |--- value: [86096.00]

Decision tree (visualization)¶

In [16]:
plot_tree(model)
plt.show()

Decision tree (evaluation)¶

In [17]:
evaluate_model()
                     Model        RMSE      R2
0       LinearRegression() 61984.36910 0.11560
1                  Lasso() 61984.38170 0.11560
2  DecisionTreeRegressor() 62859.92650 0.09040

Random forest (ensemble)¶

Random forest applies an averaging function to multiple Decision Tree models for a better overall model.

In [18]:
from sklearn.ensemble import RandomForestRegressor

model = RandomForestRegressor().fit(X_train, y_train)

evaluate_model()
                     Model        RMSE      R2
0       LinearRegression() 61984.36910 0.11560
1                  Lasso() 61984.38170 0.11560
2  DecisionTreeRegressor() 62859.92650 0.09040
3  RandomForestRegressor() 62486.58220 0.10120

Gradient tree boosting regressor¶

Gradient tree boosting iterates on tree models to find the best one.

In [19]:
from sklearn.ensemble import GradientBoostingRegressor

model = GradientBoostingRegressor().fit(X_train, y_train)

evaluate_model()
                         Model        RMSE      R2
0           LinearRegression() 61984.36910 0.11560
1                      Lasso() 61984.38170 0.11560
2      DecisionTreeRegressor() 62859.92650 0.09040
3      RandomForestRegressor() 62486.58220 0.10120
4  GradientBoostingRegressor() 61289.18180 0.13530

Improving the model¶

  • Tuning hyperparameters
  • Incorporating categorical features

https://learn.microsoft.com/en-us/training/modules/train-evaluate-regression-models/6-improve-models

Tuning hyperparameters¶

In [20]:
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer, r2_score

# Use a Gradient Boosting algorithm
alg = GradientBoostingRegressor()

# Try these hyperparameter values
params = {
 'learning_rate': [0.1, 0.5, 1.0],
 'n_estimators' : [50, 100, 150]
}

# Find the best hyperparameter combination to optimize the R2 metric
score = make_scorer(r2_score)
gridsearch = GridSearchCV(alg, params, scoring=score, cv=3, return_train_score=True)
gridsearch.fit(X_train, y_train)
print("Best parameter combination:", gridsearch.best_params_, "\n")

# Get the best model
model = gridsearch.best_estimator_
print(model, "\n")
Best parameter combination: {'learning_rate': 0.1, 'n_estimators': 50} 

GradientBoostingRegressor(n_estimators=50) 

Evaluating tuned model¶

In [21]:
evaluate_model()
                                        Model        RMSE      R2
0                          LinearRegression() 61984.36910 0.11560
1                                     Lasso() 61984.38170 0.11560
2                     DecisionTreeRegressor() 62859.92650 0.09040
3                     RandomForestRegressor() 62486.58220 0.10120
4                 GradientBoostingRegressor() 61289.18180 0.13530
5  GradientBoostingRegressor(n_estimators=50) 61241.50650 0.13670

Preparing categorical features¶

In [22]:
categorical_features = ['EdLevel', 'MainBranch', 'Country']

for col_name in categorical_features:
    survey_data = survey_data.dropna(subset = [col_name])  
    
fig, axes = plt.subplots(nrows=1, ncols=len(categorical_features), figsize=(12, 4))

for ind, col_name in enumerate(categorical_features):
    counts = survey_data[col_name].value_counts().sort_index()
    axis = axes[ind]
    counts.plot.bar(ax=axis, color='steelblue')
    axis.set_title(col_name + ' counts')

Creating a pipeline with categorical features¶

In [23]:
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# Separate features and labels
X = survey_data[numeric_features + categorical_features].values
y = survey_data[label].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=0)

# Define preprocessing for numeric columns (scale them)
numeric_features_indices = [0, 1]
numeric_transformer = Pipeline(steps=[
    ('scaler', StandardScaler())])

# Define preprocessing for categorical features (encode them)
categorical_features_indices = [2, 3, 4]
categorical_transformer = Pipeline(steps=[
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

# Combine preprocessing steps
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features_indices),
        ('cat', categorical_transformer, categorical_features_indices)])

# Create preprocessing and training pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
                           ('regressor', model)])
model = pipeline.fit(X_train, (y_train))

Evaluating model with categorical features¶

In [24]:
evaluate_model()
                                               Model        RMSE      R2
0                                 LinearRegression() 61984.36910 0.11560
1                                            Lasso() 61984.38170 0.11560
2                            DecisionTreeRegressor() 62859.92650 0.09040
3                            RandomForestRegressor() 62486.58220 0.10120
4                        GradientBoostingRegressor() 61289.18180 0.13530
5         GradientBoostingRegressor(n_estimators=50) 61241.50650 0.13670
6  Pipeline(steps=[('preprocessor',\n            ... 48715.09900 0.45580

Storing the model¶

In [25]:
import joblib

# Save the model as a pickle file
filename = '../function/model_predict/model.pkl'
joblib.dump(model, filename)
Out[25]:
['../function/model_predict/model.pkl']

Using the stored model¶

In [26]:
# Load the model from the file
loaded_model = joblib.load(filename)

# Create a numpy array containing a new observation (for example tomorrow's seasonal and weather forecast information)
X_new = np.array([[25, 15, 'Master’s degree (M.A., M.S., M.Eng., MBA, etc.)','I am a developer by profession', 'United States of America']])
print(f'New sample: {X_new[0]}')

# Use the model to predict tomorrow's rentals
result = loaded_model.predict(X_new)
print(f'Prediction: {np.round(result[0])}')
New sample: ['25' '15' 'Master’s degree (M.A., M.S., M.Eng., MBA, etc.)'
 'I am a developer by profession' 'United States of America']
Prediction: 174335.0

Turning the model into an HTTP API¶

HTTP API architecture¶

Diagram of client making HTTP GET call to Azure function

Azure function code¶

import os

import azure.functions
import fastapi
import joblib
import nest_asyncio
import numpy

app = fastapi.FastAPI()
nest_asyncio.apply()
model = joblib.load(f"{os.path.dirname(os.path.realpath(__file__))}/model.pkl")

@app.get("/model_predict")
async def predict(years_coding: int, years_coding_pro: int, ed_level: str, dev_status: str, country: str):
    X_new = numpy.array([[years_coding, years_coding_pro, ed_level, dev_status, country]])
    result = model.predict(X_new)
    return {"salary": round(result[0], 2)}

async def main(
    req: azure.functions.HttpRequest, context: azure.functions.Context
) -> azure.functions.HttpResponse:
    return azure.functions.AsgiMiddleware(app).handle(req, context)

Deploying the function¶

Many ways to deploy: Azure Tools VS Code extension, Azure CLI, Azure Dev CLI (In public preview).

Using the Azure Dev CLI:

% azd up
Provisioning Azure resources can take some time.
You can view detailed progress in the Azure Portal:
https://portal.azure.com/#blade/HubsExtension/DeploymentDetailsBlade/...

Created Resource group: salary-model1-rg
Created App Service plan: salary-model1-dtlpju3kmywzs-plan
Created Log Analytics workspace: salary-model1-dtlpju3kmywzs-logworkspace
Created Application Insights: salary-model1-dtlpju3kmywzs-appinsights
Created Storage account: salarymodel1dtlpjstorage
Created Web App: salary-model1-dtlpju3kmywzs-function-app

Azure resource provisioning completed successfully

Deployed service api
 - Endpoint: https://salary-model1-dtlpju3kmywzs-function-app.azurewebsites.net/

View the resources created under the resource group salary-model1-rg in Azure Portal:
https://portal.azure.com/#@/resource/subscriptions/32ea8a26-5b40-4838-b6cb-be5c89a57c16/resourceGroups/salary-model1-rg/overview

Calling the HTTP API¶

Example API call:

/model_predict?years_coding=25&years_coding_pro=15&ed_level=Master%E2%80%99s%20degree%20%28M.A.%2C%20M.S.%2C%20M.Eng.%2C%20MBA%2C%20etc.%29&dev_status=I%20am%20a%20developer%20by%20profession& country=United%20States%20of%20America

Results:

{"salary":171993.74}

Auto-generated documentation¶

FastAPI auto-generates documentation based on the function signature.

  • /docs
  • /redoc

Screenshot of auto-generated docs

Handling categorical features better¶

# import ...
from . import categories

app = fastapi.FastAPI()
nest_asyncio.apply()
model = joblib.load(f"{os.path.dirname(os.path.realpath(__file__))}/model.pkl")

@app.get("/model_predict")
async def model_predict(
    years_coding: int,
    years_coding_pro: int,
    ed_level: categories.EdLevel,
    dev_status: categories.MainBranch,
    country: categories.Country,
):
    X_new = numpy.array([[years_coding, years_coding_pro, ed_level.value, dev_status.value, country.value]])
    result = model.predict(X_new)
    return {"salary": round(result[0], 2)}

async def main(
    req: azure.functions.HttpRequest, context: azure.functions.Context
) -> azure.functions.HttpResponse:
    return azure.functions.AsgiMiddleware(app).handle(req, context)

The category enums file¶

from enum import Enum

class EdLevel(str, Enum):
    EDLEVEL_0 = "Associate degree (A.A., A.S., etc.)"
    EDLEVEL_1 = "Bachelor’s degree (B.A., B.S., B.Eng., etc.)"
    EDLEVEL_2 = "Master’s degree (M.A., M.S., M.Eng., MBA, etc.)"
    EDLEVEL_3 = "Other doctoral degree (Ph.D., Ed.D., etc.)"
    EDLEVEL_4 = "Primary/elementary school"
    EDLEVEL_5 = "Professional degree (JD, MD, etc.)"
    EDLEVEL_6 = "Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)"
    EDLEVEL_7 = "Some college/university study without earning a degree"
    EDLEVEL_8 = "Something else"

class MainBranch(str, Enum):
    MAINBRANCH_0 = "I am a developer by profession"
    MAINBRANCH_1 = "I am not primarily a developer, but I write code sometimes as part of my work"

class Country(str, Enum):
    COUNTRY_0 = "Afghanistan"
    COUNTRY_1 = "Albania"
    COUNTRY_2 = "Algeria"
    ...

Generating the category enums¶

In [27]:
enums_lines = []

for feature in categorical_features:
    enums_lines.append(f'class {feature}(str, Enum):')
    for ind, value in enumerate(sorted(survey_data[feature].unique())):
        enum_name = f'{feature.upper()}_{ind}'
        enums_lines.append(f'    {enum_name} = "{value}"')
    enums_lines.append('\n')

enums_module = 'from enum import Enum\n\n'  + '\n'.join(enums_lines)
f = open("../function/model_predict/categories.py", "w")
f.write(enums_module)
f.close()

Re-deploying the function¶

Since the only change is code, I can just run:

% azd deploy
Deploying service api...
Deployed service api
 - Endpoint: https://salary-model1-dtlpju3kmywzs-function-app.azurewebsites.net/

Auto-generated documentation for category enums¶

The categories in the docs are now dropdowns with all available options.

Screenshot of auto-generated docs

Next steps¶

  • If you haven't yet, go through the tutorial on regression models
  • Check out the code for this example and try deploying yourself
  • Learn more about creating Azure functions in Python with the Azure CLI or VS Code
  • Learn about more ways to host Python on Azure
  • Learn about the Azure ML SDKs
  • Attend the next talk in this series!