Машинное обучение — обучение/тестирование
Оцените свою модель
В машинном обучении мы создаем модели для прогнозирования исхода определенных событий, как в предыдущей главе, где мы предсказывали выброс CO2 автомобиля, зная его вес и объем двигателя.
Чтобы измерить, достаточно ли хороша модель, мы можем использовать метод Train/Test.
Что такое поезд/тест
Train/Test — это метод измерения точности вашей модели.
Он называется «Обучение/тестирование», потому что вы разделяете набор данных на два набора: набор для обучения и набор для тестирования.
80% на обучение и 20% на тестирование.
Вы обучаете модель, используя обучающий набор.
Вы тестируете модель с помощью тестового набора.
Обучить модель означает создать модель.
Проверить модель означает проверить точность модели.
Начните с набора данных
Начните с набора данных, который вы хотите протестировать.
Наш набор данных иллюстрирует 100 покупателей в магазине и их покупательские привычки.
Пример
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
plt.scatter(x, y)
plt.show()
Результат:
Ось x представляет количество минут до совершения покупки.
Ось Y представляет сумму денег, потраченную на покупку.
Разделить на поезд/тест
Обучающий набор должен представлять собой случайный выбор 80% исходных данных.
Тестовый набор должен составлять оставшиеся 20%.
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
Отобразите тренировочный набор
Отобразите тот же график рассеяния с обучающим набором:
Пример
plt.scatter(train_x,
train_y)
plt.show()
Результат:
Это похоже на исходный набор данных, так что выбор кажется справедливым:
Отобразите набор для тестирования
Чтобы убедиться, что тестовый набор не совсем другой, мы также рассмотрим тестовый набор.
Пример
plt.scatter(test_x,
test_y)
plt.show()
Результат:
Набор для тестирования также выглядит как исходный набор данных:
Соответствуйте набору данных
Как выглядит набор данных? На мой взгляд, я думаю, что лучше всего подходит полиномиальная регрессия , поэтому давайте нарисуем линию полиномиальной регрессии.
Чтобы провести линию через точки данных, мы используем
plot()
метод модуля matplotlib:
Пример
Нарисуйте линию полиномиальной регрессии через точки данных:
import numpy
import
matplotlib.pyplot as plt
numpy.random.seed(2)
x =
numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y =
y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
myline = numpy.linspace(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()
Результат:
Результат может подтвердить мое предположение о том, что набор данных соответствует полиномиальной регрессии, хотя это дало бы нам некоторые странные результаты, если бы мы попытались предсказать значения вне набора данных. Пример: линия указывает на то, что покупатель, проведя в магазине 6 минут, совершит покупку на 200 долларов. Возможно, это признак переобучения.
Но как насчет показателя R-квадрат? Оценка R-квадрата является хорошим индикатором того, насколько хорошо мой набор данных соответствует модели.
R2
Помните R2, также известный как R-квадрат?
Он измеряет взаимосвязь между осью x и осью y, а значение находится в диапазоне от 0 до 1, где 0 означает отсутствие взаимосвязи, а 1 означает полную взаимосвязь.
В модуле sklearn есть метод r2_score()
, который поможет нам найти эту связь.
В этом случае мы хотели бы измерить зависимость между количеством минут, в течение которых покупатель находится в магазине, и тем, сколько денег он тратит.
Пример
Насколько хорошо мои обучающие данные вписываются в полиномиальную регрессию?
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y,
4))
r2 = r2_score(train_y, mymodel(train_x))
print(r2)
Примечание . Результат 0,799 показывает, что отношение OK.
Принесите набор для тестирования
Теперь мы создали модель, в которой все в порядке, по крайней мере, когда речь идет об обучающих данных.
Теперь мы также хотим протестировать модель с тестовыми данными, чтобы увидеть, даст ли нам тот же результат.
Пример
Найдем оценку R2 при использовании данных тестирования:
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y,
4))
r2 = r2_score(test_y, mymodel(test_x))
print(r2)
Примечание . Результат 0,809 показывает, что модель также подходит для тестового набора, и мы уверены, что можем использовать модель для прогнозирования будущих значений.
Предсказать значения
Теперь, когда мы установили, что наша модель в порядке, мы можем начать прогнозировать новые значения.
Пример
Сколько денег потратит покупатель, если он останется в магазине на 5 минут?
print(mymodel(5))
Пример предсказал, что клиент потратит 22,88 доллара, что соответствует диаграмме: