Линейная регрессия своими руками python

Линейная регрессия с помощью Scikit-Learn в Python

Существует два типа алгоритмов машинного обучения с учителем: регрессия и классификация. Первый прогнозирует непрерывные выходы значений, а второй – дискретные. Например, прогнозирование стоимости дома в долларах является проблемой регрессии, тогда как прогнозирование злокачественной или доброкачественной опухоли является проблемой классификации.

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

Теория линейной регрессии

Термин «линейность» в алгебре относится к линейной зависимости между двумя или более переменными. Если мы нарисуем это соотношение в двухмерном пространстве (в данном случае между двумя переменными), мы получим прямую линию.

Давайте рассмотрим скрипт, в котором мы хотим определить линейную зависимость между количеством часов, которые студент учится, и процентом оценок, которые студент набирает на экзамене. Мы хотим выяснить, сколько часов ученик готовится к тесту, насколько высокий балл он может набрать? Если мы нанесем независимую переменную (часы) на ось x, а зависимую переменную (процент) на ось y, линейная регрессия даст нам прямую линию, которая наилучшим образом соответствует точкам данных, как показано на рисунке ниже.

Мы знаем, что уравнение прямой в основном:

Где, b – точка пересечения, а m – наклон линии. Таким образом, алгоритм линейной регрессии дает нам наиболее оптимальное значение для точки пересечения и наклона (в двух измерениях). Переменные y и x остаются неизменными, поскольку они являются функциями данных и не могут быть изменены. Значения, которые мы можем контролировать, – это точка пересечения и наклон. В зависимости от значений точки пересечения и наклона может быть несколько прямых линий. По сути, алгоритм линейной регрессии помещает несколько строк в точки данных и возвращает строку, которая дает наименьшую ошибку.

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

Это уравнение гиперплоскости. Помните, что модель линейной регрессии в двух измерениях – это прямая линия, в трех измерениях – это плоскость, а в более чем трех измерениях – гиперплоскость.

Линейная регрессия

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

Простая линейная регрессия

В этой задаче регрессии мы спрогнозируем процент оценок, которые, как ожидается, получит студент, на основе количества часов, которые он изучил. Это простая задача линейной регрессии, поскольку она включает всего две переменные.

Импорт библиотек

Чтобы импортировать необходимые библиотеки для этой задачи, выполните следующие операторы импорта:

Примечание. Как вы могли заметить из приведенных выше операторов импорта, этот код был выполнен с использованием Jupyter iPython Notebook.

Набор данных

Примечание. Этот пример был выполнен на компьютере под управлением Windows, и набор данных хранился в папке «D:\datasets». Вы можете скачать файл в другом месте, если соответствующим образом измените путь к набору данных.

Читайте также:  Нарисовать плакат для любимого своими руками

Следующая команда импортирует набор данных CSV с помощью Pandas:

Теперь давайте немного исследуем наш набор данных. Для этого выполните следующий скрипт:

После этого вы должны увидеть следующее:

Это означает, что в нашем наборе данных 25 строк и 2 столбца. Давайте посмотрим, как на самом деле выглядит наш набор данных. Для этого используйте метод head():

Вышеупомянутый метод извлекает первые 5 записей из нашего набора данных, которые будут выглядеть следующим образом:

Часы Очки
0 2,5 21 год
1 5.1 47
2 3,2 27
3 8,5 75
4 3.5 30

Чтобы увидеть статистические детали набора данных, мы можем использовать description():

Часы Очки
count 25,000000 25,000000
mean 5,012000 51,480000
std 2,525094 25,286887
min 1 100 000 17,000000
25% 2,700000 30,000000
50% 4,800000 47,000000
75% 7,400000 75,000000
max 9.200000 95,000000

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

В приведенном выше скрипте мы используем функцию plot() dataframe pandas и передаем ей имена столбцов для координаты x и координаты y, которые являются «часами» и «счетами» соответственно.

В результате сюжет будет выглядеть так:

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

Подготовка данных

Теперь у нас есть представление о статистических деталях наших данных. Следующим шагом является разделение данных на «атрибуты» и «метки». Атрибуты – это независимые переменные, а метки – это зависимые переменные, значения которых должны быть предсказаны. В нашем наборе данных всего два столбца. Мы хотим предсказать процентную оценку в зависимости от изученных часов. Поэтому наш набор атрибутов будет состоять из столбца «Часы», а меткой будет столбец «Оценка». Чтобы извлечь атрибуты и метки, выполните следующий сценарий:

Атрибуты хранятся в переменной X. Мы указали «-1» в качестве диапазона для столбцов, так как мы хотели, чтобы наш атрибут содержал все столбцы, кроме последнего, которым является «Результаты». Точно так же переменная y содержит метки. Мы указали 1 для столбца метки, так как индекс столбца «Результаты» равен 1. Помните, что индексы столбца начинаются с 0, причем 1 является вторым столбцом. В следующем разделе мы увидим лучший способ указать столбцы для атрибутов и меток.

Теперь, когда у нас есть атрибуты и метки, следующим шагом будет разделение этих данных на обучающий и тестовый наборы. Мы сделаем это с помощью встроенного в Scikit-Learn метода train_test_split():

Приведенный выше скрипт разделяет 80% данных на обучающий набор, а 20% данных – на набор тестов. Переменная test_size -–это то место, где мы фактически указываем пропорцию набора тестов.

Обучение алгоритму

Мы разделили наши данные на наборы для обучения и тестирования, и теперь, наконец, пришло время обучить наш алгоритм. Выполните следующую команду:

С Scikit-Learn чрезвычайно просто реализовать модели линейной регрессии, поскольку все, что вам действительно нужно сделать, это импортировать класс LinearRegression, создать его экземпляр и вызвать метод fit() вместе с нашими обучающими данными. Это примерно так же просто, как и при использовании библиотеки машинного обучения.

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

Чтобы получить перехват:

Полученное значение должно быть примерно 2,01816004143.

Для получения наклона (коэффициента x):

Результат должен быть примерно 9.91065648.

Это означает, что на каждую единицу изменения в изученных часах изменение оценки составляет около 9,91%. Или, проще говоря, если студент учится на один час больше, чем готовился к экзамену ранее, он может рассчитывать на повышение на 9,91% баллов, полученных студентом ранее.

Прогнозы

Теперь, когда мы обучили наш алгоритм, пришло время сделать некоторые прогнозы. Для этого мы воспользуемся нашими тестовыми данными и посмотрим, насколько точно наш алгоритм предсказывает процентную оценку. Чтобы сделать прогнозы на тестовых данных, выполните следующий скрипт:

Y_pred – это массив numpy, который содержит все предсказанные значения для входных значений в серии X_test.

Чтобы сравнить фактические выходные значения для X_test с прогнозируемыми значениями, выполните следующий скрипт:

Результат выглядит так:

Действительный Прогнозируемый
0 20 16,884145
1 27 33,732261
2 69 75.357018
3 30 26.794801
4 62 60,491033

Хотя наша модель не очень точна, прогнозируемые проценты близки к фактическим.

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

Оценка алгоритма

Последний шаг – оценить производительность алгоритма. Этот шаг особенно важен для сравнения того, насколько хорошо разные алгоритмы работают с конкретным набором данных. Для алгоритмов регрессии обычно используются три показателя оценки:

  1. Средняя абсолютная ошибка (MAE) – это среднее абсолютное значение ошибок. Он рассчитывается как:

  1. Среднеквадратичная ошибка (MSE) – это среднее значение квадратов ошибок, которое рассчитывается как:

  1. Среднеквадратичная ошибка (RMSE) – это квадратный корень из среднего квадрата ошибок:

К счастью, нам не нужно выполнять эти вычисления вручную. Библиотека Scikit-Learn поставляется со встроенными функциями, которые можно использовать, чтобы узнать эти значения для нас.

Давайте найдем значения этих показателей, используя наши тестовые данные. Выполните следующий код:

Результат будет выглядеть примерно так (но, вероятно, немного иначе):

Вы можете видеть, что значение среднеквадратичной ошибки составляет 4,64, что составляет менее 10% от среднего значения процентов всех студентов, т.е. 51,48. Это означает, что наш алгоритм проделал достойную работу.

Множественная линейная регрессия

В предыдущем разделе мы выполнили линейную регрессию с участием двух переменных. Почти все проблемы реального мира, с которыми вы столкнетесь, будут иметь более двух переменных. Линейная регрессия с участием нескольких переменных называется «множественной линейной регрессией». Шаги по выполнению множественной линейной регрессии почти аналогичны шагам простой линейной регрессии. Разница заключается в оценке. Вы можете использовать его, чтобы узнать, какой фактор имеет наибольшее влияние на прогнозируемый результат и как разные переменные связаны друг с другом.

