МАШИННОЕ ОБУЧЕНИЕ

Реализуйте простую линейную регрессию

С питоном и склеарном

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

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

Выберите данные

Я буду использовать данные из https://www.data.gouv.fr/fr/datasets/coronavirus-covid19-evolution-par-pays-et-dans-le-monde-maj-quotidienne/

На этом сайте вы сможете скачать файлы со следующими данными по дате и стране:

  • количество дел
  • число смерти
  • количество исцелений
  • уровень смертности
  • скорость заживления
  • уровень заражения

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

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

Импорт некоторых библиотек:

  • Numpy: базовая библиотека для научных вычислений и науки о данных.
  • matplot: Lib для рисования графика
  • Panda: загрузка и обработка входных данных
  • Sklearn: библиотека ML
  • google.colab: использовать Google диск
  • datetime: манипулирование датой
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from google.colab import drive
import datetime

Загрузите и подготовьте данные

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

drive.mount('/content/drive', force_remount=True)

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

convertDate = lambda x : datetime.datetime.strptime(x, "%Y-%m-%d").timestamp()

Теперь откройте свой CSV благодаря read_csv. Заполните четыре параметра:

  • путь к вашему файлу, вот путь в моем google doc
  • разделитель CSV, здесь «;»
  • error_bad_lines=False, чтобы избежать остановки выполнения в случае неверных строк.
  • converters={'Date':convertDate} примените конвертер к столбцу Дата
  • usecols=[0,1,2,3] позволяют выбирать определенные столбцы. Здесь я использую только первые четыре.
di = pd.read_csv('/content/drive/My Drive/dataML/coronavirus.politologue.com-pays-2020-08-22.csv',";", error_bad_lines=False,converters={'Date':convertDate},usecols=[0,1,2,3])

Сейчас файл почти готов, но еще остались некоторые проблемы со столбцом «Платит». На самом деле в этом столбце у нас есть категориальные данные, а не числовые данные. В этом примере мы просто сохраним данные из Франции и удалим этот столбец.

# Remove all ligne with a value different than "France" in column "Pays"
clean_di = di.drop(di[di.Pays != "France"].index)
# Remove the column "Pays"
clean_di = clean_di.drop(axis=1,labels="Pays")

Задайте параметры линейной регрессии

Теперь я изолирую функции (входные) в векторе x и выходные данные в векторе y. Кроме того, я создаю набор переменных данных для представления глобального набора данных.

dataset = clean_di;
x = clean_di.iloc[:, clean_di.columns == 'Infections'].values
y = clean_di.iloc[:, clean_di.columns == 'Deces'].values

Разделение набора данных на обучающий набор и тестовый набор

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 1/6, random_state = 0)

Обучение модели простой линейной регрессии на обучающем наборе

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train)

визуализация результатов тренировочного набора

plt.scatter(x_train, y_train, color = ‘red’)
plt.plot(x_train, regressor.predict(x_train), color = ‘blue’)
plt.xlabel(‘Case’)
plt.ylabel(‘Death’)
plt.show()

Визуализация результатов набора тестов

plt.scatter(x_test, y_test, color = 'red')
plt.plot(x_train, regressor.predict(x_train), color = 'blue')
plt.xlabel('Case')
plt.ylabel('Death')
plt.show()

Вывод

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

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
x_seq = np.linspace(x.min(),x.max(),300).reshape(-1,1)
regressorDegree5 = make_pipeline(PolynomialFeatures(5), LinearRegression())
regressorDegree5.fit(x, y)
plt.scatter(x_train, y_train, color = 'red')
plt.plot(x_seq, regressorDegree5.predict(x_seq), color = 'blue')
plt.xlabel('Case')
plt.ylabel('Death')
plt.show()
plt.scatter(x_test, y_test, color = 'red')
plt.plot(x_seq, regressorDegree5.predict(x_seq), color = 'blue')
plt.xlabel('Case')
plt.ylabel('Death')
plt.show()

Ресурсы

Источники

Исполняемый пример на Colab.

Вебография