Da die Zusammenhänge zwishen den Prediktoren und dem Preis linear zu sein scheinen, wird als erstes der Algorithmus Linear Regression getestet. Der Vorteil dieses Algorithmus ist, dass er leicht zu interpretieren ist. Nötig ist hier allerdings, dass die Daten skaliert werden.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('Solarize_Light2')
import folium
import os
os.chdir('D:\Data\Projects\Regression\Taxi Fare Prediction_Linear Regression')
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.preprocessing import StandardScaler
df = pd.read_csv('train_clean_features.csv')
df.head()
x = df.drop(['fare_amount', 'pickup_datetime'], axis=1)
y = df.fare_amount
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
sc = StandardScaler()
sc.fit(X_train)
X_train =sc.transform(X_train);
X_test =sc.transform(X_test);
def rmse(pred, true):
return np.sqrt(((pred - true) ** 2).mean())
from sklearn.dummy import DummyRegressor
dummy = DummyRegressor(strategy='mean')
# Model trainieren
dummy.fit(X_train, y_train)
# predict und MAE
dummpred = dummy.predict(X_test)
mean_absolute_error(y_test, dummpred)
rmse(y_test, dummpred)
lr = LinearRegression()
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)
mean_absolute_error(y_test, y_pred)
rmse(y_test, y_pred)
Besser als die Baseline!
lr.intercept_
coeff = pd.DataFrame({'Feature': x.columns, 'Coeff': list(lr.coef_)})
coeff= coeff.sort_values('Coeff', ascending=False)
coeff
import statsmodels.api as sm
model = sm.OLS(y_train, X_train)
results = model.fit()
print(results.summary())
#rf = RandomForestRegressor()
#rf.fit(X_train, y_train)
#y_pred_rf = rf.predict(X_test)
#rmse(y_test, y_pred_rf)
Der Random Forest Regressor ist noch ein wenig besser.
# Sammlung der fitted sub-estimators
rf.estimators_
rf.decision_path
y_test, y_pred_rf in ein DF
Die ersten 100 Werte in seaborn plotten
Die Reihenfolge bei einer Liste ist unveränderlich
prices = pd.DataFrame({'Real': y_test[:100], 'Predicted': list(y_pred_rf)[:100]})
plt.figure(figsize=(10,8))
sns.kdeplot(prices.Real)
sns.kdeplot(prices.Predicted);
Speichern des trainierten Models
import pickle
# save the model to disk
filename = 'finalized_rf.sav'
pickle.dump(rf, open(filename, 'wb'))