Шаги взяты с Cross Industry Standard Processing for Data Mining:
In [28]:
## 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
In [2]:
boston_cols = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
In [4]:
df = pd.read_csv("data/boston/housing.data", sep='\s+', names=boston_cols)
In [6]:
df.head()
Out[6]:
See UCI Data page: https://archive.ics.uci.edu/ml/datasets/Housing
Data Columns:
Let's explore the data a bit, make some interactive plots and build a classifier for the data.
In [29]:
sns.pairplot(df[["CRIM", "AGE", "RM", "MEDV"]])
Out[29]:
In [10]:
df.describe()
Out[10]:
На этом этапе выбираются и применяются различные методы моделирования, и их параметры калибруются для оптимальных значений. Как правило, существует несколько методов для того же типа задачи. Некоторые методы имеют специфические требования к форме данных. Поэтому, часто требуется дополнительная подготовка данных.
Рассмотрим линейную регрессию:LinearRegression model to understand the concepts behind regression.
Большинство знакомы с уравнением линии:
$$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)$$
In [35]:
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_))
In [36]:
# 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))
In [31]:
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()
In [27]:
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])
На данном этапе мы построили модель (или модели), которые, как представляется, имеют хорошее качество, с точки зрения анализа данных. Прежде чем приступить к окончательному развертыванию модели, важно более тщательно оценить модель, и рассмотрим шаги, выполняемые для построения модели, чтобы быть уверенным, что бизнес-цели достигнуты. Ключевая цель состоит в том, чтобы определить, есть ли какой-то важный вопрос бизнеса, который не был в достаточной степени рассмотрен. В конце этого этапа, решение об использовании результатов должно быть достигнуто.
Давайте снова посмотрим на бизнес-цели:
Creation of the model is generally not the end of the project. Even if the purpose of the model is to increase knowledge of the data, the knowledge gained will need to be organized and presented in a way that is useful to the customer. Depending on the requirements, the deployment phase can be as simple as generating a report or as complex as implementing a repeatable data scoring (e.g. segment allocation) or data mining process. In many cases it will be the customer, not the data analyst, who will carry out the deployment steps. Even if the analyst deploys the model it is important for the customer to understand up front the actions which will need to be carried out in order to actually make use of the created models.
Создание модели, как правило, не является концом. Даже если цель данной модели является повышение уровня знаний о данных, полученные знания должны быть организованы и представлены таким образом, который полезен клиенту. В зависимости от требований, фаза развертывания может быть столь же простой, как создание отчета или же сложной, как реализация повторяемого скоринга данных (например, распределение сегментов). Во многих случаях это будет клиент, который будей осуществлять шаги по развертыванию. Даже если аналитик развертывает модель очень важно для клиента, чтобы понять фронт действий, которые должны будут проводиться для того, чтобы реально использовать созданные модели.
In [ ]: