#!/usr/bin/env python # coding: utf-8 # In[3]: import numpy as np import matplotlib.pyplot as plt from skimage import transform # In[4]: from keras.datasets import boston_housing (X_train, y_train), (X_test, y_test) = boston_housing.load_data() # ### Данные: # Будем работать с датасетом [Boston Housing Prices](https://medium.com/@haydar_ai/learning-data-science-day-9-linear-regression-on-boston-housing-dataset-cd62a80775ef). # In[5]: plt.hist(y_train, bins=25) plt.ylabel('Number of objects within borders') plt.xlabel('Price') # ### Задание. # Будем решать задачу регрессии. Целевая переменная -- цена дома, признаки - различная информация о домохозяйстве. Для решения будем использовать линейную регрессию. Ваша задача - оценить качество решения в зависимости от количества объектов в обучающей выборке. Качество решения будем оценивать с помощью среднеквадратичной и среднеабсолютной ошибки, а так же [коэффициента детерминации $r^2$](http://scikit-learn.org/stable/modules/model_evaluation.html#r2-score-the-coefficient-of-determination). Также требуется оценить дисперсию данных функционалов в зависимости от числа объектов в обучающей выборке. # # *Обращаем ваше внимание, что для качественной оценки данных зависимостей эксперименты для каждого размера выборки стоит повторять многократно на различных случайных подвыборках.* # In[6]: from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score # In[7]: lm = LinearRegression() lm.fit(X_train, y_train) y_pred = lm.predict(X_test) plt.scatter(y_test, y_pred) plt.xlabel("Prices: $Y_i$") plt.ylabel("Predicted prices: $\hat{Y}_i$") plt.title("Prices vs Predicted prices: $Y_i$ vs $\hat{Y}_i$") # In[8]: print('mae = {}'.format(mean_absolute_error(y_test, y_pred))) print('mse = {}'.format(mean_squared_error(y_test, y_pred))) print('prediction variance = {}'.format(np.std((y_test - y_pred)**2))) # In[9]: samples_amount = len(X_train) rep_amount = 100 mae = np.zeros(samples_amount) mse = np.zeros(samples_amount) r2 = np.zeros(samples_amount) # In[10]: for i in range(1, samples_amount): for j in range(rep_amount): sub_data = np.random.choice(np.arange(len(X_train)), i + 1, replace = False) sub_x = X_train[sub_data] sub_y = y_train[sub_data] lm.fit(sub_x, sub_y) y_pred = lm.predict(X_test) mae[i] += mean_absolute_error(y_test, y_pred) mse[i] += mean_squared_error(y_test, y_pred) r2[i] += r2_score(y_test, y_pred) mae[i] = mae[i] / rep_amount mse[i] = mse[i] / rep_amount r2[i] = r2[i] / rep_amount # In[11]: plt.rcParams['font.family'] = 'serif' plt.rcParams['font.serif'] = 'FreeSerif' plt.rcParams['lines.linewidth'] = 2 plt.rcParams['lines.markersize'] = 12 plt.rcParams['xtick.labelsize'] = 18 plt.rcParams['ytick.labelsize'] = 18 plt.rcParams['legend.fontsize'] = 18 plt.rcParams['axes.titlesize'] = 18 plt.rcParams['axes.labelsize'] = 18 # In[16]: x = np.arange(1, len(X_train) + 1) plt.figure(figsize=(10, 8)) plt.grid(True) plt.plot(x, mae) plt.ylabel('Mean absolute error') plt.xlabel('Train set size') plt.title('MAE(Train set size)') # In[2]: plt.plot(x, mse) plt.ylabel('Mean squared error') plt.xlabel('Sample size') plt.title('mse(N)') # In[41]: plt.plot(x, r2) plt.ylabel('R2') plt.xlabel('Sample size') plt.title('R2(N)') # In[ ]: # # Plot code example from ODS Open Machine Course notebook from lesson 9 # # Source: https://github.com/Yorko/mlcourse_open/blob/master/jupyter_russian/topic09_time_series/topic9_part1_time_series_python.ipynb # plt.figure(figsize=(15, 5)) # plt.plot(prediction_test, label="prediction") # plt.plot(lower, "r--", label="upper bond / lower bond") # plt.plot(upper, "r--") # plt.plot(list(y_test), label="y_test") # plt.plot(Anomalies, "ro", markersize=10) # plt.legend(loc="best") # plt.axis('tight') # plt.title("XGBoost Mean absolute error {} users".format(round(mean_absolute_error(prediction_test, y_test)))) # plt.grid(True) # plt.legend() # In[ ]: ### Your code here