<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Linear regression on Boston Housing Data
Шаги взяты с Cross Industry Standard Processing for Data Mining
Step1:  See UCI Data page
Step2:  3. Data Preparation
У нас есть пропущенные данные?
Нам нужно кодировать категориальные переменные?
Есть ли исключения?
Влезут ли наши данные в память или нам их нужно разбивать на части?
Step3:  4. Modeling
На этом этапе выбираются и применяются различные методы моделирования, и их параметры калибруются для оптимальных значений. Как правило, существует несколько методов для того же типа задачи. Некоторые методы имеют специфические требования к форме данных. Поэтому, часто требуется дополнительная подготовка данных.
Рассмотрим линейную регрессию
<ASSISTANT_TASK:>
Python Code:
## import statements
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn
from sklearn import datasets
from sklearn.cross_validation import cross_val_predict
from sklearn import linear_model
boston_cols = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
df = pd.read_csv("data/boston/housing.data", sep='\s+', names=boston_cols)
df.head()
Explanation: Linear regression on Boston Housing Data
Шаги взяты с Cross Industry Standard Processing for Data Mining:
Business Understanding
Data Understanding
Data Preparation
Modeling
Evaluation
Deployment
1. Business Understanding
Цель: 
Определить что делает недвижимость ценной?
Какая цена конкретного дома? 
2. Data Understanding
Мы должны собрать как можно больше данных для лучшего их понимания (обнаружения корреляций, определения их качества, выдвижения гипотез)
Другие ресурсы из которых мы можем взять данные:
Realtor.com - Boston MA
Zillow API
ProgrammableWeb API - Real Estate
*В этом случае датасет уже почищен и не нуждается в дополнительных данных
End of explanation
sns.pairplot(df[["CRIM", "AGE", "RM", "MEDV"]])
Explanation: See UCI Data page: https://archive.ics.uci.edu/ml/datasets/Housing
Data Columns:
CRIM: per capita crime rate by town 
ZN: proportion of residential land zoned for lots over 25,000 sq.ft. 
INDUS: proportion of non-retail business acres per town 
CHAS: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) 
NOX: nitric oxides concentration (parts per 10 million) 
RM: average number of rooms per dwelling 
AGE: proportion of owner-occupied units built prior to 1940 
DIS: weighted distances to five Boston employment centres 
RAD: index of accessibility to radial highways 
TAX: full-value property-tax rate per \$10,000 
PTRATIO: pupil-teacher ratio by town 
B: $1000(Bk - 0.63)^2$ where Bk is the proportion of blacks by town 
LSTAT: % lower status of the population 
MEDV: Median value of owner-occupied homes in \$1000's
Let's explore the data a bit, make some interactive plots and build a classifier for the data.
End of explanation
df.describe()
Explanation: 3. Data Preparation
У нас есть пропущенные данные?
Нам нужно кодировать категориальные переменные?
Есть ли исключения?
Влезут ли наши данные в память или нам их нужно разбивать на части?
End of explanation
X = df
boston = datasets.load_boston()
y = boston.target
from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X, y)
print('Estimated intercept coefficent:', lm.intercept_)
print('Number of coefficients:', len(lm.coef_))
# def predict_house(crim, zn, indus, chas, nox, rm, age, dis, rad, tax, ptratio, b, lstat):
#     return lm.intercept_ + lm.coef_[0] * crim \
#             + zn * lm.coef_[1] \
#             + indus * lm.coef_[2] \
#             + chas * lm.coef_[3] \
#             + nox * lm.coef_[4] \
#             + rm * lm.coef_[5] \
#             + age * lm.coef_[6] \
#             + dist * lm.coef_[7] \
#             + rad * lm.coef_[8] \
#             + tax * lm.coef_[9] \
#             + ptratio * lm.coef_[10] \
#             + b * lm.coef_[11] \
#             + lstat * lm.coef_[12]
       
    
#print(X.iloc[[41]].values)
#print(y[41])
print("Predicted House price", lm.predict(X)[41] * 1000)
print("Equation house price", (lm.intercept_ + np.dot(lm.coef_, X.iloc[[41]].values[0])) * 1000)
print("Target price", y[41] * 1000)
print("Residual price", (lm.predict(X)[41] - y[41]) * 1000)
print("R^2 =", lm.score(X, y))
predicted = cross_val_predict(lm, boston.data, y, cv=10)
fig, ax = plt.subplots()
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')
plt.show()
errors = {}
for feature in boston.feature_names:
    lm = LinearRegression()
    lm.fit(X[[feature]], y)
    mean_squared_error = np.mean((y - lm.predict(X[[feature]])) ** 2)
    errors[feature] = mean_squared_error
errors = sorted(errors.items(), key=lambda x: x[1])
print("Features that Minimize Error")
print(30 * "-")
for e in errors:
    print(e[0], "\t", e[1])
Explanation: 4. Modeling
На этом этапе выбираются и применяются различные методы моделирования, и их параметры калибруются для оптимальных значений. Как правило, существует несколько методов для того же типа задачи. Некоторые методы имеют специфические требования к форме данных. Поэтому, часто требуется дополнительная подготовка данных.
Рассмотрим линейную регрессию:LinearRegression model to understand the concepts behind regression. 
X - матрица известных переменных 
y - переменная-цель (target variable)
Алгоритм
Большинство знакомы с уравнением линии:
$$y = mx + b$$
Например, у нас есть стенд с лимонадом. Мы могли бы сделать действительно простую модель, говоря, что доход от лимонада равен цене, продажам и аренде. Мы могли бы упростить это к линейному уравнению, который выглядит следующим образом
$$PredictedRevenue = (Sales * Price) - Rent$$
Но чтобы продавать лимонад, нужны не только продажи и цены. Мы могли бы учитывать другие переменные, такие как изменения цен, продаж, температуры и пешеходного движения. Мы могли бы создать более сложную модель, которая будет выглядеть примерно так.
$$PredictedRevenue = (Sales * Weight) + ( Price * Weight) + (Temperature * Weight) + (FootTraffic * Weight) - Rent$$
Весы в примере - это коэфициенты. Используя Multiple Linear Regression мы можем посчитать эти коэфициенты. 
Используем 13 переменных для того что бы предсказать цену дома:
$$\hat{Y} = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + ... \beta_n N$$
$$PredictedPrice = Intercept + (Known CRIM * coefficient) + (Known ZN * coefficient) + ... (Known N * coefficient)$$
End of explanation
<END_TASK>