Метрические методы

Шестаков А.В. Майнор по анализу данных 31/05/2016

Метрические методы классификации и регрессии - одни из самых простых моделей. Они основаны на гипотезе о компактности (непрерывности) - близким объектам соответствуют близкие ответы.

Дело остаётся за малым:

  • Определить, что же такое близкий объект
  • Определить, сколько ближайших соседей учитывать при прогнозировании
  • Определить как их учитывать?

Какие недостатки метода kNN вы помните из лекции?

Интуиция

Классификация

Поиграем с kNN на игружечном датасете

In [ ]:
from sklearn.datasets import make_moons
import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')

%matplotlib inline
In [ ]:
X, y = make_moons(noise=0.3, random_state=123)
plt.scatter(X[:,0], X[:,1], c=y)
In [ ]:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import train_test_split

knn = KNeighborsClassifier(n_neighbors=5, weights='uniform', metric='minkowski')
knn.fit(X, y)
In [ ]:
x_range = np.linspace(X.min(), X.max(), 100)
xx1, xx2 = np.meshgrid(x_range, x_range)

Y = knn.predict_proba(np.c_[xx1.ravel(), xx2.ravel()])[:,1]
Y = Y.reshape(xx1.shape)

plt.contourf(xx1, xx2, Y, alpha=0.3)
plt.scatter(X[:,0], X[:,1],c=y)

Регрессия

Загрузите простой датасет с измерениями носов(?) кенгуру. Reference: Australian Journal of Zoology, Vol. 28, p607-613

In [ ]:
data = np.loadtxt('kengo.csv', skiprows=1, delimiter=',')
X = data[:,0].reshape(-1,1)
y = data[:,1]
In [ ]:
plt.scatter(X, y)
In [ ]:
from sklearn.neighbors import KNeighborsRegressor
In [ ]:
# Your code here

Задание 1

Регрессия

Обучите метод ближайшего соседа на данных о стоимости апартаментов в Бостоне.
С помощью кросс-валидации определите оптимальное количество ближайших соседей и функцию расчета весов ближайших соседей

In [ ]:
from sklearn.datasets import load_boston
data = load_boston()
In [ ]:
print data['DESCR']

Классификация

Загрузите датасет с новостными текстами. Выберите 2 категории, разбейте документы на слова (n-gramm'ы), "обучите" метод ближайшего соседа для задачи категоризации текстов по их содержанию.

Используйте косинусную мету близости

In [ ]:
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
In [ ]:
news_docs = fetch_20newsgroups(subset='all', categories=['alt.atheism', 'comp.graphics'])