Scikit-Learn - один из лучших инструментов в сообществе машинного обучения, который используют как ученые, так и профессионалы отрасли.

В ODSC West автор Scikit-Learn Андреас Мюллер проведет тренировку, чтобы дать новичкам ускоренный курс. Как один из основных участников Scikit-Learn, Мюллер является одним из самых знающих людей в мире по этому пакету и одним из лучших, кто может получить представление о нем.

Это сложно превзойти, но было бы полезно узнать немного о Scikit-Learn перед посещением конференции. Мы сделаем краткое описание того, как некоторые из основных компонентов SK-L сочетаются друг с другом и как вы можете начать обучение моделей уже сегодня.

Что мы пытаемся узнать?

Самое важное, что нужно понять с самого начала, - это то, чему мы на самом деле пытаемся научиться. Хотим ли мы классифицировать наши данные по разным категориям? Установить линию регрессии? Кластеризовать данные? Это будет определять, с какой моделью вы решите работать.

В нашем примере, чтобы получить представление о взаимосвязи между ценами на вино и отзывами, мы будем использовать модель гребневой регрессии (регуляризованная версия линейной регрессии). Я вытащил собранную коллекцию обзоров от Wine Enthusiast, доступных через Kaggle. Я надеюсь определить, есть ли связь между ценой вина и оценкой, полученной критиками Wine Enthusiast. Давайте разберемся!

Первое, что нам нужно сделать, это извлечь данные и очистить все строки, с которыми мы не заинтересованы работать (например, пустые значения). Затем мы нормализуем наши данные до интервала от 0 до 1 для простоты процесса обучения.

import pandas as pd
#Read in data
data = pd.concat([
            pd.read_csv('data/winemag-data_first150k.csv'),
            pd.read_csv('data/winemag-data-130k-v2.csv')
            ], ignore_index=True)
#Clean data, pare down
data = data.loc[
(~data['price'].isnull()) &
            (~data['points'].isnull())
            ][['price', 'points']]
#Normalize data on 0 to 1 interval
data['price'] = (data['price'] - data['price'].min() + .001)
            / (data['price'].max() - data['price'].min())
data['points'] = (data['points'] - data['points'].min() + .001)
            / (data['points'].max() - data['points'].min())

Разделить наши данные на наборы для обучения и тестирования с помощью Scikit-Learn очень просто. Это все, что вам нужно сделать, чтобы пройти стандартный раздел тренировочных тестов 80–20 со случайным выбором.

from sklearn.model_selection import train_test_split
#Train-test split
training, test = train_test_split(data, train_size=.8, shuffle=True)

Теперь осталось только обучить и оценить нашу модель.

from sklearn.linear_model import RidgeCV
import numpy as np
#Instantiate, train model
model = RidgeCV(alphas=np.arange(0,10,.2), cv=10)
model.fit(np.vstack(training['price'].values),
          np.vstack(training['points'].values))

Как мы выступили?

print(model.score(np.vstack(test['price']), np.vstack(test['points'])))
0.200493125822

Ужасно! Значение R-квадрата 0,20 - это довольно плохая производительность, и мы не должны использовать ее в реальных условиях.

Хорошая новость в том, что это все! Нам удалось обучить регуляризованную модель с перекрестной проверкой и правильным разделением на обучение и тест в 35 строках Python. Вот и все.

#!/usr/bin/env python3
from sklearn.linear_model import RidgeCV
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
def main():
        #Read in data
        data = pd.concat([
            pd.read_csv('data/winemag-data_first150k.csv'),
            pd.read_csv('data/winemag-data-130k-v2.csv')
        ], ignore_index=True)
        #Clean data, pare down
        data = data.loc[
            (~data['price'].isnull()) &
            (~data['points'].isnull())
        ][['price', 'points']]
        #Normalize data on 0 to 1 interval
        data['price'] = (data['price'] - data['price'].min() + .001)
                        / (data['price'].max() - data['price'].min())
        data['points'] = (data['points'] - data['points'].min() + .001)
                        / (data['points'].max() - data['points'].min())
        #Train-test split
        training, test = train_test_split(data, train_size=.8, shuffle=True)
        #Instantiate, train model
        model = RidgeCV(alphas=np.arange(0,10,.2), cv=10)
        model.fit(np.vstack(training['price'].values),
                  np.vstack(training['points'].values))
        print(model.score(np.vstack(test['price']),
                          np.vstack(test['points'])))
if __name__ == '__main__':
        main()

Не слишком потрепанный. А это означает, что мы можем быстро выполнить итерацию и перестроить нашу модель, чтобы настроить производительность по мере необходимости. Может быть, в следующий раз мы попробуем регрессию гребня с нелинейным ядром или попробуем посмотреть, есть ли кластеры в соответствии с ценой.

Scikit-Learn - отличный способ для профессионалов ускорить процесс разработки, а для новичков - попробовать себя в машинном обучении. А в ODSC West вы можете узнать прямо у одного из создателей пакета.

Оригинальная история здесь.

— — — — — — — — — — — — — — — — — —

Прочтите больше статей по науке о данных на OpenDataScience.com, включая учебные пособия и руководства от новичка до продвинутого уровня! Подпишитесь на нашу еженедельную рассылку здесь и получайте последние новости каждый четверг.