В этом разделе мы будем использовать множественную линейную регрессию для прогнозирования потребления газа (в миллионах галлонов) в 48 штатах США на основе налогов на газ (в центах), дохода на душу населения (в долларах), дорог с твердым покрытием (в милях) и доли население, имеющее водительские права.

Первые два столбца в приведенном выше наборе данных не предоставляют никакой полезной информации, поэтому они были удалены из файла набора данных. Теперь давайте разработаем регрессионную модель для этой задачи.

Импорт библиотек

Следующий скрипт импортирует необходимые библиотеки:

Набор данных

Следующая команда импортирует набор данных из файла:

Как и в прошлый раз, давайте посмотрим, как на самом деле выглядит наш набор данных. Выполните команду head():

Первые несколько строк нашего набора данных выглядят так:

Petrol_tax Средний заработок Асфальтированные, шоссе Population_Driver_license (%) Petrol_Consumption
0 9.0 3571 1976 г. 0,525 541
1 9.0 4092 1250 0,572 524
2 9.0 3865 1586 0,580 561
3 7,5 4870 2351 0,529 414
4 8.0 4399 431 0,544 410

Чтобы увидеть статистические детали набора данных, мы снова воспользуемся командой describe():

Petrol_tax Средний заработок Асфальтированные, шоссе Population_Driver_license (%) Petrol_Consumption
count 48,000000 48,000000 48,000000 48,000000 48,000000
mean 7,668333 4241.833333 5565.416667 0,570333 576.770833
std 0,950770 573,623768 3491.507166 0,055470 111,885816
min 5,000000 3063.000000 431,000000 0,451000 344,000000
25% 7,000000 3739.000000 3110.250000 0,529750 509 500 000
50% 7,500000 4298.000000 4735.500000 0,564500 568 500 000
75% 8,125 000 4578.750000 7156.000000 0,595250 632,750000
max 10,00000 5342.000000 17782,000000 0,724000 986,000000

Подготовка данных

Следующим шагом является разделение данных на атрибуты и метки, как мы делали ранее. Однако, в отличие от прошлого раза, на этот раз мы собираемся использовать имена столбцов для создания набора атрибутов и метки. Выполните следующий скрипт:

Выполните следующий код, чтобы разделить наши данные на обучающий и тестовый наборы:

Обучение алгоритму

И, наконец, для обучения алгоритма мы выполняем тот же код, что и раньше, используя метод fit() класса LinearRegression:

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

Результат должен выглядеть примерно так:

Коэффициент
Petrol_tax -24.196784
Average_income -0,81680
Paved_Highways -0,000522
Population_Driver_license (%) 1324.675464

Это означает, что увеличение «petrol_tax» на единицу приводит к снижению потребления газа на 24,19 миллиона галлонов. Аналогичным образом, увеличение доли населения, имеющего водительские права, приводит к увеличению потребления газа на 1,324 миллиарда галлонов. Мы видим, что «Average_income» и «Paved_Highways» очень мало влияют на потребление газа.

Прогнозы

Чтобы сделать прогнозы на тестовых данных, выполните следующий скрипт:

Чтобы сравнить фактические выходные значения для X_test с прогнозируемыми значениями, выполните следующий скрипт:

Результат выглядит так:

Действительный Прогнозируемый
36 640 643.176639
22 464 411.950913
20 649 683,712762
38 648 728.049522
18 865 755.473801
1 524 559.135132
44 год 782 671.916474
21 год 540 550,633557
16 603 594,425464
45 510 525.038883

Оценка алгоритма

Последний шаг – оценить производительность алгоритма. Мы сделаем это, найдя значения для MAE, MSE и RMSE. Выполните следующий скрипт:

Результат будет выглядеть примерно так:

Вы можете видеть, что значение среднеквадратичной ошибки составляет 60,07, что немного больше 10% от среднего значения потребления газа во всех штатах. Это означает, что наш алгоритм не был очень точным, но все же может делать достаточно хорошие прогнозы.

Есть много факторов, которые могли повлиять на эту неточность, некоторые из которых перечислены здесь:

  1. Требуется больше данных: данных за один год – это не так уж и много, тогда как накопление данных за несколько лет могло бы помочь нам немного повысить точность.
  2. Ошибочные предположения: мы предположили, что эти данные имеют линейную зависимость, но это может быть не так. Визуализация данных может помочь вам определить это.
  3. Плохие функции: используемые нами функции могли не иметь достаточно высокой корреляции со значениями, которые мы пытались предсказать.

Заключение

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

Источник

Читайте также:  Как сшить полукомбинезон своими руками выкройка
Оцените статью
Своими руками